diff --git a/src/main/java/LadderGameApplication.java b/src/main/java/LadderGameApplication.java new file mode 100644 index 00000000..0aa81697 --- /dev/null +++ b/src/main/java/LadderGameApplication.java @@ -0,0 +1,24 @@ +import java.util.Random; +import java.util.Scanner; + +import controller.LadderGameController; +import model.LadderGenerator; +import view.InputView; +import view.LadderView; +import view.LineView; +import view.OutputView; + +public class LadderGameApplication { + + public static void main(String[] args) { + LineView lineView = new LineView(); + LadderView ladderView = new LadderView(lineView); + OutputView outputView = new OutputView(ladderView); + InputView inputView = new InputView(new Scanner(System.in)); + LadderGenerator ladderGenerator = new LadderGenerator(new Random()); + + LadderGameController ladderGameController = new LadderGameController(ladderGenerator, outputView, inputView); + + ladderGameController.run(); + } +} diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java new file mode 100644 index 00000000..e80be0e6 --- /dev/null +++ b/src/main/java/controller/LadderGameController.java @@ -0,0 +1,68 @@ +package controller; + +import java.util.List; +import java.util.Random; +import java.util.Scanner; + +import model.*; +import util.Parser; +import view.InputView; +import view.LadderView; +import view.LineView; +import view.OutputView; + +public class LadderGameController { + + private final LadderGenerator ladderGenerator; + private final OutputView outputView; + private final InputView inputView; + + private static final String VIEW_ALL = "all"; + + public LadderGameController( + LadderGenerator ladderGenerator, + OutputView outputView, + InputView inputView + ) { + this.ladderGenerator = new LadderGenerator(new Random()); + this.outputView = new OutputView(new LadderView(new LineView())); + this.inputView = new InputView(new Scanner(System.in)); + } + + public void run() { + Players players = inputPlayers(); + Prizes prizes = inputPrizes(); + + Width width = new Width(players.size()); + Height height = new Height(inputView.inputHeight()); + Ladder ladder = ladderGenerator.generate(height, width); + + outputView.printExecuteResult(ladder, players, prizes); + + printResultByViewerName(ladder, players, prizes); + } + + private Players inputPlayers() { + String strPlayerNames = inputView.inputPlayerNames(); + List playerNames = Parser.parseStringToList(strPlayerNames); + + return new Players(playerNames); + } + + private Prizes inputPrizes() { + String strPrizeNames = inputView.inputPrizeNames(); + List prizeNames = Parser.parseStringToList(strPrizeNames); + + return new Prizes(prizeNames); + } + + private void printResultByViewerName(Ladder ladder, Players players, Prizes prizes) { + String resultViewerName = inputView.inputResultViewerName(); + + if (resultViewerName.equalsIgnoreCase(VIEW_ALL)) { + outputView.printAllPlayerResult(ladder, players, prizes); + } else { + outputView.printSinglePlayerResult(ladder, players, prizes, resultViewerName); + } + } +} diff --git a/src/main/java/exception/CustomException.java b/src/main/java/exception/CustomException.java new file mode 100644 index 00000000..4bb6b359 --- /dev/null +++ b/src/main/java/exception/CustomException.java @@ -0,0 +1,8 @@ +package exception; + +public class CustomException extends IllegalArgumentException { + + public CustomException(ErrorMessage errorMessage) { + super(errorMessage.getMessage()); + } +} diff --git a/src/main/java/exception/ErrorMessage.java b/src/main/java/exception/ErrorMessage.java new file mode 100644 index 00000000..db986390 --- /dev/null +++ b/src/main/java/exception/ErrorMessage.java @@ -0,0 +1,24 @@ +package exception; + +public enum ErrorMessage { + + NOT_INTEGER_FORMAT("int 타입 정수가 아닌 값이 입력되었습니다."), + NEGATIVE_NUMBER("음수가 입력되었습니다."), + EMPTY_NAME("이름이 비어있습니다."), + NAME_LENGTH("이름이 5글자를 넘었습니다."), + PLAYER_NAMES_EMPTY("참여자가 존재하지 않습니다"), + PRIZE_EMPTY("당첨 결과가 비어있습니다."), + PRIZES_EMPTY("당첨 결과 리스트가 비어있습니다."), + PLAYER_NOT_FOUND("해당 플레이어를 찾을 수 없습니다."), + NULL_INPUT_STRING("입력 문자열로 null이 입력 되었습니다."); + + private final String message; + + ErrorMessage(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 new file mode 100644 index 00000000..ec9cbbd9 --- /dev/null +++ b/src/main/java/model/Height.java @@ -0,0 +1,17 @@ +package model; + +import util.SizeValidator; + +public class Height { + + private final int height; + + public Height(int height) { + SizeValidator.validateNotNegative(height); + this.height = height; + } + + public int getHeight() { + return height; + } +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java new file mode 100644 index 00000000..fede86c7 --- /dev/null +++ b/src/main/java/model/Ladder.java @@ -0,0 +1,28 @@ +package model; + +import java.util.List; + +public class Ladder { + + private final Height height; + private final List lines; + + public Ladder(Height height, List lines) { + this.height = height; + this.lines = lines; + } + + public int move(int index) { + int position = index; + + for (Line line : lines) { + position = line.move(position); + } + + return position; + } + + public List getLines() { + return lines; + } +} diff --git a/src/main/java/model/LadderGenerator.java b/src/main/java/model/LadderGenerator.java new file mode 100644 index 00000000..ac4f041c --- /dev/null +++ b/src/main/java/model/LadderGenerator.java @@ -0,0 +1,38 @@ +package model; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class LadderGenerator { + + private final Random random; + + public LadderGenerator(Random random) { + this.random = random; + } + + public Ladder generate(Height height, Width width) { + List lines = new ArrayList<>(); + + for (int i = 0; i < height.getHeight(); i++) { + lines.add(new Line(generateConnections(width))); + } + + return new Ladder(height, lines); + } + + private List generateConnections(Width width) { + List connections = new ArrayList<>(); + + for (int i = 0; i < width.getWidth() - 1; i++) { + if (i > 0 && connections.get(i - 1)) { + connections.add(false); + } else { + connections.add(random.nextBoolean()); + } + } + + return connections; + } +} diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java new file mode 100644 index 00000000..bad782c1 --- /dev/null +++ b/src/main/java/model/Line.java @@ -0,0 +1,26 @@ +package model; + +import java.util.List; + +public class Line { + + private final List connections; + + public Line(List connections) { + this.connections = connections; + } + + public int move(int index) { + if (index < connections.size() && connections.get(index)) { + return index + 1; + } else if (index > 0 && connections.get(index - 1)) { + return index - 1; + } + + return index; + } + + public List getConnections() { + return connections; + } +} diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java new file mode 100644 index 00000000..9c134821 --- /dev/null +++ b/src/main/java/model/Player.java @@ -0,0 +1,37 @@ +package model; + +import exception.CustomException; +import exception.ErrorMessage; + +public class Player { + + private final String name; + + private static final int MAX_NAME_LENGTH = 5; + + public Player(String name) { + validate(name); + this.name = name; + } + + public String getName() { + return name; + } + + private void validate(String name) { + validateNameEmpty(name); + validateNameLength(name); + } + + private void validateNameEmpty(String name) { + if (name == null || name.isBlank()) { + throw new CustomException(ErrorMessage.EMPTY_NAME); + } + } + + private void validateNameLength(String name) { + if (name.length() > MAX_NAME_LENGTH) { + throw new CustomException(ErrorMessage.NAME_LENGTH); + } + } +} diff --git a/src/main/java/model/Players.java b/src/main/java/model/Players.java new file mode 100644 index 00000000..046d2c56 --- /dev/null +++ b/src/main/java/model/Players.java @@ -0,0 +1,50 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +import exception.CustomException; +import exception.ErrorMessage; + +public class Players { + + private final List players; + + public Players(List playerNames) { + validateEmpty(playerNames); + this.players = init(playerNames); + } + + public void validateEmpty(List playerNames) { + if (playerNames == null || playerNames.isEmpty()) { + throw new CustomException(ErrorMessage.PLAYER_NAMES_EMPTY); + } + } + + private List init(List playerNames) { + List result = new ArrayList<>(); + + for (String name : playerNames) { + result.add(new Player(name)); + } + + return result; + } + + public int size() { + return players.size(); + } + + public List getPlayers() { + return players; + } + + public int indexOf(String name) { + for (int i = 0; i < players.size(); i++) { + if (players.get(i).getName().equals(name)) { + return i; + } + } + throw new CustomException(ErrorMessage.PLAYER_NOT_FOUND); + } +} diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java new file mode 100644 index 00000000..93585dae --- /dev/null +++ b/src/main/java/model/Prize.java @@ -0,0 +1,24 @@ +package model; + +import exception.CustomException; +import exception.ErrorMessage; + +public class Prize { + + private final String prize; + + public Prize(String prize) { + validateEmpty(prize); + this.prize = prize; + } + + private void validateEmpty(String prize) { + if (prize == null || prize.isBlank()) { + throw new CustomException(ErrorMessage.PRIZE_EMPTY); + } + } + + public String getPrize() { + return prize; + } +} diff --git a/src/main/java/model/Prizes.java b/src/main/java/model/Prizes.java new file mode 100644 index 00000000..9eb5ab25 --- /dev/null +++ b/src/main/java/model/Prizes.java @@ -0,0 +1,37 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +import exception.CustomException; +import exception.ErrorMessage; + +public class Prizes { + + private final List prizes; + + public Prizes(List prizes) { + validateEmpty(prizes); + this.prizes = init(prizes); + } + + private void validateEmpty(List prizes) { + if (prizes == null || prizes.isEmpty()) { + throw new CustomException(ErrorMessage.PRIZES_EMPTY); + } + } + + private List init(List prizes) { + List result = new ArrayList<>(); + + for (String name : prizes) { + result.add(new Prize(name)); + } + + return result; + } + + public List getPrizes() { + return prizes; + } +} diff --git a/src/main/java/model/Width.java b/src/main/java/model/Width.java new file mode 100644 index 00000000..3f31e7be --- /dev/null +++ b/src/main/java/model/Width.java @@ -0,0 +1,17 @@ +package model; + +import util.SizeValidator; + +public class Width { + + private final int width; + + public Width(int width) { + SizeValidator.validateNotNegative(width); + this.width = width; + } + + public int getWidth() { + return width; + } +} diff --git a/src/main/java/util/Parser.java b/src/main/java/util/Parser.java new file mode 100644 index 00000000..aab39914 --- /dev/null +++ b/src/main/java/util/Parser.java @@ -0,0 +1,21 @@ +package util; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import exception.CustomException; +import exception.ErrorMessage; + +public class Parser { + + public static List parseStringToList(String str) { + if (str == null) { + throw new CustomException(ErrorMessage.NULL_INPUT_STRING); + } + + return Arrays.stream(str.split(",")) + .map(String::trim) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/util/SizeValidator.java b/src/main/java/util/SizeValidator.java new file mode 100644 index 00000000..aee9c10d --- /dev/null +++ b/src/main/java/util/SizeValidator.java @@ -0,0 +1,14 @@ +package util; + +import exception.CustomException; +import exception.ErrorMessage; + +public class SizeValidator { + + private static final int ZERO = 0; + + public static void validateNotNegative(int value) { + if (value < ZERO) + throw new CustomException(ErrorMessage.NEGATIVE_NUMBER); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..e346ace5 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,57 @@ +package view; + +import java.util.InputMismatchException; +import java.util.Scanner; + +import exception.CustomException; +import exception.ErrorMessage; + +public class InputView { + + private final Scanner sc; + + public InputView(Scanner sc) { + this.sc = sc; + } + + public int inputWidth() { + System.out.println("사다리의 너비는 몇 개 인가요?"); + + return inputValue(); + } + + public int inputHeight() { + System.out.println("\n사다리의 높이는 몇 개 인가요?"); + + return inputValue(); + } + + private int inputValue() { + try { + int input = sc.nextInt(); + sc.nextLine(); + + return input; + } catch (InputMismatchException ex) { + throw new CustomException(ErrorMessage.NOT_INTEGER_FORMAT); + } + } + + public String inputPlayerNames() { + System.out.println("참여할 사람의 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요."); + + return sc.nextLine(); + } + + public String inputPrizeNames() { + System.out.println("\n실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + + return sc.nextLine(); + } + + public String inputResultViewerName() { + System.out.println("\n결과를 보고 싶은 사람은?"); + + return sc.nextLine(); + } +} diff --git a/src/main/java/view/LadderView.java b/src/main/java/view/LadderView.java new file mode 100644 index 00000000..4b84575a --- /dev/null +++ b/src/main/java/view/LadderView.java @@ -0,0 +1,19 @@ +package view; + +import model.Ladder; +import model.Line; + +public class LadderView { + + private final LineView lineView; + + public LadderView(LineView lineView) { + this.lineView = lineView; + } + + public void print(Ladder ladder) { + for (Line line : ladder.getLines()) { + lineView.print(line); + } + } +} diff --git a/src/main/java/view/LineView.java b/src/main/java/view/LineView.java new file mode 100644 index 00000000..7688dda2 --- /dev/null +++ b/src/main/java/view/LineView.java @@ -0,0 +1,17 @@ +package view; + +import model.Line; + +public class LineView { + + private static final String CONNECTION = "-----"; + private static final String EMPTY = " "; + + public void print(Line line) { + for (boolean connection : line.getConnections()) { + System.out.print("|"); + System.out.print(connection ? CONNECTION : EMPTY); + } + System.out.println("|"); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..9772b198 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,55 @@ +package view; + +import model.Ladder; +import model.Player; +import model.Players; +import model.Prize; +import model.Prizes; + +public class OutputView { + + private final LadderView ladderView; + + public OutputView(LadderView ladderView) { + this.ladderView = ladderView; + } + + public void printExecuteResult(Ladder ladder, Players players, Prizes prizes) { + System.out.println("\n사다리결과\n"); + + for (Player player : players.getPlayers()) { + System.out.printf("%-6s", player.getName()); + } + + System.out.println(); + + ladderView.print(ladder); + + for (Prize prize : prizes.getPrizes()) { + System.out.printf("%-4s ", prize.getPrize()); + } + + System.out.println("\n"); + } + + public void printAllPlayerResult(Ladder ladder, Players players, Prizes prizes) { + System.out.println(); + + for (int i = 0; i < players.size(); i++) { + String playerName = players.getPlayers().get(i).getName(); + int position = ladder.move(i); + String prize = prizes.getPrizes().get(position).getPrize(); + + System.out.printf("%s : %s\n", playerName, prize); + } + } + + public void printSinglePlayerResult(Ladder ladder, Players players, Prizes prizes, String playerName) { + int index = players.indexOf(playerName); + int position = ladder.move(index); + String prize = prizes.getPrizes().get(position).getPrize(); + + System.out.println("\n실행결과"); + System.out.println(prize); + } +} diff --git a/src/test/java/model/LadderGeneratorTest.java b/src/test/java/model/LadderGeneratorTest.java new file mode 100644 index 00000000..b9b7996d --- /dev/null +++ b/src/test/java/model/LadderGeneratorTest.java @@ -0,0 +1,44 @@ +package model; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.Random; + +import org.junit.jupiter.api.Test; + +public class LadderGeneratorTest { + + LadderGenerator ladderGenerator = new LadderGenerator(new Random()); + + @Test + void 높이와_너비에_맞는_사다리를_생성한다() { + Height height = new Height(3); + Width width = new Width(4); + Ladder ladder = ladderGenerator.generate(height, width); + + assertThat(ladder.getLines()).hasSize(height.getHeight()); + + for (Line line : ladder.getLines()) { + assertThat(line.getConnections()).hasSize(width.getWidth() - 1); + } + } + + @Test + void 연속된_라인이_존재하지_않도록_사다리가_생성된다() { + Height height = new Height(10); + Width width = new Width(10); + + Ladder ladder = ladderGenerator.generate(height, width); + + for (Line line : ladder.getLines()) { + List connections = line.getConnections(); + + for (int i = 1; i < connections.size(); i++) { + if (connections.get(i - 1)) { + assertThat(connections.get(i)).isFalse(); + } + } + } + } +} diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java new file mode 100644 index 00000000..0d357727 --- /dev/null +++ b/src/test/java/model/LadderTest.java @@ -0,0 +1,26 @@ +package model; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class LadderTest { + + @Test + void 사다리의_올바른_최종_인덱스를_반환한다() { + List connectionsLine1 = Arrays.asList(true, false); + List connectionsLine2 = Arrays.asList(false, true); + + Line line1 = new Line(connectionsLine1); + Line line2 = new Line(connectionsLine2); + + Ladder ladder = new Ladder(new Height(2), Arrays.asList(line1, line2)); + + assertThat(ladder.move(0)).isEqualTo(2); + assertThat(ladder.move(1)).isEqualTo(0); + assertThat(ladder.move(2)).isEqualTo(1); + } +} diff --git a/src/test/java/model/LineTest.java b/src/test/java/model/LineTest.java new file mode 100644 index 00000000..16400ffd --- /dev/null +++ b/src/test/java/model/LineTest.java @@ -0,0 +1,65 @@ +package model; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class LineTest { + + @Test + void 오른쪽으로_이동할_수_있으면_오른쪽_인덱스를_반환한다() { + List connections = Arrays.asList(true, false, false); + Line line = new Line(connections); + + int result = line.move(0); + + assertThat(result).isEqualTo(1); + } + + @Test + void 왼쪽으로_이동할_수_있으면_왼쪽_인덱스를_반환한다() { + List connections = Arrays.asList(false, true, false); + Line line = new Line(connections); + + int result = line.move(2); + + assertThat(result).isEqualTo(1); + } + + @Test + void 이동이_불가능_하면_현재_인덱스를_반환한다() { + List connections = Arrays.asList(false, false, false); + Line line = new Line(connections); + + int result1 = line.move(0); + int result2 = line.move(1); + int result3 = line.move(2); + + assertThat(result1).isEqualTo(0); + assertThat(result2).isEqualTo(1); + assertThat(result3).isEqualTo(2); + } + + @Test + void 오른쪽_범위를_초과하면_인덱스를_그대로_반환한다() { + List connections = Arrays.asList(true, false); + Line line = new Line(connections); + + int result = line.move(connections.size()); + + assertThat(result).isEqualTo(2); + } + + @Test + void 왼쪽_범위를_초과하면_인덱스를_그대로_반환한다() { + List connections = Arrays.asList(false, true); + Line line = new Line(connections); + + int result = line.move(0); + + assertThat(result).isEqualTo(0); + } +} diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java new file mode 100644 index 00000000..f5266c58 --- /dev/null +++ b/src/test/java/model/PlayerTest.java @@ -0,0 +1,44 @@ +package model; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +import exception.CustomException; +import exception.ErrorMessage; + +public class PlayerTest { + + @Test + void 정상적인_형태의_이름으로_플레이어_객체를_생성한다() { + assertThatCode(() -> new Player("neo")) + .doesNotThrowAnyException(); + } + + @Test + void 이름이_널이라면_플레이어_객체_생성_시_예외를_발생한다() { + assertThatThrownBy(() -> new Player(null)) + .isInstanceOf(CustomException.class) + .extracting("message") + .isEqualTo(ErrorMessage.EMPTY_NAME.getMessage()); + } + + @Test + void 이름이_비어있는_문자열이라면_플레이어_객체_생성_시_예외를_발생한다() { + assertThatThrownBy(() -> new Player(" ")) + .isInstanceOf(CustomException.class) + .extracting("message") + .isEqualTo(ErrorMessage.EMPTY_NAME.getMessage()); + } + + @Test + void 이름이_5글자를_넘어가면_플레이어_객체_생성_시_예외를_발생한다() { + String longName = "abcdef"; + + assertThatThrownBy(() -> new Player(longName)) + .isInstanceOf(CustomException.class) + .extracting("message") + .isEqualTo(ErrorMessage.NAME_LENGTH.getMessage()); + } +} diff --git a/src/test/java/model/PlayersTest.java b/src/test/java/model/PlayersTest.java new file mode 100644 index 00000000..61c588e5 --- /dev/null +++ b/src/test/java/model/PlayersTest.java @@ -0,0 +1,65 @@ +package model; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import exception.CustomException; +import exception.ErrorMessage; + +public class PlayersTest { + + @Test + void 플레이어_리스트가_널이라면_객체_생성_시_예외를_발생한다() { + assertThatThrownBy(() -> new Players(null)) + .isInstanceOf(CustomException.class) + .extracting("message") + .isEqualTo(ErrorMessage.PLAYER_NAMES_EMPTY.getMessage()); + } + + @Test + void 플레이어_리스트가_비어있다면_객체_생성_시_예외를_발생한다() { + assertThatThrownBy(() -> new Players(Collections.emptyList())) + .isInstanceOf(CustomException.class) + .extracting("message") + .isEqualTo(ErrorMessage.PLAYER_NAMES_EMPTY.getMessage()); + } + + @Test + void 정상적인_이름_리스트로_Players_객체를_생성한다() { + List names = Arrays.asList("neo", "brown", "tommy"); + Players players = new Players(names); + + assertThat(players.size()).isEqualTo(names.size()); + + assertThat(players.getPlayers()) + .extracting(Player::getName) + .containsExactlyElementsOf(names); + } + + @Test + void 존재하는_이름으로_indexOf_메소드를_호출하면_올바른_인덱스를_반환한다() { + List names = Arrays.asList("neo", "brown", "tommy"); + Players players = new Players(names); + + int index = players.indexOf("brown"); + + assertThat(index).isEqualTo(1); + } + + @Test + void 존재하지_않는_이름으로_indexOf_메소드를_호출하면_예외를_발생한다() { + List names = Arrays.asList("neo", "brown", "tommy"); + Players players = new Players(names); + + assertThatThrownBy(() -> players.indexOf("alice")) + .isInstanceOf(CustomException.class) + .extracting("message") + .isEqualTo(ErrorMessage.PLAYER_NOT_FOUND.getMessage()); + } +} diff --git a/src/test/java/util/ParserTest.java b/src/test/java/util/ParserTest.java new file mode 100644 index 00000000..d0e1ae59 --- /dev/null +++ b/src/test/java/util/ParserTest.java @@ -0,0 +1,46 @@ +package util; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import exception.CustomException; +import exception.ErrorMessage; + +public class ParserTest { + + @Test + void 쉼표로_구분된_문자열을_리스트로_파싱한다() { + String input = "neo, brown, brie, tommy"; + List result = Parser.parseStringToList(input); + + assertThat(result).containsExactly("neo", "brown", "brie", "tommy"); + } + + @Test + void 공백만_있는_요소도_포함하여_리스트로_파싱한다() { + String input = "neo, , brie"; + List result = Parser.parseStringToList(input); + + assertThat(result).containsExactly("neo", "", "brie"); + } + + @Test + void 빈_문자열_입력시_빈_리스트_반환() { + String input = ""; + List result = Parser.parseStringToList(input); + + assertThat(result).containsExactly(""); + } + + @Test + void null_입력시_예외_발생_여부_테스트() { + assertThatThrownBy(() -> Parser.parseStringToList(null)) + .isInstanceOf(CustomException.class) + .extracting("message") + .isEqualTo(ErrorMessage.NULL_INPUT_STRING.getMessage()); + } +} diff --git a/src/test/java/util/SizeValidatorTest.java b/src/test/java/util/SizeValidatorTest.java new file mode 100644 index 00000000..abbd5b61 --- /dev/null +++ b/src/test/java/util/SizeValidatorTest.java @@ -0,0 +1,27 @@ +package util; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +import exception.CustomException; +import exception.ErrorMessage; + +public class SizeValidatorTest { + + @Test + void 음수를_검증_시_예외를_발생한다() { + int negativeValue = -1; + + assertThatThrownBy(() -> SizeValidator.validateNotNegative(negativeValue)) + .isInstanceOf(CustomException.class) + .hasMessage(ErrorMessage.NEGATIVE_NUMBER.getMessage()); + } + + @Test + public void 음수가_아닌_정수를_검증_시_통과한다() { + assertThatCode(() -> SizeValidator.validateNotNegative(0)).doesNotThrowAnyException(); + assertThatCode(() -> SizeValidator.validateNotNegative(10)).doesNotThrowAnyException(); + } +}