[nextstep_TDD_클린코드] 숫자야구게임 구현 TDD 연습(1)

봄도둑·2023년 1월 31일
0

nextstep에서 진행하는 자바 플레이그라운드 with TDD, 클린코드 학습 내용입니다. 혼자 작성해본 연습 코드, 피드백 받은 내용을 정리합니다. 해당 코드를 더 나은 방향으로 개선할 수 있다면 댓글로 조언 꼭 부탁드립니다!

public class numberBaseBallTest {

    @Test
    public void 무작위_세자리_수_문자열_생성하기() {
        int fistRandomNumber = (int) (Math.random() * (1 + 9 - 1)) + 1;
        int secondRandomNumber = (int) (Math.random() * (1 + 9 - 1)) + 1;
        int thirdRandomNumber = (int) (Math.random() * (1 + 9 - 1)) + 1;
        while (secondRandomNumber == fistRandomNumber) {
            secondRandomNumber = (int) (Math.random() * (1 + 9 - 1));
        }
        while (thirdRandomNumber == fistRandomNumber || thirdRandomNumber == secondRandomNumber) {
            thirdRandomNumber = (int) (Math.random() * (1 + 9 - 1));
        }

        Integer[] numberArray = {fistRandomNumber, secondRandomNumber, thirdRandomNumber};

        System.out.println(fistRandomNumber);
        System.out.println(secondRandomNumber);
        System.out.println(thirdRandomNumber);

        assertThat(numberArray).containsExactly(fistRandomNumber, secondRandomNumber, thirdRandomNumber);
    }

    //이 부분은 일급 컬렉션으로 처리하자 -> validation check
    @ParameterizedTest
    @ValueSource(strings = {"123d"})
    public void 입력받은_값이_모두_숫자인지_확인하기(String inputValue) {
        boolean isNumberFormat = false;

        try {
            Integer.parseInt(inputValue);
            isNumberFormat = true;
        } catch (NumberFormatException e) {
        }

        assertThat(isNumberFormat).isTrue();
    }

    @ParameterizedTest
    @ValueSource(strings = {"12323"})
    public void 입력받은_수가_3자리인지_확인하기(String inputValue) {
        boolean isThreeDigitNumber = false;
        System.out.println(inputValue.length());

        if (inputValue.length() != 3) {
            assertThat(isThreeDigitNumber).isFalse();
            return;
        }

        isThreeDigitNumber = true;
        assertThat(isThreeDigitNumber).isTrue();
    }

    @ParameterizedTest
    @ValueSource(strings = {"123"})
    public void 입력된_세_자리_수_배열로_변경하기(String inputValue) {
        ArrayList<Integer> threeDigIntList = new ArrayList<>();
        for (int i = 0; i < inputValue.length(); i++) {
            try {
                threeDigIntList.add(Integer.parseInt(String.valueOf(inputValue.charAt(i))));
            } catch (NumberFormatException e) {
                e.getMessage();
            }
        }

        assertThat(threeDigIntList).containsExactly(1, 2, 3);
    }

    @ParameterizedTest
    @ValueSource(ints = {2})
    public void 볼_체크하기(int inputValue) {
        Integer[] randomThreeDigNumberList = {4, 3, 1};
        int ballCount = 0;
        //람다 캡처링 정리 하기
        /*Arrays.stream(randomThreeDigNumberList)
                .filter(compareNumber -> inputValue == compareNumber)
                .forEach(compareNumber -> strikeCount++);*/

        for (Integer compareNumber : randomThreeDigNumberList) {
            if (inputValue != compareNumber) {
                continue;
            }

            ballCount++;
        }

        assertThat(ballCount).isEqualTo(0);
    }

    @ParameterizedTest
    @CsvSource({"3, 1"})
    public void 스트라이크_체크하기(ArgumentsAccessor argumentsAccessor) {
        Integer[] randomThreeDigNumberList = {4, 3, 1};
        StrikeParam strikeParam = new StrikeParam(argumentsAccessor.getInteger(0), argumentsAccessor.getInteger(1));
        int strikeCount = 0;

        for (int i = 0; i < randomThreeDigNumberList.length; i++) {
            if (i != strikeParam.getIndex() || randomThreeDigNumberList[i] != strikeParam.getInputNumber()) {
                continue;
            }

            strikeCount++;
            break;
        }

        assertThat(strikeCount).isEqualTo(1);
    }

    @ParameterizedTest
    @CsvSource({"1, 1"})
    public void 볼_스트라이크_분기하기(ArgumentsAccessor argumentsAccessor) {
        Integer[] randomThreeDigNumberList = {4, 3, 1};
        StrikeParam strikeParam = new StrikeParam(argumentsAccessor.getInteger(0), argumentsAccessor.getInteger(1));
        int strikeCount = 0;
        int ballCount = 0;

        for (int i = 0; i < randomThreeDigNumberList.length; i++) {
            if(strikeParam.getInputNumber() != randomThreeDigNumberList[i]) {
                continue;
            }

            if (strikeParam.getIndex() == i) {
                strikeCount++;
                break;
            }

            ballCount++;
        }

        assertThat(ballCount).isEqualTo(1);
        assertThat(strikeCount).isEqualTo(0);
    }
}

아래는 테스트에 사용한 strikeParam 클래스

public class StrikeParam {

    private int inputNumber;
    private int index;

    public StrikeParam(int inputNumber, int index) {
        this.inputNumber = inputNumber;
        this.index = index;
    }

    public StrikeParam() {
    }

    public int getInputNumber() {
        return inputNumber;
    }

    public int getIndex() {
        return index;
    }
}
profile
배워서 내일을 위해 쓰자

0개의 댓글