diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..7497471843 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,50 @@ +# 구현할 기능 목록 + +## 입력 + - [x] 사용자 이름 입력 + - [ ] 쉼표로 구분 + - [ ] 최대 5글자까지 가능 + - [x] 사다리 높이 입력 + - [ ] 자연수 + + +## 출력 + - [x] 실행 결과 + - [ ] 첫번째 줄 : 사람 이름 + - [ ] 그 아래 줄 : 사다리 그리기 + +## 기능 +- [ ] 사람의 이름을 받고 , 기준으로 나누기. +- [ ] 한 줄에 | 개수를 사람 이름 개수만큼 반환. +- [ ] 랜덤 값 기능 구현 +- [ ] 랜덤에 충족하면 ----- 그리기. + - [ ] 한줄의 |에 ----- 연결선이 동시에 나오지 않게 +- [ ] 테스트 코드 작성 + + +## TDD 객체 명세서 +- [x] Height + - [x] 객체 생성 가능 +- [ ] Ladder + - [x] 객체 생성 가능 + - [ ] 전체적인 값이 맞는지 확인 +- [ ] Line + - [x] 객체 생성 가능 + - [ ] 예상되는 사다리 라인 문자열 +- [x] Player + - [x] 객체 생성 가능 +- [x] Players + - [x] 객체 생성 가능 +- [x] util + - [x] LadderHeightValidator + - [x] 정상_입력 + - [x] 정수가_아닌_입력 + - [x] 음수_입력 + - [x] 공백_입력 + - [x] PlayerNamesValidator + - [x] 정상_입력 + - [x] 공백_포함 + - [x] 공백 + - [x] 이름_길이_초과 + - [x] 중복_입력 +# 1차 리뷰 후 개선 방향 \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 0000000000..c5be1d8f5f --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,10 @@ +import controller.LadderGameController; + +import java.io.IOException; + +public class Application { + public static void main(String[] args) throws IOException { + LadderGameController ladderGameController = new LadderGameController(); + ladderGameController.run(); + } +} diff --git a/src/main/java/controller/LadderGameController.java b/src/main/java/controller/LadderGameController.java new file mode 100644 index 0000000000..6516c34ed7 --- /dev/null +++ b/src/main/java/controller/LadderGameController.java @@ -0,0 +1,57 @@ +package controller; + +import model.Height; +import model.Ladder; +import model.Player; +import model.Players; +import util.RandomFootholdGenerator; +import view.InputView; +import view.OutputView; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class LadderGameController { + private final InputView inputView; + private final OutputView outputView; + + public LadderGameController() { + this.inputView = new InputView(); + this.outputView = new OutputView(); + } + + public void run() throws IOException { + Players players = createPlayersFromInput(); + List playerNames = extractPlayerNames(players); + Height height = createHeightFromInput(); + Ladder ladder = createLadder(players, height); + + outputView.printResultSentence(ladder.getLines(), playerNames); + } + + private Players createPlayersFromInput() throws IOException { + String[] playerNamesArray = inputView.readPlayerNames().split(","); + + return new Players(Arrays.asList(playerNamesArray)); + } + + private List extractPlayerNames(Players players) { + return players.getPlayers().stream() + .map(Player::getName) + .collect(Collectors.toList()); + } + + private Height createHeightFromInput() throws IOException { + return new Height(inputView.readLadderHeightNumber()); + } + + private Ladder createLadder(Players players, Height height) { + Ladder ladder = new Ladder(); + + ladder.makeLines(height, players); + + return ladder; + } +} \ No newline at end of file diff --git a/src/main/java/exception/ErrorMessage.java b/src/main/java/exception/ErrorMessage.java new file mode 100644 index 0000000000..ac9102a013 --- /dev/null +++ b/src/main/java/exception/ErrorMessage.java @@ -0,0 +1,22 @@ +package exception; + +public enum ErrorMessage { + + DUPLICATED_CAR_NAME("참여자 이름이 중복될 수 없습니다."), + NOT_ALLOW_BLANK("참여자 이름에 공백이 들어갈 수 없습니다."), + NOT_ALLOW_EMPTY("참여자 입력 값이 비어있을수 없습니다."), + INVALID_NAME_LENGTH("참여자의 이름은 5자 이하여야합니다."), + NOT_NUMERIC("시도 횟수 입력은 숫자여야 합니다."), + ONLY_NATURAL_NUMBER("시도 횟수는 자연수여야합니다"), + NOT_ALLOW_ZERO("사다리 높이는 0이 될 수 없습니다"); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/exception/LadderGameValidationException.java b/src/main/java/exception/LadderGameValidationException.java new file mode 100644 index 0000000000..79065d6e40 --- /dev/null +++ b/src/main/java/exception/LadderGameValidationException.java @@ -0,0 +1,47 @@ +package exception; + +public class LadderGameValidationException { + + public static class DuplicatedPlayerNameException extends IllegalArgumentException { + public DuplicatedPlayerNameException() { + super(ErrorMessage.DUPLICATED_CAR_NAME.getMessage()); + } + } + + public static class BlankPlayerNameException extends IllegalArgumentException { + public BlankPlayerNameException() { + super(ErrorMessage.NOT_ALLOW_BLANK.getMessage()); + } + } + + public static class NotAllowEmptyInputException extends IllegalArgumentException { + public NotAllowEmptyInputException() { + super(ErrorMessage.NOT_ALLOW_EMPTY.getMessage()); + } + } + + public static class InvalidPlayerNameLengthException extends IllegalArgumentException { + public InvalidPlayerNameLengthException() { + super(ErrorMessage.INVALID_NAME_LENGTH.getMessage()); + } + } + + public static class NotNumericException extends IllegalArgumentException { + public NotNumericException() { + super(ErrorMessage.NOT_NUMERIC.getMessage()); + } + } + + public static class NotNaturalNumberException extends IllegalArgumentException { + public NotNaturalNumberException() { + super(ErrorMessage.ONLY_NATURAL_NUMBER.getMessage()); + } + } + + public static class NotAllowZeroNumberException extends IllegalArgumentException { + public NotAllowZeroNumberException() { + super(ErrorMessage.NOT_ALLOW_ZERO.getMessage()); + } + } + +} diff --git a/src/main/java/model/Height.java b/src/main/java/model/Height.java new file mode 100644 index 0000000000..9848eb87ad --- /dev/null +++ b/src/main/java/model/Height.java @@ -0,0 +1,14 @@ +package model; + +public class Height { + + private final String height; + + public Height(final String height) { + this.height = height; + } + + public String getHeight() { + return height; + } +} \ No newline at end of file diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java new file mode 100644 index 0000000000..fd40295a85 --- /dev/null +++ b/src/main/java/model/Ladder.java @@ -0,0 +1,24 @@ +package model; + +import util.RandomFootholdGenerator; + +public class Ladder { + private final StringBuilder lines; + private Line line; + + public Ladder() { + this.lines = new StringBuilder(); + this.line = new Line(new RandomFootholdGenerator()); + } + + public void makeLines(Height height, Players players) { + for (int i = 0; i < Integer.parseInt(height.getHeight()); i++) { + line.makeLine(players); + lines.append(line.getLine()).append("\n"); + } + } + + public StringBuilder getLines() { + return lines; + } +} \ No newline at end of file diff --git a/src/main/java/model/LadderSymbol.java b/src/main/java/model/LadderSymbol.java new file mode 100644 index 0000000000..194160be84 --- /dev/null +++ b/src/main/java/model/LadderSymbol.java @@ -0,0 +1,19 @@ +package model; + + +public enum LadderSymbol { + + BLANK(" "), + FOOTHOLD("-----"), + BAR("|"); + + private final String symbol; + + LadderSymbol(final String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return this.symbol; + } +} \ No newline at end of file diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java new file mode 100644 index 0000000000..8d6392455e --- /dev/null +++ b/src/main/java/model/Line.java @@ -0,0 +1,73 @@ +package model; + +import util.FootholdGenerator; + +public class Line { + private final StringBuilder line; + private static final int LAST_PLAYER_OFFSET = 1; + private static final String BLANK = LadderSymbol.BLANK.getSymbol(); + private static final String BAR = LadderSymbol.BAR.getSymbol(); + private static final String FOOTHOLD = LadderSymbol.FOOTHOLD.getSymbol(); + private final FootholdGenerator footholdGenerator; + + public Line(FootholdGenerator footholdGenerator) { + this.line = new StringBuilder(); + this.footholdGenerator = footholdGenerator; + } + + public void makeLine(Players players) { + initializeLine(); + + boolean previousWasFoothold = false; + int numOfPlayers = players.getPlayerCount(); + + for (int i = 0; i < numOfPlayers; i++) { + currentLadderLine(BAR); + previousWasFoothold = AppendFootholdIfNotLastPlayer(i, numOfPlayers, previousWasFoothold); + } + } + + private boolean AppendFootholdIfNotLastPlayer(int currentPlayerIndex, int totalPlayers, boolean previousWasFoothold) { + if (isNotLastPlayer(currentPlayerIndex, totalPlayers)) { + return appendFoothold(previousWasFoothold); + } + + return previousWasFoothold; + } + + public StringBuilder getLine() { + return line; + } + + private void initializeLine() { + line.delete(0, line.length()); + + currentLadderLine(BLANK); + } + + private boolean isNotLastPlayer(int currentIndex, int totalPlayers) { + return currentIndex < totalPlayers - LAST_PLAYER_OFFSET; + } + + private boolean appendFoothold(boolean hasPreviousFoothold) { + boolean isFootholdAppended = false; + + if (canAppendFoothold(hasPreviousFoothold)) { + currentLadderLine(FOOTHOLD); + isFootholdAppended = true; + } + + currentLadderLine(BLANK); + + return isFootholdAppended; + } + + private boolean canAppendFoothold(boolean hasPreviousFoothold) { + return !hasPreviousFoothold && footholdGenerator.generate(); + } + + private void currentLadderLine(String ladderSymbol) { + line.append(ladderSymbol); + } + +} \ No newline at end of file diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java new file mode 100644 index 0000000000..708024a3b6 --- /dev/null +++ b/src/main/java/model/Player.java @@ -0,0 +1,15 @@ +package model; + +public class Player { + + private final String playerName; + + public Player(String playerName) { + this.playerName = playerName; + } + + public String getName() { + return this.playerName; + } + +} \ No newline at end of file diff --git a/src/main/java/model/Players.java b/src/main/java/model/Players.java new file mode 100644 index 0000000000..cf6a280e73 --- /dev/null +++ b/src/main/java/model/Players.java @@ -0,0 +1,26 @@ +package model; + +import java.util.List; + +public class Players { + + private final List players; + + public Players(List playerNames) { + this.players = makePlayers(playerNames); + } + + public int getPlayerCount() { + return this.players.size(); + } + + public List getPlayers() { + return players; + } + + private List makePlayers(final List playerNames) { + return playerNames.stream() + .map(Player::new) + .toList(); + } +} diff --git a/src/main/java/util/FootholdGenerator.java b/src/main/java/util/FootholdGenerator.java new file mode 100644 index 0000000000..b23b2b2d60 --- /dev/null +++ b/src/main/java/util/FootholdGenerator.java @@ -0,0 +1,5 @@ +package util; + +public interface FootholdGenerator { + boolean generate(); +} diff --git a/src/main/java/util/RandomFootholdGenerator.java b/src/main/java/util/RandomFootholdGenerator.java new file mode 100644 index 0000000000..a30aef12ab --- /dev/null +++ b/src/main/java/util/RandomFootholdGenerator.java @@ -0,0 +1,13 @@ +package util; + +import java.util.Random; + +public class RandomFootholdGenerator implements FootholdGenerator{ + + private static Random random = new Random(); + + @Override + public boolean generate() { + return random.nextBoolean(); + } +} diff --git a/src/main/java/util/validator/LadderHeightValidator.java b/src/main/java/util/validator/LadderHeightValidator.java new file mode 100644 index 0000000000..c9c0384778 --- /dev/null +++ b/src/main/java/util/validator/LadderHeightValidator.java @@ -0,0 +1,33 @@ +package util.validator; + +import exception.LadderGameValidationException; + +public class LadderHeightValidator { + + public static void validateLadderHeightNumberIsCorrect(String ladderNumber) { + validateLadderHeightNumberIsEmpty(ladderNumber); + validateLadderHeightNumberIsNotInt(ladderNumber); + validateLadderHeightNumberIsNaturalNumber(ladderNumber); + } + + private static void validateLadderHeightNumberIsNotInt(String ladderNumber) { + try { + Integer.parseInt(ladderNumber); + } catch (NumberFormatException e) { + throw new LadderGameValidationException.NotNumericException(); + } + } + + private static void validateLadderHeightNumberIsNaturalNumber(String ladderNumber) { + int number = Integer.parseInt(ladderNumber); + if (number <= 0) { + throw new LadderGameValidationException.NotNaturalNumberException(); + } + } + + private static void validateLadderHeightNumberIsEmpty(String ladderNumber) { + if (ladderNumber.isEmpty()) { + throw new LadderGameValidationException.NotAllowEmptyInputException(); + } + } +} diff --git a/src/main/java/util/validator/PlayerValidator.java b/src/main/java/util/validator/PlayerValidator.java new file mode 100644 index 0000000000..b09c2d401b --- /dev/null +++ b/src/main/java/util/validator/PlayerValidator.java @@ -0,0 +1,51 @@ +package util.validator; + +import exception.LadderGameValidationException; + +import java.util.HashSet; +import java.util.Set; + +public class PlayerValidator { + + public static void validatePlayerNameIsCorrect(String[] playerNames) { + validatePlayerNameHasNoSpace(playerNames); + validatePlayerNameIsNotEmpty(playerNames); + validatePlayerNameLength(playerNames); + validatePlayerNameDuplicated(playerNames); + } + + private static void validatePlayerNameDuplicated(String[] playerNames) { + Set carNameSet = new HashSet<>(); + for (String name : playerNames) { + if (!carNameSet.add(name)) { + throw new LadderGameValidationException.DuplicatedPlayerNameException(); + } + } + } + + private static void validatePlayerNameIsNotEmpty(String[] playerNames) { + for (String name : playerNames) { + if (name.isEmpty()) { + throw new LadderGameValidationException.NotAllowEmptyInputException(); + } + } + } + + private static void validatePlayerNameHasNoSpace(String[] playerNames) { + for (String name : playerNames) { + if (name.contains(" ")) { + throw new LadderGameValidationException.BlankPlayerNameException(); + } + } + } + + private static void validatePlayerNameLength(String[] playNames) { + final int LENGTH_LIMIT_NUMBER = 5; + + for (String name : playNames) { + if (name.length() > LENGTH_LIMIT_NUMBER) { + throw new LadderGameValidationException.InvalidPlayerNameLengthException(); + } + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000000..c8e46be88c --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,36 @@ +package view; + +import util.validator.LadderHeightValidator; +import util.validator.PlayerValidator; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class InputView { + + private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + + public String readPlayerNames() throws IOException { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + String input = reader.readLine(); + + PlayerValidator.validatePlayerNameIsCorrect(convertInputStringToArray(input)); + + return input; + } + + public String readLadderHeightNumber() throws IOException { + System.out.println("최대 사다리 높이는 몇 개인가요?"); + String ladderHeightNumber = reader.readLine(); + + LadderHeightValidator.validateLadderHeightNumberIsCorrect(ladderHeightNumber); + + return ladderHeightNumber; + } + + private String[] convertInputStringToArray(String input) { + return input.split(","); + } + +} \ No newline at end of file diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 0000000000..a1ddf2736d --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,33 @@ +package view; + +import java.util.List; + +public class OutputView { + private final static int NAME_WIDTH = 5; + + public void printResultSentence(StringBuilder ladder, List playerNames) { + System.out.println("실행결과"); + + printPlayerNames(playerNames); + + System.out.println(ladder); + } + + public void printPlayerNames(List playerNames) { + StringBuilder builder = new StringBuilder(); + + for (String name : playerNames) { + String formattedName = formatName(name, NAME_WIDTH); + builder.append(formattedName).append(" "); + } + + System.out.println(builder); + } + + private String formatName(String name, int width) { + if (name.length() > width) { + return name.substring(0, width); + } + return String.format("%" + width + "s", name); + } +} \ No newline at end of file diff --git a/src/test/java/model/HeightTest.java b/src/test/java/model/HeightTest.java new file mode 100644 index 0000000000..14731e19eb --- /dev/null +++ b/src/test/java/model/HeightTest.java @@ -0,0 +1,21 @@ +package model; + + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class HeightTest { + + @Test + @DisplayName("객체 생성 테스트") + void Height_Object_Create_Success() { + + String inputHeight = "5"; + + Height height = new Height(inputHeight); + + assertEquals(inputHeight, height.getHeight()); + } +} diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java new file mode 100644 index 0000000000..5dce9f4702 --- /dev/null +++ b/src/test/java/model/LadderTest.java @@ -0,0 +1,35 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import util.TestFootholdGenerator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; + +class LadderTest { + + private Ladder ladder; + private Players players; + private Height height; + + @BeforeEach + void setUp() { + ladder = new Ladder(); + players = new Players(Arrays.asList("a", "bb", "ccc", "dddd", "eeeee")); + height = new Height("5"); + } + + @Test + @DisplayName("makeLines 메소드가 정상적으로 작동하는지 테스트 합니다.") + void MakeLines_Operation() { + + ladder.makeLines(height, players); + + String[] lines = ladder.getLines().toString().split("\n"); + + assertEquals(5, lines.length); + } +} diff --git a/src/test/java/model/LineTest.java b/src/test/java/model/LineTest.java new file mode 100644 index 0000000000..f8a4801044 --- /dev/null +++ b/src/test/java/model/LineTest.java @@ -0,0 +1,58 @@ +package model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import util.FootholdGenerator; +import util.RandomFootholdGenerator; +import util.TestFootholdGenerator; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +public class LineTest { + private Line line; + private Players players; + private Height height; + + @Test + void makeLineWithNotFoothold() { + TestFootholdGenerator generator = new TestFootholdGenerator(false); + Line line = new Line(generator); + Players players = new Players(Arrays.asList("a", "bb", "ccc", "dddd")); + + line.makeLine(players); + + assertEquals(" | | | |", line.getLine().toString()); + } + + @Test + void makeLineWithFoothold() { + TestFootholdGenerator generator = new TestFootholdGenerator(true); + Line line = new Line(generator); + Players players = new Players(Arrays.asList("a", "bb", "ccc", "dddd")); + + line.makeLine(players); + + assertEquals(" |-----| |-----|", line.getLine().toString()); + } + + @Test + @DisplayName("정상적으로 라인 객체 생성") + void Line_Object_Create_Success() { + + // given + line = new Line(new RandomFootholdGenerator()); + players = new Players(Arrays.asList("a", "bb", "ccc", "dddd", "eeeee")); + height = new Height("5"); + + // when + line.makeLine(players); + + // then + assertThat(line).isNotNull(); + } +} diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java new file mode 100644 index 0000000000..23aca617a2 --- /dev/null +++ b/src/test/java/model/PlayerTest.java @@ -0,0 +1,18 @@ +package model; + + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class PlayerTest { + + @Test + @DisplayName("정상적으로 참여자 객체 생성") + void GetName() { + Player player = new Player("pobix"); + + assertEquals("pobix", player.getName()); + } +} diff --git a/src/test/java/model/PlayersTest.java b/src/test/java/model/PlayersTest.java new file mode 100644 index 0000000000..bfbf58d57d --- /dev/null +++ b/src/test/java/model/PlayersTest.java @@ -0,0 +1,34 @@ +package model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PlayersTest { + @Test + @DisplayName("리스트를 사용해 정상적으로 Players 객체를 생성하고, 값이 같은지 확인") + void Players_Object_Create_Success() { + // given + List playerNames = new ArrayList<>(); + + playerNames.add("Player1"); + playerNames.add("Player2"); + playerNames.add("Player3"); + + // when + Players players = new Players(playerNames); + + // then + assertThat(players.getPlayers()).hasSize(playerNames.size()); + + List extractedNames = players.getPlayers().stream() + .map(Player::getName) + .toList(); + + assertThat(extractedNames).containsExactlyElementsOf(playerNames); + } +} diff --git a/src/test/java/util/TestFootholdGenerator.java b/src/test/java/util/TestFootholdGenerator.java new file mode 100644 index 0000000000..752cb202e3 --- /dev/null +++ b/src/test/java/util/TestFootholdGenerator.java @@ -0,0 +1,15 @@ +package util; + +public class TestFootholdGenerator implements FootholdGenerator { + + private final boolean testGenerateFoothold; + + public TestFootholdGenerator(boolean testGenerateFoothold) { + this.testGenerateFoothold = testGenerateFoothold; + } + + @Override + public boolean generate() { + return testGenerateFoothold; + } +} diff --git a/src/test/java/util/validator/LadderHeightValidatorTest.java b/src/test/java/util/validator/LadderHeightValidatorTest.java new file mode 100644 index 0000000000..e8c9872296 --- /dev/null +++ b/src/test/java/util/validator/LadderHeightValidatorTest.java @@ -0,0 +1,34 @@ +package util.validator; + +import exception.LadderGameValidationException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class LadderHeightValidatorTest { + + @Test + void ladderHeightValidator_정상_입력() { + String ladderHeight = "5"; + assertDoesNotThrow(() -> LadderHeightValidator.validateLadderHeightNumberIsCorrect(ladderHeight)); + } + + @Test + void ladderHeightValidator_정수가_아닌_입력() { + String ladderHeight = "abc"; + assertThrows(LadderGameValidationException.NotNumericException.class, () -> LadderHeightValidator.validateLadderHeightNumberIsCorrect(ladderHeight)); + } + + @Test + void ladderHeightValidator_음수_입력() { + String ladderHeight = "-1"; + assertThrows(LadderGameValidationException.NotNaturalNumberException.class, () -> LadderHeightValidator.validateLadderHeightNumberIsCorrect(ladderHeight)); + } + + @Test + void ladderHeightValidator_공백_입력() { + String ladderHeight = ""; + assertThrows(LadderGameValidationException.NotAllowEmptyInputException.class, () -> LadderHeightValidator.validateLadderHeightNumberIsCorrect(ladderHeight)); + } +} diff --git a/src/test/java/util/validator/PlayerValidatorTest.java b/src/test/java/util/validator/PlayerValidatorTest.java new file mode 100644 index 0000000000..5a9e50562f --- /dev/null +++ b/src/test/java/util/validator/PlayerValidatorTest.java @@ -0,0 +1,40 @@ +package util.validator; + +import exception.LadderGameValidationException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PlayerValidatorTest { + + @Test + void playerNameValidator_정상_입력() { + String[] playerNames = {"pobi", "honux", "crong", "jk"}; + assertDoesNotThrow(() -> PlayerValidator.validatePlayerNameIsCorrect(playerNames)); + } + + @Test + void playerNameValidator_공백_포함() { + String[] playerNames = {"pobi", "ho nux", "crong", "jk"}; + assertThrows(LadderGameValidationException.BlankPlayerNameException.class, () -> PlayerValidator.validatePlayerNameIsCorrect(playerNames)); + } + + @Test + void playerNameValidator_공백() { + String[] playerNames = {"pobi", "", "crong", "jk"}; + assertThrows(LadderGameValidationException.NotAllowEmptyInputException.class, () -> PlayerValidator.validatePlayerNameIsCorrect(playerNames)); + } + + @Test + void playerNameValidator_이름_길이_초과() { + String[] playerNames = {"pobi", "honux", "crong", "123456"}; + assertThrows(LadderGameValidationException.InvalidPlayerNameLengthException.class, () -> PlayerValidator.validatePlayerNameIsCorrect(playerNames)); + } + + @Test + void playerNameValidator_중복_입력() { + String[] playerNames = {"pobi", "pobi", "crong", "jk"}; + assertThrows(LadderGameValidationException.DuplicatedPlayerNameException.class, () -> PlayerValidator.validatePlayerNameIsCorrect(playerNames)); + } +}