Skip to content

Commit dd87d38

Browse files
committed
feat: LadderResult 구현
1 parent 92fd74d commit dd87d38

11 files changed

+286
-6
lines changed

src/main/java/ladder/LadderMain.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,35 @@
88

99
public class LadderMain {
1010

11+
private static final String LADDER_RESULT_CONFIRM_COMMAND_ALL = "all";
12+
private static final String LADDER_RESULT_CONFIRM_COMMAND_BREAK = "-1";
13+
1114
public static void main(String[] args) {
1215
final Participants participants = new Participants(InputView.inputParticipantNames()
1316
.stream()
1417
.map(Participant::new)
1518
.collect(Collectors.toList()));
19+
final LadderResults ladderResults = new LadderResults(InputView.inputLadderResults()
20+
.stream()
21+
.map(LadderResult::new)
22+
.collect(Collectors.toList()));
1623
final LadderHeight ladderHeight = new LadderHeight(InputView.inputLadderHeight());
1724
final Ladder ladder = LadderFactory.create(participants, ladderHeight);
18-
ResultView.print(ladder);
25+
ResultView.printLadder(ladder, ladderResults);
26+
27+
while (true) {
28+
final String targetParticipantName = InputView.inputTargetLadderParticipantName();
29+
if (LADDER_RESULT_CONFIRM_COMMAND_ALL.equalsIgnoreCase(targetParticipantName)) {
30+
ResultView.printAllLadderResults(ladder, ladderResults);
31+
continue;
32+
}
33+
34+
if (LADDER_RESULT_CONFIRM_COMMAND_BREAK.equalsIgnoreCase(targetParticipantName)) {
35+
ResultView.printConfirmationEndMessage();
36+
break;
37+
}
38+
39+
ResultView.printLadderResult(ladder, ladderResults, new Participant(targetParticipantName));
40+
}
1941
}
2042
}

src/main/java/ladder/domain/Ladder.java

+49-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ladder.domain;
22

33
import java.util.Objects;
4+
import java.util.stream.IntStream;
45

