From dcabc68a1ba0526c00ded1253d97ac7065444fed Mon Sep 17 00:00:00 2001 From: brody Date: Sun, 20 Apr 2025 18:42:56 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat.=20-=20InputView.java=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80:=20=EC=9E=85=EB=A0=A5=20=EB=8B=B4=EB=8B=B9=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20-=20PersonName.java=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=8B=B4=EB=8B=B9=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/ladder/domain/PersonName.java | 23 ++++++ .../java/nextstep/ladder/view/InputView.java | 72 +++++++++++++++++++ .../ladder/domain/PersonNameTest.java | 36 ++++++++++ 3 files changed, 131 insertions(+) create mode 100644 src/main/java/nextstep/ladder/domain/PersonName.java create mode 100644 src/main/java/nextstep/ladder/view/InputView.java create mode 100644 src/test/java/nextstep/ladder/domain/PersonNameTest.java diff --git a/src/main/java/nextstep/ladder/domain/PersonName.java b/src/main/java/nextstep/ladder/domain/PersonName.java new file mode 100644 index 0000000000..de3fb7a435 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/PersonName.java @@ -0,0 +1,23 @@ +package nextstep.ladder.domain; + +public class PersonName { + public static final int MAX_NAME_LENGTH = 5; + + private String name; + + public PersonName(String name) { + if (name == null || name.isEmpty()) { + throw new IllegalArgumentException("Name cannot be null or empty"); + } + + if (name.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("Name is too long"); + } + + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/nextstep/ladder/view/InputView.java b/src/main/java/nextstep/ladder/view/InputView.java new file mode 100644 index 0000000000..cfd120f26c --- /dev/null +++ b/src/main/java/nextstep/ladder/view/InputView.java @@ -0,0 +1,72 @@ +package nextstep.ladder.view; + +import nextstep.ladder.domain.PersonName; + +import java.util.Arrays; +import java.util.InputMismatchException; +import java.util.Scanner; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + private InputView() { + } + + public static int getPositiveNumberInput(String prompt) { + return getNumberInput(prompt, "0 이상의 정수만 허용됩니다. 다시 입력해 주세요.", + input -> input >= 0); + } + + private static int getNumberInput(String prompt, String errorMessage, Predicate predicate) { + System.out.println(prompt); + + while (true) { + try { + int result = scanner.nextInt(); + + // scanner.nextInt() 는 개행 문자를 제거하지 못해 nextInt 이후 nextLine 으로 개행 제거 + scanner.nextLine(); + + if (predicate.test(result)) { + return result; + } + + System.out.println(errorMessage + " input: " + result); + } catch (InputMismatchException e) { + System.out.println(errorMessage + scanner.nextLine()); + } + } + } + + public static Set getPersonNameInput(String prompt, String delimiter) { + System.out.println(prompt); + while (true) { + String line = scanner.nextLine(); + + String[] split = line.split(delimiter); + if (split.length == 0) { + System.out.println("이름은 하나 이상 입력되어야 합니다. 다시 입력해 주세요."); + continue; + } + + Set result = Arrays.stream(split) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toSet()); + + if (split.length != result.size()) { + System.out.println("이름은 중복될 수 없습니다. 다시 입력해 주세요."); + continue; + } + + if (result.stream().allMatch(s -> s.length() <= PersonName.MAX_NAME_LENGTH)) { + return result; + } + + System.out.println("이름은 최대 5글자까지 사용 가능합니다. 다시 입력해 주세요."); + } + } +} diff --git a/src/test/java/nextstep/ladder/domain/PersonNameTest.java b/src/test/java/nextstep/ladder/domain/PersonNameTest.java new file mode 100644 index 0000000000..2ddb95d3d4 --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/PersonNameTest.java @@ -0,0 +1,36 @@ +package nextstep.ladder.domain; + +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; + +class PersonNameTest { + @DisplayName("사용자 이름 생성") + @Test + public void personName() throws Exception { + assertThat(new PersonName("12345").getName()) + .isEqualTo("12345"); + } + + @DisplayName("사용자 이름 생성 실패, null") + @Test + public void personNameNull() throws Exception { + assertThatThrownBy(() -> new PersonName(null)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("Name cannot be null or empty"); + + assertThatThrownBy(() -> new PersonName("")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("Name cannot be null or empty"); + } + + @DisplayName("사용자 이름 생성 실패, 최대 길이 초과") + @Test + public void personNameMaxLength() throws Exception { + assertThatThrownBy(() -> new PersonName("123456")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("Name is too long"); + } +} \ No newline at end of file From 1d7e209702752f7023ae60ecef939b3cca2bb57a Mon Sep 17 00:00:00 2001 From: brody Date: Sun, 20 Apr 2025 19:11:39 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat.=20-=20LadderLine.java=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EB=9D=BC=EC=9D=B8?= =?UTF-8?q?=20=EC=97=AD=ED=95=A0=20-=20PersonName.java:=20toString=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20LadderLines.java,=20PersonNames.java?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80:=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC?= =?UTF-8?q?=EB=A0=89=EC=85=98=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/ladder/domain/LadderLine.java | 31 ++++++++++++++ .../nextstep/ladder/domain/LadderLines.java | 11 +++++ .../nextstep/ladder/domain/PersonName.java | 9 ++++ .../nextstep/ladder/domain/PersonNames.java | 22 ++++++++++ .../ladder/domain/LadderLineTest.java | 42 +++++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 src/main/java/nextstep/ladder/domain/LadderLine.java create mode 100644 src/main/java/nextstep/ladder/domain/LadderLines.java create mode 100644 src/main/java/nextstep/ladder/domain/PersonNames.java create mode 100644 src/test/java/nextstep/ladder/domain/LadderLineTest.java diff --git a/src/main/java/nextstep/ladder/domain/LadderLine.java b/src/main/java/nextstep/ladder/domain/LadderLine.java new file mode 100644 index 0000000000..418ef1e402 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/LadderLine.java @@ -0,0 +1,31 @@ +package nextstep.ladder.domain; + +import java.util.Iterator; +import java.util.List; + +public class LadderLine { + private final List lines; + + public LadderLine(List lines) { + if (lines == null || lines.isEmpty()) { + throw new IllegalArgumentException("lines cannot be null or empty"); + } + + validateLines(lines); + + this.lines = lines; + } + + private void validateLines(List lines) { + Iterator iterator = lines.iterator(); + boolean prev = iterator.next(); + + while (iterator.hasNext()) { + boolean cur = iterator.next(); + if (prev && cur) { + throw new IllegalArgumentException("Ladder lines cannot be connected continuously."); + } + prev = cur; + } + } +} diff --git a/src/main/java/nextstep/ladder/domain/LadderLines.java b/src/main/java/nextstep/ladder/domain/LadderLines.java new file mode 100644 index 0000000000..d41c65a98e --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/LadderLines.java @@ -0,0 +1,11 @@ +package nextstep.ladder.domain; + +import java.util.List; + +public class LadderLines { + private final List ladderLines; + + public LadderLines(List ladderLines) { + this.ladderLines = ladderLines; + } +} diff --git a/src/main/java/nextstep/ladder/domain/PersonName.java b/src/main/java/nextstep/ladder/domain/PersonName.java index de3fb7a435..062ef02d89 100644 --- a/src/main/java/nextstep/ladder/domain/PersonName.java +++ b/src/main/java/nextstep/ladder/domain/PersonName.java @@ -20,4 +20,13 @@ public PersonName(String name) { public String getName() { return name; } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append(" ".repeat((9 - name.length()) / 2)); + sb.append(name); + sb.append(" ".repeat(9 - sb.length())); + return sb.toString(); + } } diff --git a/src/main/java/nextstep/ladder/domain/PersonNames.java b/src/main/java/nextstep/ladder/domain/PersonNames.java new file mode 100644 index 0000000000..2edfc6967a --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/PersonNames.java @@ -0,0 +1,22 @@ +package nextstep.ladder.domain; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class PersonNames { + private final List personNames; + + public PersonNames(Set personNames) { + this.personNames = personNames.stream() + .map(PersonName::new) + .collect(Collectors.toList()); + } + + @Override + public String toString() { + return personNames.stream() + .map(PersonName::toString) + .collect(Collectors.joining("")); + } +} diff --git a/src/test/java/nextstep/ladder/domain/LadderLineTest.java b/src/test/java/nextstep/ladder/domain/LadderLineTest.java new file mode 100644 index 0000000000..398a43147b --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/LadderLineTest.java @@ -0,0 +1,42 @@ +package nextstep.ladder.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LadderLineTest { + @DisplayName("사다리 라인 정상 연결 테스트") + @Test + public void connectLine() throws Exception { + assertThat(new LadderLine(List.of(true,false,true))) + .isNotNull(); + } + + @DisplayName("사다리 라인 null or empty") + @Test + public void invalidConnectLineNullOrEmpty() throws Exception { + assertThatThrownBy(() -> new LadderLine(List.of())) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("lines cannot be null or empty"); + + assertThatThrownBy(() -> new LadderLine(null)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("lines cannot be null or empty"); + } + + @DisplayName("사다리 라인 연속해서 연결되어 생성 실패") + @Test + public void invalidConnectLine() throws Exception { + assertThatThrownBy(() -> new LadderLine(List.of(true,true,false))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("Ladder lines cannot be connected continuously."); + + assertThatThrownBy(() -> new LadderLine(List.of(false,true,true))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("Ladder lines cannot be connected continuously."); + } +} \ No newline at end of file From c4875484b6cd5afa16d8f5194d8c6e41dcee80ed Mon Sep 17 00:00:00 2001 From: brody Date: Sun, 20 Apr 2025 19:40:43 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat.=20-=20LadderLine.java=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EB=9D=BC=EC=9D=B8?= =?UTF-8?q?=20=EC=97=AD=ED=95=A0=20-=20LadderLine.java,=20LadderLines.java?= =?UTF-8?q?:=20toString=20=EC=B6=94=EA=B0=80=20-=20Ladder.java=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20-=20LadderLineGenerator.java=20=EC=B6=94=EA=B0=80:?= =?UTF-8?q?=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20=EB=9D=BC=EC=9D=B8=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EC=83=9D=EC=84=B1=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?-=20LadderMain.java=20=EC=B6=94=EA=B0=80:=20=EC=82=AC=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EA=B2=8C=EC=9E=84=20=EB=A9=94=EC=9D=B8=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20-=20ReviewView.java=20=EC=B6=94=EA=B0=80:?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=EB=8B=B4=EB=8B=B9=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderMain.java | 18 +++++++++++ .../java/nextstep/ladder/domain/Ladder.java | 19 ++++++++++++ .../nextstep/ladder/domain/LadderLine.java | 11 +++++++ .../ladder/domain/LadderLineGenerator.java | 31 +++++++++++++++++++ .../nextstep/ladder/domain/LadderLines.java | 8 +++++ .../nextstep/ladder/domain/PersonNames.java | 4 +++ .../java/nextstep/ladder/view/ReviewView.java | 13 ++++++++ 7 files changed, 104 insertions(+) create mode 100644 src/main/java/nextstep/ladder/LadderMain.java create mode 100644 src/main/java/nextstep/ladder/domain/Ladder.java create mode 100644 src/main/java/nextstep/ladder/domain/LadderLineGenerator.java create mode 100644 src/main/java/nextstep/ladder/view/ReviewView.java diff --git a/src/main/java/nextstep/ladder/LadderMain.java b/src/main/java/nextstep/ladder/LadderMain.java new file mode 100644 index 0000000000..e23b5f6462 --- /dev/null +++ b/src/main/java/nextstep/ladder/LadderMain.java @@ -0,0 +1,18 @@ +package nextstep.ladder; + +import nextstep.ladder.domain.Ladder; +import nextstep.ladder.domain.PersonNames; +import nextstep.ladder.view.InputView; +import nextstep.ladder.view.ReviewView; + +import java.util.Set; + +public class LadderMain { + public static void main(String[] args) { + Set personNameInput = InputView.getPersonNameInput("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)", ","); + int height = InputView.getPositiveNumberInput("최대 사다리 높이는 몇 개인가요?"); + + Ladder ladder = new Ladder(new PersonNames(personNameInput), height); + ReviewView.printLadder(ladder); + } +} diff --git a/src/main/java/nextstep/ladder/domain/Ladder.java b/src/main/java/nextstep/ladder/domain/Ladder.java new file mode 100644 index 0000000000..9cc0deb5db --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/Ladder.java @@ -0,0 +1,19 @@ +package nextstep.ladder.domain; + +public class Ladder { + private final PersonNames personNames; + private final LadderLines ladderLines; + + public Ladder(PersonNames personNames, int height) { + this.personNames = personNames; + this.ladderLines = LadderLineGenerator.generateLadderLines(height, personNames.size() - 1); + } + + public PersonNames getPersonNames() { + return personNames; + } + + public LadderLines getLadderLines() { + return ladderLines; + } +} diff --git a/src/main/java/nextstep/ladder/domain/LadderLine.java b/src/main/java/nextstep/ladder/domain/LadderLine.java index 418ef1e402..3e7d5b56d3 100644 --- a/src/main/java/nextstep/ladder/domain/LadderLine.java +++ b/src/main/java/nextstep/ladder/domain/LadderLine.java @@ -28,4 +28,15 @@ private void validateLines(List lines) { prev = cur; } } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + for (Boolean line : lines) { + sb.append("|"); + sb.append(line ? "--------": " "); + } + sb.append("|"); + return sb.toString(); + } } diff --git a/src/main/java/nextstep/ladder/domain/LadderLineGenerator.java b/src/main/java/nextstep/ladder/domain/LadderLineGenerator.java new file mode 100644 index 0000000000..9594e9d1a0 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/LadderLineGenerator.java @@ -0,0 +1,31 @@ +package nextstep.ladder.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class LadderLineGenerator { + private static final Random random = new Random(); + + public static LadderLines generateLadderLines(int height, int size) { + List ladderLines = new ArrayList<>(); + for (int i = 0; i < height; i++) { + ladderLines.add(generateLadderLine(size)); + } + + return new LadderLines(ladderLines); + } + + private static LadderLine generateLadderLine(int size) { + List lines = new ArrayList<>(); + + for (int i = 0; i < size; i++) { + boolean prev = i != 0 && lines.get(i - 1); + + boolean cur = !prev && random.nextBoolean(); + lines.add(cur); + } + + return new LadderLine(lines); + } +} diff --git a/src/main/java/nextstep/ladder/domain/LadderLines.java b/src/main/java/nextstep/ladder/domain/LadderLines.java index d41c65a98e..1f1a67d709 100644 --- a/src/main/java/nextstep/ladder/domain/LadderLines.java +++ b/src/main/java/nextstep/ladder/domain/LadderLines.java @@ -1,6 +1,7 @@ package nextstep.ladder.domain; import java.util.List; +import java.util.stream.Collectors; public class LadderLines { private final List ladderLines; @@ -8,4 +9,11 @@ public class LadderLines { public LadderLines(List ladderLines) { this.ladderLines = ladderLines; } + + @Override + public String toString() { + return " " + ladderLines.stream() + .map(LadderLine::toString) + .collect(Collectors.joining("\n ")); + } } diff --git a/src/main/java/nextstep/ladder/domain/PersonNames.java b/src/main/java/nextstep/ladder/domain/PersonNames.java index 2edfc6967a..d6acfffdbb 100644 --- a/src/main/java/nextstep/ladder/domain/PersonNames.java +++ b/src/main/java/nextstep/ladder/domain/PersonNames.java @@ -13,6 +13,10 @@ public PersonNames(Set personNames) { .collect(Collectors.toList()); } + public int size() { + return personNames.size(); + } + @Override public String toString() { return personNames.stream() diff --git a/src/main/java/nextstep/ladder/view/ReviewView.java b/src/main/java/nextstep/ladder/view/ReviewView.java new file mode 100644 index 0000000000..3507c31e46 --- /dev/null +++ b/src/main/java/nextstep/ladder/view/ReviewView.java @@ -0,0 +1,13 @@ +package nextstep.ladder.view; + +import nextstep.ladder.domain.Ladder; + +public class ReviewView { + private ReviewView() { + } + + public static void printLadder(Ladder ladder) { + System.out.println(ladder.getPersonNames()); + System.out.println(ladder.getLadderLines()); + } +} From c74415648c8262227b5d7288b06fb55bbc368bde Mon Sep 17 00:00:00 2001 From: brody Date: Sun, 20 Apr 2025 19:58:23 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor.=20-=20LadderLine.java:=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20-=20PersonNa?= =?UTF-8?q?mes.java:=20=EC=83=9D=EC=84=B1=EC=9E=90=20Set=20=EB=8C=80?= =?UTF-8?q?=EC=8B=A0=20List=20=EB=B0=9B=EA=B2=8C=20=EB=B3=80=EA=B2=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderMain.java | 4 +-- .../nextstep/ladder/domain/LadderLine.java | 4 +++ .../nextstep/ladder/domain/LadderLines.java | 9 ++++++ .../nextstep/ladder/domain/PersonName.java | 16 +++++++++++ .../nextstep/ladder/domain/PersonNames.java | 8 ++++-- .../java/nextstep/ladder/view/InputView.java | 8 +++--- .../nextstep/ladder/domain/LadderTest.java | 28 +++++++++++++++++++ 7 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/test/java/nextstep/ladder/domain/LadderTest.java diff --git a/src/main/java/nextstep/ladder/LadderMain.java b/src/main/java/nextstep/ladder/LadderMain.java index e23b5f6462..bbbed32d4c 100644 --- a/src/main/java/nextstep/ladder/LadderMain.java +++ b/src/main/java/nextstep/ladder/LadderMain.java @@ -5,11 +5,11 @@ import nextstep.ladder.view.InputView; import nextstep.ladder.view.ReviewView; -import java.util.Set; +import java.util.List; public class LadderMain { public static void main(String[] args) { - Set personNameInput = InputView.getPersonNameInput("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)", ","); + List personNameInput = InputView.getPersonNameInput("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)", ","); int height = InputView.getPositiveNumberInput("최대 사다리 높이는 몇 개인가요?"); Ladder ladder = new Ladder(new PersonNames(personNameInput), height); diff --git a/src/main/java/nextstep/ladder/domain/LadderLine.java b/src/main/java/nextstep/ladder/domain/LadderLine.java index 3e7d5b56d3..5b728dd842 100644 --- a/src/main/java/nextstep/ladder/domain/LadderLine.java +++ b/src/main/java/nextstep/ladder/domain/LadderLine.java @@ -16,6 +16,10 @@ public LadderLine(List lines) { this.lines = lines; } + public int size() { + return lines.size(); + } + private void validateLines(List lines) { Iterator iterator = lines.iterator(); boolean prev = iterator.next(); diff --git a/src/main/java/nextstep/ladder/domain/LadderLines.java b/src/main/java/nextstep/ladder/domain/LadderLines.java index 1f1a67d709..a5c9488487 100644 --- a/src/main/java/nextstep/ladder/domain/LadderLines.java +++ b/src/main/java/nextstep/ladder/domain/LadderLines.java @@ -1,5 +1,6 @@ package nextstep.ladder.domain; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -10,6 +11,14 @@ public LadderLines(List ladderLines) { this.ladderLines = ladderLines; } + public int size() { + return ladderLines.size(); + } + + public List getLadderLines() { + return Collections.unmodifiableList(ladderLines); + } + @Override public String toString() { return " " + ladderLines.stream() diff --git a/src/main/java/nextstep/ladder/domain/PersonName.java b/src/main/java/nextstep/ladder/domain/PersonName.java index 062ef02d89..07e0349221 100644 --- a/src/main/java/nextstep/ladder/domain/PersonName.java +++ b/src/main/java/nextstep/ladder/domain/PersonName.java @@ -1,5 +1,7 @@ package nextstep.ladder.domain; +import java.util.Objects; + public class PersonName { public static final int MAX_NAME_LENGTH = 5; @@ -21,6 +23,20 @@ public String getName() { return name; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PersonName that = (PersonName) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } + @Override public String toString() { final StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/nextstep/ladder/domain/PersonNames.java b/src/main/java/nextstep/ladder/domain/PersonNames.java index d6acfffdbb..d25a8c53b5 100644 --- a/src/main/java/nextstep/ladder/domain/PersonNames.java +++ b/src/main/java/nextstep/ladder/domain/PersonNames.java @@ -1,13 +1,13 @@ package nextstep.ladder.domain; +import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.stream.Collectors; public class PersonNames { private final List personNames; - public PersonNames(Set personNames) { + public PersonNames(List personNames) { this.personNames = personNames.stream() .map(PersonName::new) .collect(Collectors.toList()); @@ -17,6 +17,10 @@ public int size() { return personNames.size(); } + public List getPersonNames() { + return Collections.unmodifiableList(personNames); + } + @Override public String toString() { return personNames.stream() diff --git a/src/main/java/nextstep/ladder/view/InputView.java b/src/main/java/nextstep/ladder/view/InputView.java index cfd120f26c..49a70377ae 100644 --- a/src/main/java/nextstep/ladder/view/InputView.java +++ b/src/main/java/nextstep/ladder/view/InputView.java @@ -4,8 +4,8 @@ import java.util.Arrays; import java.util.InputMismatchException; +import java.util.List; import java.util.Scanner; -import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -41,7 +41,7 @@ private static int getNumberInput(String prompt, String errorMessage, Predicate< } } - public static Set getPersonNameInput(String prompt, String delimiter) { + public static List getPersonNameInput(String prompt, String delimiter) { System.out.println(prompt); while (true) { String line = scanner.nextLine(); @@ -52,10 +52,10 @@ public static Set getPersonNameInput(String prompt, String delimiter) { continue; } - Set result = Arrays.stream(split) + List result = Arrays.stream(split) .map(String::trim) .filter(s -> !s.isEmpty()) - .collect(Collectors.toSet()); + .collect(Collectors.toList()); if (split.length != result.size()) { System.out.println("이름은 중복될 수 없습니다. 다시 입력해 주세요."); diff --git a/src/test/java/nextstep/ladder/domain/LadderTest.java b/src/test/java/nextstep/ladder/domain/LadderTest.java new file mode 100644 index 0000000000..07a5fb95fb --- /dev/null +++ b/src/test/java/nextstep/ladder/domain/LadderTest.java @@ -0,0 +1,28 @@ +package nextstep.ladder.domain; + +import nextstep.ladder.view.ReviewView; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LadderTest { + @DisplayName("사다리 생성 테스트") + @Test + public void createLadder() throws Exception { + Ladder ladder = new Ladder(new PersonNames(List.of("1", "2", "3")), 3); + ReviewView.printLadder(ladder); + + assertThat(ladder.getPersonNames().getPersonNames()) + .containsExactly(new PersonName("1"), new PersonName("2"), new PersonName("3")); + + assertThat(ladder.getLadderLines().size()) + .isEqualTo(3); + + assertThat(ladder.getLadderLines().getLadderLines().get(0).size()) + .isEqualTo(2); + } + +} \ No newline at end of file