diff --git a/build.gradle b/build.gradle index 4fe6044..c27c8be 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ dependencies { testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') testImplementation('org.assertj:assertj-core') + testImplementation('org.mockito:mockito-core') } tasks.named('test') { diff --git a/src/main/java/leets/land/Controller.java b/src/main/java/leets/land/Controller.java new file mode 100644 index 0000000..f604874 --- /dev/null +++ b/src/main/java/leets/land/Controller.java @@ -0,0 +1,65 @@ +package leets.land; + +import leets.land.domain.Range; +import leets.land.domain.CharRange; +import leets.land.view.InputView; +import leets.land.view.OutputView; + +public class Controller { + private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); + public void run() { + int version = inputView.getVersionInput(); + if (version == 1) { + numberVersion(); + } else { + alphaVersion(); + } + } + public void numberVersion() { + double randomValue = Math.random(); + int randomNumber = (int)(randomValue *100) +1; + int cnt = 0; + int correct = -1; + Range range = new Range(1, 100); + while (correct != randomNumber) { + correct = inputView.getNumberInput(range); + printUpDown(correct, randomNumber, range); // Call printUpDown function + cnt ++; + } + outputView.printCorrectMessage(cnt); + } + + public void printUpDown(int correct, int randomNumber, Range range) { + if (correct < randomNumber) { + System.out.println("UP"); + range.setMin(correct + 1); + } else if (correct > randomNumber) { + System.out.println("DOWN"); + range.setMax(correct - 1); + } + } + + public void alphaVersion() { + char randomAlpha = (char)((Math.random() * 58) + 65); + int cnt = 0; + char correct = 'A'-1; + CharRange range = new CharRange('A', 'z'); + while (correct != randomAlpha) { + correct = inputView.getCharInput(range); + printUpDown(correct, randomAlpha, range); + cnt ++; + } + outputView.printCorrectMessage(cnt); + } + + public void printUpDown(char correct, char randomAlpha, CharRange range) { + if (correct < randomAlpha) { + System.out.println("UP"); + range.setMin((char)(correct + 1)); + } else if (correct > randomAlpha) { + System.out.println("DOWN"); + range.setMax((char)(correct - 1)); + } + } +} diff --git a/src/main/java/leets/land/UpdownApplication.java b/src/main/java/leets/land/UpdownApplication.java index 09d7ae5..981c4ee 100644 --- a/src/main/java/leets/land/UpdownApplication.java +++ b/src/main/java/leets/land/UpdownApplication.java @@ -1,8 +1,8 @@ package leets.land; public class UpdownApplication { - public static void main(String[] args) { - System.out.print("hihi :D"); + Controller controller = new Controller(); + controller.run(); } } diff --git a/src/main/java/leets/land/domain/CharRange.java b/src/main/java/leets/land/domain/CharRange.java new file mode 100644 index 0000000..5d43729 --- /dev/null +++ b/src/main/java/leets/land/domain/CharRange.java @@ -0,0 +1,31 @@ +package leets.land.domain; + +public class CharRange { + private char min; + private char max; + + public CharRange(char min, char max) { + this.min = min; + this.max = max; + } + + public char getMin() { + return min; + } + + public char getMax() { + return max; + } + + public void setMin(char min) { + this.min = min; + } + + public void setMax(char max) { + this.max = max; + } + + public boolean isInRange(char value) { + return value >= min && value <= max; + } +} \ No newline at end of file diff --git a/src/main/java/leets/land/domain/Range.java b/src/main/java/leets/land/domain/Range.java new file mode 100644 index 0000000..7022645 --- /dev/null +++ b/src/main/java/leets/land/domain/Range.java @@ -0,0 +1,31 @@ +package leets.land.domain; + +public class Range { + private int min; + private int max; + + public Range(int min, int max) { + this.min = min; + this.max = max; + } + + public int getMin() { + return min; + } + + public void setMin(int min) { + this.min = min; + } + + public int getMax() { + return max; + } + + public void setMax(int max) { + this.max = max; + } + + public boolean isInRange(int value) { + return value >= min && value <= max; + } +} diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java new file mode 100644 index 0000000..28edc40 --- /dev/null +++ b/src/main/java/leets/land/view/InputView.java @@ -0,0 +1,84 @@ +package leets.land.view; + +import leets.land.domain.CharRange; +import leets.land.domain.Range; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class InputView { + private final Scanner scanner = new Scanner(System.in); + + public int getVersionInput() { + System.out.print("버전을 입력해주세요 (숫자 버전: 1, 영어 버전: 2) : "); + try { + int version = scanner.nextInt(); + validateVersion(version); + return version; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return getVersionInput(); + } catch (InputMismatchException e) { + System.out.println("[ERROR] 버전을 입력해주세요 (숫자 버전: 1, 영어 버전: 2) : "); + scanner.nextLine(); + return getVersionInput(); + } + } + + public void validateVersion(int version) { + if (version != 1 && version != 2) { + throw new IllegalArgumentException("[ERROR] 존재하지 않는 버전입니다."); + } + } + + public int getNumberInput(Range range) { + System.out.printf("숫자를 입력해주세요(%d ~ %d) : ",range.getMin(),range.getMax()); + try { + int number = scanner.nextInt(); + validateNumberRange(range, number); + return number; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return getNumberInput(range); + } catch (InputMismatchException e) { + System.out.println("[ERROR] 숫자를 입력해주세요 "); + scanner.nextLine(); + return getNumberInput(range); + } + } + + public void validateNumberRange(Range range, int number) { + if (!range.isInRange(number)) { + throw new IllegalArgumentException("[ERROR] 범위 내의 숫자를 입력하세요. "); + } + } + + public char getCharInput(CharRange range) { + System.out.printf("영어를 입력해주세요(%c ~ %c) : ",range.getMin(),range.getMax()); + String input = scanner.next(); + try { + validCharLength(input); + char character = input.charAt(0); + validateCharRange(range, character); + return character; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return getCharInput(range); + } catch (InputMismatchException e) { + System.out.println("입력 문자의 타입이 맞지 않습니다. "); + scanner.nextLine(); + return getCharInput(range); + } + } + public void validateCharRange(CharRange range, char character) { + if (!range.isInRange(character)) { + throw new IllegalArgumentException("[ERROR] 범위 내의 알파벳을 입력하세요. "); + } + } + public void validCharLength(String s) { + if (s.length() >= 2) { + throw new IllegalArgumentException("[ERROR] 알파벳 한 글자만 입력해주세요 "); + } + } + +} diff --git a/src/main/java/leets/land/view/OutputView.java b/src/main/java/leets/land/view/OutputView.java new file mode 100644 index 0000000..5fe5227 --- /dev/null +++ b/src/main/java/leets/land/view/OutputView.java @@ -0,0 +1,9 @@ +package leets.land.view; + +public class OutputView { + public void printCorrectMessage(int cnt) { + System.out.println("정답"); + + System.out.printf("시도한 횟수 : %d회",cnt); + } +} diff --git a/src/test/java/leets/land/UpdownApplicationTests.java b/src/test/java/leets/land/UpdownApplicationTests.java index fe61ffe..42ff34e 100644 --- a/src/test/java/leets/land/UpdownApplicationTests.java +++ b/src/test/java/leets/land/UpdownApplicationTests.java @@ -1,11 +1,21 @@ package leets.land; +import leets.land.view.InputView; +import leets.land.view.OutputView; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.*; + class UpdownApplicationTests { + UpdownApplication app; + private Controller controller; + private InputView inputViewMock; + private OutputView outputViewMock; + @Test - void contextLoads() { + public void setUp() { + controller = new Controller(); } - } diff --git a/src/test/java/leets/land/view/InputViewTest.java b/src/test/java/leets/land/view/InputViewTest.java new file mode 100644 index 0000000..61bab6c --- /dev/null +++ b/src/test/java/leets/land/view/InputViewTest.java @@ -0,0 +1,50 @@ +package leets.land.view; + +import leets.land.domain.CharRange; +import leets.land.domain.Range; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + +class InputViewTest { + InputView inputView; + Range range; + @BeforeEach + void setUp() { + inputView = new InputView(); + } + + @DisplayName("지정 버전 이외에 버전을 입력하면 예외처리") + @Test + void getVersionInput() { + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, ()-> + inputView.validateVersion(0) ); + } + + @DisplayName("범위 외의 숫자가 입력되면 예외처리") + @Test + void validateNumberRange() { + range = new Range(1,100); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, ()-> + inputView.validateNumberRange(range,101) ); + } + + @DisplayName("범위 외의 알파벳이 입력되면 예외처리") + @Test + void validateCharRange() { + CharRange charRange = new CharRange('A','z'); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, ()-> + inputView.validateCharRange(charRange,',') ); + } + @DisplayName("알파벳이 두개 입력되면 예외처리") + @Test + void validCharLength() { + String doubleString = "ab"; + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, ()-> + inputView.validCharLength(doubleString)); + } +} \ No newline at end of file