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;
}
}