56
public class Ladder {
67

@@ -19,7 +20,7 @@ public Participants getParticipants() {
1920
}
2021

2122
public int getHeight() {
22-
return this.lines.size();
23+
return this.lines.height();
2324
}
2425

2526
public Lines getLines() {
@@ -31,6 +32,53 @@ public Line getLine(final int index) {
3132
.get(index);
3233
}
3334

35+
public int getLastVerticalLineIndex(final Participant participant) {
36+
return this.getLastVerticalLineIndex(this.participants.indexOf(participant));
37+
}
38+
39+
private int getLastVerticalLineIndex(final int firstVerticalLineIndex) {
40+
return IntStream.range(0, this.lines.height())
41+
.reduce(firstVerticalLineIndex, (curVerticalLineIndex, curLineHeight) -> {
42+
if (canMoveLeft(curVerticalLineIndex, curLineHeight)) {
43+
return curVerticalLineIndex - 1;
44+
}
45+
46+
if (canMoveRight(curVerticalLineIndex, curLineHeight)) {
47+
return curVerticalLineIndex + 1;
48+
}
49+
50+
return curVerticalLineIndex;
51+
});
52+
}
53+
54+
private boolean canMoveLeft(final int verticalLineIndex, final int curLineHeight) {
55+
if (isFirstVerticalLineIndex(verticalLineIndex)) {
56+
return false;
57+
}
58+
59+
return this.lines.getLine(curLineHeight)
60+
.isConnected(verticalLineIndex - 1);
61+
}
62+
63+
private boolean canMoveRight(final int verticalLineIndex, final int curLineHeight) {
64+
if (isLastVerticalLineIndex(verticalLineIndex)) {
65+
return false;
66+
}
67+
68+
return this.lines.getLine(curLineHeight)
69+
.isConnected(verticalLineIndex);
70+
}
71+
72+
73+
private boolean isFirstVerticalLineIndex(final int verticalLineIndex) {
74+
return verticalLineIndex == 0;
75+
}
76+
77+
78+
private boolean isLastVerticalLineIndex(final int verticalLineIndex) {
79+
return verticalLineIndex == this.lines.width();
80+
}
81+
3482
private void validateOrThrow(final Participants participants, final Lines lines) {
3583
if (Objects.isNull(participants) || Objects.isNull(lines)) {
3684
throw new IllegalArgumentException("참가자나 사다리 라인은 null이 될 수 없습니다.");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package ladder.domain;
2+
3+
import java.util.Objects;
4+
5+
public class LadderResult {
6+
7+
private final String value;
8+
9+
public LadderResult(final String value) {
10+
validateOrThrow(value);
11+
12+
this.value = value;
13+
}
14+
15+
private void validateOrThrow(final String value) {
16+
if (Objects.isNull(value) || value.isBlank()) {
17+
throw new IllegalArgumentException("사다리 결과는 빈 문자열일 수 없습니다.");
18+
}
19+
}
20+
21+
public String getValue() {
22+
return this.value;
23+
}
24+
25+
@Override
26+
public boolean equals(Object o) {
27+
if (this == o) return true;
28+
if (o == null || getClass() != o.getClass()) return false;
29+
LadderResult that = (LadderResult) o;
30+
return Objects.equals(value, that.value);
31+
}
32+
33+
@Override
34+
public int hashCode() {
35+
return Objects.hash(value);
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package ladder.domain;
2+
3+
import java.util.List;
4+
import java.util.Objects;
5+
6+
public class LadderResults {
7+
8+
private final List<LadderResult> ladderResults;
9+
10+
public LadderResults(final List<LadderResult> ladderResults) {
11+
validateOrThrow(ladderResults);
12+
13+
this.ladderResults = ladderResults;
14+
}
15+
16+
private void validateOrThrow(final List<LadderResult> ladderResults) {
17+
if (Objects.isNull(ladderResults) || ladderResults.isEmpty()) {
18+
throw new IllegalArgumentException("빈 사다리 결과는 생성될 수 없습니다.");
19+
}
20+
}
21+
22+
public List<LadderResult> getLadderResults() {
23+
return this.ladderResults;
24+
}
25+
26+
public LadderResult get(final int index) {
27+
return this.ladderResults.get(index);
28+
}
29+
30+
@Override
31+
public boolean equals(Object o) {
32+
if (this == o) return true;
33+
if (o == null || getClass() != o.getClass()) return false;
34+
LadderResults that = (LadderResults) o;
35+
return Objects.equals(ladderResults, that.ladderResults);
36+
}
37+
38+
@Override
39+
public int hashCode() {
40+
return Objects.hash(ladderResults);
41+
}
42+
}

src/main/java/ladder/domain/Lines.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,23 @@ public Lines(final List<Line> lines) {
1313
this.lines = lines;
1414
}
1515

16-
public int size() {
16+
public int height() {
1717
return this.lines.size();
1818
}
1919

20+
public int width() {
21+
return this.lines.get(0)
22+
.size();
23+
}
24+
2025
public List<Line> getLines() {
2126
return this.lines;
2227
}
2328

29+
public Line getLine(final int index) {
30+
return this.lines.get(index);
31+
}
32+
2433
private void validateLinesOrThrow(final List<Line> lines) {
2534
if (Objects.isNull(lines) || lines.isEmpty()) {
2635
throw new IllegalArgumentException("최소 1개 이상의 사다리 라인이 필요합니다.");

src/main/java/ladder/domain/Participants.java

+4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public int size() {
3030
return this.participants.size();
3131
}
3232

33+
public int indexOf(final Participant participant) {
34+
return this.participants.indexOf(participant);
35+
}
36+
3337
private void validateOrThrow(final List<Participant> participants) {
3438
if (Objects.isNull(participants) || participants.size() == 0) {
3539
throw new IllegalArgumentException("참가자는 최소 1명 이상이여야 합니다.");

src/main/java/ladder/view/InputView.java

+15
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,19 @@ public static int inputLadderHeight() {
2727
SCANNER.skip(System.lineSeparator());
2828
return intLadderHeight;
2929
}
30+
31+
public static List<String> inputLadderResults() {
32+
System.out.println();
33+
System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)");
34+
return Stream.of(SCANNER.nextLine()
35+
.split(","))
36+
.map(String::trim)
37+
.collect(Collectors.toList());
38+
}
39+
40+
public static String inputTargetLadderParticipantName() {
41+
System.out.println();
42+
System.out.println("결과를 보고 싶은 사람은?");
43+
return SCANNER.nextLine();
44+
}
3045
}

src/main/java/ladder/view/ResultView.java

+36-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package ladder.view;
22

33
import ladder.domain.Ladder;
4+
import ladder.domain.LadderResult;
5+
import ladder.domain.LadderResults;
46
import ladder.domain.Participant;
57

68
import java.util.stream.Collectors;
@@ -14,9 +16,9 @@ public class ResultView {
1416
private ResultView() {
1517
}
1618

17-
public static void print(final Ladder ladder) {
19+
public static void printLadder(final Ladder ladder, final LadderResults ladderResults) {
1820
System.out.println();
19-
System.out.println("실행결과");
21+
System.out.println("사다리 결과");
2022
System.out.println();
2123

2224
System.out.print(" ");
@@ -46,9 +48,41 @@ public static void print(final Ladder ladder) {
4648
}
4749
System.out.println();
4850
}
51+
52+
System.out.println(ladderResults.getLadderResults()
53+
.stream()
54+
.map(LadderResult::getValue)
55+
.map(name -> addLeftPaddingString(name, Participant.MAXIMUM_NAME_LENGTH))
56+
.collect(Collectors.joining(" ")));
57+
}
58+
59+
public static void printAllLadderResults(final Ladder ladder, final LadderResults ladderResults) {
60+
System.out.println();
61+
System.out.println("실행 결과");
62+
ladder.getParticipants()
63+
.getParticipants()
64+
.forEach(participant ->
65+
System.out.printf("%s : %s%n",
66+
participant.getName(),
67+
ladderResults.get(ladder.getLastVerticalLineIndex(participant))
68+
.getValue()));
69+
}
70+
71+
public static void printLadderResult(final Ladder ladder,
72+
final LadderResults ladderResults,
73+
final Participant targetParticipant) {
74+
System.out.println();
75+
System.out.println("실행 결과");
76+
System.out.println(ladderResults.get(ladder.getLastVerticalLineIndex(targetParticipant))
77+
.getValue());
4978
}
5079

5180
private static String addLeftPaddingString(final String string, final int size) {
5281
return String.format("%" + size + "s", string);
5382
}
83+
84+
public static void printConfirmationEndMessage() {
85+
System.out.println();
86+
System.out.println("-1을 입력하여 종료합니다.");
87+
}
5488
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ladder.domain;
2+
3+
import org.assertj.core.api.Assertions;
4+
import org.junit.jupiter.api.DisplayName;
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.NullSource;
8+
import org.junit.jupiter.params.provider.ValueSource;
9+
10+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
11+
12+
public class LadderResultTest {
13+
14+
@DisplayName("생성")
15+
@Test
16+
void create() {
17+
LadderResult ladderResult = new LadderResult("꽝");
18+
Assertions.assertThat(ladderResult)
19+
.isEqualTo(new LadderResult("꽝"));
20+
}
21+
22+
@ParameterizedTest(name = "생성 실패 - {0}")
23+
@NullSource
24+
@ValueSource(strings = {"", " "})
25+
void invalid(final String input) {
26+
assertThatThrownBy(() -> new LadderResult(input))
27+
.isInstanceOf(IllegalArgumentException.class)
28+
.hasMessageContaining("사다리 결과는 빈 문자열일 수 없습니다.");
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package ladder.domain;
2+
3+
import org.junit.jupiter.api.DisplayName;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.List;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
10+
import static org.junit.jupiter.api.Assertions.assertAll;
11+
12+
public class LadderResultsTest {
13+
14+
@DisplayName("생성")
15+
@Test
16+
void create() {
17+
LadderResults ladderResults = new LadderResults(List.of(new LadderResult("꽝")));
18+
assertThat(ladderResults).isEqualTo(new LadderResults(List.of(new LadderResult("꽝"))));
19+
}
20+
21+
@DisplayName("실패")
22+
@Test
23+
void invalid() {
24+
assertThatThrownBy(() -> new LadderResults(List.of()))
25+
.isInstanceOf(IllegalArgumentException.class)
26+
.hasMessageContaining("빈 사다리 결과는 생성될 수 없습니다.");
27+
}
28+
29+
@DisplayName("사다리 결과 가져오기")
30+
@Test
31+
void get() {
32+
LadderResults ladderResults = new LadderResults(
33+
List.of(new LadderResult("1000"), new LadderResult("2000")));
34+
assertAll(
35+
() -> assertThat(ladderResults.get(0)).isEqualTo(new LadderResult("1000")),
36+
() -> assertThat(ladderResults.get(1)).isEqualTo(new LadderResult("2000"))
37+
);
38+
}
39+
}

src/test/java/ladder/domain/LadderTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ void create() {
2525
() -> assertThat(ladder.getParticipants()
2626
.size()).isEqualTo(4),
2727
() -> assertThat(ladder.getLines()
28-
.size()).isEqualTo(1)
28+
.height()).isEqualTo(1)
2929
);
3030
}
3131

0 commit comments

Comments
 (0)