Skip to content

Commit 8b8d124

Browse files
committed
숫자야구 테스트 코드 작성
1 parent 30c06a8 commit 8b8d124

File tree

8 files changed

+144
-12
lines changed

8 files changed

+144
-12
lines changed

number-baseball/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
dependencies {
2+
testImplementation(platform("org.junit:junit-bom:5.11.3"))
3+
testImplementation("org.junit.jupiter:junit-jupiter")
4+
testImplementation("org.mockito:mockito-core:5.14.2")
5+
testImplementation("org.assertj:assertj-core:3.26.3")
6+
}

number-baseball/src/main/java/io/github/gunkim/baseball/Application.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.github.gunkim.baseball.application.ConsoleInput;
44
import io.github.gunkim.baseball.application.ConsoleOutput;
5+
import io.github.gunkim.baseball.application.DefaultInputScanner;
56
import io.github.gunkim.baseball.application.RandomNumberInput;
67
import io.github.gunkim.baseball.domain.BaseBallGame;
78

@@ -11,7 +12,7 @@ public class Application {
1112

1213
public static void main(final String[] args) {
1314
new BaseBallGame(
14-
new ConsoleInput(TOTAL_BALL_COUNT),
15+
new ConsoleInput(new DefaultInputScanner(), TOTAL_BALL_COUNT),
1516
new RandomNumberInput(TOTAL_BALL_COUNT),
1617
new ConsoleOutput(),
1718
TOTAL_BALL_COUNT,

number-baseball/src/main/java/io/github/gunkim/baseball/application/ConsoleInput.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,28 @@
44
import io.github.gunkim.baseball.domain.BallNumbers;
55
import io.github.gunkim.baseball.domain.Input;
66

7-
import java.util.Scanner;
8-
97
public class ConsoleInput implements Input {
10-
private static final Scanner SCANNER = new Scanner(System.in);
11-
8+
private final InputScanner inputScanner;
129
private final int ballCount;
1310

14-
public ConsoleInput(final int ballCount) {
11+
public ConsoleInput(InputScanner inputScanner, int ballCount) {
12+
this.inputScanner = inputScanner;
1513
this.ballCount = ballCount;
1614
}
1715

1816
@Override
1917
public BallNumbers ballNumbers() {
20-
final String input = SCANNER.nextLine();
18+
final String input = inputScanner.input();
19+
20+
//TODO: 입력한 값에 대한 유효성 검증은 여기서 처리하는게 맞을까? 혹은 도메인 로직일까?
2121
if (input.length() != ballCount) {
22-
throw new IllegalArgumentException("3자리 숫자를 입력해주세요.");
22+
throw new IllegalArgumentException("%d자리 숫자를 입력해주세요. 현재: %s".formatted(ballCount, input));
2323
}
2424
if (input.chars().distinct().count() != ballCount) {
25-
throw new IllegalArgumentException("중복되지 않는 숫자를 입력해주세요.");
25+
throw new IllegalArgumentException("중복되지 않는 숫자를 입력해주세요. 현재: %s".formatted(input));
2626
}
2727
if (input.chars().anyMatch(c -> c < '1' || c > '9')) {
28-
throw new IllegalArgumentException("1부터 9까지의 숫자를 입력해주세요.");
28+
throw new IllegalArgumentException("1부터 9까지의 숫자를 입력해주세요. 현재: %s".formatted(input));
2929
}
3030
return new BallNumbers(input.chars()
3131
.mapToObj(c -> (char) c)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.gunkim.baseball.application;
2+
3+
import java.util.Scanner;
4+
5+
public class DefaultInputScanner implements InputScanner {
6+
private static final Scanner SCANNER = new Scanner(System.in);
7+
8+
@Override
9+
public String input() {
10+
return SCANNER.nextLine();
11+
}
12+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package io.github.gunkim.baseball.application;
2+
3+
@FunctionalInterface
4+
public interface InputScanner {
5+
String input();
6+
}

number-baseball/src/main/java/io/github/gunkim/baseball/domain/BallNumbers.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ public BallNumbers(final List<BallNumber> ballNumbers) {
1212
}
1313

1414
public Result match(final BallNumbers otherBalls) {
15-
int strike = 0, ball = 0;
15+
int strike = 0;
16+
int ball = 0;
1617

1718
for (int i = 0; i < this.ballNumbers.size(); i++) {
1819
final BallNumber myBall = this.ballNumbers.get(i);
1920
final BallNumber otherBall = otherBalls.ballNumbers.get(i);
2021

2122
if (myBall.equals(otherBall)) {
2223
strike++;
23-
} else if (this.hasBallNumber(myBall)) {
24+
} else if (hasBallNumber(myBall)) {
2425
ball++;
2526
}
2627
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.github.gunkim.baseball.application;
2+
3+
import org.junit.jupiter.api.DisplayName;
4+
import org.junit.jupiter.api.Test;
5+
6+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
7+
8+
@DisplayName("ConsoleInput은")
9+
class ConsoleInputTest {
10+
@Test
11+
void 입력한_숫자가_세자리가_아닐_경우_예외가_발생한다() {
12+
final InputScanner mockInputScanner = () -> "1234";
13+
final ConsoleInput consoleInput = new ConsoleInput(mockInputScanner, 3);
14+
15+
assertThatThrownBy(consoleInput::ballNumbers)
16+
.isInstanceOf(IllegalArgumentException.class)
17+
.hasMessage("3자리 숫자를 입력해주세요. 현재: 1234");
18+
}
19+
20+
@Test
21+
void 중복된_숫자를_입력할_경우_예외가_발생한다() {
22+
final InputScanner mockInputScanner = () -> "111";
23+
final ConsoleInput consoleInput = new ConsoleInput(mockInputScanner, 3);
24+
25+
assertThatThrownBy(consoleInput::ballNumbers)
26+
.isInstanceOf(IllegalArgumentException.class)
27+
.hasMessage("중복되지 않는 숫자를 입력해주세요. 현재: 111");
28+
}
29+
30+
@Test
31+
void test() {
32+
final InputScanner mockInputScanner = () -> "abc";
33+
final ConsoleInput consoleInput = new ConsoleInput(mockInputScanner, 3);
34+
35+
assertThatThrownBy(consoleInput::ballNumbers)
36+
.isInstanceOf(IllegalArgumentException.class)
37+
.hasMessage("1부터 9까지의 숫자를 입력해주세요. 현재: abc");
38+
}
39+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.github.gunkim.baseball.domain;
2+
3+
import org.junit.jupiter.api.DisplayName;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.List;
7+
import java.util.stream.Stream;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
@DisplayName("BallNumbers는")
12+
class BallNumbersTest {
13+
14+
@Test
15+
void 모든_숫자가_같다면_올_스트라이크_노_낫싱이다() {
16+
final List<BallNumber> numbers = Stream.of(1, 2, 3)
17+
.map(BallNumber::of)
18+
.toList();
19+
20+
final var totalBallCount = 3;
21+
final var ballNumbers = new BallNumbers(numbers);
22+
final var otherBallNumbers = new BallNumbers(numbers);
23+
24+
final Result result = ballNumbers.match(otherBallNumbers);
25+
26+
assertAll(
27+
() -> assertTrue(result.isAllStrike(totalBallCount)),
28+
() -> assertFalse(result.isNothing())
29+
);
30+
}
31+
32+
@Test
33+
void 모든_숫자가_다르다면_낫싱_노_스트라이크이다() {
34+
final var ballNumbers = new BallNumbers(Stream.of(1, 2, 3)
35+
.map(BallNumber::of)
36+
.toList());
37+
final var otherBallNumbers = new BallNumbers(Stream.of(4, 5, 6)
38+
.map(BallNumber::of)
39+
.toList());
40+
41+
final Result result = ballNumbers.match(otherBallNumbers);
42+
43+
assertAll(
44+
() -> assertTrue(result.isNothing()),
45+
() -> assertFalse(result.isAllStrike(3))
46+
);
47+
}
48+
49+
@Test
50+
public void 숫자123과_숫자231은_1스트라이크_2볼이다() {
51+
final var ballNumbers = new BallNumbers(Stream.of(1, 2, 3)
52+
.map(BallNumber::of)
53+
.toList());
54+
final var otherBallNumbers = new BallNumbers(Stream.of(2, 3, 1)
55+
.map(BallNumber::of)
56+
.toList());
57+
58+
final Result result = ballNumbers.match(otherBallNumbers);
59+
60+
assertAll(
61+
() -> assertEquals(1, result.strike()),
62+
() -> assertEquals(2, result.ball()),
63+
() -> assertFalse(result.isNothing()),
64+
() -> assertFalse(result.isAllStrike(3))
65+
);
66+
}
67+
}

0 commit comments

Comments
 (0)