From 8ff892db02cf3c3d92aec12bed71f3766f6d265e Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Fri, 7 Mar 2025 11:47:38 +0900 Subject: [PATCH 01/46] =?UTF-8?q?feat=20=EC=82=AC=EB=8B=A4=EB=A6=AC=201?= =?UTF-8?q?=EB=8B=A8=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 8 +++ .../java/controller/LadderController.java | 30 +++++++++++ src/main/java/model/Ladder.java | 24 +++++++++ src/main/java/model/Line.java | 39 +++++++++++++++ src/main/java/model/Point.java | 27 ++++++++++ src/main/java/model/Size.java | 20 ++++++++ src/main/java/view/LineCharacter.java | 17 +++++++ src/main/java/view/ResultView.java | 50 +++++++++++++++++++ 8 files changed, 215 insertions(+) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/controller/LadderController.java create mode 100644 src/main/java/model/Ladder.java create mode 100644 src/main/java/model/Line.java create mode 100644 src/main/java/model/Point.java create mode 100644 src/main/java/model/Size.java create mode 100644 src/main/java/view/LineCharacter.java create mode 100644 src/main/java/view/ResultView.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..887d4222 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,8 @@ +import controller.LadderController; + +public class Application { + public static void main(String[] args) { + LadderController ladderController = new LadderController(); + ladderController.startLadder(); + } +} diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java new file mode 100644 index 00000000..78004341 --- /dev/null +++ b/src/main/java/controller/LadderController.java @@ -0,0 +1,30 @@ +package controller; + +import model.Ladder; +import model.Line; +import model.Point; +import model.Size; +import view.ResultView; +import java.util.ArrayList; +import java.util.List; + +public class LadderController { + + private static final int LADDER_SIZE = 4; + private final ResultView resultView = new ResultView(); + + public void startLadder() { + Ladder ladder = new Ladder(new Size(LADDER_SIZE), new Size(LADDER_SIZE)); + List points = convertPointsToStringList(ladder.getLines()); + resultView.printLadder(points); + } + + private List convertPointsToStringList(List lines) { + List points = new ArrayList<>(); + for (Line line : lines) { + points.add(Point.toStringUsingMap(line.getPoints())); + } + return List.copyOf(points); + } +} + diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java new file mode 100644 index 00000000..28ea187c --- /dev/null +++ b/src/main/java/model/Ladder.java @@ -0,0 +1,24 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class Ladder { + private final List lines; + + public Ladder(Size width, Size height) { + this.lines = generateLines(width, height); + } + + private List generateLines(Size width, Size height) { + List lines = new ArrayList<>(); + for (int i = 0; i < height.getSize(); i++) { + lines.add(new Line(width)); + } + return List.copyOf(lines); + } + + public List getLines() { + return List.copyOf(lines); + } +} diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java new file mode 100644 index 00000000..a4764603 --- /dev/null +++ b/src/main/java/model/Line.java @@ -0,0 +1,39 @@ +package model; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Line { + private final List points; + private final Random random = new Random(); + + public Line(Size width) { + this.points = createLinePoints(width); + } + + private List createLinePoints(Size width) { + List points = new ArrayList<>(); + boolean isPreviousLine = false; + + for (int i = 1; i < width.getSize(); i++) { + Point point = createPoint(isPreviousLine); + points.add(point); + isPreviousLine = (point == Point.HAS_POINT); + } + return List.copyOf(points); + } + + private Point createPoint(boolean isPreviousLine) { + List points = List.of(Point.NO_POINT, Point.HAS_POINT); + if (isPreviousLine) { + return Point.NO_POINT; + } + int randomIndex = random.nextInt(points.size()); + return points.get(randomIndex); + } + + public List getPoints() { + return List.copyOf(points); + } +} diff --git a/src/main/java/model/Point.java b/src/main/java/model/Point.java new file mode 100644 index 00000000..19a66e90 --- /dev/null +++ b/src/main/java/model/Point.java @@ -0,0 +1,27 @@ +package model; + +import java.util.List; +import java.util.Map; + +public enum Point { + HAS_POINT(true), + NO_POINT(false); + + private final boolean point; + + Point(boolean point) { + this.point = point; + } + + public static String toStringUsingMap(List points) { + Map pointToStringMap = Map.of( + HAS_POINT, "HAS_POINT", + NO_POINT, "NO_POINT" + ); + + return points.stream() + .map(point -> pointToStringMap.getOrDefault(point, "UNKNOWN")) + .toList() + .toString(); + } +} diff --git a/src/main/java/model/Size.java b/src/main/java/model/Size.java new file mode 100644 index 00000000..3ce05711 --- /dev/null +++ b/src/main/java/model/Size.java @@ -0,0 +1,20 @@ +package model; + +public class Size { + private final int size; + + public Size(int size) { + validateSize(size); + this.size = size; + } + + public int getSize() { + return size; + } + + private void validateSize(int size) { + if (size < 0) { + throw new IllegalArgumentException("사다리 사이즈가 0보다 작을 수는 없습니다."); + } + } +} diff --git a/src/main/java/view/LineCharacter.java b/src/main/java/view/LineCharacter.java new file mode 100644 index 00000000..9169a24a --- /dev/null +++ b/src/main/java/view/LineCharacter.java @@ -0,0 +1,17 @@ +package view; + +public enum LineCharacter { + VERTICAL("|"), + CONNECTED("-----"), + DISCONNECTED(" "); + + private final String symbol; + + LineCharacter(String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java new file mode 100644 index 00000000..5d36b81e --- /dev/null +++ b/src/main/java/view/ResultView.java @@ -0,0 +1,50 @@ +package view; + +import java.util.List; + +public class ResultView { + + public void printLadder(List ladderLines) { + printResultHeader(); + StringBuilder resultBuilder = new StringBuilder(); + processLadderLines(resultBuilder, ladderLines); + outputResult(resultBuilder); + } + + private void printResultHeader() { + System.out.println("실행결과"); + System.out.println(); + } + + private void processLadderLines(StringBuilder resultBuilder, List ladderLines) { + for (String line : ladderLines) { + String[] points = parseLine(line); + resultBuilder.append(LineCharacter.VERTICAL.getSymbol()); + appendSymbolsForPoints(points, resultBuilder); + resultBuilder.append("\n"); + } + } + + private String[] parseLine(String line) { + return line.replaceAll("[\\[\\] ]", "").split(","); + } + + private void appendSymbolsForPoints(String[] points, StringBuilder resultBuilder) { + for (String point : points) { + appendSymbolToBuilder(resultBuilder, point); + resultBuilder.append(LineCharacter.VERTICAL.getSymbol()); + } + } + + private void appendSymbolToBuilder(StringBuilder resultBuilder, String point) { + if (point.equals("HAS_POINT")) { + resultBuilder.append(LineCharacter.CONNECTED.getSymbol()); + } else if (point.equals("NO_POINT")) { + resultBuilder.append(LineCharacter.DISCONNECTED.getSymbol()); + } + } + + private void outputResult(StringBuilder resultBuilder) { + System.out.println(resultBuilder); + } +} From 272e3f3ffe970c943d3c4a31d21458b60318fe8a Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Fri, 7 Mar 2025 23:33:59 +0900 Subject: [PATCH 02/46] =?UTF-8?q?fix=20else=EB=AC=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/ResultView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 5d36b81e..cdfb8ce3 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -39,7 +39,8 @@ private void appendSymbolsForPoints(String[] points, StringBuilder resultBuilder private void appendSymbolToBuilder(StringBuilder resultBuilder, String point) { if (point.equals("HAS_POINT")) { resultBuilder.append(LineCharacter.CONNECTED.getSymbol()); - } else if (point.equals("NO_POINT")) { + } + if (point.equals("NO_POINT")) { resultBuilder.append(LineCharacter.DISCONNECTED.getSymbol()); } } From 79a89dd8e4c482123fe3c1c008dc553f9682eec4 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Mon, 10 Mar 2025 03:55:54 +0900 Subject: [PATCH 03/46] =?UTF-8?q?refactor=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=94=ED=83=95=20=EB=A6=AC=ED=8E=99=ED=86=A0?= =?UTF-8?q?=EB=A7=81=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LadderController.java | 42 ++++++++++----- src/main/java/model/Ladder.java | 18 +++---- src/main/java/model/LadderGame.java | 27 ++++++++++ src/main/java/model/Line.java | 30 ++--------- src/main/java/model/Point.java | 15 ------ src/main/java/model/PointGenerator.java | 34 ++++++++++++ src/main/java/view/ResultView.java | 52 ++++++++----------- 7 files changed, 122 insertions(+), 96 deletions(-) create mode 100644 src/main/java/model/LadderGame.java create mode 100644 src/main/java/model/PointGenerator.java diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 78004341..98fe5571 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -1,30 +1,46 @@ package controller; -import model.Ladder; -import model.Line; -import model.Point; -import model.Size; +import model.*; import view.ResultView; + import java.util.ArrayList; import java.util.List; +import java.util.Random; + +import static model.Point.HAS_POINT; public class LadderController { private static final int LADDER_SIZE = 4; private final ResultView resultView = new ResultView(); + private static final int CHUNK_SIZE = 3; public void startLadder() { - Ladder ladder = new Ladder(new Size(LADDER_SIZE), new Size(LADDER_SIZE)); - List points = convertPointsToStringList(ladder.getLines()); - resultView.printLadder(points); + PointGenerator pointGenerator = new PointGenerator(new Random()); + LadderGame ladderGame = new LadderGame(new Size(LADDER_SIZE), new Size(LADDER_SIZE), pointGenerator); + List ladderPoints = ladderGame.getLadderPoints(); + List booleans = formatLadderPoints(ladderPoints); + List> booleansChunks = processLadderLines(booleans); + resultView.printLadder(booleansChunks); } - private List convertPointsToStringList(List lines) { - List points = new ArrayList<>(); - for (Line line : lines) { - points.add(Point.toStringUsingMap(line.getPoints())); + private List formatLadderPoints(List ladderPoints) { + List formattedLadder = new ArrayList<>(); + for (Point point : ladderPoints) { + formattedLadder.add(point == HAS_POINT); } - return List.copyOf(points); + return formattedLadder; + } + + private List> processLadderLines(List ladderPoints) { + List> chunks = new ArrayList<>(); + for (int i = 0; i < ladderPoints.size(); i += CHUNK_SIZE) { + chunks.add(getChunk(ladderPoints, i)); + } + return chunks; } -} + private List getChunk(List ladderPoints, int startIndex) { + return ladderPoints.subList(startIndex, Math.min(startIndex + CHUNK_SIZE, ladderPoints.size())); + } +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 28ea187c..76d767c2 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -6,19 +6,15 @@ public class Ladder { private final List lines; - public Ladder(Size width, Size height) { - this.lines = generateLines(width, height); + public Ladder(List lines) { + this.lines = List.copyOf(lines); } - private List generateLines(Size width, Size height) { - List lines = new ArrayList<>(); - for (int i = 0; i < height.getSize(); i++) { - lines.add(new Line(width)); + public List getPointsFromLines() { + List result = new ArrayList<>(); + for (Line line : lines) { + result.addAll(line.getPointGroups()); } - return List.copyOf(lines); - } - - public List getLines() { - return List.copyOf(lines); + return List.copyOf(result); } } diff --git a/src/main/java/model/LadderGame.java b/src/main/java/model/LadderGame.java new file mode 100644 index 00000000..a90daf67 --- /dev/null +++ b/src/main/java/model/LadderGame.java @@ -0,0 +1,27 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class LadderGame { + private final Ladder ladder; + private final PointGenerator generator; + + public LadderGame(Size width, Size height, PointGenerator generator) { + this.generator = generator; + this.ladder = new Ladder(generateLines(width, height)); + } + + private List generateLines(Size width, Size height) { + List lines = new ArrayList<>(); + for (int i = 0; i < height.getSize(); i++) { + List points = generator.createLinePoints(width); + lines.add(new Line(points)); + } + return List.copyOf(lines); + } + + public List getLadderPoints() { + return ladder.getPointsFromLines(); + } +} diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java index a4764603..8606ca36 100644 --- a/src/main/java/model/Line.java +++ b/src/main/java/model/Line.java @@ -1,39 +1,15 @@ package model; -import java.util.ArrayList; import java.util.List; -import java.util.Random; public class Line { private final List points; - private final Random random = new Random(); - public Line(Size width) { - this.points = createLinePoints(width); + public Line(List points) { + this.points = List.copyOf(points); } - private List createLinePoints(Size width) { - List points = new ArrayList<>(); - boolean isPreviousLine = false; - - for (int i = 1; i < width.getSize(); i++) { - Point point = createPoint(isPreviousLine); - points.add(point); - isPreviousLine = (point == Point.HAS_POINT); - } - return List.copyOf(points); - } - - private Point createPoint(boolean isPreviousLine) { - List points = List.of(Point.NO_POINT, Point.HAS_POINT); - if (isPreviousLine) { - return Point.NO_POINT; - } - int randomIndex = random.nextInt(points.size()); - return points.get(randomIndex); - } - - public List getPoints() { + public List getPointGroups() { return List.copyOf(points); } } diff --git a/src/main/java/model/Point.java b/src/main/java/model/Point.java index 19a66e90..ebf2730b 100644 --- a/src/main/java/model/Point.java +++ b/src/main/java/model/Point.java @@ -1,8 +1,5 @@ package model; -import java.util.List; -import java.util.Map; - public enum Point { HAS_POINT(true), NO_POINT(false); @@ -12,16 +9,4 @@ public enum Point { Point(boolean point) { this.point = point; } - - public static String toStringUsingMap(List points) { - Map pointToStringMap = Map.of( - HAS_POINT, "HAS_POINT", - NO_POINT, "NO_POINT" - ); - - return points.stream() - .map(point -> pointToStringMap.getOrDefault(point, "UNKNOWN")) - .toList() - .toString(); - } } diff --git a/src/main/java/model/PointGenerator.java b/src/main/java/model/PointGenerator.java new file mode 100644 index 00000000..25f752e4 --- /dev/null +++ b/src/main/java/model/PointGenerator.java @@ -0,0 +1,34 @@ +package model; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class PointGenerator { + private final Random random; + + public PointGenerator(Random random) { + this.random = random; + } + + public List createLinePoints(Size width) { + List points = new ArrayList<>(); + boolean isPreviousLine = false; + + for (int i = 1; i < width.getSize(); i++) { + Point point = createPoint(isPreviousLine); + points.add(point); + isPreviousLine = (point == Point.HAS_POINT); + } + return List.copyOf(points); + } + + private Point createPoint(boolean isPreviousLine) { + List points = List.of(Point.NO_POINT, Point.HAS_POINT); + if (isPreviousLine) { + return Point.NO_POINT; + } + int randomIndex = random.nextInt(points.size()); + return points.get(randomIndex); + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index cdfb8ce3..beaea35e 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -4,11 +4,17 @@ public class ResultView { - public void printLadder(List ladderLines) { - printResultHeader(); + public void printLadder(List> ladderChunks) { StringBuilder resultBuilder = new StringBuilder(); - processLadderLines(resultBuilder, ladderLines); - outputResult(resultBuilder); + printResultHeader(); + appendLadderChunks(ladderChunks, resultBuilder); + System.out.println(resultBuilder); + } + + private void appendLadderChunks(List> ladderChunks, StringBuilder resultBuilder) { + for (List chunk : ladderChunks) { + appendChunkToResult(resultBuilder, chunk); + } } private void printResultHeader() { @@ -16,36 +22,22 @@ private void printResultHeader() { System.out.println(); } - private void processLadderLines(StringBuilder resultBuilder, List ladderLines) { - for (String line : ladderLines) { - String[] points = parseLine(line); - resultBuilder.append(LineCharacter.VERTICAL.getSymbol()); - appendSymbolsForPoints(points, resultBuilder); - resultBuilder.append("\n"); - } + private void appendChunkToResult(StringBuilder resultBuilder, List chunk) { + resultBuilder.append(LineCharacter.VERTICAL.getSymbol()); + appendSymbolsForPoints(chunk, resultBuilder); + resultBuilder.append("\n"); } - private String[] parseLine(String line) { - return line.replaceAll("[\\[\\] ]", "").split(","); - } + private void appendSymbolsForPoints(List points, StringBuilder resultBuilder) { + for (Boolean isExistPoint : points) { + if (isExistPoint) { + resultBuilder.append(LineCharacter.CONNECTED.getSymbol()); + } - private void appendSymbolsForPoints(String[] points, StringBuilder resultBuilder) { - for (String point : points) { - appendSymbolToBuilder(resultBuilder, point); + if (!isExistPoint) { + resultBuilder.append(LineCharacter.DISCONNECTED.getSymbol()); + } resultBuilder.append(LineCharacter.VERTICAL.getSymbol()); } } - - private void appendSymbolToBuilder(StringBuilder resultBuilder, String point) { - if (point.equals("HAS_POINT")) { - resultBuilder.append(LineCharacter.CONNECTED.getSymbol()); - } - if (point.equals("NO_POINT")) { - resultBuilder.append(LineCharacter.DISCONNECTED.getSymbol()); - } - } - - private void outputResult(StringBuilder resultBuilder) { - System.out.println(resultBuilder); - } } From 58449af16319981a57e9ad370ac2b9606969a95b Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Mon, 10 Mar 2025 04:05:42 +0900 Subject: [PATCH 04/46] =?UTF-8?q?refactor=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 13 ++++++------- src/main/java/view/ResultView.java | 18 +++++++++--------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 98fe5571..b4d5da53 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -6,22 +6,21 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; - import static model.Point.HAS_POINT; public class LadderController { private static final int LADDER_SIZE = 4; - private final ResultView resultView = new ResultView(); private static final int CHUNK_SIZE = 3; + private final ResultView resultView = new ResultView(); public void startLadder() { PointGenerator pointGenerator = new PointGenerator(new Random()); LadderGame ladderGame = new LadderGame(new Size(LADDER_SIZE), new Size(LADDER_SIZE), pointGenerator); List ladderPoints = ladderGame.getLadderPoints(); - List booleans = formatLadderPoints(ladderPoints); - List> booleansChunks = processLadderLines(booleans); - resultView.printLadder(booleansChunks); + List points = formatLadderPoints(ladderPoints); + List> ladderLines = processLadderLines(points); + resultView.printLadder(ladderLines); } private List formatLadderPoints(List ladderPoints) { @@ -35,12 +34,12 @@ private List formatLadderPoints(List ladderPoints) { private List> processLadderLines(List ladderPoints) { List> chunks = new ArrayList<>(); for (int i = 0; i < ladderPoints.size(); i += CHUNK_SIZE) { - chunks.add(getChunk(ladderPoints, i)); + chunks.add(getLadderSegment(ladderPoints, i)); } return chunks; } - private List getChunk(List ladderPoints, int startIndex) { + private List getLadderSegment(List ladderPoints, int startIndex) { return ladderPoints.subList(startIndex, Math.min(startIndex + CHUNK_SIZE, ladderPoints.size())); } } diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index beaea35e..d1d899a2 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -4,16 +4,16 @@ public class ResultView { - public void printLadder(List> ladderChunks) { + public void printLadder(List> ladderRows) { StringBuilder resultBuilder = new StringBuilder(); printResultHeader(); - appendLadderChunks(ladderChunks, resultBuilder); + appendLadderRows(ladderRows, resultBuilder); System.out.println(resultBuilder); } - private void appendLadderChunks(List> ladderChunks, StringBuilder resultBuilder) { - for (List chunk : ladderChunks) { - appendChunkToResult(resultBuilder, chunk); + private void appendLadderRows(List> ladderRows, StringBuilder resultBuilder) { + for (List ladderRow : ladderRows) { + appendRowToResult(resultBuilder, ladderRow); } } @@ -22,14 +22,14 @@ private void printResultHeader() { System.out.println(); } - private void appendChunkToResult(StringBuilder resultBuilder, List chunk) { + private void appendRowToResult(StringBuilder resultBuilder, List ladderRow) { resultBuilder.append(LineCharacter.VERTICAL.getSymbol()); - appendSymbolsForPoints(chunk, resultBuilder); + appendSymbolsForPoints(ladderRow, resultBuilder); resultBuilder.append("\n"); } - private void appendSymbolsForPoints(List points, StringBuilder resultBuilder) { - for (Boolean isExistPoint : points) { + private void appendSymbolsForPoints(List ladderPoints, StringBuilder resultBuilder) { + for (Boolean isExistPoint : ladderPoints) { if (isExistPoint) { resultBuilder.append(LineCharacter.CONNECTED.getSymbol()); } From a15ea171b8f216050a8df55767475f18e484470b Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Mon, 17 Mar 2025 11:03:47 +0900 Subject: [PATCH 05/46] =?UTF-8?q?=EC=82=AC=EB=8B=A4=EB=A6=AC=202-5?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LadderController.java | 34 ++++++--- src/main/java/model/Height.java | 22 ++++++ src/main/java/model/Ladder.java | 4 ++ src/main/java/model/LadderGame.java | 43 ++++++++---- src/main/java/model/LadderResult.java | 56 +++++++++++++++ src/main/java/model/Player.java | 22 ++++++ src/main/java/model/Players.java | 36 ++++++++++ src/main/java/model/PointGenerator.java | 9 ++- src/main/java/model/Prize.java | 22 ++++++ src/main/java/model/Prizes.java | 35 ++++++++++ src/main/java/model/RandomUtil.java | 5 ++ src/main/java/model/RandomValueGenerator.java | 13 ++++ src/main/java/test/FixedNumberGenerator.java | 16 +++++ src/main/java/view/InputView.java | 55 +++++++++++++++ src/main/java/view/ResultView.java | 20 +++++- src/test/java/model/HeightTest.java | 27 +++++++ src/test/java/model/LadderGameTest.java | 56 +++++++++++++++ src/test/java/model/LadderResultTest.java | 51 ++++++++++++++ src/test/java/model/LadderTest.java | 43 ++++++++++++ src/test/java/model/LineTest.java | 54 ++++++++++++++ src/test/java/model/PlayerTest.java | 28 ++++++++ src/test/java/model/PlayersTest.java | 40 +++++++++++ src/test/java/model/PointGeneratorTest.java | 70 +++++++++++++++++++ src/test/java/model/PrizeTest.java | 39 +++++++++++ src/test/java/model/PrizesTest.java | 45 ++++++++++++ .../java/model/RandomValueGeneratorTest.java | 20 ++++++ src/test/java/model/SizeTest.java | 26 +++++++ 27 files changed, 864 insertions(+), 27 deletions(-) create mode 100644 src/main/java/model/Height.java create mode 100644 src/main/java/model/LadderResult.java create mode 100644 src/main/java/model/Player.java create mode 100644 src/main/java/model/Players.java create mode 100644 src/main/java/model/Prize.java create mode 100644 src/main/java/model/Prizes.java create mode 100644 src/main/java/model/RandomUtil.java create mode 100644 src/main/java/model/RandomValueGenerator.java create mode 100644 src/main/java/test/FixedNumberGenerator.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/test/java/model/HeightTest.java create mode 100644 src/test/java/model/LadderGameTest.java create mode 100644 src/test/java/model/LadderResultTest.java create mode 100644 src/test/java/model/LadderTest.java create mode 100644 src/test/java/model/LineTest.java create mode 100644 src/test/java/model/PlayerTest.java create mode 100644 src/test/java/model/PlayersTest.java create mode 100644 src/test/java/model/PointGeneratorTest.java create mode 100644 src/test/java/model/PrizeTest.java create mode 100644 src/test/java/model/PrizesTest.java create mode 100644 src/test/java/model/RandomValueGeneratorTest.java create mode 100644 src/test/java/model/SizeTest.java diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index b4d5da53..5231888a 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -1,26 +1,44 @@ package controller; import model.*; +import view.InputView; import view.ResultView; - import java.util.ArrayList; import java.util.List; -import java.util.Random; + import static model.Point.HAS_POINT; public class LadderController { - private static final int LADDER_SIZE = 4; private static final int CHUNK_SIZE = 3; private final ResultView resultView = new ResultView(); + private final InputView inputView = new InputView(); public void startLadder() { - PointGenerator pointGenerator = new PointGenerator(new Random()); - LadderGame ladderGame = new LadderGame(new Size(LADDER_SIZE), new Size(LADDER_SIZE), pointGenerator); - List ladderPoints = ladderGame.getLadderPoints(); - List points = formatLadderPoints(ladderPoints); + Players player = new Players(inputView.inputNames()); + Prizes prizes = Prizes.form(inputView.inputResult(), player); + Height height = new Height(inputView.getMaxLadderHeight()); + PointGenerator pointGenerator = new PointGenerator(new RandomValueGenerator()); + LadderGame ladderGame = LadderGame.createGame(player, height, pointGenerator, prizes); + + List points = formatLadderPoints(ladderGame.getLadderPoints()); List> ladderLines = processLadderLines(points); - resultView.printLadder(ladderLines); + resultView.printLadder(ladderLines, player.getPlayers(), prizes.getPrize()); + printResult(ladderGame); + } + + private void printResult(LadderGame ladderGame) { + while (true) { + String targetPlayerName = inputView.getTargetPlayerName(); + + if (targetPlayerName.equals("all")) { + resultView.printAllResults(ladderGame.getAllResultForPlayers()); + break; + } + if (ladderGame.hasResultForPlayer(targetPlayerName)) { + resultView.printSingleResult(ladderGame.getResultForPlayer(targetPlayerName)); + } + } } private List formatLadderPoints(List ladderPoints) { diff --git a/src/main/java/model/Height.java b/src/main/java/model/Height.java new file mode 100644 index 00000000..ad68a2a2 --- /dev/null +++ b/src/main/java/model/Height.java @@ -0,0 +1,22 @@ +package model; + +public class Height { + private static final int MINIMUM_HEIGHT = 2; + + private final int value; + + public Height(int value) { + validateValue(value); + this.value = value; + } + + private void validateValue(int value) { + if (value < MINIMUM_HEIGHT) { + throw new IllegalArgumentException("사다리 높이는 2 이상이여야 합니다."); + } + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 76d767c2..59fbf06b 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -17,4 +17,8 @@ public List getPointsFromLines() { } return List.copyOf(result); } + + public List getLines() { + return List.copyOf(lines); + } } diff --git a/src/main/java/model/LadderGame.java b/src/main/java/model/LadderGame.java index a90daf67..9cf0d081 100644 --- a/src/main/java/model/LadderGame.java +++ b/src/main/java/model/LadderGame.java @@ -1,27 +1,46 @@ package model; -import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; public class LadderGame { private final Ladder ladder; - private final PointGenerator generator; + private final LadderResult ladderResult; - public LadderGame(Size width, Size height, PointGenerator generator) { - this.generator = generator; - this.ladder = new Ladder(generateLines(width, height)); + public LadderGame(Ladder ladder, LadderResult ladderResult) { + this.ladder = ladder; + this.ladderResult = ladderResult; } - private List generateLines(Size width, Size height) { - List lines = new ArrayList<>(); - for (int i = 0; i < height.getSize(); i++) { - List points = generator.createLinePoints(width); - lines.add(new Line(points)); - } - return List.copyOf(lines); + public static LadderGame createGame(Players players, Height maxHeight, + PointGenerator pointGenerator, + Prizes prizes) { + Ladder ladder = new Ladder(generateLines(players.size(), maxHeight.getValue(), pointGenerator)); + LadderResult ladderResult = new LadderResult(ladder); + ladderResult.calculateResults(players.getPlayers(), prizes); + return new LadderGame(ladder, ladderResult); + } + + private static List generateLines(int playerCount, int maxHeight, PointGenerator pointGenerator) { + return IntStream.range(0, maxHeight) + .mapToObj(i -> new Line(pointGenerator.createLinePoints(new Size(playerCount)))) + .toList(); } public List getLadderPoints() { return ladder.getPointsFromLines(); } + + public String getResultForPlayer(String name) { + return ladderResult.getResultForPlayer(name); + } + + public Map getAllResultForPlayers() { + return ladderResult.getValue(); + } + + public boolean hasResultForPlayer(String name) { + return ladderResult.getValue().containsKey(name); + } } diff --git a/src/main/java/model/LadderResult.java b/src/main/java/model/LadderResult.java new file mode 100644 index 00000000..8311ad02 --- /dev/null +++ b/src/main/java/model/LadderResult.java @@ -0,0 +1,56 @@ +package model; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LadderResult { + private static final String NO_RESULT = "결과 없음"; + private final Map results; + private final Ladder ladder; + + public LadderResult(Ladder ladder) { + this.ladder = ladder; + this.results = new HashMap<>(); + } + + public void calculateResults(List playerNames, Prizes prizes) { + List lines = ladder.getLines(); + List prizeValues = prizes.getPrize(); + + for (String playerName : playerNames) { + int playerIndex = playerNames.indexOf(playerName); + for (Line line : lines) { + playerIndex = getNewIndexMove(playerIndex, line.getPointGroups()); + } + results.put(playerName, prizeValues.get(playerIndex)); + } + } + + private int getNewIndexMove(int currentIndex, List points) { + if (canMoveLeft(currentIndex, points)) { + return currentIndex - 1; + } + if (canMoveRight(currentIndex, points)) { + return currentIndex + 1; + } + return currentIndex; + } + + private boolean canMoveLeft(int currentIndex, List points) { + return currentIndex > 0 && points.get(currentIndex - 1) == Point.HAS_POINT; + } + + private boolean canMoveRight(int currentIndex, List points) { + return currentIndex < points.size() && points.get(currentIndex) == Point.HAS_POINT; + } + + public String getResultForPlayer(String name) { + return results.getOrDefault(name, NO_RESULT); + } + + public Map getValue() { + return Collections.unmodifiableMap(results); + } +} diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java new file mode 100644 index 00000000..5413d31d --- /dev/null +++ b/src/main/java/model/Player.java @@ -0,0 +1,22 @@ +package model; + +public class Player { + + private static final int MAX_NAME_LENGTH = 5; + private final String value; + + public Player(String value) { + validateValues(value); + this.value = value; + } + + public String getValue() { + return value; + } + + private void validateValues(String values) { + if (values.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("참가자 이름은 5글자를 초과할 수 없습니다."); + } + } +} diff --git a/src/main/java/model/Players.java b/src/main/java/model/Players.java new file mode 100644 index 00000000..e1bfdf63 --- /dev/null +++ b/src/main/java/model/Players.java @@ -0,0 +1,36 @@ +package model; + +import java.util.List; + +public class Players { + + private static final int MITMUM_PLAYER_LENGTH = 2; + private final List players; + + public Players(List players) { + validatePlayers(players); + this.players = generatePlayers(players); + } + + public int size() { + return players.size(); + } + + public List getPlayers() { + return players.stream() + .map(Player::getValue) + .toList(); + } + + private List generatePlayers(List players) { + return players.stream() + .map(Player::new) + .toList(); + } + + private void validatePlayers(List players) { + if (players.size() < MITMUM_PLAYER_LENGTH) { + throw new IllegalArgumentException("참가자는 2명 이상이여야 합니다."); + } + } +} diff --git a/src/main/java/model/PointGenerator.java b/src/main/java/model/PointGenerator.java index 25f752e4..09ba0a28 100644 --- a/src/main/java/model/PointGenerator.java +++ b/src/main/java/model/PointGenerator.java @@ -2,13 +2,12 @@ import java.util.ArrayList; import java.util.List; -import java.util.Random; public class PointGenerator { - private final Random random; + private final RandomUtil randomUtil; - public PointGenerator(Random random) { - this.random = random; + public PointGenerator(RandomUtil randomUtil) { + this.randomUtil = randomUtil; } public List createLinePoints(Size width) { @@ -28,7 +27,7 @@ private Point createPoint(boolean isPreviousLine) { if (isPreviousLine) { return Point.NO_POINT; } - int randomIndex = random.nextInt(points.size()); + int randomIndex = randomUtil.generateRandomNumber(); return points.get(randomIndex); } } diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java new file mode 100644 index 00000000..4ae247b5 --- /dev/null +++ b/src/main/java/model/Prize.java @@ -0,0 +1,22 @@ +package model; + +public class Prize { + + private final String value; + + public Prize(String value) { + validateValue(value); + this.value = value; + } + + public String getValue() { + return value; + } + + private void validateValue(String value) { + if(value == null || value.isEmpty()) { + throw new IllegalArgumentException("실행결과는 null이거나 공백일 수는 없습니다."); + } + } +} + diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java new file mode 100644 index 00000000..5b511f72 --- /dev/null +++ b/src/main/java/model/Prizes.java @@ -0,0 +1,35 @@ +package model; + +import java.util.List; + +public class Prizes { + + private final List prize; + + public Prizes(List prize) { + this.prize = prize; + } + + public static Prizes form(List result, Players players) { + validatePrize(result, players); + return new Prizes(generatePrize(result)); + } + + public List getPrize() { + return prize.stream() + .map(Prize::getValue) + .toList(); + } + + private static List generatePrize(List result) { + return result.stream() + .map(Prize::new) + .toList(); + } + + private static void validatePrize(List prizes, Players players) { + if (prizes.size() != players.size()) { + throw new IllegalArgumentException("실행결과 개수와 참가자의 수는 동일해야 합니다."); + } + } +} diff --git a/src/main/java/model/RandomUtil.java b/src/main/java/model/RandomUtil.java new file mode 100644 index 00000000..05e9f7af --- /dev/null +++ b/src/main/java/model/RandomUtil.java @@ -0,0 +1,5 @@ +package model; + +public interface RandomUtil { + int generateRandomNumber(); +} diff --git a/src/main/java/model/RandomValueGenerator.java b/src/main/java/model/RandomValueGenerator.java new file mode 100644 index 00000000..44f0139d --- /dev/null +++ b/src/main/java/model/RandomValueGenerator.java @@ -0,0 +1,13 @@ +package model; + +import java.util.Random; + +public class RandomValueGenerator implements RandomUtil { + private static final int RANDOM_BOUND = 2; + private static final Random random = new Random(); + + @Override + public int generateRandomNumber() { + return random.nextInt(RANDOM_BOUND); + } +} diff --git a/src/main/java/test/FixedNumberGenerator.java b/src/main/java/test/FixedNumberGenerator.java new file mode 100644 index 00000000..b990eeef --- /dev/null +++ b/src/main/java/test/FixedNumberGenerator.java @@ -0,0 +1,16 @@ +package test; + +import model.RandomUtil; + +public class FixedNumberGenerator implements RandomUtil { + private final int fixedNumber; + + public FixedNumberGenerator(int fixedNumber) { + this.fixedNumber = fixedNumber; + } + + @Override + public int generateRandomNumber() { + return fixedNumber; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..28f53e3f --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,55 @@ +package view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + + private final Scanner scanner = new Scanner(System.in); + + public List inputNames() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + String players = scanner.nextLine(); + return parseResults(players); + } + + public List inputResult() { + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + String input = scanner.nextLine(); + return parseResults(input); + } + + public int getMaxLadderHeight() { + System.out.println("최대 사다리 높이는 몇 개인가요?"); + String input = scanner.nextLine(); + return parseLadderHeight(input); + } + + public String getTargetPlayerName() { + System.out.println("결과를 보고 싶은 사람은?"); + return scanner.nextLine(); + } + + private List parseResults(String input) { + throwIfNamesIsNullOrEmpty(input); + + return Arrays.stream(input.trim().split(",")) + .map(String::trim) + .toList(); + } + + private int parseLadderHeight(String input) { + try { + return Integer.parseInt(String.valueOf(input)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("사다리 높이는 숫자여야 합니다."); + } + } + + private void throwIfNamesIsNullOrEmpty(String input) { + if (input == null || input.isEmpty()) { + throw new IllegalArgumentException("입력값이 null이거나 비어있을 순 없습니다."); + } + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index d1d899a2..dbb82530 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -1,14 +1,18 @@ package view; + import java.util.List; +import java.util.Map; public class ResultView { - public void printLadder(List> ladderRows) { + public void printLadder(List> ladderRows, List playerNames, List prize) { StringBuilder resultBuilder = new StringBuilder(); printResultHeader(); + System.out.println(String.join(" ", playerNames)); appendLadderRows(ladderRows, resultBuilder); System.out.println(resultBuilder); + System.out.println(String.join(" ", prize)); } private void appendLadderRows(List> ladderRows, StringBuilder resultBuilder) { @@ -18,7 +22,7 @@ private void appendLadderRows(List> ladderRows, StringBuilder resu } private void printResultHeader() { - System.out.println("실행결과"); + System.out.println("사다리결과"); System.out.println(); } @@ -28,6 +32,18 @@ private void appendRowToResult(StringBuilder resultBuilder, List ladder resultBuilder.append("\n"); } + public void printSingleResult(String prizes) { + System.out.println("실행결과"); + System.out.println(prizes); + } + + public void printAllResults(Map results) { + System.out.println("실행결과"); + results.forEach((player, result) -> + System.out.println(player + ":" + result) + ); + } + private void appendSymbolsForPoints(List ladderPoints, StringBuilder resultBuilder) { for (Boolean isExistPoint : ladderPoints) { if (isExistPoint) { diff --git a/src/test/java/model/HeightTest.java b/src/test/java/model/HeightTest.java new file mode 100644 index 00000000..bc208f5b --- /dev/null +++ b/src/test/java/model/HeightTest.java @@ -0,0 +1,27 @@ +package model; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class HeightTest { + + @Test + void testHeightValidValue() { + Height height = new Height(5); + assertThat(height.getValue()).isEqualTo(5); + } + + @Test + void testHeightInvalidValue() { + assertThatThrownBy(() -> new Height(1)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("사다리 높이는 2 이상이여야 합니다."); + } + + @Test + void testHeightMinimumValue() { + Height height = new Height(2); + assertThat(height.getValue()).isEqualTo(2); + } +} diff --git a/src/test/java/model/LadderGameTest.java b/src/test/java/model/LadderGameTest.java new file mode 100644 index 00000000..1fe17b95 --- /dev/null +++ b/src/test/java/model/LadderGameTest.java @@ -0,0 +1,56 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import test.FixedNumberGenerator; + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; + +class LadderGameTest { + + private Players players; + private Prizes prizes; + + @BeforeEach + void setUp() { + List playerNames = List.of("Gold", "nana", "Broze"); + List prizeList = List.of("꽝", "3000", "5000"); + players = new Players(playerNames); + prizes = Prizes.form(prizeList, players); + } + + @Test + @DisplayName("LadderGame을 생성하는 지 검증한다.") + void shouldCreateLadderGameCorrectly() { + PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); + Height maxHeight = new Height(5); + + LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); + + assertThat(ladderGame).isExactlyInstanceOf(LadderGame.class); + } + + @Test + @DisplayName("LadderGame의 레더 포인트가 비어 있지 않음을 검증한다.") + void shouldHaveNonEmptyLadderPoints() { + PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); + Height maxHeight = new Height(5); + LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); + + assertThat(ladderGame.getLadderPoints()).isNotEmpty(); + } + + @Test + @DisplayName("LadderGame에서 모든 플레이어의 결과가 예상된 보상과 일치하는지 검증한다.") + void shouldHaveCorrectResultsForAllPlayers() { + PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); + Height maxHeight = new Height(5); + LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); + + assertThat(ladderGame.getAllResultForPlayers().values()) + .containsExactly("3000", "꽝", "5000"); + } +} diff --git a/src/test/java/model/LadderResultTest.java b/src/test/java/model/LadderResultTest.java new file mode 100644 index 00000000..fa21db1d --- /dev/null +++ b/src/test/java/model/LadderResultTest.java @@ -0,0 +1,51 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; + +class LadderResultTest { + + private List player; + private List prize; + + @BeforeEach + void setUp() { + player = List.of("Gold", "nana", "Broze"); + prize = List.of("꽝", "3000", "5000"); + } + + private LadderResult createLadderResult(List player, List prize) { + Players players = new Players(player); + Prizes prizes = Prizes.form(prize, players); + + List lines = List.of( + new Line(List.of(Point.HAS_POINT, Point.NO_POINT)), + new Line(List.of(Point.NO_POINT, Point.HAS_POINT)) + ); + Ladder ladder = new Ladder(lines); + LadderResult ladderResult = new LadderResult(ladder); + ladderResult.calculateResults(player, prizes); + return ladderResult; + } + + @Test + @DisplayName("플레이어 이름에 대한 결과를 올바르게 계산하는지 검증한다.") + void shouldCalculateResultsCorrectly() { + LadderResult ladderResult = createLadderResult(player, prize); + + assertThat(ladderResult.getValue().values()).containsExactly("5000", "꽝", "3000"); + } + + @Test + @DisplayName("결과가 없는 플레이어에 대해 '결과 없음'을 반환하는지 검증한다.") + void shouldReturnNoResultWhenPlayerNotFound() { + LadderResult ladderResult = createLadderResult(player, prize); + + assertThat(ladderResult.getResultForPlayer("NonExistPlayer")).isEqualTo("결과 없음"); + } +} diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java new file mode 100644 index 00000000..01f094cf --- /dev/null +++ b/src/test/java/model/LadderTest.java @@ -0,0 +1,43 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; +import static org.assertj.core.api.Assertions.*; + +class LadderTest { + + @Test + @DisplayName("레더에서 라인들을 제대로 반환하는지 검증한다.") + void shouldReturnLinesCorrectly() { + + List lines = Arrays.asList(new Line(Arrays.asList(Point.HAS_POINT, Point.NO_POINT)), + new Line(Arrays.asList(Point.NO_POINT, Point.HAS_POINT))); + + Ladder ladder = new Ladder(lines); + + List result = ladder.getLines(); + + assertThat(result).hasSize(2); + assertThat(result).isEqualTo(lines); + } + + @Test + @DisplayName("레더에서 라인에 포함된 포인트들을 제대로 반환하는지 검증한다.") + void shouldReturnPointsFromLinesCorrectly() { + + Line line1 = new Line(Arrays.asList(Point.HAS_POINT, Point.NO_POINT)); + Line line2 = new Line(Arrays.asList(Point.NO_POINT, Point.HAS_POINT)); + List lines = Arrays.asList(line1, line2); + Ladder ladder = new Ladder(lines); + + List result = ladder.getPointsFromLines(); + + assertThat(result).hasSize(4); + assertThat(result.get(0)).isEqualTo(Point.HAS_POINT); + assertThat(result.get(1)).isEqualTo(Point.NO_POINT); + assertThat(result.get(2)).isEqualTo(Point.NO_POINT); + assertThat(result.get(3)).isEqualTo(Point.HAS_POINT); + } +} diff --git a/src/test/java/model/LineTest.java b/src/test/java/model/LineTest.java new file mode 100644 index 00000000..16537ee6 --- /dev/null +++ b/src/test/java/model/LineTest.java @@ -0,0 +1,54 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; +import java.util.List; + +class LineTest { + + @Test + @DisplayName("유효한 포인트들이 주어졌을 때 라인이 포인트들을 포함하는지 검증한다.") + void shouldContainPointsWhenValidProvided() { + List points = List.of(Point.HAS_POINT, Point.NO_POINT); + + Line line = new Line(points); + + assertThat(line.getPointGroups()).containsExactly(Point.HAS_POINT, Point.NO_POINT); + } + + @Test + @DisplayName("포인트들이 변경 불가능한 리스트로 반환되는지 검증한다.") + void shouldReturnUnmodifiableList() { + List points = List.of(Point.HAS_POINT, Point.NO_POINT); + + Line line = new Line(points); + + assertThatThrownBy(() -> line.getPointGroups().clear()) + .isInstanceOf(UnsupportedOperationException.class); + } + + @Test + @DisplayName("포인트들이 주어졌을 때 순서를 유지하는지 검증한다.") + void shouldContainPointsInOrder() { + List points = List.of(Point.HAS_POINT, Point.NO_POINT); + + Line line = new Line(points); + + assertThat(line.getPointGroups()) + .element(0).isEqualTo(Point.HAS_POINT); + + assertThat(line.getPointGroups()) + .element(1).isEqualTo(Point.NO_POINT); + } + + @Test + @DisplayName("하나의 포인트가 주어졌을 때 라인이 올바르게 처리하는지 검증한다.") + void shouldHandleSinglePoint() { + List points = List.of(Point.HAS_POINT); + + Line line = new Line(points); + + assertThat(line.getPointGroups()).containsExactly(Point.HAS_POINT); + } +} diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java new file mode 100644 index 00000000..855e4027 --- /dev/null +++ b/src/test/java/model/PlayerTest.java @@ -0,0 +1,28 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +class PlayerTest { + + @Test + @DisplayName("유효한 이름으로 플레이어가 정상적으로 생성되는지 검증한다.") + void shouldCreatePlayerCorrectlyWhenNameIsValid() { + String validName = "Alice"; + + Player player = new Player(validName); + + assertThat(player.getValue()).isEqualTo(validName); + } + + @Test + @DisplayName("플레이어 이름이 최대 길이를 초과하면 예외가 발생하는지 검증한다.") + void shouldThrowExceptionWhenNameMaxLength() { + String invalidName = "LongName"; + + assertThatThrownBy(() -> new Player(invalidName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("참가자 이름은 5글자를 초과할 수 없습니다."); + } +} diff --git a/src/test/java/model/PlayersTest.java b/src/test/java/model/PlayersTest.java new file mode 100644 index 00000000..97393cf3 --- /dev/null +++ b/src/test/java/model/PlayersTest.java @@ -0,0 +1,40 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +class PlayersTest { + + @Test + @DisplayName("유효한 플레이어 리스트로 객체가 제대로 생성되는지 검증한다.") + void shouldNotThrowExceptionWhenValidPlayers() { + List validPlayerNames = List.of("Alice", "Bob"); + + Players players = new Players(validPlayerNames); + + assertThat(players.size()).isEqualTo(2); + } + + @Test + @DisplayName("플레이어 수가 부족하면 예외가 발생하는지 검증한다.") + void shouldThrowExceptionWhenNotEnoughPlayers() { + List invalidPlayerNames = List.of("Alice"); + + assertThatThrownBy(() -> new Players(invalidPlayerNames)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("참가자는 2명 이상이여야 합니다."); + } + + @Test + @DisplayName("플레이어 수가 충분하면 객체가 제대로 생성되는지 검증한다.") + void shouldContainValidPlayersWhenGenerated() { + List validPlayerNames = List.of("Alice", "Bob"); + + Players players = new Players(validPlayerNames); + + assertThat(players.getPlayers()).containsExactly("Alice", "Bob"); + } +} diff --git a/src/test/java/model/PointGeneratorTest.java b/src/test/java/model/PointGeneratorTest.java new file mode 100644 index 00000000..4db39695 --- /dev/null +++ b/src/test/java/model/PointGeneratorTest.java @@ -0,0 +1,70 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import test.FixedNumberGenerator; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class PointGeneratorTest { + + private PointGenerator pointGenerator; + private Players players; + + @BeforeEach + void setUp() { + players = new Players(Arrays.asList("neo", "brown", "brie", "tommy")); + } + + private void createPointGeneratorWithFixedNumber(int number) { + pointGenerator = new PointGenerator(new FixedNumberGenerator(number)); + } + + @Test + @DisplayName("포인트 리스트의 크기가 3인지 검증한다.") + void shouldHaveSizeThree() { + createPointGeneratorWithFixedNumber(0); + Size size = new Size(players.size()); + + List points = pointGenerator.createLinePoints(size); + + assertThat(points).hasSize(3); + } + + @Test + @DisplayName("FixedNumberGenerator 값이 0일 때, 모든 포인트가 NO_POINT로 생성되는지 검증한다.") + void shouldCreateLinePointsAllNoPoint() { + createPointGeneratorWithFixedNumber(0); + Size size = new Size(players.size()); + + List points = pointGenerator.createLinePoints(size); + + assertThat(points).allMatch(point -> point == Point.NO_POINT); + } + + @Test + @DisplayName("FixedNumberGenerator 값이 1일 때, HAS_POINT가 포함된 포인트가 생성되는지 검증한다.") + void shouldCreateLinePointsWithHasPoint() { + createPointGeneratorWithFixedNumber(1); + Size size = new Size(players.size()); + + List linePoints = pointGenerator.createLinePoints(size); + + assertThat(linePoints).contains(Point.HAS_POINT); + } + + @Test + @DisplayName("FixedNumberGenerator 값이 0일 때, 모두 NO_POINT로 생성되는지 검증한다.") + void shouldCreateLinePointsWithMixPoints() { + createPointGeneratorWithFixedNumber(0); + Size size = new Size(players.size()); + + List points = pointGenerator.createLinePoints(size); + + assertThat(points).containsExactly(Point.NO_POINT, Point.NO_POINT, Point.NO_POINT); + } +} diff --git a/src/test/java/model/PrizeTest.java b/src/test/java/model/PrizeTest.java new file mode 100644 index 00000000..495694ad --- /dev/null +++ b/src/test/java/model/PrizeTest.java @@ -0,0 +1,39 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +public class PrizeTest { + + @Test + @DisplayName("유효한 값이면 Prize 객체를 생성하는지 검증한다.") + public void shouldCreatePrizeWithValidValue() { + String validValue = "Gold"; + + Prize prize = new Prize(validValue); + + assertThat(prize.getValue()).isEqualTo(validValue); + } + + @Test + @DisplayName("값이 null이면 예외를 발생시키는지 검증한다.") + public void shouldThrowExceptionWhenValueIsNull() { + String invalidValue = null; + + assertThatThrownBy(() -> new Prize(invalidValue)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("실행결과는 null이거나 공백일 수는 없습니다."); + } + + @Test + @DisplayName("값이 빈 문자열이면 예외를 발생시키는지 검증한다.") + public void shouldThrowExceptionWhenValueIsEmpty() { + String invalidValue = ""; + + assertThatThrownBy(() -> new Prize(invalidValue)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("실행결과는 null이거나 공백일 수는 없습니다."); + } +} diff --git a/src/test/java/model/PrizesTest.java b/src/test/java/model/PrizesTest.java new file mode 100644 index 00000000..f361d50f --- /dev/null +++ b/src/test/java/model/PrizesTest.java @@ -0,0 +1,45 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; +import java.util.List; + +public class PrizesTest { + + @Test + @DisplayName("유효한 값이면 Prizes 객체를 생성하는지 검증한다.") + public void shouldCreatePrizesWithValidValues() { + List player = List.of("Gold", "nana", "Broze"); + List prize = List.of("꽝", "3000", "5000"); + Players players = new Players(player); + + Prizes prizes = Prizes.form(prize, players); + + assertThat(prizes.getPrize()).containsExactly("꽝", "3000", "5000"); + } + + @Test + @DisplayName("실행결과 개수와 참가자의 수가 다르면 예외를 발생시키는지 검증한다.") + public void shouldThrowExceptionWhenPrizeSizeDoesNotMatchPlayersSize() { + List player = List.of("Gold", "nana"); + List prize = List.of("꽝", "3000", "5000"); + Players players = new Players(player); + + assertThatThrownBy(() -> Prizes.form(prize, players)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("실행결과 개수와 참가자의 수는 동일해야 합니다."); + } + + @Test + @DisplayName("결과가 비어있으면 예외를 발생시키는지 검증한다.") + public void shouldCreateEmptyPrizesWhenEmptyResults() { + List player = List.of("Gold", "nana"); + List prize = List.of(); + Players players = new Players(player); + + assertThatThrownBy(() -> Prizes.form(prize, players)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("실행결과 개수와 참가자의 수는 동일해야 합니다."); + } +} diff --git a/src/test/java/model/RandomValueGeneratorTest.java b/src/test/java/model/RandomValueGeneratorTest.java new file mode 100644 index 00000000..73441b62 --- /dev/null +++ b/src/test/java/model/RandomValueGeneratorTest.java @@ -0,0 +1,20 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class RandomValueGeneratorTest { + private static final int MIN_RANDOM_VALUE = 0; + private static final int MAX_RANDOM_VALUE = 2; + private final RandomValueGenerator generator = new RandomValueGenerator(); + + @Test + @DisplayName("랜덤값을 생성하면 범위에 있는지 검증한다.") + void testRandomValueGenerator() { + int randomNumber = generator.generateRandomNumber(); + + assertThat(randomNumber).isBetween(MIN_RANDOM_VALUE, MAX_RANDOM_VALUE); + } +} diff --git a/src/test/java/model/SizeTest.java b/src/test/java/model/SizeTest.java new file mode 100644 index 00000000..76526f57 --- /dev/null +++ b/src/test/java/model/SizeTest.java @@ -0,0 +1,26 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +public class SizeTest { + + @Test + @DisplayName("사이즈가 유효한 값이면 Size 객체를 생성하는지 검증한다.") + public void shouldCreateSizeWithValidValue() { + int validSize = 5; + Size size = new Size(validSize); + assertThat(size.getSize()).isEqualTo(validSize); + } + + @Test + @DisplayName("사이즈가 유효하지 않는 값이면 예외를 발생시키는지 검증한다.") + public void shouldThrowExceptionWhenSizeIsNegative() { + int invalidSize = -1; + + assertThatThrownBy(() -> new Size(invalidSize)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("사다리 사이즈가 0보다 작을 수는 없습니다."); + } +} From 61dac536f0a7ec32e862f5f49aefc9a124b1ee63 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Mon, 17 Mar 2025 11:08:00 +0900 Subject: [PATCH 06/46] =?UTF-8?q?refactor=20pointGeneratorTest=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A4=91=EB=B3=B5=EB=90=9C=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PointGeneratorTest.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/test/java/model/PointGeneratorTest.java b/src/test/java/model/PointGeneratorTest.java index 4db39695..5186ec0b 100644 --- a/src/test/java/model/PointGeneratorTest.java +++ b/src/test/java/model/PointGeneratorTest.java @@ -56,15 +56,4 @@ void shouldCreateLinePointsWithHasPoint() { assertThat(linePoints).contains(Point.HAS_POINT); } - - @Test - @DisplayName("FixedNumberGenerator 값이 0일 때, 모두 NO_POINT로 생성되는지 검증한다.") - void shouldCreateLinePointsWithMixPoints() { - createPointGeneratorWithFixedNumber(0); - Size size = new Size(players.size()); - - List points = pointGenerator.createLinePoints(size); - - assertThat(points).containsExactly(Point.NO_POINT, Point.NO_POINT, Point.NO_POINT); - } } From 5894df8456b6b96a823f8a9338a6028f8d35b1b4 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Mon, 17 Mar 2025 11:15:30 +0900 Subject: [PATCH 07/46] =?UTF-8?q?refactor=20HeightTest=20displayname=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=9D=BC=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/HeightTest.java | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/test/java/model/HeightTest.java b/src/test/java/model/HeightTest.java index bc208f5b..b95f76ac 100644 --- a/src/test/java/model/HeightTest.java +++ b/src/test/java/model/HeightTest.java @@ -1,5 +1,6 @@ package model; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; @@ -7,21 +8,24 @@ class HeightTest { @Test - void testHeightValidValue() { + @DisplayName("Height 객체의 높이가 유효한 값일 때 정상적으로 생성되는지 검증한다.") + void shouldCreateHeightWithValidValue() { Height height = new Height(5); assertThat(height.getValue()).isEqualTo(5); } @Test - void testHeightInvalidValue() { + @DisplayName("최소값일 때 Height 객체가 정상적으로 생성되는지 검증한다.") + void shouldCreateHeightWithMinimumValue() { + Height height = new Height(2); + assertThat(height.getValue()).isEqualTo(2); + } + + @Test + @DisplayName("Height 객체의 높이가 2 미만일 때 예외가 발생하는지 검증한다.") + void shouldThrowExceptionForHeightBelowMin() { assertThatThrownBy(() -> new Height(1)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("사다리 높이는 2 이상이여야 합니다."); } - - @Test - void testHeightMinimumValue() { - Height height = new Height(2); - assertThat(height.getValue()).isEqualTo(2); - } } From cf29f3e89309324be31a9671f840a0cda099e031 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Mon, 17 Mar 2025 12:01:49 +0900 Subject: [PATCH 08/46] =?UTF-8?q?refactor=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B0=9C=ED=96=89=20=EB=A6=AC=ED=8E=99=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 1 - src/main/java/model/LadderGame.java | 1 + src/main/java/view/ResultView.java | 1 - src/test/java/model/HeightTest.java | 3 +-- src/test/java/model/LadderGameTest.java | 2 -- src/test/java/model/LadderResultTest.java | 2 -- src/test/java/model/PlayersTest.java | 1 - src/test/java/model/PointGeneratorTest.java | 2 -- src/test/java/model/PrizeTest.java | 1 - src/test/java/model/RandomValueGeneratorTest.java | 1 - 10 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 5231888a..f928a4ec 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -5,7 +5,6 @@ import view.ResultView; import java.util.ArrayList; import java.util.List; - import static model.Point.HAS_POINT; public class LadderController { diff --git a/src/main/java/model/LadderGame.java b/src/main/java/model/LadderGame.java index 9cf0d081..0f926719 100644 --- a/src/main/java/model/LadderGame.java +++ b/src/main/java/model/LadderGame.java @@ -16,6 +16,7 @@ public LadderGame(Ladder ladder, LadderResult ladderResult) { public static LadderGame createGame(Players players, Height maxHeight, PointGenerator pointGenerator, Prizes prizes) { + Ladder ladder = new Ladder(generateLines(players.size(), maxHeight.getValue(), pointGenerator)); LadderResult ladderResult = new LadderResult(ladder); ladderResult.calculateResults(players.getPlayers(), prizes); diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index dbb82530..87998f99 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -1,6 +1,5 @@ package view; - import java.util.List; import java.util.Map; diff --git a/src/test/java/model/HeightTest.java b/src/test/java/model/HeightTest.java index b95f76ac..c40dbe31 100644 --- a/src/test/java/model/HeightTest.java +++ b/src/test/java/model/HeightTest.java @@ -2,7 +2,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.*; class HeightTest { @@ -20,7 +19,7 @@ void shouldCreateHeightWithMinimumValue() { Height height = new Height(2); assertThat(height.getValue()).isEqualTo(2); } - + @Test @DisplayName("Height 객체의 높이가 2 미만일 때 예외가 발생하는지 검증한다.") void shouldThrowExceptionForHeightBelowMin() { diff --git a/src/test/java/model/LadderGameTest.java b/src/test/java/model/LadderGameTest.java index 1fe17b95..4227edd2 100644 --- a/src/test/java/model/LadderGameTest.java +++ b/src/test/java/model/LadderGameTest.java @@ -4,9 +4,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import test.FixedNumberGenerator; - import static org.assertj.core.api.Assertions.*; - import java.util.List; class LadderGameTest { diff --git a/src/test/java/model/LadderResultTest.java b/src/test/java/model/LadderResultTest.java index fa21db1d..5ef79179 100644 --- a/src/test/java/model/LadderResultTest.java +++ b/src/test/java/model/LadderResultTest.java @@ -3,9 +3,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.*; - import java.util.List; class LadderResultTest { diff --git a/src/test/java/model/PlayersTest.java b/src/test/java/model/PlayersTest.java index 97393cf3..57f9ff1d 100644 --- a/src/test/java/model/PlayersTest.java +++ b/src/test/java/model/PlayersTest.java @@ -3,7 +3,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.List; - import static org.assertj.core.api.Assertions.*; class PlayersTest { diff --git a/src/test/java/model/PointGeneratorTest.java b/src/test/java/model/PointGeneratorTest.java index 5186ec0b..52fd59fa 100644 --- a/src/test/java/model/PointGeneratorTest.java +++ b/src/test/java/model/PointGeneratorTest.java @@ -4,10 +4,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import test.FixedNumberGenerator; - import java.util.Arrays; import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; class PointGeneratorTest { diff --git a/src/test/java/model/PrizeTest.java b/src/test/java/model/PrizeTest.java index 495694ad..28470a4d 100644 --- a/src/test/java/model/PrizeTest.java +++ b/src/test/java/model/PrizeTest.java @@ -2,7 +2,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.*; public class PrizeTest { diff --git a/src/test/java/model/RandomValueGeneratorTest.java b/src/test/java/model/RandomValueGeneratorTest.java index 73441b62..ec47202c 100644 --- a/src/test/java/model/RandomValueGeneratorTest.java +++ b/src/test/java/model/RandomValueGeneratorTest.java @@ -2,7 +2,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; class RandomValueGeneratorTest { From 26d4ae4996d70829f5f0ba23b53a6fbd5158b992 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 09:41:05 +0900 Subject: [PATCH 09/46] =?UTF-8?q?refactor=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=88=98=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EB=82=98=EB=88=A0=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index f928a4ec..54710e1c 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -3,8 +3,10 @@ import model.*; import view.InputView; import view.ResultView; + import java.util.ArrayList; import java.util.List; + import static model.Point.HAS_POINT; public class LadderController { @@ -15,13 +17,13 @@ public class LadderController { public void startLadder() { Players player = new Players(inputView.inputNames()); - Prizes prizes = Prizes.form(inputView.inputResult(), player); + Prizes prizes = Prizes.from(inputView.inputResult(), player); Height height = new Height(inputView.getMaxLadderHeight()); PointGenerator pointGenerator = new PointGenerator(new RandomValueGenerator()); LadderGame ladderGame = LadderGame.createGame(player, height, pointGenerator, prizes); List points = formatLadderPoints(ladderGame.getLadderPoints()); - List> ladderLines = processLadderLines(points); + List> ladderLines = processLadderLines(points, player.size()); resultView.printLadder(ladderLines, player.getPlayers(), prizes.getPrize()); printResult(ladderGame); } @@ -48,15 +50,16 @@ private List formatLadderPoints(List ladderPoints) { return formattedLadder; } - private List> processLadderLines(List ladderPoints) { + private List> processLadderLines(List ladderPoints, int numPlayers) { + int lineCount = numPlayers - 1; List> chunks = new ArrayList<>(); - for (int i = 0; i < ladderPoints.size(); i += CHUNK_SIZE) { - chunks.add(getLadderSegment(ladderPoints, i)); + for (int i = 0; i < ladderPoints.size(); i += lineCount) { + chunks.add(getLadderSegment(ladderPoints, i, lineCount)); } return chunks; } - private List getLadderSegment(List ladderPoints, int startIndex) { - return ladderPoints.subList(startIndex, Math.min(startIndex + CHUNK_SIZE, ladderPoints.size())); + private List getLadderSegment(List ladderPoints, int startIndex, int lineCount) { + return ladderPoints.subList(startIndex, Math.min(startIndex + lineCount, ladderPoints.size())); } } From 03c08834fba5f65250a71f91ce17729fe46df801 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 09:46:40 +0900 Subject: [PATCH 10/46] =?UTF-8?q?refactor=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=83=81=EC=88=98=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F?= =?UTF-8?q?=20=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 54710e1c..2a582c3a 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -11,7 +11,7 @@ public class LadderController { - private static final int CHUNK_SIZE = 3; + private static final String ALL_PLAYERS = "all"; private final ResultView resultView = new ResultView(); private final InputView inputView = new InputView(); @@ -32,7 +32,7 @@ private void printResult(LadderGame ladderGame) { while (true) { String targetPlayerName = inputView.getTargetPlayerName(); - if (targetPlayerName.equals("all")) { + if (targetPlayerName.equals(ALL_PLAYERS)) { resultView.printAllResults(ladderGame.getAllResultForPlayers()); break; } From 586cbf0d1f006e205191020fecce9cc353cf5329 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 09:49:12 +0900 Subject: [PATCH 11/46] =?UTF-8?q?refactor=20players=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 2a582c3a..096387a0 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -1,5 +1,6 @@ package controller; + import model.*; import view.InputView; import view.ResultView; @@ -16,15 +17,15 @@ public class LadderController { private final InputView inputView = new InputView(); public void startLadder() { - Players player = new Players(inputView.inputNames()); - Prizes prizes = Prizes.from(inputView.inputResult(), player); + Players players = new Players(inputView.inputNames()); + Prizes prizes = Prizes.from(inputView.inputResult(), players); Height height = new Height(inputView.getMaxLadderHeight()); PointGenerator pointGenerator = new PointGenerator(new RandomValueGenerator()); - LadderGame ladderGame = LadderGame.createGame(player, height, pointGenerator, prizes); + LadderGame ladderGame = LadderGame.createGame(players, height, pointGenerator, prizes); List points = formatLadderPoints(ladderGame.getLadderPoints()); - List> ladderLines = processLadderLines(points, player.size()); - resultView.printLadder(ladderLines, player.getPlayers(), prizes.getPrize()); + List> ladderLines = processLadderLines(points, players.size()); + resultView.printLadder(ladderLines, players.getPlayers(), prizes.getPrize()); printResult(ladderGame); } From 4cc30cc4a2775b678223748cf79d40f6c762dd71 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 09:54:09 +0900 Subject: [PATCH 12/46] =?UTF-8?q?refactor=20MIN,=20MAX=EB=A1=9C=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EC=9D=BC=EC=B9=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Height.java | 4 ++-- src/main/java/model/Players.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/model/Height.java b/src/main/java/model/Height.java index ad68a2a2..20cdb59f 100644 --- a/src/main/java/model/Height.java +++ b/src/main/java/model/Height.java @@ -1,7 +1,7 @@ package model; public class Height { - private static final int MINIMUM_HEIGHT = 2; + private static final int MIN_HEIGHT = 2; private final int value; @@ -11,7 +11,7 @@ public Height(int value) { } private void validateValue(int value) { - if (value < MINIMUM_HEIGHT) { + if (value < MIN_HEIGHT) { throw new IllegalArgumentException("사다리 높이는 2 이상이여야 합니다."); } } diff --git a/src/main/java/model/Players.java b/src/main/java/model/Players.java index e1bfdf63..ade005d1 100644 --- a/src/main/java/model/Players.java +++ b/src/main/java/model/Players.java @@ -4,7 +4,7 @@ public class Players { - private static final int MITMUM_PLAYER_LENGTH = 2; + private static final int MIT_PLAYER_LENGTH = 2; private final List players; public Players(List players) { @@ -29,7 +29,7 @@ private List generatePlayers(List players) { } private void validatePlayers(List players) { - if (players.size() < MITMUM_PLAYER_LENGTH) { + if (players.size() < MIT_PLAYER_LENGTH) { throw new IllegalArgumentException("참가자는 2명 이상이여야 합니다."); } } From c7151e912c833764d705466a2e267f422f17ce2f Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 09:56:01 +0900 Subject: [PATCH 13/46] =?UTF-8?q?refactor=20MIN=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Players.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/Players.java b/src/main/java/model/Players.java index ade005d1..e39cb274 100644 --- a/src/main/java/model/Players.java +++ b/src/main/java/model/Players.java @@ -4,7 +4,7 @@ public class Players { - private static final int MIT_PLAYER_LENGTH = 2; + private static final int MIN_PLAYER_LENGTH = 2; private final List players; public Players(List players) { @@ -29,7 +29,7 @@ private List generatePlayers(List players) { } private void validatePlayers(List players) { - if (players.size() < MIT_PLAYER_LENGTH) { + if (players.size() < MIN_PLAYER_LENGTH) { throw new IllegalArgumentException("참가자는 2명 이상이여야 합니다."); } } From e7385c6122485dbdb01033c53153619865e96737 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 10:08:40 +0900 Subject: [PATCH 14/46] =?UTF-8?q?refactor=20static=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 2 +- src/main/java/model/Prizes.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 096387a0..49a922e8 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -18,7 +18,7 @@ public class LadderController { public void startLadder() { Players players = new Players(inputView.inputNames()); - Prizes prizes = Prizes.from(inputView.inputResult(), players); + Prizes prizes = Prizes.createPrizes(inputView.inputResult(), players); Height height = new Height(inputView.getMaxLadderHeight()); PointGenerator pointGenerator = new PointGenerator(new RandomValueGenerator()); LadderGame ladderGame = LadderGame.createGame(players, height, pointGenerator, prizes); diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java index 5b511f72..8beb6c8f 100644 --- a/src/main/java/model/Prizes.java +++ b/src/main/java/model/Prizes.java @@ -10,7 +10,7 @@ public Prizes(List prize) { this.prize = prize; } - public static Prizes form(List result, Players players) { + public static Prizes createPrizes(List result, Players players) { validatePrize(result, players); return new Prizes(generatePrize(result)); } From 7a08d40355edbd96c8b2866c99fe6d785548a81a Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 10:26:13 +0900 Subject: [PATCH 15/46] =?UTF-8?q?refactor=20Prize=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A7=88=EC=A7=80=EB=A7=89=EC=A4=84=20=EA=B0=9C?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Prize.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java index 4ae247b5..0fbad2a4 100644 --- a/src/main/java/model/Prize.java +++ b/src/main/java/model/Prize.java @@ -14,9 +14,8 @@ public String getValue() { } private void validateValue(String value) { - if(value == null || value.isEmpty()) { + if (value == null || value.isEmpty()) { throw new IllegalArgumentException("실행결과는 null이거나 공백일 수는 없습니다."); } } } - From ed8b69ed57e7dbd97bc08f4287f2baacfaee7c94 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 10:52:01 +0900 Subject: [PATCH 16/46] =?UTF-8?q?feat=20=EC=98=88=EC=99=B8=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20ExceptionMessage=20=EC=97=B4=EA=B1=B0=ED=98=95=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/exception/ExceptionMessage.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/exception/ExceptionMessage.java diff --git a/src/main/java/exception/ExceptionMessage.java b/src/main/java/exception/ExceptionMessage.java new file mode 100644 index 00000000..f88cbc0a --- /dev/null +++ b/src/main/java/exception/ExceptionMessage.java @@ -0,0 +1,18 @@ +package exception; + +public enum ExceptionMessage { + LADDER_HEIGHT_TOO_SMALL("사다리 높이는 2 이상이여야 합니다."), + LADDER_SIZE_NEGATIVE("사다리 사이즈가 0보다 작을 수는 없습니다."), + LADDER_HEIGHT_NOT_NUMBER("사다리 높이는 숫자여야 합니다."), + PLAYER_NAME_TOO_LONG("참가자 이름은 5글자를 초과할 수 없습니다."), + MIN_PLAYERS_REQUIRED("참가자는 2명 이상이여야 합니다."), + RESULT_COUNT_MISMATCH("실행결과 개수와 참가자의 수는 동일해야 합니다."), + RESULT_NOT_NULL_OR_EMPTY("실행결과는 null이거나 공백일 수는 없습니다."), + NULL_OR_EMPTY_INPUT("입력값이 null이거나 비어있을 순 없습니다."); + + private final String message; + + ExceptionMessage(String message) { + this.message = message; + } +} From 62e1bcedec7d3494cb3a9f960da279d4d694523d Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 11:30:16 +0900 Subject: [PATCH 17/46] =?UTF-8?q?refactor=20=EC=98=88=EC=99=B8=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=EC=97=90=20ExceptionMessage=20=EC=97=B4?= =?UTF-8?q?=EA=B1=B0=ED=98=95=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/exception/ExceptionMessage.java | 6 ++++++ src/main/java/model/Height.java | 4 +++- src/main/java/model/Player.java | 4 +++- src/main/java/model/Players.java | 4 +++- src/main/java/model/Prize.java | 4 +++- src/main/java/model/Prizes.java | 4 +++- src/main/java/model/Size.java | 4 +++- src/main/java/view/InputView.java | 5 +++-- 8 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/main/java/exception/ExceptionMessage.java b/src/main/java/exception/ExceptionMessage.java index f88cbc0a..5c90c696 100644 --- a/src/main/java/exception/ExceptionMessage.java +++ b/src/main/java/exception/ExceptionMessage.java @@ -4,8 +4,10 @@ public enum ExceptionMessage { LADDER_HEIGHT_TOO_SMALL("사다리 높이는 2 이상이여야 합니다."), LADDER_SIZE_NEGATIVE("사다리 사이즈가 0보다 작을 수는 없습니다."), LADDER_HEIGHT_NOT_NUMBER("사다리 높이는 숫자여야 합니다."), + PLAYER_NAME_TOO_LONG("참가자 이름은 5글자를 초과할 수 없습니다."), MIN_PLAYERS_REQUIRED("참가자는 2명 이상이여야 합니다."), + RESULT_COUNT_MISMATCH("실행결과 개수와 참가자의 수는 동일해야 합니다."), RESULT_NOT_NULL_OR_EMPTY("실행결과는 null이거나 공백일 수는 없습니다."), NULL_OR_EMPTY_INPUT("입력값이 null이거나 비어있을 순 없습니다."); @@ -15,4 +17,8 @@ public enum ExceptionMessage { ExceptionMessage(String message) { this.message = message; } + + public String getMessage() { + return message; + } } diff --git a/src/main/java/model/Height.java b/src/main/java/model/Height.java index 20cdb59f..e0378bf5 100644 --- a/src/main/java/model/Height.java +++ b/src/main/java/model/Height.java @@ -1,5 +1,7 @@ package model; +import exception.ExceptionMessage; + public class Height { private static final int MIN_HEIGHT = 2; @@ -12,7 +14,7 @@ public Height(int value) { private void validateValue(int value) { if (value < MIN_HEIGHT) { - throw new IllegalArgumentException("사다리 높이는 2 이상이여야 합니다."); + throw new IllegalArgumentException(ExceptionMessage.LADDER_HEIGHT_TOO_SMALL.getMessage()); } } diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java index 5413d31d..5476a2ff 100644 --- a/src/main/java/model/Player.java +++ b/src/main/java/model/Player.java @@ -1,5 +1,7 @@ package model; +import exception.ExceptionMessage; + public class Player { private static final int MAX_NAME_LENGTH = 5; @@ -16,7 +18,7 @@ public String getValue() { private void validateValues(String values) { if (values.length() > MAX_NAME_LENGTH) { - throw new IllegalArgumentException("참가자 이름은 5글자를 초과할 수 없습니다."); + throw new IllegalArgumentException(ExceptionMessage.PLAYER_NAME_TOO_LONG.getMessage()); } } } diff --git a/src/main/java/model/Players.java b/src/main/java/model/Players.java index e39cb274..952dc128 100644 --- a/src/main/java/model/Players.java +++ b/src/main/java/model/Players.java @@ -1,5 +1,7 @@ package model; +import exception.ExceptionMessage; + import java.util.List; public class Players { @@ -30,7 +32,7 @@ private List generatePlayers(List players) { private void validatePlayers(List players) { if (players.size() < MIN_PLAYER_LENGTH) { - throw new IllegalArgumentException("참가자는 2명 이상이여야 합니다."); + throw new IllegalArgumentException(ExceptionMessage.MIN_PLAYERS_REQUIRED.getMessage()); } } } diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java index 0fbad2a4..d884c935 100644 --- a/src/main/java/model/Prize.java +++ b/src/main/java/model/Prize.java @@ -1,5 +1,7 @@ package model; +import exception.ExceptionMessage; + public class Prize { private final String value; @@ -15,7 +17,7 @@ public String getValue() { private void validateValue(String value) { if (value == null || value.isEmpty()) { - throw new IllegalArgumentException("실행결과는 null이거나 공백일 수는 없습니다."); + throw new IllegalArgumentException(ExceptionMessage.RESULT_NOT_NULL_OR_EMPTY.getMessage()); } } } diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java index 8beb6c8f..bbe4f6b0 100644 --- a/src/main/java/model/Prizes.java +++ b/src/main/java/model/Prizes.java @@ -1,5 +1,7 @@ package model; +import exception.ExceptionMessage; + import java.util.List; public class Prizes { @@ -29,7 +31,7 @@ private static List generatePrize(List result) { private static void validatePrize(List prizes, Players players) { if (prizes.size() != players.size()) { - throw new IllegalArgumentException("실행결과 개수와 참가자의 수는 동일해야 합니다."); + throw new IllegalArgumentException(ExceptionMessage.RESULT_COUNT_MISMATCH.getMessage()); } } } diff --git a/src/main/java/model/Size.java b/src/main/java/model/Size.java index 3ce05711..e2ae76d8 100644 --- a/src/main/java/model/Size.java +++ b/src/main/java/model/Size.java @@ -1,5 +1,7 @@ package model; +import exception.ExceptionMessage; + public class Size { private final int size; @@ -14,7 +16,7 @@ public int getSize() { private void validateSize(int size) { if (size < 0) { - throw new IllegalArgumentException("사다리 사이즈가 0보다 작을 수는 없습니다."); + throw new IllegalArgumentException(ExceptionMessage.LADDER_SIZE_NEGATIVE.getMessage()); } } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 28f53e3f..f9a3fd77 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,5 +1,6 @@ package view; +import exception.ExceptionMessage; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -43,13 +44,13 @@ private int parseLadderHeight(String input) { try { return Integer.parseInt(String.valueOf(input)); } catch (NumberFormatException e) { - throw new IllegalArgumentException("사다리 높이는 숫자여야 합니다."); + throw new IllegalArgumentException(ExceptionMessage.LADDER_HEIGHT_NOT_NUMBER.getMessage()); } } private void throwIfNamesIsNullOrEmpty(String input) { if (input == null || input.isEmpty()) { - throw new IllegalArgumentException("입력값이 null이거나 비어있을 순 없습니다."); + throw new IllegalArgumentException(ExceptionMessage.NULL_OR_EMPTY_INPUT.getMessage()); } } } From 8b1cb049f4c3e08d343c7f3fc2363b074a1fb69f Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:00:11 +0900 Subject: [PATCH 18/46] =?UTF-8?q?refactor=20=EC=88=98=EC=A0=95=EB=90=9C=20?= =?UTF-8?q?static=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=AA=85=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LadderGameTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/model/LadderGameTest.java b/src/test/java/model/LadderGameTest.java index 4227edd2..6849cb23 100644 --- a/src/test/java/model/LadderGameTest.java +++ b/src/test/java/model/LadderGameTest.java @@ -17,7 +17,7 @@ void setUp() { List playerNames = List.of("Gold", "nana", "Broze"); List prizeList = List.of("꽝", "3000", "5000"); players = new Players(playerNames); - prizes = Prizes.form(prizeList, players); + prizes = Prizes.createPrizes(prizeList, players); } @Test From 6f4ef52fbab47b903aeed40b214c33c4a1018dd6 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:13:56 +0900 Subject: [PATCH 19/46] =?UTF-8?q?refactor=20calculateResults=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC=20=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=B8=EB=8D=B4=ED=8A=B8=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LadderResult.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/model/LadderResult.java b/src/main/java/model/LadderResult.java index 8311ad02..6d199bfd 100644 --- a/src/main/java/model/LadderResult.java +++ b/src/main/java/model/LadderResult.java @@ -21,13 +21,18 @@ public void calculateResults(List playerNames, Prizes prizes) { for (String playerName : playerNames) { int playerIndex = playerNames.indexOf(playerName); - for (Line line : lines) { - playerIndex = getNewIndexMove(playerIndex, line.getPointGroups()); - } + playerIndex = getPlayerIndex(lines, playerIndex); results.put(playerName, prizeValues.get(playerIndex)); } } + private int getPlayerIndex(List lines, int playerIndex) { + for (Line line : lines) { + playerIndex = getNewIndexMove(playerIndex, line.getPointGroups()); + } + return playerIndex; + } + private int getNewIndexMove(int currentIndex, List points) { if (canMoveLeft(currentIndex, points)) { return currentIndex - 1; From a2a5707029e8c4cb24035b15809aad83bcb3e709 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:23:21 +0900 Subject: [PATCH 20/46] =?UTF-8?q?refactor=20HeightTest=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/HeightTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/model/HeightTest.java b/src/test/java/model/HeightTest.java index c40dbe31..e494e454 100644 --- a/src/test/java/model/HeightTest.java +++ b/src/test/java/model/HeightTest.java @@ -7,21 +7,21 @@ class HeightTest { @Test - @DisplayName("Height 객체의 높이가 유효한 값일 때 정상적으로 생성되는지 검증한다.") + @DisplayName("높이가 유효한 값일 때 정상적으로 생성된다.") void shouldCreateHeightWithValidValue() { Height height = new Height(5); assertThat(height.getValue()).isEqualTo(5); } @Test - @DisplayName("최소값일 때 Height 객체가 정상적으로 생성되는지 검증한다.") + @DisplayName("최소값일 때 높이가 정상적으로 생성된다") void shouldCreateHeightWithMinimumValue() { Height height = new Height(2); assertThat(height.getValue()).isEqualTo(2); } @Test - @DisplayName("Height 객체의 높이가 2 미만일 때 예외가 발생하는지 검증한다.") + @DisplayName("높이가 2 미만일 때 예외가 발생한다.") void shouldThrowExceptionForHeightBelowMin() { assertThatThrownBy(() -> new Height(1)) .isInstanceOf(IllegalArgumentException.class) From c3e91765310d97f4a5c1d2e0bad89eae40c2f438 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:27:12 +0900 Subject: [PATCH 21/46] =?UTF-8?q?refactor=20LadderGameTest=20displayname?= =?UTF-8?q?=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LadderGameTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/model/LadderGameTest.java b/src/test/java/model/LadderGameTest.java index 6849cb23..418f0d43 100644 --- a/src/test/java/model/LadderGameTest.java +++ b/src/test/java/model/LadderGameTest.java @@ -4,7 +4,9 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import test.FixedNumberGenerator; + import static org.assertj.core.api.Assertions.*; + import java.util.List; class LadderGameTest { @@ -21,9 +23,9 @@ void setUp() { } @Test - @DisplayName("LadderGame을 생성하는 지 검증한다.") + @DisplayName("게임 생성 시 정상적으로 생성된다.") void shouldCreateLadderGameCorrectly() { - PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); + PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); Height maxHeight = new Height(5); LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); @@ -32,7 +34,7 @@ void shouldCreateLadderGameCorrectly() { } @Test - @DisplayName("LadderGame의 레더 포인트가 비어 있지 않음을 검증한다.") + @DisplayName("게임의 레더 포인트가 비어 있지 않는다.") void shouldHaveNonEmptyLadderPoints() { PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); Height maxHeight = new Height(5); @@ -42,7 +44,7 @@ void shouldHaveNonEmptyLadderPoints() { } @Test - @DisplayName("LadderGame에서 모든 플레이어의 결과가 예상된 보상과 일치하는지 검증한다.") + @DisplayName("게임에서 모든 플레이어의 결과가 예상된 보상과 일치한다.") void shouldHaveCorrectResultsForAllPlayers() { PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); Height maxHeight = new Height(5); From 522379a0f5f75e5883637020c948f8df5198f832 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:28:08 +0900 Subject: [PATCH 22/46] =?UTF-8?q?refactor=20LadderResultTest=EC=97=90?= =?UTF-8?q?=EC=88=98=EC=A0=95=EB=90=9C=20static=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=AA=85=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LadderResultTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/model/LadderResultTest.java b/src/test/java/model/LadderResultTest.java index 5ef79179..05f7a186 100644 --- a/src/test/java/model/LadderResultTest.java +++ b/src/test/java/model/LadderResultTest.java @@ -19,7 +19,7 @@ void setUp() { private LadderResult createLadderResult(List player, List prize) { Players players = new Players(player); - Prizes prizes = Prizes.form(prize, players); + Prizes prizes = Prizes.createPrizes(prize, players); List lines = List.of( new Line(List.of(Point.HAS_POINT, Point.NO_POINT)), From 8aafd4f832bfba3932b42f01f57a2fca69711c88 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:29:51 +0900 Subject: [PATCH 23/46] =?UTF-8?q?refactor=20LadderResultTest=20displayname?= =?UTF-8?q?=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LadderResultTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/model/LadderResultTest.java b/src/test/java/model/LadderResultTest.java index 05f7a186..473f9cc2 100644 --- a/src/test/java/model/LadderResultTest.java +++ b/src/test/java/model/LadderResultTest.java @@ -3,7 +3,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; + import java.util.List; class LadderResultTest { @@ -32,7 +34,7 @@ private LadderResult createLadderResult(List player, List prize) } @Test - @DisplayName("플레이어 이름에 대한 결과를 올바르게 계산하는지 검증한다.") + @DisplayName("플레이어 이름에 대한 결과를 올바르게 계산한다.") void shouldCalculateResultsCorrectly() { LadderResult ladderResult = createLadderResult(player, prize); @@ -40,7 +42,7 @@ void shouldCalculateResultsCorrectly() { } @Test - @DisplayName("결과가 없는 플레이어에 대해 '결과 없음'을 반환하는지 검증한다.") + @DisplayName("결과가 없는 플레이어에 대해 '결과 없음'을 반환한다.") void shouldReturnNoResultWhenPlayerNotFound() { LadderResult ladderResult = createLadderResult(player, prize); From a7f648c83d7830e7958834f55191337dbe768dd1 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:34:09 +0900 Subject: [PATCH 24/46] =?UTF-8?q?refactor=20LadderTest=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LadderTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java index 01f094cf..53e2396a 100644 --- a/src/test/java/model/LadderTest.java +++ b/src/test/java/model/LadderTest.java @@ -9,7 +9,7 @@ class LadderTest { @Test - @DisplayName("레더에서 라인들을 제대로 반환하는지 검증한다.") + @DisplayName("레더의 라인이 정상적으로 반환된다.") void shouldReturnLinesCorrectly() { List lines = Arrays.asList(new Line(Arrays.asList(Point.HAS_POINT, Point.NO_POINT)), @@ -24,7 +24,7 @@ void shouldReturnLinesCorrectly() { } @Test - @DisplayName("레더에서 라인에 포함된 포인트들을 제대로 반환하는지 검증한다.") + @DisplayName("라인의 포인트 목록이 정상적으로 반환된다.") void shouldReturnPointsFromLinesCorrectly() { Line line1 = new Line(Arrays.asList(Point.HAS_POINT, Point.NO_POINT)); From 42140af8bf9bc01bbf90503869af3d42f0bbb0be Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:37:38 +0900 Subject: [PATCH 25/46] =?UTF-8?q?refactor=20LineTest=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LineTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/model/LineTest.java b/src/test/java/model/LineTest.java index 16537ee6..cfea1a24 100644 --- a/src/test/java/model/LineTest.java +++ b/src/test/java/model/LineTest.java @@ -8,7 +8,7 @@ class LineTest { @Test - @DisplayName("유효한 포인트들이 주어졌을 때 라인이 포인트들을 포함하는지 검증한다.") + @DisplayName("라인이 유효한 포인트를 포함한다.") void shouldContainPointsWhenValidProvided() { List points = List.of(Point.HAS_POINT, Point.NO_POINT); @@ -18,7 +18,7 @@ void shouldContainPointsWhenValidProvided() { } @Test - @DisplayName("포인트들이 변경 불가능한 리스트로 반환되는지 검증한다.") + @DisplayName("포인트들이 변경 불가능한 리스트로 반환한다.") void shouldReturnUnmodifiableList() { List points = List.of(Point.HAS_POINT, Point.NO_POINT); @@ -29,7 +29,7 @@ void shouldReturnUnmodifiableList() { } @Test - @DisplayName("포인트들이 주어졌을 때 순서를 유지하는지 검증한다.") + @DisplayName("포인트들이 주어졌을 때 순서를 유지한다.") void shouldContainPointsInOrder() { List points = List.of(Point.HAS_POINT, Point.NO_POINT); @@ -43,7 +43,7 @@ void shouldContainPointsInOrder() { } @Test - @DisplayName("하나의 포인트가 주어졌을 때 라인이 올바르게 처리하는지 검증한다.") + @DisplayName("하나의 포인트가 주어졌을 때 라인이 올바르게 처리한다.") void shouldHandleSinglePoint() { List points = List.of(Point.HAS_POINT); From 93c75781840e55c5f1a0b09f79cd44c1393355f4 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:42:01 +0900 Subject: [PATCH 26/46] =?UTF-8?q?refactor=20PlayersTest=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PlayersTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/model/PlayersTest.java b/src/test/java/model/PlayersTest.java index 57f9ff1d..7ff6a8d8 100644 --- a/src/test/java/model/PlayersTest.java +++ b/src/test/java/model/PlayersTest.java @@ -8,7 +8,7 @@ class PlayersTest { @Test - @DisplayName("유효한 플레이어 리스트로 객체가 제대로 생성되는지 검증한다.") + @DisplayName("유효한 플레이어 리스트로 객체가 정상적으로 생성된다.") void shouldNotThrowExceptionWhenValidPlayers() { List validPlayerNames = List.of("Alice", "Bob"); @@ -18,7 +18,7 @@ void shouldNotThrowExceptionWhenValidPlayers() { } @Test - @DisplayName("플레이어 수가 부족하면 예외가 발생하는지 검증한다.") + @DisplayName("플레이어 수가 부족하면 예외가 발생한다.") void shouldThrowExceptionWhenNotEnoughPlayers() { List invalidPlayerNames = List.of("Alice"); @@ -28,7 +28,7 @@ void shouldThrowExceptionWhenNotEnoughPlayers() { } @Test - @DisplayName("플레이어 수가 충분하면 객체가 제대로 생성되는지 검증한다.") + @DisplayName("플레이어 수가 충분하면 객체가 정상적으로 생성된다.") void shouldContainValidPlayersWhenGenerated() { List validPlayerNames = List.of("Alice", "Bob"); From 871892e7cfc1a18ea4a66e1b91f8e3d05402c95b Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:42:54 +0900 Subject: [PATCH 27/46] =?UTF-8?q?refactor=20PlayerTest=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PlayerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java index 855e4027..6f6d4cc4 100644 --- a/src/test/java/model/PlayerTest.java +++ b/src/test/java/model/PlayerTest.java @@ -7,7 +7,7 @@ class PlayerTest { @Test - @DisplayName("유효한 이름으로 플레이어가 정상적으로 생성되는지 검증한다.") + @DisplayName("유효한 이름으로 플레이어가 정상적으로 생성된다.") void shouldCreatePlayerCorrectlyWhenNameIsValid() { String validName = "Alice"; @@ -17,7 +17,7 @@ void shouldCreatePlayerCorrectlyWhenNameIsValid() { } @Test - @DisplayName("플레이어 이름이 최대 길이를 초과하면 예외가 발생하는지 검증한다.") + @DisplayName("플레이어 이름이 최대 길이를 초과하면 예외가 발생한다.") void shouldThrowExceptionWhenNameMaxLength() { String invalidName = "LongName"; From c2facf9a3690cbee218c87e15cbd634db9fdb018 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:48:39 +0900 Subject: [PATCH 28/46] =?UTF-8?q?refactor=20PointGeneratorTest=20displayna?= =?UTF-8?q?me=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PointGeneratorTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/model/PointGeneratorTest.java b/src/test/java/model/PointGeneratorTest.java index 52fd59fa..8bb92c1c 100644 --- a/src/test/java/model/PointGeneratorTest.java +++ b/src/test/java/model/PointGeneratorTest.java @@ -23,7 +23,7 @@ private void createPointGeneratorWithFixedNumber(int number) { } @Test - @DisplayName("포인트 리스트의 크기가 3인지 검증한다.") + @DisplayName("포인트 리스트 크기가 3으로 생성된다.") void shouldHaveSizeThree() { createPointGeneratorWithFixedNumber(0); Size size = new Size(players.size()); @@ -34,7 +34,7 @@ void shouldHaveSizeThree() { } @Test - @DisplayName("FixedNumberGenerator 값이 0일 때, 모든 포인트가 NO_POINT로 생성되는지 검증한다.") + @DisplayName("고정된 숫자 생성기 값이 0일 때, 모든 포인트가 NO_POINT로 생성된다.") void shouldCreateLinePointsAllNoPoint() { createPointGeneratorWithFixedNumber(0); Size size = new Size(players.size()); @@ -45,7 +45,7 @@ void shouldCreateLinePointsAllNoPoint() { } @Test - @DisplayName("FixedNumberGenerator 값이 1일 때, HAS_POINT가 포함된 포인트가 생성되는지 검증한다.") + @DisplayName("고정된 숫자 생성기 값이 1일 때, HAS_POINT가 포함된 포인트가 생성된다.") void shouldCreateLinePointsWithHasPoint() { createPointGeneratorWithFixedNumber(1); Size size = new Size(players.size()); From 5ff0bacb2d33a611d34cdeec0d9c221a02b50645 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:49:38 +0900 Subject: [PATCH 29/46] =?UTF-8?q?refactor=20PrizesTest=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=EB=90=9C=20static=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=AA=85=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PrizesTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/model/PrizesTest.java b/src/test/java/model/PrizesTest.java index f361d50f..404a7916 100644 --- a/src/test/java/model/PrizesTest.java +++ b/src/test/java/model/PrizesTest.java @@ -14,7 +14,7 @@ public void shouldCreatePrizesWithValidValues() { List prize = List.of("꽝", "3000", "5000"); Players players = new Players(player); - Prizes prizes = Prizes.form(prize, players); + Prizes prizes = Prizes.createPrizes(prize, players); assertThat(prizes.getPrize()).containsExactly("꽝", "3000", "5000"); } @@ -26,7 +26,7 @@ public void shouldThrowExceptionWhenPrizeSizeDoesNotMatchPlayersSize() { List prize = List.of("꽝", "3000", "5000"); Players players = new Players(player); - assertThatThrownBy(() -> Prizes.form(prize, players)) + assertThatThrownBy(() -> Prizes.createPrizes(prize, players)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("실행결과 개수와 참가자의 수는 동일해야 합니다."); } @@ -38,7 +38,7 @@ public void shouldCreateEmptyPrizesWhenEmptyResults() { List prize = List.of(); Players players = new Players(player); - assertThatThrownBy(() -> Prizes.form(prize, players)) + assertThatThrownBy(() -> Prizes.createPrizes(prize, players)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("실행결과 개수와 참가자의 수는 동일해야 합니다."); } From 5ae66011bb7154e75def246a8a8bad4e6b4c4684 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:54:25 +0900 Subject: [PATCH 30/46] =?UTF-8?q?refactor=20PrizesTest=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PrizesTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/model/PrizesTest.java b/src/test/java/model/PrizesTest.java index 404a7916..0c4d3c20 100644 --- a/src/test/java/model/PrizesTest.java +++ b/src/test/java/model/PrizesTest.java @@ -8,7 +8,7 @@ public class PrizesTest { @Test - @DisplayName("유효한 값이면 Prizes 객체를 생성하는지 검증한다.") + @DisplayName("유효한 값이면 사다라의 실행결과 객체가 생성된다.") public void shouldCreatePrizesWithValidValues() { List player = List.of("Gold", "nana", "Broze"); List prize = List.of("꽝", "3000", "5000"); @@ -20,7 +20,7 @@ public void shouldCreatePrizesWithValidValues() { } @Test - @DisplayName("실행결과 개수와 참가자의 수가 다르면 예외를 발생시키는지 검증한다.") + @DisplayName("실행결과 개수와 참가자의 수가 다르면 예외를 발생한다.") public void shouldThrowExceptionWhenPrizeSizeDoesNotMatchPlayersSize() { List player = List.of("Gold", "nana"); List prize = List.of("꽝", "3000", "5000"); @@ -32,7 +32,7 @@ public void shouldThrowExceptionWhenPrizeSizeDoesNotMatchPlayersSize() { } @Test - @DisplayName("결과가 비어있으면 예외를 발생시키는지 검증한다.") + @DisplayName("결과가 비어있으면 예외를 발생한다.") public void shouldCreateEmptyPrizesWhenEmptyResults() { List player = List.of("Gold", "nana"); List prize = List.of(); From 2b0164d0a88478f58d37436fe842ef972ccccdb5 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 15:59:51 +0900 Subject: [PATCH 31/46] =?UTF-8?q?refactor=20PrizeTest=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=ED=99=94=EB=90=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=A1=9C=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EA=B2=80=EC=A6=9D,=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PrizeTest.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/test/java/model/PrizeTest.java b/src/test/java/model/PrizeTest.java index 28470a4d..5f87531f 100644 --- a/src/test/java/model/PrizeTest.java +++ b/src/test/java/model/PrizeTest.java @@ -2,12 +2,15 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + import static org.assertj.core.api.Assertions.*; public class PrizeTest { @Test - @DisplayName("유효한 값이면 Prize 객체를 생성하는지 검증한다.") + @DisplayName("유효한 값이면 Prize 객체가 생성된다.") public void shouldCreatePrizeWithValidValue() { String validValue = "Gold"; @@ -16,18 +19,18 @@ public void shouldCreatePrizeWithValidValue() { assertThat(prize.getValue()).isEqualTo(validValue); } - @Test - @DisplayName("값이 null이면 예외를 발생시키는지 검증한다.") - public void shouldThrowExceptionWhenValueIsNull() { - String invalidValue = null; - + @ParameterizedTest + @NullAndEmptySource + @DisplayName("값이 null이면 예외가 발생한다.") + public void shouldThrowExceptionWhenValueIsNull(String invalidValue) { + assertThatThrownBy(() -> new Prize(invalidValue)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("실행결과는 null이거나 공백일 수는 없습니다."); } @Test - @DisplayName("값이 빈 문자열이면 예외를 발생시키는지 검증한다.") + @DisplayName("값이 빈 문자열이면 예외가 발생한다.") public void shouldThrowExceptionWhenValueIsEmpty() { String invalidValue = ""; From 133567570c818256a6177d547b1beea5a0851c97 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 16:06:12 +0900 Subject: [PATCH 32/46] =?UTF-8?q?refactor=20Prize=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=EB=AC=B8=EC=9E=90=EC=97=B4=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Prize.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java index d884c935..1df2b145 100644 --- a/src/main/java/model/Prize.java +++ b/src/main/java/model/Prize.java @@ -16,7 +16,7 @@ public String getValue() { } private void validateValue(String value) { - if (value == null || value.isEmpty()) { + if (value == null || value.trim().isEmpty()) { throw new IllegalArgumentException(ExceptionMessage.RESULT_NOT_NULL_OR_EMPTY.getMessage()); } } From 903cbf58fc19c8811994748fe45079bfb6313c3c Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 16:07:43 +0900 Subject: [PATCH 33/46] =?UTF-8?q?refactor=20PrizeTest=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B9=88=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EB=B0=8F=20=EA=B3=B5?= =?UTF-8?q?=EB=B0=B1=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0?= =?UTF-8?q?=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PrizeTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/model/PrizeTest.java b/src/test/java/model/PrizeTest.java index 5f87531f..c0db91cc 100644 --- a/src/test/java/model/PrizeTest.java +++ b/src/test/java/model/PrizeTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.*; @@ -23,17 +24,16 @@ public void shouldCreatePrizeWithValidValue() { @NullAndEmptySource @DisplayName("값이 null이면 예외가 발생한다.") public void shouldThrowExceptionWhenValueIsNull(String invalidValue) { - + assertThatThrownBy(() -> new Prize(invalidValue)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("실행결과는 null이거나 공백일 수는 없습니다."); } - @Test - @DisplayName("값이 빈 문자열이면 예외가 발생한다.") - public void shouldThrowExceptionWhenValueIsEmpty() { - String invalidValue = ""; - + @ParameterizedTest + @ValueSource(strings = {"", " ", " "}) + @DisplayName("값이 빈 문자열, 공백일 경우 예외가 발생한다.") + public void shouldThrowExceptionWhenValueIsEmpty(String invalidValue) { assertThatThrownBy(() -> new Prize(invalidValue)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("실행결과는 null이거나 공백일 수는 없습니다."); From 71f176b7c011b476384a7bd9c2d54c1ac9732f4d Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 16:10:40 +0900 Subject: [PATCH 34/46] =?UTF-8?q?refactor=20RandomValueGeneratorTest=20dis?= =?UTF-8?q?playname=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/RandomValueGeneratorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/model/RandomValueGeneratorTest.java b/src/test/java/model/RandomValueGeneratorTest.java index ec47202c..7aafc65b 100644 --- a/src/test/java/model/RandomValueGeneratorTest.java +++ b/src/test/java/model/RandomValueGeneratorTest.java @@ -10,7 +10,7 @@ class RandomValueGeneratorTest { private final RandomValueGenerator generator = new RandomValueGenerator(); @Test - @DisplayName("랜덤값을 생성하면 범위에 있는지 검증한다.") + @DisplayName("랜덤값이 지정된 범위 안에 생성된다.") void testRandomValueGenerator() { int randomNumber = generator.generateRandomNumber(); From 3a1f20833c51a050b265fc1b06f678101a0cbc7e Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 16:15:46 +0900 Subject: [PATCH 35/46] =?UTF-8?q?refactor=20SizeTest=20displayname=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/SizeTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/model/SizeTest.java b/src/test/java/model/SizeTest.java index 76526f57..33a0765c 100644 --- a/src/test/java/model/SizeTest.java +++ b/src/test/java/model/SizeTest.java @@ -7,7 +7,7 @@ public class SizeTest { @Test - @DisplayName("사이즈가 유효한 값이면 Size 객체를 생성하는지 검증한다.") + @DisplayName("사다리 크기가 유효한 값이면 정상적으로 객체를 생성한다.") public void shouldCreateSizeWithValidValue() { int validSize = 5; Size size = new Size(validSize); @@ -15,7 +15,7 @@ public void shouldCreateSizeWithValidValue() { } @Test - @DisplayName("사이즈가 유효하지 않는 값이면 예외를 발생시키는지 검증한다.") + @DisplayName("사다리 크기가 유효하지 않는 값이면 예외가 발생한다.") public void shouldThrowExceptionWhenSizeIsNegative() { int invalidSize = -1; From 1e16ec91c391dc6ec9f27c541aabe95b41403893 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 16:26:16 +0900 Subject: [PATCH 36/46] =?UTF-8?q?refactor=20FixedNumberGenerator=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/test => test/java/model}/FixedNumberGenerator.java | 4 +--- src/test/java/model/LadderGameTest.java | 5 +---- src/test/java/model/PointGeneratorTest.java | 1 - 3 files changed, 2 insertions(+), 8 deletions(-) rename src/{main/java/test => test/java/model}/FixedNumberGenerator.java (83%) diff --git a/src/main/java/test/FixedNumberGenerator.java b/src/test/java/model/FixedNumberGenerator.java similarity index 83% rename from src/main/java/test/FixedNumberGenerator.java rename to src/test/java/model/FixedNumberGenerator.java index b990eeef..48d7ffe0 100644 --- a/src/main/java/test/FixedNumberGenerator.java +++ b/src/test/java/model/FixedNumberGenerator.java @@ -1,6 +1,4 @@ -package test; - -import model.RandomUtil; +package model; public class FixedNumberGenerator implements RandomUtil { private final int fixedNumber; diff --git a/src/test/java/model/LadderGameTest.java b/src/test/java/model/LadderGameTest.java index 418f0d43..3ccff688 100644 --- a/src/test/java/model/LadderGameTest.java +++ b/src/test/java/model/LadderGameTest.java @@ -3,10 +3,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import test.FixedNumberGenerator; - import static org.assertj.core.api.Assertions.*; - import java.util.List; class LadderGameTest { @@ -25,7 +22,7 @@ void setUp() { @Test @DisplayName("게임 생성 시 정상적으로 생성된다.") void shouldCreateLadderGameCorrectly() { - PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); + PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); Height maxHeight = new Height(5); LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); diff --git a/src/test/java/model/PointGeneratorTest.java b/src/test/java/model/PointGeneratorTest.java index 8bb92c1c..cd195667 100644 --- a/src/test/java/model/PointGeneratorTest.java +++ b/src/test/java/model/PointGeneratorTest.java @@ -3,7 +3,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import test.FixedNumberGenerator; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; From 0c4b52fda09b56be225a87b045ba7e8b3b3d448d Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 22:17:33 +0900 Subject: [PATCH 37/46] =?UTF-8?q?refactor=20=EC=9D=B4=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=9D=84=20Ladder=EC=99=80=20Line=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Ladder.java | 7 +++++++ src/main/java/model/LadderResult.java | 28 +-------------------------- src/main/java/model/Line.java | 20 +++++++++++++++++++ 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 59fbf06b..4d848cb6 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -10,6 +10,13 @@ public Ladder(List lines) { this.lines = List.copyOf(lines); } + public int move(int position) { + for (Line line : lines) { + position = line.move(position); + } + return position; + } + public List getPointsFromLines() { List result = new ArrayList<>(); for (Line line : lines) { diff --git a/src/main/java/model/LadderResult.java b/src/main/java/model/LadderResult.java index 6d199bfd..851f0240 100644 --- a/src/main/java/model/LadderResult.java +++ b/src/main/java/model/LadderResult.java @@ -16,41 +16,15 @@ public LadderResult(Ladder ladder) { } public void calculateResults(List playerNames, Prizes prizes) { - List lines = ladder.getLines(); List prizeValues = prizes.getPrize(); for (String playerName : playerNames) { int playerIndex = playerNames.indexOf(playerName); - playerIndex = getPlayerIndex(lines, playerIndex); + playerIndex = ladder.move(playerIndex); results.put(playerName, prizeValues.get(playerIndex)); } } - private int getPlayerIndex(List lines, int playerIndex) { - for (Line line : lines) { - playerIndex = getNewIndexMove(playerIndex, line.getPointGroups()); - } - return playerIndex; - } - - private int getNewIndexMove(int currentIndex, List points) { - if (canMoveLeft(currentIndex, points)) { - return currentIndex - 1; - } - if (canMoveRight(currentIndex, points)) { - return currentIndex + 1; - } - return currentIndex; - } - - private boolean canMoveLeft(int currentIndex, List points) { - return currentIndex > 0 && points.get(currentIndex - 1) == Point.HAS_POINT; - } - - private boolean canMoveRight(int currentIndex, List points) { - return currentIndex < points.size() && points.get(currentIndex) == Point.HAS_POINT; - } - public String getResultForPlayer(String name) { return results.getOrDefault(name, NO_RESULT); } diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java index 8606ca36..4242d326 100644 --- a/src/main/java/model/Line.java +++ b/src/main/java/model/Line.java @@ -9,6 +9,26 @@ public Line(List points) { this.points = List.copyOf(points); } + public int move(int position) { + if(canMoveLeft(position)) { + return position -1; + } + + if(canMoveRight(position)) { + return position + 1; + } + return position; + } + + private boolean canMoveLeft(int position) { + return position > 0 && points.get(position - 1) == Point.HAS_POINT; + } + + private boolean canMoveRight(int position) { + return position < points.size() - 1 && points.get(position) == Point.HAS_POINT; + + } + public List getPointGroups() { return List.copyOf(points); } From c9380357230b7c266f92cf18cbd9924d6ab316a7 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Wed, 19 Mar 2025 23:45:17 +0900 Subject: [PATCH 38/46] =?UTF-8?q?refactor=20Line=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=EC=84=9C=20=EB=9D=BC=EC=9D=B8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=B1=85=EC=9E=84=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Ladder.java | 5 +++++ src/main/java/model/LadderGame.java | 8 +------- src/main/java/model/Line.java | 9 ++++++++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index 4d848cb6..116f5460 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -10,6 +10,11 @@ public Ladder(List lines) { this.lines = List.copyOf(lines); } + public static Ladder createLadder(int playerCount, int maxHeight, PointGenerator pointGenerator) { + List lines = Line.createLines(playerCount, maxHeight, pointGenerator); + return new Ladder(lines); + } + public int move(int position) { for (Line line : lines) { position = line.move(position); diff --git a/src/main/java/model/LadderGame.java b/src/main/java/model/LadderGame.java index 9cf0d081..76c541e5 100644 --- a/src/main/java/model/LadderGame.java +++ b/src/main/java/model/LadderGame.java @@ -16,18 +16,12 @@ public LadderGame(Ladder ladder, LadderResult ladderResult) { public static LadderGame createGame(Players players, Height maxHeight, PointGenerator pointGenerator, Prizes prizes) { - Ladder ladder = new Ladder(generateLines(players.size(), maxHeight.getValue(), pointGenerator)); + Ladder ladder = Ladder.createLadder(players.size(), maxHeight.getValue(), pointGenerator); LadderResult ladderResult = new LadderResult(ladder); ladderResult.calculateResults(players.getPlayers(), prizes); return new LadderGame(ladder, ladderResult); } - private static List generateLines(int playerCount, int maxHeight, PointGenerator pointGenerator) { - return IntStream.range(0, maxHeight) - .mapToObj(i -> new Line(pointGenerator.createLinePoints(new Size(playerCount)))) - .toList(); - } - public List getLadderPoints() { return ladder.getPointsFromLines(); } diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java index 4242d326..84179cd9 100644 --- a/src/main/java/model/Line.java +++ b/src/main/java/model/Line.java @@ -1,6 +1,7 @@ package model; import java.util.List; +import java.util.stream.IntStream; public class Line { private final List points; @@ -9,6 +10,12 @@ public Line(List points) { this.points = List.copyOf(points); } + public static List createLines(int playerCount, int maxHeight, PointGenerator pointGenerator) { + return IntStream.range(0, maxHeight) + .mapToObj(i -> new Line(pointGenerator.createLinePoints(new Size(playerCount)))) + .toList(); + } + public int move(int position) { if(canMoveLeft(position)) { return position -1; @@ -25,7 +32,7 @@ private boolean canMoveLeft(int position) { } private boolean canMoveRight(int position) { - return position < points.size() - 1 && points.get(position) == Point.HAS_POINT; + return position < points.size() && points.get(position) == Point.HAS_POINT; } From 2020d0572b5fed6503fa956a4bea1848f72e9021 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 00:07:36 +0900 Subject: [PATCH 39/46] =?UTF-8?q?refactor=20LadderGame=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20startLadder=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=82=B4=EC=97=90=EC=84=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LadderController.java | 17 +++--- src/main/java/model/LadderGame.java | 40 -------------- src/test/java/model/LadderGameTest.java | 53 ------------------- 3 files changed, 10 insertions(+), 100 deletions(-) delete mode 100644 src/main/java/model/LadderGame.java delete mode 100644 src/test/java/model/LadderGameTest.java diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 49a922e8..e6c41f13 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -21,24 +21,27 @@ public void startLadder() { Prizes prizes = Prizes.createPrizes(inputView.inputResult(), players); Height height = new Height(inputView.getMaxLadderHeight()); PointGenerator pointGenerator = new PointGenerator(new RandomValueGenerator()); - LadderGame ladderGame = LadderGame.createGame(players, height, pointGenerator, prizes); - List points = formatLadderPoints(ladderGame.getLadderPoints()); + Ladder ladder = Ladder.createLadder(players.size(), height.getValue(), pointGenerator); + LadderResult ladderResult = new LadderResult(ladder); + ladderResult.calculateResults(players.getPlayers(), prizes); + + List points = formatLadderPoints(ladder.getPointsFromLines()); List> ladderLines = processLadderLines(points, players.size()); resultView.printLadder(ladderLines, players.getPlayers(), prizes.getPrize()); - printResult(ladderGame); + printResult(ladderResult); } - private void printResult(LadderGame ladderGame) { + private void printResult(LadderResult ladderResult) { while (true) { String targetPlayerName = inputView.getTargetPlayerName(); if (targetPlayerName.equals(ALL_PLAYERS)) { - resultView.printAllResults(ladderGame.getAllResultForPlayers()); + resultView.printAllResults(ladderResult.getValue()); break; } - if (ladderGame.hasResultForPlayer(targetPlayerName)) { - resultView.printSingleResult(ladderGame.getResultForPlayer(targetPlayerName)); + if (ladderResult.getValue().containsKey(targetPlayerName)) { + resultView.printSingleResult(ladderResult.getResultForPlayer(targetPlayerName)); } } } diff --git a/src/main/java/model/LadderGame.java b/src/main/java/model/LadderGame.java deleted file mode 100644 index 76c541e5..00000000 --- a/src/main/java/model/LadderGame.java +++ /dev/null @@ -1,40 +0,0 @@ -package model; - -import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; - -public class LadderGame { - private final Ladder ladder; - private final LadderResult ladderResult; - - public LadderGame(Ladder ladder, LadderResult ladderResult) { - this.ladder = ladder; - this.ladderResult = ladderResult; - } - - public static LadderGame createGame(Players players, Height maxHeight, - PointGenerator pointGenerator, - Prizes prizes) { - Ladder ladder = Ladder.createLadder(players.size(), maxHeight.getValue(), pointGenerator); - LadderResult ladderResult = new LadderResult(ladder); - ladderResult.calculateResults(players.getPlayers(), prizes); - return new LadderGame(ladder, ladderResult); - } - - public List getLadderPoints() { - return ladder.getPointsFromLines(); - } - - public String getResultForPlayer(String name) { - return ladderResult.getResultForPlayer(name); - } - - public Map getAllResultForPlayers() { - return ladderResult.getValue(); - } - - public boolean hasResultForPlayer(String name) { - return ladderResult.getValue().containsKey(name); - } -} diff --git a/src/test/java/model/LadderGameTest.java b/src/test/java/model/LadderGameTest.java deleted file mode 100644 index 3ccff688..00000000 --- a/src/test/java/model/LadderGameTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package model; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.*; -import java.util.List; - -class LadderGameTest { - - private Players players; - private Prizes prizes; - - @BeforeEach - void setUp() { - List playerNames = List.of("Gold", "nana", "Broze"); - List prizeList = List.of("꽝", "3000", "5000"); - players = new Players(playerNames); - prizes = Prizes.createPrizes(prizeList, players); - } - - @Test - @DisplayName("게임 생성 시 정상적으로 생성된다.") - void shouldCreateLadderGameCorrectly() { - PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); - Height maxHeight = new Height(5); - - LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); - - assertThat(ladderGame).isExactlyInstanceOf(LadderGame.class); - } - - @Test - @DisplayName("게임의 레더 포인트가 비어 있지 않는다.") - void shouldHaveNonEmptyLadderPoints() { - PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); - Height maxHeight = new Height(5); - LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); - - assertThat(ladderGame.getLadderPoints()).isNotEmpty(); - } - - @Test - @DisplayName("게임에서 모든 플레이어의 결과가 예상된 보상과 일치한다.") - void shouldHaveCorrectResultsForAllPlayers() { - PointGenerator pointGenerator = new PointGenerator(new FixedNumberGenerator(1)); - Height maxHeight = new Height(5); - LadderGame ladderGame = LadderGame.createGame(players, maxHeight, pointGenerator, prizes); - - assertThat(ladderGame.getAllResultForPlayers().values()) - .containsExactly("3000", "꽝", "5000"); - } -} From c6780580569fb73a09e1606504f24116305c5c33 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 00:17:44 +0900 Subject: [PATCH 40/46] =?UTF-8?q?refactor=20startLadder=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B0=84=EA=B2=B0=ED=99=94=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index e6c41f13..0b93fc61 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -23,13 +23,22 @@ public void startLadder() { PointGenerator pointGenerator = new PointGenerator(new RandomValueGenerator()); Ladder ladder = Ladder.createLadder(players.size(), height.getValue(), pointGenerator); + LadderResult ladderResult = calculateLadderResult(ladder, players.getPlayers(), prizes); + + printLadder(ladder, players, prizes); + printResult(ladderResult); + } + + private LadderResult calculateLadderResult(Ladder ladder, List players, Prizes prizes) { LadderResult ladderResult = new LadderResult(ladder); - ladderResult.calculateResults(players.getPlayers(), prizes); + ladderResult.calculateResults(players, prizes); + return ladderResult; + } + private void printLadder(Ladder ladder, Players players, Prizes prizes) { List points = formatLadderPoints(ladder.getPointsFromLines()); List> ladderLines = processLadderLines(points, players.size()); resultView.printLadder(ladderLines, players.getPlayers(), prizes.getPrize()); - printResult(ladderResult); } private void printResult(LadderResult ladderResult) { From 34ca8702c82ff8f04da2c1855bbc928eb8b93901 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 09:58:54 +0900 Subject: [PATCH 41/46] =?UTF-8?q?refactor=20Player=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Player.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java index 5476a2ff..c55060d1 100644 --- a/src/main/java/model/Player.java +++ b/src/main/java/model/Player.java @@ -16,8 +16,12 @@ public String getValue() { return value; } - private void validateValues(String values) { - if (values.length() > MAX_NAME_LENGTH) { + private void validateValues(String value) { + if (value == null || value.trim().isEmpty()) { + throw new IllegalArgumentException(ExceptionMessage.NULL_OR_EMPTY_INPUT.getMessage()); + } + + if (value.length() > MAX_NAME_LENGTH) { throw new IllegalArgumentException(ExceptionMessage.PLAYER_NAME_TOO_LONG.getMessage()); } } From 38a13598f8fbfad0d7912c7ae3648825a84b6dd8 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 10:11:45 +0900 Subject: [PATCH 42/46] =?UTF-8?q?refactor=20PlayerTest=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=A6=AC=ED=8E=99?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PlayerTest.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java index 6f6d4cc4..113f37c8 100644 --- a/src/test/java/model/PlayerTest.java +++ b/src/test/java/model/PlayerTest.java @@ -2,6 +2,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; + import static org.assertj.core.api.Assertions.*; class PlayerTest { @@ -25,4 +29,23 @@ void shouldThrowExceptionWhenNameMaxLength() { .isInstanceOf(IllegalArgumentException.class) .hasMessage("참가자 이름은 5글자를 초과할 수 없습니다."); } + + @ParameterizedTest + @NullAndEmptySource + @DisplayName("플레이어 이름이 null이면 예외가 발생한다.") + void shouldThrowExceptionWhenNameIsNullOrEmpty(String invalidName) { + assertThatThrownBy(() -> new Player(invalidName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("입력값이 null이거나 비어있을 순 없습니다."); + } + + + @ParameterizedTest + @ValueSource(strings = {" ", " "}) + @DisplayName("플레이어 이름이 공백 문자일 경우 예외가 발생한다.") + void shouldThrowExceptionWhenNameIsBlank(String invalidName) { + assertThatThrownBy(() -> new Player(invalidName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("입력값이 null이거나 비어있을 순 없습니다."); + } } From 31cca693b8918b8b74e79afbe61f8eaa136eb779 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 10:15:56 +0900 Subject: [PATCH 43/46] =?UTF-8?q?refactor=20FixedNumberGenerator=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20util=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PointGeneratorTest.java | 1 + src/test/java/model/{ => util}/FixedNumberGenerator.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) rename src/test/java/model/{ => util}/FixedNumberGenerator.java (82%) diff --git a/src/test/java/model/PointGeneratorTest.java b/src/test/java/model/PointGeneratorTest.java index cd195667..efed8a5d 100644 --- a/src/test/java/model/PointGeneratorTest.java +++ b/src/test/java/model/PointGeneratorTest.java @@ -1,5 +1,6 @@ package model; +import model.util.FixedNumberGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/model/FixedNumberGenerator.java b/src/test/java/model/util/FixedNumberGenerator.java similarity index 82% rename from src/test/java/model/FixedNumberGenerator.java rename to src/test/java/model/util/FixedNumberGenerator.java index 48d7ffe0..b46a6365 100644 --- a/src/test/java/model/FixedNumberGenerator.java +++ b/src/test/java/model/util/FixedNumberGenerator.java @@ -1,4 +1,6 @@ -package model; +package model.util; + +import model.RandomUtil; public class FixedNumberGenerator implements RandomUtil { private final int fixedNumber; From 70f1f5631bde2ea3ff135696393ba818e8e15703 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 11:16:52 +0900 Subject: [PATCH 44/46] =?UTF-8?q?refactor=20=EC=97=90=EB=9F=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=ED=86=B5=EC=9D=BC=20=EB=B0=8F=20=EA=B0=80?= =?UTF-8?q?=EB=8F=85=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/exception/ExceptionMessage.java | 6 +++--- src/main/java/model/Height.java | 2 +- src/main/java/model/Player.java | 2 +- src/test/java/model/HeightTest.java | 2 +- src/test/java/model/PlayersTest.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/exception/ExceptionMessage.java b/src/main/java/exception/ExceptionMessage.java index 5c90c696..c9d5569a 100644 --- a/src/main/java/exception/ExceptionMessage.java +++ b/src/main/java/exception/ExceptionMessage.java @@ -1,12 +1,12 @@ package exception; public enum ExceptionMessage { - LADDER_HEIGHT_TOO_SMALL("사다리 높이는 2 이상이여야 합니다."), + LADDER_HEIGHT_MIN_VALUE("사다리 높이는 최소 2 이상이어야 합니다."), LADDER_SIZE_NEGATIVE("사다리 사이즈가 0보다 작을 수는 없습니다."), LADDER_HEIGHT_NOT_NUMBER("사다리 높이는 숫자여야 합니다."), - PLAYER_NAME_TOO_LONG("참가자 이름은 5글자를 초과할 수 없습니다."), - MIN_PLAYERS_REQUIRED("참가자는 2명 이상이여야 합니다."), + PLAYER_NAME_MAX_LENGTH_EXCEEDED("참가자 이름은 최대 5글자를 초과할 수 없습니다."), + MIN_PLAYERS_REQUIRED("참가자는 최소 2명 이상이여야 합니다."), RESULT_COUNT_MISMATCH("실행결과 개수와 참가자의 수는 동일해야 합니다."), RESULT_NOT_NULL_OR_EMPTY("실행결과는 null이거나 공백일 수는 없습니다."), diff --git a/src/main/java/model/Height.java b/src/main/java/model/Height.java index e0378bf5..7eb720f2 100644 --- a/src/main/java/model/Height.java +++ b/src/main/java/model/Height.java @@ -14,7 +14,7 @@ public Height(int value) { private void validateValue(int value) { if (value < MIN_HEIGHT) { - throw new IllegalArgumentException(ExceptionMessage.LADDER_HEIGHT_TOO_SMALL.getMessage()); + throw new IllegalArgumentException(ExceptionMessage.LADDER_HEIGHT_MIN_VALUE.getMessage()); } } diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java index c55060d1..933515c8 100644 --- a/src/main/java/model/Player.java +++ b/src/main/java/model/Player.java @@ -22,7 +22,7 @@ private void validateValues(String value) { } if (value.length() > MAX_NAME_LENGTH) { - throw new IllegalArgumentException(ExceptionMessage.PLAYER_NAME_TOO_LONG.getMessage()); + throw new IllegalArgumentException(ExceptionMessage.PLAYER_NAME_MAX_LENGTH_EXCEEDED.getMessage()); } } } diff --git a/src/test/java/model/HeightTest.java b/src/test/java/model/HeightTest.java index e494e454..5bd492f0 100644 --- a/src/test/java/model/HeightTest.java +++ b/src/test/java/model/HeightTest.java @@ -25,6 +25,6 @@ void shouldCreateHeightWithMinimumValue() { void shouldThrowExceptionForHeightBelowMin() { assertThatThrownBy(() -> new Height(1)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("사다리 높이는 2 이상이여야 합니다."); + .hasMessage("사다리 높이는 최소 2 이상이어야 합니다."); } } diff --git a/src/test/java/model/PlayersTest.java b/src/test/java/model/PlayersTest.java index 7ff6a8d8..f582a8a0 100644 --- a/src/test/java/model/PlayersTest.java +++ b/src/test/java/model/PlayersTest.java @@ -24,7 +24,7 @@ void shouldThrowExceptionWhenNotEnoughPlayers() { assertThatThrownBy(() -> new Players(invalidPlayerNames)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("참가자는 2명 이상이여야 합니다."); + .hasMessage("참가자는 최소 2명 이상이여야 합니다."); } @Test From 8f215c1ba8c4c855944607117fccad6559f4814e Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 11:28:31 +0900 Subject: [PATCH 45/46] =?UTF-8?q?refactor=20PlayerTest=20hasMessage=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/PlayerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java index 113f37c8..1218f240 100644 --- a/src/test/java/model/PlayerTest.java +++ b/src/test/java/model/PlayerTest.java @@ -27,7 +27,7 @@ void shouldThrowExceptionWhenNameMaxLength() { assertThatThrownBy(() -> new Player(invalidName)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("참가자 이름은 5글자를 초과할 수 없습니다."); + .hasMessage("참가자 이름은 최대 5글자를 초과할 수 없습니다."); } @ParameterizedTest From 9e6496d193d80538e66e42f3fda3abca0129ca95 Mon Sep 17 00:00:00 2001 From: jihoo2002 Date: Thu, 20 Mar 2025 11:50:19 +0900 Subject: [PATCH 46/46] =?UTF-8?q?refactor=20import=20=EB=AC=B8=20=EC=99=80?= =?UTF-8?q?=EC=9D=BC=EB=93=9C=EC=B9=B4=EB=93=9C=20=EB=A6=AC=ED=8E=99?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EB=B0=8F=20=EA=B0=9C=ED=96=89=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LadderController.java | 12 ++++++++---- src/main/java/model/Prizes.java | 1 - src/test/java/model/LadderResultTest.java | 2 -- src/test/java/model/PlayerTest.java | 1 - src/test/java/model/PrizeTest.java | 1 - 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 0b93fc61..4f473277 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -1,13 +1,17 @@ package controller; - -import model.*; +import model.Height; +import model.Players; +import model.PointGenerator; +import model.Prizes; +import model.Ladder; +import model.LadderResult; +import model.RandomValueGenerator; +import model.Point; import view.InputView; import view.ResultView; - import java.util.ArrayList; import java.util.List; - import static model.Point.HAS_POINT; public class LadderController { diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java index bbe4f6b0..7ae41cf9 100644 --- a/src/main/java/model/Prizes.java +++ b/src/main/java/model/Prizes.java @@ -1,7 +1,6 @@ package model; import exception.ExceptionMessage; - import java.util.List; public class Prizes { diff --git a/src/test/java/model/LadderResultTest.java b/src/test/java/model/LadderResultTest.java index 473f9cc2..54a2716d 100644 --- a/src/test/java/model/LadderResultTest.java +++ b/src/test/java/model/LadderResultTest.java @@ -3,9 +3,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.*; - import java.util.List; class LadderResultTest { diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java index 1218f240..f4f01da1 100644 --- a/src/test/java/model/PlayerTest.java +++ b/src/test/java/model/PlayerTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; - import static org.assertj.core.api.Assertions.*; class PlayerTest { diff --git a/src/test/java/model/PrizeTest.java b/src/test/java/model/PrizeTest.java index c0db91cc..1e3f94e8 100644 --- a/src/test/java/model/PrizeTest.java +++ b/src/test/java/model/PrizeTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; - import static org.assertj.core.api.Assertions.*; public class PrizeTest {