diff --git a/README.md b/README.md index 89c5e8384a..39bb266b41 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,48 @@ 사다리타기 미션 저장소 ## 우아한테크코스 코드리뷰 -* [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) \ No newline at end of file +* [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) + +## TODO +### ladder +* equals 좀 정확히 이해해보자 +* vo로 입력을 받는다 +* 입력 + * 사다리 게임에 참여하는 사람에 이름을 최대5글자까지 부여할 수 있다. + * 이름은 대,소문자를 구분한다 + * 허용하지 않음 + * null + * 공백 + * 앞,뒤 공백 + * 중간 공백 + * 영어가 아닌 문자 + * 5글자 초과 + + * 사다리를 출력할 때 사람 이름도 같이 출력한다. + * 사람 이름은 쉼표(,)를 기준으로 구분한다. + * all 은 사람 이름이 될 수 없다. +* 사다리 + * 사람 이름을 5자 기준으로 출력하기 때문에 사다리 폭도 넓어져야 한다. + * 사다리 타기가 정상적으로 동작하려면 라인이 겹치지 않도록 해야 한다. + * |-----|-----| 모양과 같이 가로 라인이 겹치는 경우 어느 방향으로 이동할지 결정할 수 없다. + * 포지션은 (왼쪽, 오른쪽, 상태없음) 로 정의한다. + +## DONE + +--- + +### calculator + +* 커스텀 문자열을 쓰지 않는 경우 + * ,와 ;로 구분한다. + * 빈 문자열 또는 null 값을 입력할 경우 0을 반환해야 한다. + * 숫자 하나를 문자열로 입력할 경우 해당 숫자를 반환한다. + * 숫자 두개를 컴마(,) 구분자로 입력할 경우 두 숫자의 합을 반환한다. + * 구분자를 컴마(,) 이외에 콜론(:)을 사용할 수 있다. + * “//”와 “\n” 문자 사이에 커스텀 구분자를 지정할 수 있다. + * 음수를 전달할 경우 RuntimeException 예외가 발생해야 한다. + +* 커스텀 문자열을 쓰는 경우 + * //와 \n 사이의 커스텀 문자로 구분한다. + +## DONE diff --git a/src/main/java/com/woowacourse/calculator/domain/Calculator.java b/src/main/java/com/woowacourse/calculator/domain/Calculator.java new file mode 100644 index 0000000000..fcbacd3e64 --- /dev/null +++ b/src/main/java/com/woowacourse/calculator/domain/Calculator.java @@ -0,0 +1,80 @@ +package com.woowacourse.calculator.domain; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class Calculator { + private static final Pattern PATTERN = Pattern.compile("//(.)\n(.*)"); + private static final String DEFAULT_NUMBER = "0"; + private static final String DEFAULT_DELIMETER = ":|,"; + private static final int NEGATIVE_BOUND = 0; + + private String expression; + private String delimeter; + private List numbers; + + public Calculator(String input) { + init(input); + numbers = parseNumbers(expression); + } + + void init(String input) { + if (checkEmptyOrNull(input)) return; + if (checkCustomDelimiter(input)) return; + + expression = input; + delimeter = DEFAULT_DELIMETER; + } + + private boolean checkCustomDelimiter(String input) { + Matcher m = PATTERN.matcher(input); + if (m.find()) { + String customDelimiter = m.group(1); + expression = m.group(2); + delimeter = customDelimiter; + return true; + } + return false; + } + + private boolean checkEmptyOrNull(String input) { + if (ifNullOrEmpty(input)) { + expression = DEFAULT_NUMBER; + delimeter = DEFAULT_DELIMETER; + return true; + } + return false; + } + + + List parseNumbers(String expression) { + return Arrays.stream(expression.split(delimeter)) + .map(this::checkIfNegative) + .collect(Collectors.toList()); + } + + int checkIfNegative(String number) { + int no = Integer.parseInt(number); + + if (no < NEGATIVE_BOUND) { + throw new RuntimeException("음수는 입력할 수 없습니다"); + } + + return no; + } + + private boolean ifNullOrEmpty(String input) { + return input == null || input.isEmpty(); + } + + public int calculate() { + if (numbers.size() == 0) { + return 0; + } + + return numbers.stream().mapToInt(Integer::intValue).sum(); + } +} \ No newline at end of file diff --git a/src/main/java/com/woowacourse/laddergame/Main.java b/src/main/java/com/woowacourse/laddergame/Main.java new file mode 100644 index 0000000000..02413f8570 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/Main.java @@ -0,0 +1,32 @@ +package com.woowacourse.laddergame; + +import com.woowacourse.laddergame.domain.vo.*; +import com.woowacourse.laddergame.service.LadderGameService; +import com.woowacourse.laddergame.util.ConsoleUtil; +import com.woowacourse.laddergame.view.InputView; +import com.woowacourse.laddergame.view.OutputView; + +public class Main { + + public static void main(String[] args) { + LadderDto ladderDto = new LadderDto(); + InputView.inputPlayerNames(ladderDto); + InputView.inputHeight(ladderDto); + InputView.inputGameResult(ladderDto); + + LadderGameService ladderGameService = new LadderGameService(ladderDto); + + MadeLadderVO madeLadderVO = ladderGameService.getLadderResult(); + WinnerVO winnerVO = ladderGameService.play(); + + LadderResultDto ladderResultDto = ConsoleUtil.convertLadderResultDto(winnerVO, madeLadderVO); + OutputView.printLadderStatus(ladderResultDto); + + while (true) { + ResultNameDto resultNameDto = new ResultNameDto(); + InputView.inputResultName(resultNameDto); + String targetName = resultNameDto.getName(); + OutputView.printLadderGameResult(targetName, ladderResultDto, resultNameDto); + } + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Ladder.java b/src/main/java/com/woowacourse/laddergame/domain/Ladder.java new file mode 100644 index 0000000000..e96e9619bb --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Ladder.java @@ -0,0 +1,82 @@ +package com.woowacourse.laddergame.domain; + +import com.woowacourse.laddergame.util.BooleanGenerator; +import com.woowacourse.laddergame.util.NaturalNumber; + +import java.util.ArrayList; +import java.util.List; + +public class Ladder { + private final List lines; + + public Ladder(NaturalNumber height, NaturalNumber countOfPerson, BooleanGenerator booleanGenerator) { + lines = new ArrayList<>(); + for (int h = 0; h < height.getNumber(); h++) { + lines.add(new Line(countOfPerson)); + } + initLadder(booleanGenerator, height, countOfPerson); + } + + private void initLadder(BooleanGenerator booleanGenerator, NaturalNumber height, NaturalNumber countOfPerson) { + for (int h = 1; h <= height.getNumber(); h++) { + loopInPerson(booleanGenerator, h, countOfPerson); + } + } + + private void loopInPerson(BooleanGenerator booleanGenerator, int height, NaturalNumber countOfPerson) { + for (int i = 1; i < countOfPerson.getNumber(); i++) { + if (booleanGenerator.generate()) { + putBridge(new NaturalNumber(height), new NaturalNumber(i)); + i++; + } + } + } + + private void putBridge(NaturalNumber height, NaturalNumber position) { + getLine(height).putBridge(position); + } + + private Line getLine(NaturalNumber height) { + return lines.get(height.convertIndex()); + } + + public int getHeight() { + return lines.size(); + } + + public int takeLadder(NaturalNumber personNo) { + int currentPosition = personNo.getNumber(); + for (int i = 0; i < getHeight(); i++) { + currentPosition = lines.get(i).takeLine(new NaturalNumber(currentPosition)); + } + return currentPosition; + } + + public boolean isContainsLine(NaturalNumber height, Line line) { + return getLine(height).equals(line); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Ladder ladder = (Ladder) o; + + return lines != null ? lines.equals(ladder.lines) : ladder.lines == null; + } + + @Override + public int hashCode() { + return lines != null ? lines.hashCode() : 0; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Line line : lines) { + sb.append(line.toString()).append("\n"); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Line.java b/src/main/java/com/woowacourse/laddergame/domain/Line.java new file mode 100644 index 0000000000..8ec0a42214 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Line.java @@ -0,0 +1,71 @@ +package com.woowacourse.laddergame.domain; + +import com.woowacourse.laddergame.util.NaturalNumber; + +import java.util.ArrayList; +import java.util.List; + +public class Line { + private final List positions; + + public Line(NaturalNumber countOfPerson) { + positions = new ArrayList<>(); + + for (int i = 0; i < countOfPerson.getNumber(); i++) { + positions.add(Position.NONE); + } + } + + public int getPositionCount() { + return positions.size(); + } + + public void putBridge(NaturalNumber number) { + if (number.getNumber() >= positions.size()) { + throw new IllegalArgumentException("다리를 놓을 수 없습니다"); + } + + if (positions.get(number.convertIndex()) != Position.NONE) { + throw new IllegalArgumentException("다리가 존재하거나 연속되게 놓을 수 없습니다."); + } + + positions.set(number.convertIndex(), Position.RIGHT); + positions.set(number.convertIndex() + 1, Position.LEFT); + } + + public boolean isBridgeExist(int index) { + return positions.get(index) != Position.NONE; + } + + public int takeLine(NaturalNumber positionNo) { + return positions.get(positionNo.convertIndex()).move(positionNo.getNumber(), positions.size()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Position position : positions) { + if (position.equals(Position.LEFT)) { + sb.append("-----|"); + continue; + } + sb.append(" |"); + } + return sb.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Line line = (Line) o; + + return positions != null ? positions.equals(line.positions) : line.positions == null; + } + + @Override + public int hashCode() { + return positions != null ? positions.hashCode() : 0; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Player.java b/src/main/java/com/woowacourse/laddergame/domain/Player.java new file mode 100644 index 0000000000..0e0a511115 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Player.java @@ -0,0 +1,72 @@ +package com.woowacourse.laddergame.domain; + +public class Player { + private static final int MAX_NAME_LENGTH = 5; + private static final String ILLEGAL_NAME = "all"; + + private final String name; + + public Player(String name) { + checkPlayerNameIfNull(name); + checkPlayerNameEmptySpace(name); + checkPlayerNameBlankSpace(name); + checkPlayerNameLength(name); + checkPlayerNamePattern(name); + + this.name = name; + } + + private void checkPlayerNameIfNull(String name) { + if (name == null) { + throw new IllegalArgumentException("null을 입력할 수 없습니다"); + } + } + + private void checkPlayerNameEmptySpace(String name) { + if (name.contains(" ")) { + throw new IllegalArgumentException("이름에 공백이 있으면 안됩니다"); + } + } + + private void checkPlayerNameBlankSpace(String name) { + if (name.trim().length() == 0) { + throw new IllegalArgumentException("공백을 입력할 수 없습니다"); + } + } + + private void checkPlayerNameLength(String name) { + if (name.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("이름은 5글자 까지 가능합니다"); + } + } + + private void checkPlayerNamePattern(String name) { + if (name.equals(ILLEGAL_NAME)) { + throw new IllegalArgumentException("all은 player 이름으로 입력할 수 없습니다"); + } + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Player player = (Player) o; + + return name != null ? name.equals(player.name) : player.name == null; + } + + @Override + public int hashCode() { + return name != null ? name.hashCode() : 0; + } + + @Override + public String toString() { + return String.format("%6.6s", name); + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Players.java b/src/main/java/com/woowacourse/laddergame/domain/Players.java new file mode 100644 index 0000000000..511b5cd5af --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Players.java @@ -0,0 +1,63 @@ +package com.woowacourse.laddergame.domain; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class Players { + private final List players; + + public Players(List players) { + checkDuplicateName(players); + this.players = players; + } + + private void checkDuplicateName(List players) { + Set nameSet = new HashSet<>(players); + if (nameSet.size() != players.size()) { + throw new IllegalArgumentException("이름은 중복될 수 없습니다"); + } + } + + public int getPlayerNo(String name) { + // 사다리의 번호는 1부터 시작한다 + return players.indexOf(new Player(name)) + 1; + } + + public List getPlayers() { + return players; + } + + public int getPlayerCount() { + return players.size(); + } + + public List getPlayersName() { + return players.stream().map(Player::getName).collect(Collectors.toList()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Players players1 = (Players) o; + + return players != null ? players.equals(players1.players) : players1.players == null; + } + + @Override + public int hashCode() { + return players != null ? players.hashCode() : 0; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Player player : players) { + sb.append(player.toString()); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Position.java b/src/main/java/com/woowacourse/laddergame/domain/Position.java new file mode 100644 index 0000000000..6e42c03dbb --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Position.java @@ -0,0 +1,27 @@ +package com.woowacourse.laddergame.domain; + +import java.util.function.Function; + +public enum Position { + LEFT((index) -> index - 1), + RIGHT((index) -> index + 1), + NONE((index) -> index); + + private static final int LADDER_INDEX_BOUNDARY = 0; + + Function function; + + Position(Function function) { + this.function = function; + } + + int move(int index, int maxIndex) { + if (index <= LADDER_INDEX_BOUNDARY) { + throw new IllegalArgumentException("인덱스는 1부터 시작해야 합니다"); + } + if (index > maxIndex) { + throw new IllegalArgumentException("최대 인덱스보다 큰 인덱스입니다"); + } + return this.function.apply(index); + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Result.java b/src/main/java/com/woowacourse/laddergame/domain/Result.java new file mode 100644 index 0000000000..843f13d713 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Result.java @@ -0,0 +1,33 @@ +package com.woowacourse.laddergame.domain; + +public class Result { + private final String result; + + public Result(String result) { + this.result = result; + } + + public String getResult() { + return result; + } + + @Override + public String toString() { + return String.format("%-6.6s", result); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Result result1 = (Result) o; + + return result != null ? result.equals(result1.result) : result1.result == null; + } + + @Override + public int hashCode() { + return result != null ? result.hashCode() : 0; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Results.java b/src/main/java/com/woowacourse/laddergame/domain/Results.java new file mode 100644 index 0000000000..fe637d3f1c --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Results.java @@ -0,0 +1,26 @@ +package com.woowacourse.laddergame.domain; + +import com.woowacourse.laddergame.util.NaturalNumber; + +import java.util.List; + +public class Results { + private final List results; + + public Results(List results) { + this.results = results; + } + + public Result get(NaturalNumber resultNo) { + return results.get(resultNo.convertIndex()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Result result : results) { + sb.append(result.toString()); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/Winners.java b/src/main/java/com/woowacourse/laddergame/domain/Winners.java new file mode 100644 index 0000000000..791a8f06be --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/Winners.java @@ -0,0 +1,44 @@ +package com.woowacourse.laddergame.domain; + +import java.util.HashMap; + +public class Winners { + private final HashMap winners; + + public Winners(HashMap winners) { + this.winners = winners; + } + + public String getSingleResult(String name) { + return winners.get(new Player(name)).getResult(); + } + + public String getAllResult() { + StringBuilder sb = new StringBuilder(); + for (Player player : winners.keySet()) { + sb.append(player.getName()); + sb.append(" : "); + sb.append(winners.get(player).getResult()).append("\n"); + } + return sb.toString(); + } + + public boolean isContains(String name) { + return winners.containsKey(new Player(name)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Winners winners1 = (Winners) o; + + return winners != null ? winners.equals(winners1.winners) : winners1.winners == null; + } + + @Override + public int hashCode() { + return winners != null ? winners.hashCode() : 0; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/vo/LadderDto.java b/src/main/java/com/woowacourse/laddergame/domain/vo/LadderDto.java new file mode 100644 index 0000000000..18b269b0ed --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/vo/LadderDto.java @@ -0,0 +1,157 @@ +package com.woowacourse.laddergame.domain.vo; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class LadderDto { + private static final Pattern TOTAL_PLAYER_NAMES_PATTERN = Pattern.compile("^([A-Za-z]{1,5})(,([A-Za-z]{1,5}))+$"); + private static final Pattern SINGLE_PLAYER_NAMES_PATTERN = Pattern.compile("([A-Za-z]{1,5})"); + private static final Pattern HEIGHT_PATTERN = Pattern.compile("^([1-9])([0-9])*$"); + private static final Pattern TOTAL_RESULT_PATTERN = Pattern.compile("^([ㄱ-ㅎㅏ-ㅣ가-힣A-Za-z0-9]{1,5})(,[ㄱ-ㅎㅏ-ㅣ가-힣A-Za-z0-9]{1,5})+$"); + private static final Pattern SINGLE_RESULT_PATTERN = Pattern.compile("([ㄱ-ㅎㅏ-ㅣ가-힣A-Za-z0-9]{1,5})"); + private static final String ILLEGAL_NAME = "all"; + + private String names; + private int height; + private String result; + + public String getNames() { + return names; + } + + public void setNames(String names) { + checkPlayerNames(names); + this.names = names; + } + + private void checkPlayerNames(String names) { + checkNameIfNull(names); + checkNameIfIllegal(names); + checkNameMatchPattern(names); + + // Result가 들어와 있는상태에서 플레이어 이름을 다시 초기화 할 때 + if (!isSameLengthBetweenResultAndNames(getNamesCount(names))) { + throw new IllegalArgumentException("Result 개수와 맞지 않습니다"); + } + checkDuplicateNames(names); + } + + private void checkDuplicateNames(String names) { + List nameTokens = Arrays.asList(names.split(",")); + Set set = new HashSet<>(nameTokens); + if (set.size() != nameTokens.size()) { + throw new IllegalArgumentException("중복된 이름을 입력할 수 없습니다"); + } + } + + private void checkNameMatchPattern(String names) { + Matcher matcher = TOTAL_PLAYER_NAMES_PATTERN.matcher(names); + if (!matcher.find()) { + throw new IllegalArgumentException("Player 이름들이 잘못되었습니다"); + } + } + + private void checkNameIfIllegal(String names) { + if (names.contains(ILLEGAL_NAME)) { + throw new IllegalArgumentException("all은 player 이름으로 입력할 수 없습니다"); + } + } + + private void checkNameIfNull(String names) { + if (names == null) { + throw new IllegalArgumentException("Null 은 입력할 수 없습니다"); + } + } + + public void checkHeight(String height) { + if (height == null) { + throw new IllegalArgumentException("Null 은 입력할 수 없습니다"); + } + + Matcher matcher = HEIGHT_PATTERN.matcher(height); + if (!matcher.find()) { + throw new IllegalArgumentException("정상적인 사다리 높이가 아닙니다"); + } + } + + public void checkResult(String result) { + checkResultisNull(result); + checkNamesInitialized(); + checkResultMatchPattern(result); + + // Result 초기화 시 이름 개수와 비교 + if (!isSameLengthBetweenResultAndNames(getResultCount(result))) { + throw new IllegalArgumentException("이름과 개수가 다릅니다"); + } + } + + private void checkResultMatchPattern(String result) { + Matcher matcher = TOTAL_RESULT_PATTERN.matcher(result); + if (!matcher.find()) { + throw new IllegalArgumentException("Result 값이 잘못 되었습니다"); + } + } + + private void checkNamesInitialized() { + if (names == null) { + throw new IllegalArgumentException("이름이 먼저 초기화되야 합니다"); + } + } + + private void checkResultisNull(String result) { + if (result == null) { + throw new IllegalArgumentException("Null 은 입력할 수 없습니다"); + } + } + + private int getResultCount(String result) { + int count = 0; + + Matcher matcher = SINGLE_RESULT_PATTERN.matcher(result); + while (matcher.find()) { + count++; + } + return count; + } + + private boolean isSameLengthBetweenResultAndNames(int count) { + if (result != null && count != getResultCount(result)) { + return false; + } + if (names != null && count != getNamesCount(names)) { + return false; + } + return true; + } + + private int getNamesCount(String result) { + Matcher matcher = SINGLE_PLAYER_NAMES_PATTERN.matcher(result); + int count = 0; + while (matcher.find()) { + count++; + } + return count; + } + + public int getHeight() { + return height; + } + + public void setHeight(String height) { + checkHeight(height); + this.height = Integer.parseInt(height); + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + checkResult(result); + this.result = result; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/vo/LadderResultDto.java b/src/main/java/com/woowacourse/laddergame/domain/vo/LadderResultDto.java new file mode 100644 index 0000000000..eafbc01ef1 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/vo/LadderResultDto.java @@ -0,0 +1,55 @@ +package com.woowacourse.laddergame.domain.vo; + +public class LadderResultDto { + private static final String PLAY_ALL_LADDER_RESERVED_WORD = "all"; + + private MadeLadderVO madeLadderVO; + private WinnerVO winnerVO; + + public String getResult(String name) { + if (name == null) { + throw new IllegalArgumentException("이름이 존재하지 않습니다"); + } + if (name.equals(PLAY_ALL_LADDER_RESERVED_WORD)) { + return winnerVO.getAllResult(); + } + if (!winnerVO.isContains(name)) { + throw new IllegalArgumentException("존재하지 않는 이름입니다"); + } + return winnerVO.getSingleResult(name) + "\n"; + } + + public MadeLadderVO getMadeLadderVO() { + return madeLadderVO; + } + + public void setMadeLadderVO(MadeLadderVO madeLadderVO) { + this.madeLadderVO = madeLadderVO; + } + + public WinnerVO getWinnerVO() { + return winnerVO; + } + + public void setWinnerVO(WinnerVO winnerVO) { + this.winnerVO = winnerVO; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + LadderResultDto that = (LadderResultDto) o; + + if (madeLadderVO != null ? !madeLadderVO.equals(that.madeLadderVO) : that.madeLadderVO != null) return false; + return winnerVO != null ? winnerVO.equals(that.winnerVO) : that.winnerVO == null; + } + + @Override + public int hashCode() { + int result = madeLadderVO != null ? madeLadderVO.hashCode() : 0; + result = 31 * result + (winnerVO != null ? winnerVO.hashCode() : 0); + return result; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/vo/MadeLadderVO.java b/src/main/java/com/woowacourse/laddergame/domain/vo/MadeLadderVO.java new file mode 100644 index 0000000000..e6290511a0 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/vo/MadeLadderVO.java @@ -0,0 +1,47 @@ +package com.woowacourse.laddergame.domain.vo; + +import com.woowacourse.laddergame.domain.Ladder; +import com.woowacourse.laddergame.domain.Players; +import com.woowacourse.laddergame.domain.Results; + +public class MadeLadderVO { + private final Players players; + private final Ladder ladder; + private final Results results; + + public MadeLadderVO(Players players, Ladder ladder, Results results) { + this.players = players; + this.ladder = ladder; + this.results = results; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MadeLadderVO that = (MadeLadderVO) o; + + if (players != null ? !players.equals(that.players) : that.players != null) return false; + if (ladder != null ? !ladder.equals(that.ladder) : that.ladder != null) return false; + return results != null ? results.equals(that.results) : that.results == null; + } + + @Override + public int hashCode() { + int result = players != null ? players.hashCode() : 0; + result = 31 * result + (ladder != null ? ladder.hashCode() : 0); + result = 31 * result + (results != null ? results.hashCode() : 0); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(players.toString()).append("\n"); + sb.append(ladder.toString()); + sb.append(results.toString()); + + return sb.toString(); + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/vo/ResultNameDto.java b/src/main/java/com/woowacourse/laddergame/domain/vo/ResultNameDto.java new file mode 100644 index 0000000000..f673f3eb00 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/vo/ResultNameDto.java @@ -0,0 +1,30 @@ +package com.woowacourse.laddergame.domain.vo; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ResultNameDto { + private static final Pattern SINGLE_PLAYER_NAMES_PATTERN = Pattern.compile("^([A-Za-z]{1,5})$"); + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + checkName(name); + this.name = name; + } + + private void checkName(String name) { + if (name == null) { + throw new IllegalArgumentException("Null 은 입력할 수 없습니다"); + } + + Matcher matcher = SINGLE_PLAYER_NAMES_PATTERN.matcher(name); + if (!matcher.find()) { + throw new IllegalArgumentException("Result Name 이 잘못되었습니다"); + } + } +} diff --git a/src/main/java/com/woowacourse/laddergame/domain/vo/WinnerVO.java b/src/main/java/com/woowacourse/laddergame/domain/vo/WinnerVO.java new file mode 100644 index 0000000000..ef0da1dcc3 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/domain/vo/WinnerVO.java @@ -0,0 +1,38 @@ +package com.woowacourse.laddergame.domain.vo; + +import com.woowacourse.laddergame.domain.Winners; + +public class WinnerVO { + private Winners winners; + + public WinnerVO(Winners winners) { + this.winners = winners; + } + + public String getSingleResult(String name) { + return winners.getSingleResult(name); + } + + public String getAllResult() { + return winners.getAllResult(); + } + + public boolean isContains(String name) { + return winners.isContains(name); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + WinnerVO winnerVO = (WinnerVO) o; + + return winners != null ? winners.equals(winnerVO.winners) : winnerVO.winners == null; + } + + @Override + public int hashCode() { + return winners != null ? winners.hashCode() : 0; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/service/LadderGameService.java b/src/main/java/com/woowacourse/laddergame/service/LadderGameService.java new file mode 100644 index 0000000000..1293517ea7 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/service/LadderGameService.java @@ -0,0 +1,77 @@ +package com.woowacourse.laddergame.service; + +import com.woowacourse.laddergame.domain.*; +import com.woowacourse.laddergame.domain.vo.LadderDto; +import com.woowacourse.laddergame.domain.vo.MadeLadderVO; +import com.woowacourse.laddergame.domain.vo.WinnerVO; +import com.woowacourse.laddergame.util.BooleanGenerator; +import com.woowacourse.laddergame.util.NaturalNumber; +import com.woowacourse.laddergame.util.RandomBooleanGenerator; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; + +public class LadderGameService { + private Players players; + private Results results; + private Ladder ladder; + + public LadderGameService(LadderDto ladderDto) { + this.players = getPlayers(ladderDto); + this.results = getResults(ladderDto); + this.ladder = getLadder(ladderDto, players); + } + + private static Players getPlayers(LadderDto ladderDto) { + String[] playerNameTokens = ladderDto.getNames().split(","); + List players = new ArrayList<>(); + + for (String name : playerNameTokens) { + players.add(new Player(name)); + } + + return new Players(players); + } + + private static Results getResults(LadderDto ladderDto) { + String[] resultNameTokens = ladderDto.getResult().split(","); + List results = new ArrayList<>(); + + for (String result : resultNameTokens) { + results.add(new Result(result)); + } + + return new Results(results); + } + + private static Ladder getLadder(LadderDto ladderDto, Players players) { + int height = ladderDto.getHeight(); + int countOfPerson = players.getPlayerCount(); + BooleanGenerator booleanGenerator = new RandomBooleanGenerator(); + + return new Ladder(new NaturalNumber(height), new NaturalNumber(countOfPerson), booleanGenerator); + } + + public MadeLadderVO getLadderResult() { + return new MadeLadderVO(players, ladder, results); + } + + public WinnerVO play() { + return getWinners(players, ladder, results); + } + + private static WinnerVO getWinners(Players players, Ladder ladder, Results results) { + HashMap winnerHashMap = new LinkedHashMap<>(); + for (Player player: players.getPlayers()) { + int resultNo = ladder.takeLadder(new NaturalNumber(players.getPlayerNo(player.getName()))); + Result result = results.get(new NaturalNumber(resultNo)); + winnerHashMap.put(player, result); + } + + Winners winners = new Winners(winnerHashMap); + return new WinnerVO(winners); + } +} + diff --git a/src/main/java/com/woowacourse/laddergame/util/BooleanGenerator.java b/src/main/java/com/woowacourse/laddergame/util/BooleanGenerator.java new file mode 100644 index 0000000000..a44f505367 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/util/BooleanGenerator.java @@ -0,0 +1,5 @@ +package com.woowacourse.laddergame.util; + +public interface BooleanGenerator { + boolean generate(); +} diff --git a/src/main/java/com/woowacourse/laddergame/util/ConsoleUtil.java b/src/main/java/com/woowacourse/laddergame/util/ConsoleUtil.java new file mode 100644 index 0000000000..fa89e989f4 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/util/ConsoleUtil.java @@ -0,0 +1,15 @@ +package com.woowacourse.laddergame.util; + +import com.woowacourse.laddergame.domain.vo.LadderResultDto; +import com.woowacourse.laddergame.domain.vo.MadeLadderVO; +import com.woowacourse.laddergame.domain.vo.WinnerVO; + +public class ConsoleUtil { + public static LadderResultDto convertLadderResultDto(WinnerVO winnerVO, MadeLadderVO madeLadderVO) { + LadderResultDto ladderResultDto = new LadderResultDto(); + ladderResultDto.setMadeLadderVO(madeLadderVO); + ladderResultDto.setWinnerVO(winnerVO); + + return ladderResultDto; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/util/NaturalNumber.java b/src/main/java/com/woowacourse/laddergame/util/NaturalNumber.java new file mode 100644 index 0000000000..78659c2eef --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/util/NaturalNumber.java @@ -0,0 +1,22 @@ +package com.woowacourse.laddergame.util; + +public class NaturalNumber { + private static final int NATURAL_NUM_BOUNDARY = 0; + private int number; + + public NaturalNumber(int number) { + if (number <= NATURAL_NUM_BOUNDARY) { + throw new IllegalArgumentException("자연수가 아닙니다."); + } + + this.number = number; + } + + public int convertIndex() { + return number - 1; + } + + public int getNumber() { + return number; + } +} diff --git a/src/main/java/com/woowacourse/laddergame/util/RandomBooleanGenerator.java b/src/main/java/com/woowacourse/laddergame/util/RandomBooleanGenerator.java new file mode 100644 index 0000000000..ec746efdcf --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/util/RandomBooleanGenerator.java @@ -0,0 +1,12 @@ +package com.woowacourse.laddergame.util; + +import java.util.Random; + +public class RandomBooleanGenerator implements BooleanGenerator { + private static Random random = new Random(); + + @Override + public boolean generate() { + return random.nextBoolean(); + } +} diff --git a/src/main/java/com/woowacourse/laddergame/view/InputView.java b/src/main/java/com/woowacourse/laddergame/view/InputView.java new file mode 100644 index 0000000000..6422463824 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/view/InputView.java @@ -0,0 +1,62 @@ +package com.woowacourse.laddergame.view; + +import com.woowacourse.laddergame.domain.vo.LadderDto; +import com.woowacourse.laddergame.domain.vo.ResultNameDto; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + public static LadderDto inputPlayerNames(LadderDto ladderDto) { + try { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + ladderDto.setNames(scanner.nextLine()); + return ladderDto; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return inputPlayerNames(ladderDto); + } + } + + public static LadderDto inputGameResult(LadderDto ladderDto) { + try { + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + ladderDto.setResult(scanner.nextLine()); + return ladderDto; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return inputGameResult(ladderDto); + } + } + + public static LadderDto inputHeight(LadderDto ladderDto) { + try { + System.out.println("최대 사다리 높이는 몇 개인가요?"); + ladderDto.setHeight(scanner.nextLine()); + return ladderDto; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return inputHeight(ladderDto); + } + } + + public static ResultNameDto inputResultName(ResultNameDto resultNameDto) { + try { + System.out.println("결과를 보고 싶은 사람은?"); + String resultName = scanner.nextLine(); + checkExit(resultName); + resultNameDto.setName(resultName); + return resultNameDto; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return inputResultName(resultNameDto); + } + } + + private static void checkExit(String input) { + if (input.equals("-1")) { + System.exit(0); + } + } +} diff --git a/src/main/java/com/woowacourse/laddergame/view/OutputView.java b/src/main/java/com/woowacourse/laddergame/view/OutputView.java new file mode 100644 index 0000000000..65a218f8e1 --- /dev/null +++ b/src/main/java/com/woowacourse/laddergame/view/OutputView.java @@ -0,0 +1,19 @@ +package com.woowacourse.laddergame.view; + +import com.woowacourse.laddergame.domain.vo.LadderResultDto; +import com.woowacourse.laddergame.domain.vo.ResultNameDto; + +public class OutputView { + public static void printLadderStatus(LadderResultDto ladderResultDto) { + System.out.println(ladderResultDto.getMadeLadderVO()); + } + + public static void printLadderGameResult(String targetName, LadderResultDto ladderResultDto, ResultNameDto resultNameDto) { + System.out.println("실행 결과"); + try { + System.out.println(ladderResultDto.getResult(targetName)); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/test/java/com/woowacourse/calculator/domain/CalculatorTest.java b/src/test/java/com/woowacourse/calculator/domain/CalculatorTest.java new file mode 100644 index 0000000000..174e982c9b --- /dev/null +++ b/src/test/java/com/woowacourse/calculator/domain/CalculatorTest.java @@ -0,0 +1,57 @@ +package com.woowacourse.calculator.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class CalculatorTest { + @Test + void 빈_문자열입력() { + String emptyString = ""; + + Calculator calculator = new Calculator(emptyString); + assertThat(calculator.calculate()).isEqualTo(0); + } + + @Test + void null_입력() { + String nullString = null; + + Calculator calculator = new Calculator(nullString); + assertThat(calculator.calculate()).isEqualTo(0); + } + + @Test + void 숫자_하나_입력() { + String singleNumber = "1"; + + Calculator calculator = new Calculator(singleNumber); + assertThat(calculator.calculate()).isEqualTo(1); + } + + @Test + void 구분자로_계산() { + String input = "1,2:3"; + + Calculator calculator = new Calculator(input); + assertThat(calculator.calculate()).isEqualTo(6); + } + + @Test + void 커스텀_구분자_계산() { + String input = "//;\n1;2;3"; + + Calculator calculator = new Calculator(input); + assertThat(calculator.calculate()).isEqualTo(6); + } + + @Test + void 음수_입력_예외처리() { + String input = "-1,2,3"; + + assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> { + Calculator calculator = new Calculator(input); + }).withMessage("음수는 입력할 수 없습니다"); + } +} diff --git a/src/test/java/com/woowacourse/laddergame/domain/LadderTest.java b/src/test/java/com/woowacourse/laddergame/domain/LadderTest.java new file mode 100644 index 0000000000..05c2f1589d --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/domain/LadderTest.java @@ -0,0 +1,90 @@ +package com.woowacourse.laddergame.domain; + +import com.woowacourse.laddergame.util.BooleanGenerator; +import com.woowacourse.laddergame.util.NaturalNumber; +import com.woowacourse.laddergame.util.TestBooleanGenerator; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LadderTest { + private NaturalNumber height; + private NaturalNumber countOfPerson; + private Ladder ladder; + private BooleanGenerator booleanGenerator; + private boolean[] testBooleanData; + + @BeforeEach + void setUp() { + height = new NaturalNumber(3); + countOfPerson = new NaturalNumber(4); + testBooleanData = new boolean[]{true, true, false, true, false, false, true}; + booleanGenerator = new TestBooleanGenerator(testBooleanData); + ladder = new Ladder(height, countOfPerson, booleanGenerator); + } + + @Test + void 정상적_사다리_높이_확인() { + List lines = Arrays.asList(new Line(new NaturalNumber(3)), + new Line(new NaturalNumber(3)), + new Line(new NaturalNumber(3))); + + assertThat(ladder.getHeight()).isEqualTo(lines.size()); + } + + @Test + void 사다리에_다리_놓기() { + // 첫 번째 줄 + Line line1 = new Line(new NaturalNumber(4)); + line1.putBridge(new NaturalNumber(1)); + line1.putBridge(new NaturalNumber(3)); + + // 두 번째 줄 + Line line2 = new Line(new NaturalNumber(4)); + line2.putBridge(new NaturalNumber(2)); + + // 세 번째 줄 + Line line3 = new Line(new NaturalNumber(4)); + line3.putBridge(new NaturalNumber(3)); + + assertThat(ladder.isContainsLine(new NaturalNumber(1), line1)).isTrue(); + assertThat(ladder.isContainsLine(new NaturalNumber(2), line2)).isTrue(); + assertThat(ladder.isContainsLine(new NaturalNumber(3), line3)).isTrue(); + } + + @Test + void 사다리타기_1번사람() { + // 1번 사람은 4번 인덱스로 반환 되어야 함 + int firstIdx = ladder.takeLadder(new NaturalNumber(1)); + + assertThat(firstIdx).isEqualTo(4); + } + + @Test + void 사다리타기_2번사람() { + // 2번 사람은 1번 인덱스로 반환 되어야 함 + int secondIdx = ladder.takeLadder(new NaturalNumber(2)); + + assertThat(secondIdx).isEqualTo(1); + } + + @Test + void 사다리타기_3번사람() { + // 3번 사람은 3번 인덱스로 반환 되어야 함 + int thirdIdx = ladder.takeLadder(new NaturalNumber(3)); + + assertThat(thirdIdx).isEqualTo(3); + } + + @Test + void 사다리타기_4번사람() { + // 4번 사람은 2번 인덱스로 반환 되어야 함 + int fourthIdx = ladder.takeLadder(new NaturalNumber(4)); + + assertThat(fourthIdx).isEqualTo(2); + } +} \ No newline at end of file diff --git a/src/test/java/com/woowacourse/laddergame/domain/LineTest.java b/src/test/java/com/woowacourse/laddergame/domain/LineTest.java new file mode 100644 index 0000000000..78e3490205 --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/domain/LineTest.java @@ -0,0 +1,106 @@ +package com.woowacourse.laddergame.domain; + +import com.woowacourse.laddergame.util.NaturalNumber; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class LineTest { + private int countOfPerson; + private Line line; + + @BeforeEach + void setUp() { + countOfPerson = 4; + line = new Line(new NaturalNumber(countOfPerson)); + } + + @Test + void 라인_사람수만큼_포지션_초기화() { + assertThat(line.getPositionCount()).isEqualTo(4); + } + + @Test + void 정상적_사다리_초기화() { + // |-----| |-----| + line.putBridge(new NaturalNumber(1)); + line.putBridge(new NaturalNumber(3)); + + assertThat(line.isBridgeExist(1)).isTrue(); + assertThat(line.isBridgeExist(3)).isTrue(); + } + + @Test + void 비정상적_사다리_초기화() { + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> + line.putBridge(new NaturalNumber(4))).withMessage("다리를 놓을 수 없습니다"); + } + + @Test + void 비정상적_사다리_초기화_인덱스_음수() { + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> + line.putBridge(new NaturalNumber(-1))).withMessage("자연수가 아닙니다."); + } + + + @Test + void 사다리_그려지는_테스트_양쪽선() { + String ladderShape = " |-----| |-----|"; + + line.putBridge(new NaturalNumber(1)); + line.putBridge(new NaturalNumber(3)); + + assertThat(line.toString()).isEqualTo(ladderShape); + + } + + @Test + void 사다리_그려지는_테스트_중간만_선() { + String ladderShape = " | |-----| |"; + + line.putBridge(new NaturalNumber(2)); + + assertThat(line.toString()).isEqualTo(ladderShape); + } + + @Test + void 이미다리가_놓여져있을_때_예외처리() { + line.putBridge(new NaturalNumber(2)); + + assertThrows(IllegalArgumentException.class, () -> { + line.putBridge(new NaturalNumber(2)); + }); + } + + @Test + void 연속해서_다리를_놓는_예외처리() { + line.putBridge(new NaturalNumber(2)); + + assertThrows(IllegalArgumentException.class, () -> { + line.putBridge(new NaturalNumber(3)); + }); + } + + @Test + void 범위가_넘어가는_위치에_사다리_놓는경우_예외() { + assertThrows(IllegalArgumentException.class, () -> { + line.putBridge(new NaturalNumber(5)); + }); + } + + @Test + void 동일한_라인인지_테스트() { + assertThat(line).isEqualTo(new Line(new NaturalNumber(4))); + } + + @Test + void 라인_이동_테스트() { + line.putBridge(new NaturalNumber(1)); + line.putBridge(new NaturalNumber(3)); + + assertThat(line.takeLine(new NaturalNumber(1))).isEqualTo(2); + } +} diff --git a/src/test/java/com/woowacourse/laddergame/domain/PlayerTest.java b/src/test/java/com/woowacourse/laddergame/domain/PlayerTest.java new file mode 100644 index 0000000000..ea14e6925e --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/domain/PlayerTest.java @@ -0,0 +1,61 @@ +package com.woowacourse.laddergame.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class PlayerTest { + @Test + void 정상이름_초기화() { + String name = "aiden"; + + Player player = new Player(name); + assertThat(player.getName()).isEqualTo("aiden"); + } + + @Test + void 비정상이름_5자이상() { + String name = "aidenjay"; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Player player = new Player(name); + }).withMessage("이름은 5글자 까지 가능합니다"); + } + + @Test + void 공백_입력() { + String name = " "; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Player player = new Player(name); + }).withMessage("이름에 공백이 있으면 안됩니다"); + } + + @Test + void null_입력() { + String name = null; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Player player = new Player(name); + }).withMessage("null을 입력할 수 없습니다"); + } + + @Test + void 공백이_있는_경우() { + String name = "j ay"; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Player player = new Player(name); + }).withMessage("이름에 공백이 있으면 안됩니다"); + } + + @Test + void all_이라는_이름입력() { + String name = "all"; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Player player = new Player(name); + }).withMessage("all은 player 이름으로 입력할 수 없습니다"); + } +} diff --git a/src/test/java/com/woowacourse/laddergame/domain/PlayersTest.java b/src/test/java/com/woowacourse/laddergame/domain/PlayersTest.java new file mode 100644 index 0000000000..14b6d9f58a --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/domain/PlayersTest.java @@ -0,0 +1,33 @@ +package com.woowacourse.laddergame.domain; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class PlayersTest { + @Test + void player_인덱스_반환() { + List playerList = Arrays.asList(new Player("pobi"), + new Player("aiden"), + new Player("jay")); + + Players players = new Players(playerList); + + assertThat(players.getPlayerNo("aiden")).isEqualTo(2); + } + + @Test + void 이름이_중복되는_경우() { + List duplicatePlayerList = Arrays.asList(new Player("pobi"), + new Player("pobi"), + new Player("jay")); + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Players players = new Players(duplicatePlayerList); + }).withMessage("이름은 중복될 수 없습니다"); + } +} \ No newline at end of file diff --git a/src/test/java/com/woowacourse/laddergame/domain/PositionTest.java b/src/test/java/com/woowacourse/laddergame/domain/PositionTest.java new file mode 100644 index 0000000000..bc5570cae9 --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/domain/PositionTest.java @@ -0,0 +1,44 @@ +package com.woowacourse.laddergame.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class PositionTest { + private int currentIdx = 3; + private int maxIdx = 4; + + @Test + public void 왼쪽으로_이동하는경우() { + assertThat(Position.LEFT.move(currentIdx, maxIdx)).isEqualTo(currentIdx - 1); + } + + @Test + public void 오른쪽으로_이동하는경우() { + assertThat(Position.RIGHT.move(currentIdx, maxIdx)).isEqualTo(currentIdx + 1); + } + + @Test + public void 정지_하는경우() { + assertThat(Position.NONE.move(currentIdx, maxIdx)).isEqualTo(currentIdx); + } + + @Test + void 이동_불가한경우_자연수가_아닌_인덱스() { + int zeroIndex = 0; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Position.LEFT.move(zeroIndex, maxIdx); + }).withMessage("인덱스는 1부터 시작해야 합니다"); + } + + @Test + void 이동_불가한경우_최대_인덱스를_넘는경우() { + int currentIdx = 5; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + Position.LEFT.move(currentIdx, maxIdx); + }).withMessage("최대 인덱스보다 큰 인덱스입니다"); + } +} \ No newline at end of file diff --git a/src/test/java/com/woowacourse/laddergame/domain/vo/LadderDtoTest.java b/src/test/java/com/woowacourse/laddergame/domain/vo/LadderDtoTest.java new file mode 100644 index 0000000000..c84adf4307 --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/domain/vo/LadderDtoTest.java @@ -0,0 +1,87 @@ +package com.woowacourse.laddergame.domain.vo; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class LadderDtoTest { + @Test + void Player_정상이름입력() { + String input = "pobi,crong,honux"; + + LadderDto ladderDto = new LadderDto(); + ladderDto.setNames(input); + + assertThat(ladderDto.getNames()).isEqualTo(input); + } + + @ParameterizedTest + @ValueSource(strings = {"pobiiii,crong,honux", "po bi,crong", " ", ",pobi", "pobi,", "pobi, jay"}) + void Player_비정상이름입력(String input) { + LadderDto ladderDto = new LadderDto(); + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + ladderDto.setNames(input); + }).withMessage("Player 이름들이 잘못되었습니다"); + } + + @Test + void Player_null입력() { + String input = null; + + LadderDto ladderDto = new LadderDto(); + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + ladderDto.setNames(input); + }).withMessage("Null 은 입력할 수 없습니다"); + } + + @ParameterizedTest + @ValueSource(strings = {"01", "ab", "!!", "-1", " ", "1_000"}) + void 높이_비정상값(String input) { + LadderDto ladderDto = new LadderDto(); + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + ladderDto.setHeight(input); + }).withMessage("정상적인 사다리 높이가 아닙니다"); + } + + @Test + void 높이_null() { + LadderDto ladderDto = new LadderDto(); + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + ladderDto.setHeight(null); + }).withMessage("Null 은 입력할 수 없습니다"); + } + + @Test + void 사다리_결과_정상_입력() { + LadderDto ladderDto = new LadderDto(); + + ladderDto.setNames("pobi,crong,jay,aiden,jm"); + ladderDto.setResult("꽝,10,아이스크림,꽝,꽝"); + } + + @Test + void 사다리_결과_비정상_입력() { + LadderDto ladderDto = new LadderDto(); + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + ladderDto.setResult("꽝,아이스크림,아이스크림,꽝,꽝"); + }).withMessage("이름이 먼저 초기화되야 합니다"); + } + + @Test + void 사다리_결과_null_입력() { + LadderDto ladderDto = new LadderDto(); + + ladderDto.setNames("pobi,crong,jay,aiden,jm"); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + ladderDto.setResult(null); + }).withMessage("Null 은 입력할 수 없습니다"); + } +} \ No newline at end of file diff --git a/src/test/java/com/woowacourse/laddergame/domain/vo/ResultNameDtoTest.java b/src/test/java/com/woowacourse/laddergame/domain/vo/ResultNameDtoTest.java new file mode 100644 index 0000000000..5c38fe52bd --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/domain/vo/ResultNameDtoTest.java @@ -0,0 +1,33 @@ +package com.woowacourse.laddergame.domain.vo; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class ResultNameDtoTest { + @Test + void 이름_정상_입력() { + ResultNameDto resultNameDto = new ResultNameDto(); + assertThatCode(() -> resultNameDto.setName("pobi")).doesNotThrowAnyException(); + } + + @ParameterizedTest + @ValueSource(strings = {"pobi ", " pobi", "po bi", "1", "pobi,"}) + void 이름_비정상_입력(String input) { + ResultNameDto resultNameDto = new ResultNameDto(); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + resultNameDto.setName(input); + }).withMessage("Result Name 이 잘못되었습니다"); + } + + @Test + void 이름_null_입력() { + ResultNameDto resultNameDto = new ResultNameDto(); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + resultNameDto.setName(null); + }).withMessage("Null 은 입력할 수 없습니다"); + } +} \ No newline at end of file diff --git a/src/test/java/com/woowacourse/laddergame/util/NaturalNumberTest.java b/src/test/java/com/woowacourse/laddergame/util/NaturalNumberTest.java new file mode 100644 index 0000000000..18542d0350 --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/util/NaturalNumberTest.java @@ -0,0 +1,35 @@ +package com.woowacourse.laddergame.util; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class NaturalNumberTest { + @Test + void 자연수() { + int number = 3; + + NaturalNumber naturalNumber = new NaturalNumber(number); + + assertThat(naturalNumber.getNumber()).isEqualTo(3); + } + + @Test + void 인덱스반환() { + int number = 3; + + NaturalNumber naturalNumber = new NaturalNumber(number); + + assertThat(naturalNumber.convertIndex()).isEqualTo(2); + } + + @Test + void 음수() { + int number = -10; + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> { + NaturalNumber naturalNumber = new NaturalNumber(number); + }).withMessage("자연수가 아닙니다."); + } +} \ No newline at end of file diff --git a/src/test/java/com/woowacourse/laddergame/util/TestBooleanGenerator.java b/src/test/java/com/woowacourse/laddergame/util/TestBooleanGenerator.java new file mode 100644 index 0000000000..d3b7b2b07c --- /dev/null +++ b/src/test/java/com/woowacourse/laddergame/util/TestBooleanGenerator.java @@ -0,0 +1,16 @@ +package com.woowacourse.laddergame.util; + +public class TestBooleanGenerator implements BooleanGenerator { + private boolean[] testData; + private int index; + + public TestBooleanGenerator(boolean[] testData) { + this.testData = testData; + this.index = 0; + } + + @Override + public boolean generate() { + return testData[index++]; + } +} diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29bb2..0000000000