diff --git a/src/main/java/baseboll/StringCalculator.java b/src/main/java/baseboll/StringCalculator.java new file mode 100644 index 000000000..71d99ec45 --- /dev/null +++ b/src/main/java/baseboll/StringCalculator.java @@ -0,0 +1,42 @@ +package baseboll; + +public class StringCalculator { + public String[] toStringArray(String s){ + return s.split(" "); + } + + public int add(int a, int b){ + return a + b; + } + + public int subtract(int a, int b){ + return a - b; + } + + public int multiply(int a, int b){ + return a * b; + } + + public int divide(int a, int b){ + if (b == 0) throw new IllegalArgumentException("0으로 나눌 수 없다 인마"); + return a / b; + } + + public int calculate(int a, int b, String operator){ + if (operator.equals("+")) return add(a, b); + if (operator.equals("-")) return subtract(a,b); + if (operator.equals("*")) return multiply(a,b); + if (operator.equals("/")) return divide(a,b); + + throw new IllegalArgumentException("잘못된 입력이다 인마"); + } + + public int calculateString(String s){ + String[] stringArray = toStringArray(s); + int answer = Integer.parseInt(stringArray[0]); + for (int i = 1; i < stringArray.length; i += 2) { + answer = calculate(answer, Integer.parseInt(stringArray[i + 1]), stringArray[i]); + } + return answer; + } +} diff --git a/src/main/java/baseboll/myTrial/allInOne/BadCaseGame.java b/src/main/java/baseboll/myTrial/allInOne/BadCaseGame.java new file mode 100644 index 000000000..7644af71e --- /dev/null +++ b/src/main/java/baseboll/myTrial/allInOne/BadCaseGame.java @@ -0,0 +1,109 @@ +package baseboll.myTrial.allInOne; + + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.*; + +public class BadCaseGame { + private final BufferedReader br; + public BadCaseGame(BufferedReader br) { + this.br = br; + } + public void game() throws IOException { + String answer = String.valueOf(makeRandomAnswer()); + progressGame(answer); + } + private void progressGame(String answer) throws IOException { + String input = getInput(); // 사용자에게 입력값 받아오기 + if (!isPossible(input)) progressGame(answer); + if (isCorrect(input, answer)) { + continueOrNot(); + return; + } + countTotal(input, answer); + progressGame(answer); + } + + private boolean isPossible(String input) { + return false; + } + + private void countTotal(String input, String answer){ + int strikeCount = strikeCountChecker(input, answer); + int ballCount = ballCountChecker(input, answer); + StringBuilder sb = new StringBuilder(); + if (strikeCount == 0 & ballCount == 0) { + System.out.println("낫싱"); + return; + } + if (strikeCount != 0) sb.append(strikeCount).append("스트라이크"); + if (ballCount != 0) sb.append(ballCount).append("볼"); + System.out.println(sb.toString()); + } + + private int makeRandomAnswer() { + List digits = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + digits.add(i); + } + Collections.shuffle(digits); + int firstDigit = digits.get(0); + int secondDigit = digits.get(1); + int thirdDigit = digits.get(2); + return firstDigit * 100 + secondDigit * 10 + thirdDigit; + } + + private String getInput() throws IOException { + System.out.println("숫자를 입력 해 주세요"); + return br.readLine(); + } + + private void continueOrNot() throws IOException { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String input = br.readLine(); + if (input.equals("1")) { + game(); + return; + } + if (input.equals("2")) { + return; + } + System.out.println("잘못된 입력입니다."); + } + + private int strikeCountChecker(String input, String answer){ + String[] given = input.split(""); + String[] ans = answer.split(""); + int correctCount = 0; + for (int i = 0; i < given.length; i++) { + correctCount += strikeCheck(given[i], ans[i]); + } + return correctCount; + } + + private int ballCountChecker(String input, String answer){ + String[] given = input.split(""); + Set set = new HashSet<>(Arrays.asList(given)); + int count = 0; + for (String s : set) { + count += ballCheck(s, answer); + } + int alreadyCountedStrike = strikeCountChecker(input, answer); + if (alreadyCountedStrike != 0) count -= alreadyCountedStrike; + return count; + } + + private int strikeCheck(String s, String d){ + return s.equals(d) ? 1 : 0; + } + + private int ballCheck(String input, String answer){ + return answer.contains(input) ? 1 : 0; + } + + private boolean isCorrect(String input, String answer){ + return input.equals(answer); + } +} diff --git a/src/main/java/baseboll/myTrial/second/Main.java b/src/main/java/baseboll/myTrial/second/Main.java new file mode 100644 index 000000000..8d9186e83 --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/Main.java @@ -0,0 +1,19 @@ +package baseboll.myTrial.second; + +import baseboll.myTrial.second.checker.GameChecker; +import baseboll.myTrial.second.view.GameController; +import baseboll.myTrial.second.view.InputView; +import baseboll.myTrial.second.view.OutputView; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + GameChecker gameChecker = new GameChecker(); + NumberProvider numberProvider = new NumberProvider(); + GameController gameController = new GameController(inputView, outputView, gameChecker, numberProvider); + gameController.game(); + } +} diff --git a/src/main/java/baseboll/myTrial/second/NumberProvider.java b/src/main/java/baseboll/myTrial/second/NumberProvider.java new file mode 100644 index 000000000..ae254abbd --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/NumberProvider.java @@ -0,0 +1,23 @@ +package baseboll.myTrial.second; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class NumberProvider { + private int makeInteger() { + List digits = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + digits.add(i); + } + Collections.shuffle(digits); + int firstDigit = digits.get(0); + int secondDigit = digits.get(1); + int thirdDigit = digits.get(2); + return firstDigit * 100 + secondDigit * 10 + thirdDigit; + } + + public String makeRandomAnswer(){ + return String.valueOf(this.makeInteger()); + } +} diff --git a/src/main/java/baseboll/myTrial/second/checker/BallChecker.java b/src/main/java/baseboll/myTrial/second/checker/BallChecker.java new file mode 100644 index 000000000..46bf41988 --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/checker/BallChecker.java @@ -0,0 +1,22 @@ +package baseboll.myTrial.second.checker; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class BallChecker extends Checker { + private int checkBall(String s, String answer){ + return answer.contains(s) ? 1 : 0; + } + + public int countBall(String input, String answer, int strikeCount){ + String[] given = input.split(""); + Set set = new HashSet<>(Arrays.asList(given)); + int count = 0; + for (String s : set) { + count += checkBall(s, answer); + } + if (strikeCount != 0) count -= strikeCount; + return count; + } +} diff --git a/src/main/java/baseboll/myTrial/second/checker/Checker.java b/src/main/java/baseboll/myTrial/second/checker/Checker.java new file mode 100644 index 000000000..41bf898fb --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/checker/Checker.java @@ -0,0 +1,7 @@ +package baseboll.myTrial.second.checker; + +abstract class Checker { + + public Checker() { + } +} diff --git a/src/main/java/baseboll/myTrial/second/checker/CorrectChecker.java b/src/main/java/baseboll/myTrial/second/checker/CorrectChecker.java new file mode 100644 index 000000000..78c497eb6 --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/checker/CorrectChecker.java @@ -0,0 +1,8 @@ +package baseboll.myTrial.second.checker; + +public class CorrectChecker extends Checker{ + + public boolean isCorrect(String input, String answer){ + return input.equals(answer); + } +} diff --git a/src/main/java/baseboll/myTrial/second/checker/GameChecker.java b/src/main/java/baseboll/myTrial/second/checker/GameChecker.java new file mode 100644 index 000000000..3938074ee --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/checker/GameChecker.java @@ -0,0 +1,31 @@ +package baseboll.myTrial.second.checker; + +public class GameChecker { + private NothingChecker nothingChecker; + private CorrectChecker correctChecker; + private StrikeChecker strikeChecker; + private BallChecker ballChecker; + + public GameChecker() { + init(); + } + + private void init() { + this.ballChecker = new BallChecker(); + this.correctChecker = new CorrectChecker(); + this.nothingChecker = new NothingChecker(); + this.strikeChecker = new StrikeChecker(); + } + + public String check(String input, String answer){ + if (this.correctChecker.isCorrect(input, answer)) return "정답"; + int strikeCount = strikeChecker.countStrike(input, answer); + int ballCount = ballChecker.countBall(input, answer, strikeCount); + if (nothingChecker.isNothing(strikeCount, ballCount)) return "낫싱"; + String ball = ballCount + "볼"; + if (strikeCount == 0 && ballCount != 0) return ball; + String strike = strikeCount + "스트라이크"; + if (ballCount == 0 && strikeCount != 0) return strike; + return strike + ball; + } +} \ No newline at end of file diff --git a/src/main/java/baseboll/myTrial/second/checker/NothingChecker.java b/src/main/java/baseboll/myTrial/second/checker/NothingChecker.java new file mode 100644 index 000000000..5673c1a03 --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/checker/NothingChecker.java @@ -0,0 +1,8 @@ +package baseboll.myTrial.second.checker; + +public class NothingChecker extends Checker{ + + public boolean isNothing(int strikeCount, int ballCount){ + return strikeCount == 0 && ballCount == 0; + } +} diff --git a/src/main/java/baseboll/myTrial/second/checker/StrikeChecker.java b/src/main/java/baseboll/myTrial/second/checker/StrikeChecker.java new file mode 100644 index 000000000..415c2c0a7 --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/checker/StrikeChecker.java @@ -0,0 +1,16 @@ +package baseboll.myTrial.second.checker; + +public class StrikeChecker extends Checker{ + private int checkStrike(String aInput, String aAnswer){ + return aInput.equals(aAnswer) ? 1 : 0; + } + public int countStrike(String input, String answer){ + String[] inputs = input.split(""); + String[] answers = answer.split(""); + int strikeCount = 0; + for (int i = 0; i < inputs.length; i++) { + strikeCount += checkStrike(inputs[i], answers[i]); + } + return strikeCount; + } +} diff --git a/src/main/java/baseboll/myTrial/second/view/GameController.java b/src/main/java/baseboll/myTrial/second/view/GameController.java new file mode 100644 index 000000000..f824df95d --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/view/GameController.java @@ -0,0 +1,37 @@ +package baseboll.myTrial.second.view; + +import baseboll.myTrial.second.NumberProvider; +import baseboll.myTrial.second.checker.GameChecker; + +import java.io.IOException; + +public class GameController { + private final InputView inputView; + private final OutputView outputView; + private final GameChecker gameChecker; + private final NumberProvider numberProvider; + + + public GameController(InputView inputView, OutputView outputView, GameChecker gameChecker, NumberProvider numberProvider) { + this.inputView = inputView; + this.outputView = outputView; + this.gameChecker = gameChecker; + this.numberProvider = numberProvider; + } + + private boolean correct(String input, String answer) { + return input.equals(answer); + } + + public void game() throws IOException { + String answer = numberProvider.makeRandomAnswer(); + System.out.println(answer); + String input = ""; + while (!correct(input, answer)){ + input = inputView.getInput(); // 인펏부터 받는다 + String checked = gameChecker.check(input, answer); + outputView.sendOutput(checked); + } + if (inputView.wantContinue()) game(); + } +} diff --git a/src/main/java/baseboll/myTrial/second/view/InputView.java b/src/main/java/baseboll/myTrial/second/view/InputView.java new file mode 100644 index 000000000..79455c2cc --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/view/InputView.java @@ -0,0 +1,41 @@ +package baseboll.myTrial.second.view; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class InputView { + private final BufferedReader br; + + public InputView() { + this.br = new BufferedReader(new InputStreamReader(System.in)); + } + + public String getInput() throws IOException { + System.out.println("숫자를 입력 해 주세요"); + String input = br.readLine(); + if (!isProperInput(input)) { + getInput(); + } + return input; + } + + public boolean wantContinue() throws IOException { + String input = br.readLine(); + return input.equals("1"); + } + + public boolean isProperInput(String s) { + if (s.length() != 3) { + System.out.println("3자리 숫자를 입력해주세요"); + return false; + } + try { + Integer.parseInt(s); + } catch (NumberFormatException e) { + System.out.println("숫자만 입력해주세요"); + return false; + } + return true; + } +} diff --git a/src/main/java/baseboll/myTrial/second/view/OutputView.java b/src/main/java/baseboll/myTrial/second/view/OutputView.java new file mode 100644 index 000000000..2ef1d88a9 --- /dev/null +++ b/src/main/java/baseboll/myTrial/second/view/OutputView.java @@ -0,0 +1,22 @@ +package baseboll.myTrial.second.view; + +public class OutputView { + public void nothing(){ + System.out.println("낫싱"); + } + public void gameEnd(){ + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료" + "\n" + "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + } + public void sendOutput(String checkResult){ + if (checkResult.equals("정답")) { + gameEnd(); + return; + } + if (checkResult.equals("낫싱")) { + nothing(); + return; + } + if (checkResult.equals("")) return; + System.out.println(checkResult); + } +} diff --git a/src/main/java/tdd/Ball.java b/src/main/java/tdd/Ball.java new file mode 100644 index 000000000..7fc0e8014 --- /dev/null +++ b/src/main/java/tdd/Ball.java @@ -0,0 +1,40 @@ +package tdd; + +import java.util.Objects; + +public class Ball { + private final int location; + private final int value; + + public Ball(int location, int value) { + this.location = location; + this.value = value; + } + + public BallStatus play(Ball userBall) { + if (this.equals(userBall)) { + return BallStatus.STRIKE; + } + if (isBall(userBall)) { + return BallStatus.BALL; + } + return BallStatus.NOTHING; + } + + private boolean isBall(Ball userBall) { + return this.value == userBall.value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Ball ball = (Ball) o; + return location == ball.location && value == ball.value; + } + + @Override + public int hashCode() { + return Objects.hash(location, value); + } +} diff --git a/src/main/java/tdd/BallStatus.java b/src/main/java/tdd/BallStatus.java new file mode 100644 index 000000000..12c2c013c --- /dev/null +++ b/src/main/java/tdd/BallStatus.java @@ -0,0 +1,13 @@ +package tdd; + +public enum BallStatus { + BALL, STRIKE, NOTHING; + + public boolean isBall(){ + return this == BALL; + } + + public boolean isStrike() { + return this == STRIKE; + } +} diff --git a/src/main/java/tdd/Balls.java b/src/main/java/tdd/Balls.java new file mode 100644 index 000000000..a7bac768f --- /dev/null +++ b/src/main/java/tdd/Balls.java @@ -0,0 +1,43 @@ +package tdd; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Balls { + List balls; + + public Balls(List balls) { + isValid(balls); + this.balls = mapBalls(balls); + } + + private static List mapBalls(List balls) { + return IntStream.range(0, balls.size()) + .mapToObj(i -> new Ball(i + 1, balls.get(i))) + .collect(Collectors.toList()); + } + + private void isValid(List balls) { + if (balls.size() != 3) { + throw new IllegalArgumentException("잘못 입력"); + } + } + + public BallStatus play(Ball ball) { + return this.balls.stream() + .map(answer -> answer.play(ball)) + .filter(ballStatus -> ballStatus != BallStatus.NOTHING) + .findFirst() + .orElse(BallStatus.NOTHING); + } + + public PlayerResult play(List userInput){ + List mappedBalls = mapBalls(userInput); + PlayerResult result = new PlayerResult(); + for (Ball mappedBall : mappedBalls) { + result.report(play(mappedBall)); + } + return result; + } +} diff --git a/src/main/java/tdd/PlayerResult.java b/src/main/java/tdd/PlayerResult.java new file mode 100644 index 000000000..aa0026968 --- /dev/null +++ b/src/main/java/tdd/PlayerResult.java @@ -0,0 +1,19 @@ +package tdd; + +public class PlayerResult { + private int strikeCount = 0; + private int ballCount = 0; + + public int getBall() { + return ballCount; + } + + public int getStrike(){ + return strikeCount; + } + + public void report(BallStatus result) { + if (result.isBall()) ballCount += 1; + if (result.isStrike()) strikeCount += 1; + } +} diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java new file mode 100644 index 000000000..1df4b32a8 --- /dev/null +++ b/src/test/java/StringCalculatorTest.java @@ -0,0 +1,81 @@ +import baseboll.StringCalculator; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class StringCalculatorTest { + static StringCalculator sc; + @BeforeAll + static void init(){ + sc = new StringCalculator(); + } + + @ParameterizedTest + @ValueSource(strings = {"1 * 3 / 2", "1 * 2 * 3 * 4"}) + void toStringArray(String s) { + String[] stringArray = sc.toStringArray(s); + + assertThat(stringArray).contains("*"); + } + + @ParameterizedTest + @CsvSource(value = {"1:3", "2:2", "3:1"}, delimiter = ':') + void add(int a, int b) { + int added = sc.add(a, b); + + assertThat(added).isEqualTo(4); + } + + @ParameterizedTest + @CsvSource(value = {"15:13", "4:2", "3:1"}, delimiter = ':') + void subtract(int a, int b) { + int subtracted = sc.subtract(a, b); + + assertThat(subtracted).isEqualTo(2); + } + + @ParameterizedTest + @CsvSource(value = {"1:8", "4:2", "2:4"}, delimiter = ':') + void multiply(int a, int b) { + int multiplied = sc.multiply(a, b); + + assertThat(multiplied).isEqualTo(8); + } + + @ParameterizedTest + @CsvSource(value = {"4:2", "8:4", "16:8"}, delimiter = ':') + void divideSuccess(int a, int b) { + int divided = sc.divide(a, b); + assertThat(divided).isEqualTo(2); + } + + @ParameterizedTest + @CsvSource(value = {"10:0", "3:0"}, delimiter = ':') + void divideFailByDivideBy0(int a, int b){ + assertThatThrownBy(() -> sc.divide(a, b)); + } + + @ParameterizedTest + @CsvSource(value = {"3:5:*", "15:0:-", "30:2:/", "8:7:+"}, delimiter = ':') + void calculateSuccess(int a, int b, String operator) { + int calculate = sc.calculate(a, b, operator); + assertThat(calculate).isEqualTo(15); + } + + @ParameterizedTest + @CsvSource(value = {"3:5:음", "15:0:오", "30:2:아", "8:7:예", "1:1:?"}, delimiter = ':') + void calculateFailByOperator(int a, int b, String operator){ + assertThatThrownBy(() -> sc.calculate(a, b, operator)); + } + + @ParameterizedTest + @ValueSource(strings = {"1 * 3 * 5", "5 * 3 * 1", "10 + 10 - 5"}) + void calculateString(String s) { + int calculated = sc.calculateString(s); + assertThat(calculated).isEqualTo(15); + } +} \ No newline at end of file diff --git a/src/test/java/baseboll/checker/CheckerTest.java b/src/test/java/baseboll/checker/CheckerTest.java new file mode 100644 index 000000000..7bd9032f5 --- /dev/null +++ b/src/test/java/baseboll/checker/CheckerTest.java @@ -0,0 +1,79 @@ +package baseboll.checker; + + +import baseboll.myTrial.second.checker.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CheckerTest { + @Test + void nothingCheckerTest(){ + NothingChecker nothingChecker = new NothingChecker(); + boolean nothing = nothingChecker.isNothing(0, 0); + assertTrue(nothing); + nothing = nothingChecker.isNothing(1,2); + assertFalse(nothing); + } + + @Test + void correctCheckerTest(){ + CorrectChecker correctChecker = new CorrectChecker(); + String input = "123"; + String answer = "123"; + boolean correct = correctChecker.isCorrect(input, answer); + assertTrue(correct); + correct = correctChecker.isCorrect(input, "125"); + assertFalse(correct); + } + + @Test + void strikerCheckerTest(){ + StrikeChecker strikeChecker = new StrikeChecker(); + int strike = strikeChecker.countStrike("123", "128"); + assertEquals(2, strike); + } + + @Test + void ballCheckerTest(){ + BallChecker ballChecker = new BallChecker(); + int ball = ballChecker.countBall("123", "312", 0); + assertEquals(3, ball); + } + + @Test + void gameCheckerCorrectTest(){ + GameChecker gameChecker = new GameChecker(); + String input = "123"; + String answer = "123"; + String checked = gameChecker.check(input, answer); + assertEquals("정답", checked); + } + + @Test + void gameCheckerStrikeTest(){ + GameChecker gameChecker = new GameChecker(); + String input = "126"; + String answer = "123"; + String checked = gameChecker.check(input, answer); + assertEquals("2스트라이크", checked); + } + + @Test + void gameCheckerStrikeAndBallTest(){ + GameChecker gameChecker = new GameChecker(); + String input = "132"; + String answer = "123"; + String checked = gameChecker.check(input, answer); + assertEquals("1스트라이크2볼", checked); + } + + @Test + void gameCheckerNothingTest(){ + GameChecker gameChecker = new GameChecker(); + String input = "789"; + String answer = "123"; + String checked = gameChecker.check(input, answer); + assertEquals("낫싱", checked); + } +} \ No newline at end of file diff --git a/src/test/java/study/SetTest.java b/src/test/java/study/SetTest.java new file mode 100644 index 000000000..c57db4539 --- /dev/null +++ b/src/test/java/study/SetTest.java @@ -0,0 +1,51 @@ +package study; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SetTest { + private Set numbers; + + private Set anotherNumbers; + @BeforeEach + void setUp() { + numbers = new HashSet<>(); + numbers.add(1); + numbers.add(1); + numbers.add(2); + numbers.add(3); + + anotherNumbers = new HashSet<>(); + anotherNumbers.add(4); + anotherNumbers.add(5); + } + + // Test Case 구현 + @Test + @DisplayName("Set.size() 매서드가 셋의 크기를 반환함을 테스트") + void size(){ + int size = numbers.size(); + assertThat(size).isEqualTo(3); + } + + @ParameterizedTest + @ValueSource(ints = {1, 2, 3}) + void simpleContains(int setNumbers){ + assertThat(numbers).contains(setNumbers); + } + + @ParameterizedTest + @CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':') + void contains(int pass, boolean notPass){ + assertThat(numbers.contains(pass)).isEqualTo(notPass); + } +} \ No newline at end of file diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java index 43e47d90b..9b5eb3621 100644 --- a/src/test/java/study/StringTest.java +++ b/src/test/java/study/StringTest.java @@ -1,8 +1,10 @@ package study; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class StringTest { @Test @@ -10,4 +12,31 @@ void replace() { String actual = "abc".replace("b", "d"); assertThat(actual).isEqualTo("adc"); } + + @Test + void split(){ + String actual = "1,2"; + String[] split = actual.split(","); + assertThat(split).contains("1").contains("2"); // 1 + assertThat(split).containsExactly("1", "2"); // 2 + } + + @Test + void substring(){ + String actual = "(1,2)"; + String substring = actual.substring(1, actual.length() - 1); + assertThat(substring).isEqualTo("1,2"); + } + + @Test + @DisplayName("String.charAt 매서드에서 유효하지 않은 인덱스를 인자로 준 경우") + void charAt(){ + String actual = "abc"; + int idx = 3; + assertThatThrownBy(() -> { + actual.charAt(idx); + }) + .isInstanceOf(StringIndexOutOfBoundsException.class) + .hasMessageContaining("String index out of range: " + idx);; + } } diff --git a/src/test/java/tdd/BallTest.java b/src/test/java/tdd/BallTest.java new file mode 100644 index 000000000..3132fd186 --- /dev/null +++ b/src/test/java/tdd/BallTest.java @@ -0,0 +1,31 @@ +package tdd; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BallTest { + static Ball comBall; + @BeforeEach + void comBall(){ + comBall = new Ball(1,1); + } + @Test + void nothing(){ + Ball userBall = new Ball(1,9); + assertThat(comBall.play(userBall)).isEqualTo(BallStatus.NOTHING); + } + + @Test + void ball(){ + Ball userBall = new Ball(2,1); + assertThat(comBall.play(userBall)).isEqualTo(BallStatus.BALL); + } + + @Test + void strike(){ + Ball userBall = new Ball(1,1); + assertThat(comBall.play(userBall)).isEqualTo(BallStatus.STRIKE); + } +} diff --git a/src/test/java/tdd/BallsTest.java b/src/test/java/tdd/BallsTest.java new file mode 100644 index 000000000..1c2ad7426 --- /dev/null +++ b/src/test/java/tdd/BallsTest.java @@ -0,0 +1,47 @@ +package tdd; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BallsTest { + static Balls balls; + @BeforeEach + void setBall(){ + balls = new Balls(Arrays.asList(1, 2, 3)); + } + + @Test + void play_1Ball1Strike(){ + PlayerResult result = balls.play(Arrays.asList(1,3,6)); + assertThat(result.getBall()).isEqualTo(1); + assertThat(result.getStrike()).isEqualTo(1); + } + @Test + void play_Nothing(){ + PlayerResult result = balls.play(Arrays.asList(4,5,6)); + assertThat(result.getBall()).isEqualTo(0); + assertThat(result.getStrike()).isEqualTo(0); + } + @Test + void nothing(){ + Ball ball = new Ball(1, 9); + BallStatus status = balls.play(ball); + assertThat(status).isEqualTo(BallStatus.NOTHING); + } + + @Test + void ball(){ + Ball ball = new Ball(1, 3); + assertThat(balls.play(ball)).isEqualTo(BallStatus.BALL); + } + + @Test + void strike(){ + Ball ball = new Ball(1, 1); + assertThat(balls.play(ball)).isEqualTo(BallStatus.STRIKE); + } +}