diff --git a/README.md b/README.md index 68a2f1a8..e972e04a 100644 --- a/README.md +++ b/README.md @@ -8,37 +8,68 @@ 모든 라운드가 끝난 뒤 가장 많이 이동한 자동차들이 우승하게 됩니다. ## 🎮게임 규칙 -* 🚗 게임에 참가할 자동차 수와 라운드 수를 정하고 게임을 시작합니다. +* 🚗 게임에 참가할 자동차 이름을 입력합니다(자동차 이름의 길이는 5이하여야 합니다) -* 🎲 게임이 시작되면 모든 차는 매 라운드마다 랜덤으로 발생한 0부터 10까지의 숫자 중 3 이하가 나올 경우 정지해있고, 4이상의 숫자가 나올 경우 1만큼 전진합니다. +* 🏁 라운드 수를 정하고 게임을 시작합니다. + + +* 🎲 게임이 시작되면 모든 차는 매 라운드마다 랜덤으로 발생한 0부터 9까지의 숫자 중 3 이하가 나올 경우 정지해있고, 4이상의 숫자가 나올 경우 1만큼 전진합니다. * 🏆 모든 라운드가 끝나고 우승한 자동차를 확인하면 됩니다. ## 🔧프로젝트 설계 -프로젝트는 크게 자동차, 게임을 구현한 두개의 클래스로 작성되었습니다. -### 🚗자동차 클래스 -* 자동차 클래스는 필드로 이름과 이동 거리를 가지고 있습니다. +프로젝트는 MVC 모델을 적용하여 controller, domain((model), view +패키지로 이루어져 있습니다. 메인 클래스를 실행하면 controller 객체의 +게임 실행 메서드가 실행되어 게임이 진행됩니다. -* 생성자는 이름을 매개변수로 받아 초기화하고 이동거리를 0으로 초기화합니다. +### ⚙️Domain +* domain 패키지는 자동차, 자동차의 리스트, 레이싱, 랜덤 변수 생성 클래스로 이루어져 +있습니다. -* 자동차의 이동 메서드는 매개변수로 받은 값이 4 이상일 경우 이동거리를 1 증가시킵니다. +* 자동차 클래스는 이름과 이동한 거리를 저장하고 있으며 생성된 랜덤 변수에 +따라 한 칸 전진하는 메서드, 자신의 현재 위치가 주어진 값과 같은지 반환하는 +메서드로 구성되어 있습니다. -### 🎮Game 클래스 -* 참가하는 차들과 우승한 차를 저장하기 위해 두 개의 리스트를 가지고 있습니다. - -* 게임 실행 메서드는 차 갯수와 라운드 수를 매개변수로 받아 게임 초기화, 게임 진행, 우승자 선정을 수행합니다. +* 자동차 리스트 클래스는 자동차들의 배열을 저장하고 있습니다. 또한 리스트에 +저장된 자동차들을 이동시키는 메서드, 리스트에 저장된 자동차 중 가장 멀리 +이동한 자동차의 이동 거리를 반환하는 메서드, 어떤 한 위치에 있는 모든 자동차 +들의 리스트를 반환하는 메서드로 이루어져 있습니다. + + +* 레이싱 클래스는 참가한 자동차들의 리스트를 저장하고 있으며 참가한 자동차들을 +전부 이동시키는 메서드와 참가한 자동차들 중 우승자들의 리스트를 반환하는 +메서드를 가지고 있습니다. + + +* 랜덤 변수 생성 클래스는 0부터 9사이의 숫자를 생성해서 반환하는 메서드를 +가지고 있습니다. + +### 💻View +- view 패키지는 입력을 담당하는 클래스와 출력을 담당하는 클래스를 담당하는 +클래스로 이루어져 있습니다. + + +- 입력을 담당하는 클래스는 자동차들의 이름을 양식에 맞게 입력받아 이를 문자열의 +배열로 변환하여 반환하는 메서드와, 라운드 수를 입력받는 메서드로 이루어져 있습니다. + + +- 출력을 담당하는 클래스는 사용자 입력 요청을 출력하는 메서드와 게임 현황을 +출력하는 메서드, 우승자 리스트를 출력하는 메서드를 가지고 있습니다. -* 게임 초기화 메서드는 게임 실행 중 가장 먼저 호출되어 차 갯수를 매개변수로 받아 갯수만큼 자동차 객체를 생성하여 리스트에 저장합니다. 현 단계에서는 차 이름이 순차적으로 자동생성됩니다.( ex)Car_1, Car_2, ... ) +- 출력의 양식을 지키기 위한 포맷팅 메서드도 출력을 담당하는 클래스에 +포함되어 있습니다 -* 라운드 진행 메서드는 라운드 수만큼 실행되며 게임에 참여한 모든 차의 이동 메서드를 호출합니다. -이때 각 자동차마다 랜덤 변수 생성기를 통해 0부터 10까지의 숫자 중 하나를 매개변수로 줍니다 +### 🎮Controller -* 우승자 선정 메서드는 모든 라운드가 끝난 후 가장 먼 거리를 이동한 차들을 우승자 리스트에 저장합니다. \ No newline at end of file +* Controller 클래스는 domain과 view의 클래스들을 이용하여 게임을 진행합니다 +게임 실행 메서드가 실행되면 사용자에게 자동차 이름과 라운드 수를 입력받아 +레이싱을 수행합니다. 레이싱이 끝나면 우승자 리스트를 출력하고 메서드가 +종료됩니다. diff --git a/src/main/java/Car.java b/src/main/java/Car.java deleted file mode 100644 index 163039c5..00000000 --- a/src/main/java/Car.java +++ /dev/null @@ -1,30 +0,0 @@ -public class Car { - - private static final int CRITICAL_NUMBER_TO_MOVE = 4; - - private final String name; - private int distance; - - public Car(String name) { - this.name = name; - this.distance = 0; - } - - public void move(int randomNumber) { - if (randomNumber >= CRITICAL_NUMBER_TO_MOVE) { - distance++; - } - } - - public String getName() { - return name; - } - - public int getDistance() { - return distance; - } - - public boolean isSamePosition(int distance) { - return distance == this.distance; - } -} diff --git a/src/main/java/Game.java b/src/main/java/Game.java deleted file mode 100644 index 2d31413e..00000000 --- a/src/main/java/Game.java +++ /dev/null @@ -1,55 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public class Game { - - List carList = new ArrayList<>(); - List winnerList = new ArrayList<>(); - - public void playGame(int carNum, int roundNum) { - initGame(carNum); - for (int i = 0; i < roundNum; i++) { - playRound(); - } - makeWinnerList(); - } - - public void initGame(int carNum) { - for (int i = 0; i < carNum; i++) { - carList.add(new Car("Car_" + i)); - } - } - - public void playRound() { - for (Car car : carList) { - car.move(getRandom()); - } - } - - public int getRandom() { - return new Random().nextInt(10); - } - - public void makeWinnerList() { - int maxDistance = getMaxDistance(); - for (Car car : carList) { - addWinner(car, maxDistance); - } - } - - private void addWinner(Car car, int maxDistance) { - if (car.isSamePosition(maxDistance)) { - winnerList.add(car); - } - } - - private int getMaxDistance() { - - int maxDistance = 0; - for (Car car : carList) { - maxDistance = Math.max(maxDistance, car.getDistance()); - } - return maxDistance; - } -} diff --git a/src/main/java/RacingApplication.java b/src/main/java/RacingApplication.java new file mode 100644 index 00000000..e3a458e4 --- /dev/null +++ b/src/main/java/RacingApplication.java @@ -0,0 +1,9 @@ +import controller.RacingController; + +public class RacingApplication { + + public static void main(String[] args) { + new RacingController().run(); + } + +} diff --git a/src/main/java/controller/RacingController.java b/src/main/java/controller/RacingController.java new file mode 100644 index 00000000..43acc470 --- /dev/null +++ b/src/main/java/controller/RacingController.java @@ -0,0 +1,50 @@ +package controller; + +import domain.Car; +import domain.Cars; +import domain.Racing; +import domain.NumberGenerator; +import domain.RandomNumberGenerator; +import java.util.ArrayList; +import java.util.List; +import view.InputView; +import view.OutputView; + +public class RacingController { + + private static final NumberGenerator randomGenerator = new RandomNumberGenerator(); + + public void run() { + + OutputView.printInputCarNames(); + List carNames = InputView.getCarNames(); + Cars cars = Cars.from(createCars(carNames)); + + OutputView.printInputRoundNumber(); + int roundNumber = InputView.getRoundNumber(); + + Racing racing = new Racing(cars); + + OutputView.printResult(); + playRace(racing, cars, roundNumber); + + Cars winnerList = racing.findWinners(); + OutputView.printWinners(winnerList.getCars()); + } + + public List createCars(List names) { + List cars = new ArrayList<>(); + for (String name : names) { + cars.add(new Car(name, randomGenerator)); + } + return cars; + } + + public void playRace(Racing racing, Cars cars, int roundNumber) { + for (int i = 0; i < roundNumber; i++) { + racing.playRound(); + OutputView.printProcess(cars.getCars()); + } + } + +} diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java new file mode 100644 index 00000000..b97e2ece --- /dev/null +++ b/src/main/java/domain/Car.java @@ -0,0 +1,35 @@ +package domain; + +public class Car { + + private static final int CRITICAL_NUMBER_TO_MOVE = 4; + + private final Name name; + private int distance; + private final NumberGenerator numberGenerator; + + public Car(String name, NumberGenerator numberGenerator) { + this.name = Name.from(name); + this.distance = 0; + this.numberGenerator = numberGenerator; + } + + public void move() { + if (numberGenerator.generateNumber() >= CRITICAL_NUMBER_TO_MOVE) { + distance++; + } + } + + public boolean hasSamePosition(int position) { + return distance == position; + } + + public String getName() { + return name.getName(); + } + + public int getDistance() { + return distance; + } + +} diff --git a/src/main/java/domain/Cars.java b/src/main/java/domain/Cars.java new file mode 100644 index 00000000..bf03600d --- /dev/null +++ b/src/main/java/domain/Cars.java @@ -0,0 +1,70 @@ +package domain; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class Cars { + + private static final int MAX_CAR_NUMBER = 10; + + private final List cars; + + private Cars(List cars) { + this.cars = cars; + } + + public static Cars from(List cars) { + checkCarNumber(cars); + checkDuplicates(cars); + return new Cars(new ArrayList<>(cars)); + } + + public static void checkCarNumber(List cars) { + if (cars.size() > MAX_CAR_NUMBER) { + throw new IllegalArgumentException("[Error] 차의 개수는 10대를 초과할 수 없습니다."); + } + } + + public static void checkDuplicates(List cars) { + if (hasDuplicates(cars)) { + throw new IllegalArgumentException("[Error] 차의 이름은 중복될 수 없습니다."); + } + } + + private static boolean hasDuplicates(List cars) { + Set nameSet = new HashSet<>(); + return cars.stream() + .map(Car::getName) + .anyMatch(name -> !nameSet.add(name)); + } + + public void move() { + for (Car car : cars) { + car.move(); + } + } + + public int getMaxDistance() { + int maxDistance = 0; + for (Car car : cars) { + maxDistance = Math.max(maxDistance, car.getDistance()); + } + return maxDistance; + } + + public Cars findCarsHasSamePosition(int position) { + List carsHasSamePosition = cars.stream() + .filter(car -> car.hasSamePosition(position)) + .collect(Collectors.toList()); + + return new Cars(carsHasSamePosition); + } + + public List getCars() { + return new ArrayList<>(cars); + } + +} diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/Name.java new file mode 100644 index 00000000..b7e3456a --- /dev/null +++ b/src/main/java/domain/Name.java @@ -0,0 +1,35 @@ +package domain; + +public class Name { + + private static final int MAX_LENGTH = 5; + + private final String name; + + private Name(final String name) { + this.name = name; + } + + public static Name from(final String name) { + checkBlank(name); + checkLength(name); + return new Name(name); + } + + public static void checkLength(String name) { + if (name.length() > MAX_LENGTH) { + throw new IllegalArgumentException("[Error] 이름은 " + MAX_LENGTH + "자를 초과할 수 없습니다."); + } + } + + public static void checkBlank(String name) { + if (name.trim().isEmpty()) { + throw new IllegalArgumentException("[Error] 이름은 공백으로 이루어질 수 없습니다."); + } + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/domain/NumberGenerator.java b/src/main/java/domain/NumberGenerator.java new file mode 100644 index 00000000..2021e72d --- /dev/null +++ b/src/main/java/domain/NumberGenerator.java @@ -0,0 +1,5 @@ +package domain; + +public interface NumberGenerator { + int generateNumber(); +} diff --git a/src/main/java/domain/Racing.java b/src/main/java/domain/Racing.java new file mode 100644 index 00000000..5348c398 --- /dev/null +++ b/src/main/java/domain/Racing.java @@ -0,0 +1,19 @@ +package domain; + +public class Racing { + + private final Cars cars; + + public Racing(Cars cars) { + this.cars = cars; + } + + public void playRound() { + cars.move(); + } + + public Cars findWinners() { + return cars.findCarsHasSamePosition(cars.getMaxDistance()); + } + +} diff --git a/src/main/java/domain/RandomNumberGenerator.java b/src/main/java/domain/RandomNumberGenerator.java new file mode 100644 index 00000000..02cca919 --- /dev/null +++ b/src/main/java/domain/RandomNumberGenerator.java @@ -0,0 +1,15 @@ +package domain; + +import java.util.Random; + +public class RandomNumberGenerator implements NumberGenerator { + + private static final int BOUND_RANDOM_NUMBER = 10; + private static final Random random = new Random(); + + @Override + public int generateNumber() { + return random.nextInt(BOUND_RANDOM_NUMBER); + } + +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..d22b545b --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,67 @@ +package view; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Scanner; +import java.util.Set; + +public class InputView { + + private static final int MAX_LENGTH = 5; + private static final int MAX_CAR_NUMBER = 10; + private static final Scanner scanner = new Scanner(System.in); + + public static List getCarNames() { + List names = Arrays.asList(scanner.nextLine().split(",")); + checkLength(names); + checkBlank(names); + checkDuplicates(names); + checkCarNumber(names); + return names; + } + + public static int getRoundNumber() { + return Integer.parseInt(scanner.nextLine()); + } + + public static void checkLength(List names) { + if (hasTooLongName(names)) { + throw new IllegalArgumentException("[Error] 이름은 " + MAX_LENGTH + "자를 초과할 수 없습니다."); + } + } + + public static void checkBlank(List names) { + if (hasBlank(names)) { + throw new IllegalArgumentException("[Error] 이름은 공백으로 이루어질 수 없습니다."); + } + } + + public static void checkCarNumber(List names) { + if (names.size() > MAX_CAR_NUMBER) { + throw new IllegalArgumentException("[Error] 차의 개수는 10대를 초과할 수 없습니다."); + } + } + + public static void checkDuplicates(List names) { + if (hasDuplicates(names)) { + throw new IllegalArgumentException("[Error] 차의 이름은 중복될 수 없습니다."); + } + } + + private static boolean hasTooLongName(List names) { + return names.stream() + .anyMatch(name -> name.length() > MAX_LENGTH); + } + + private static boolean hasBlank(List names) { + return names.stream() + .anyMatch(name -> name.trim().isEmpty()); + } + + private static boolean hasDuplicates(List names) { + Set nameSet = new HashSet<>(); + return names.stream() + .anyMatch(name -> !nameSet.add(name)); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..966fa6ed --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,43 @@ +package view; + +import domain.Car; +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + + public static void printInputCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + } + + public static void printInputRoundNumber() { + System.out.println("시도할 회수는 몇회인가요?"); + } + + public static void printResult() { + System.out.println("실행 결과"); + } + + public static void printProcess(List cars) { + for (Car car : cars) { + System.out.println(formatCarInfo(car)); + } + System.out.println(); + } + + public static String formatCarInfo(Car car) { + return car.getName() + " : " + "-".repeat(car.getDistance()); + } + + public static void printWinners(List winners) { + String winnerNames = winners.stream() + .map(Car::getName) + .collect(Collectors.joining(", ")); + System.out.println(winnerNames + "가 최종 우승했습니다."); + } + + public static String formatWinnerNames(List cars) { + return cars.toString().replace("[", "").replace("]", ""); + } + +} diff --git a/src/test/java/CarTest.java b/src/test/java/CarTest.java index 3ec1c162..f4bb4c34 100644 --- a/src/test/java/CarTest.java +++ b/src/test/java/CarTest.java @@ -1,29 +1,42 @@ +import domain.Car; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; public class CarTest { - private static final int MOVE_FORWARD = 4; - private static final int NOT_MOVE = 3; - @Test void testCarName() { - Car car = new Car("KIA"); + Car car = new Car("KIA", new MovableNumberGenerator()); assertThat(car.getName()).isEqualTo("KIA"); } @Test void testCarMove() { - Car car = new Car("TestCar"); - car.move(MOVE_FORWARD); + Car car = new Car("KIA", new MovableNumberGenerator()); + car.move(); assertThat(car.getDistance()).isEqualTo(1); } @Test void testCarNotMove() { - Car car = new Car("TestCar"); - car.move(NOT_MOVE - 1); + Car car = new Car("KIA", new NotMovableNumberGenerator()); + car.move(); assertThat(car.getDistance()).isEqualTo(0); } + + @Test + void testCarHasSamePosition() { + Car car = new Car("KIA", new MovableNumberGenerator()); + car.move(); + assertThat(car.hasSamePosition(1)).isEqualTo(true); + } + + @Test + void testCarIsNotInPosition() { + Car car = new Car("KIA", new MovableNumberGenerator()); + car.move(); + assertThat(car.hasSamePosition(0)).isEqualTo(false); + } + } diff --git a/src/test/java/CarsTest.java b/src/test/java/CarsTest.java new file mode 100644 index 00000000..ce5ba4cf --- /dev/null +++ b/src/test/java/CarsTest.java @@ -0,0 +1,93 @@ +import static org.assertj.core.api.Assertions.assertThat; + +import domain.Car; +import domain.Cars; +import java.util.ArrayList; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class CarsTest { + + private List cars_Fixture; + private Car movableA_Fixture; + private Car movableB_Fixture; + private Car notMovableC_Fixture; + + @BeforeEach + public void setUp() { + movableA_Fixture = new Car("A", new MovableNumberGenerator()); + movableB_Fixture = new Car("B", new MovableNumberGenerator()); + notMovableC_Fixture = new Car("C", new NotMovableNumberGenerator()); + + cars_Fixture = new ArrayList<>(); + cars_Fixture.add(movableA_Fixture); + cars_Fixture.add(movableB_Fixture); + cars_Fixture.add(notMovableC_Fixture); + } + + @Test + void testCarsFrom() { + Cars cars = Cars.from(cars_Fixture); + + assertThat(cars.getCars().size()).isEqualTo(3); + assertThat(cars.getCars().get(0).getName()).isEqualTo("A"); + assertThat(cars.getCars().get(1).getName()).isEqualTo("B"); + assertThat(cars.getCars().get(2).getName()).isEqualTo("C"); + } + + @Test + public void testCarsMove() { + Cars cars = Cars.from(cars_Fixture); + cars.move(); + + assertThat(cars.getCars().get(0).getDistance()).isEqualTo(1); + assertThat(cars.getCars().get(1).getDistance()).isEqualTo(1); + assertThat(cars.getCars().get(2).getDistance()).isEqualTo(0); + } + + @Test + public void testCarsGetMaxDistance() { + Cars cars = Cars.from(cars_Fixture); + + cars.move(); + cars.move(); + + assertThat(cars.getMaxDistance()).isEqualTo(2); + } + + @Test + public void testFindCarsInSamePosition() { + Cars cars = Cars.from(cars_Fixture); + + cars.move(); + cars.move(); + + Cars carsInSamePosition = cars.findCarsHasSamePosition(2); + assertThat(carsInSamePosition.getCars()).containsOnly(movableA_Fixture, movableB_Fixture); + } + + @Test + public void testCheckCarNumber() { + List cars = new ArrayList<>(); + for (int i = 0; i < 11; i++) { + cars.add(new Car("car" + i, new MovableNumberGenerator())); + } + + Assertions.assertThatThrownBy(() -> Cars.checkCarNumber(cars)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void testCheckDuplicates() { + List cars = new ArrayList<>(); + cars.add(new Car("A", new MovableNumberGenerator())); + cars.add(new Car("A", new MovableNumberGenerator())); + cars.add(new Car("B", new MovableNumberGenerator())); + + Assertions.assertThatThrownBy(() -> Cars.checkDuplicates(cars)) + .isInstanceOf(IllegalArgumentException.class); + } + +} diff --git a/src/test/java/ControllerTest.java b/src/test/java/ControllerTest.java new file mode 100644 index 00000000..1f5c9d89 --- /dev/null +++ b/src/test/java/ControllerTest.java @@ -0,0 +1,35 @@ +import static org.assertj.core.api.Assertions.assertThat; + +import controller.RacingController; +import domain.Car; +import domain.Cars; +import domain.Racing; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +public class ControllerTest { + + private static final int MOVE_POSITION = 3; + private static final int NOT_MOVE_POSITION = 0; + + @Test + public void testPlayRace() { + RacingController racingController = new RacingController(); + List carList = new ArrayList<>(); + + carList.add(new Car("A", new MovableNumberGenerator())); + carList.add(new Car("B", new NotMovableNumberGenerator())); + carList.add(new Car("C", new MovableNumberGenerator())); + + Cars cars = Cars.from(carList); + Racing racing = new Racing(cars); + + racingController.playRace(racing, cars, MOVE_POSITION); + + assertThat(cars.getCars().get(0).getDistance()).isEqualTo(MOVE_POSITION); + assertThat(cars.getCars().get(1).getDistance()).isEqualTo(NOT_MOVE_POSITION); + assertThat(cars.getCars().get(2).getDistance()).isEqualTo(MOVE_POSITION); + } + +} diff --git a/src/test/java/GameTest.java b/src/test/java/GameTest.java deleted file mode 100644 index 46f0cb52..00000000 --- a/src/test/java/GameTest.java +++ /dev/null @@ -1,24 +0,0 @@ -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.*; - -public class GameTest { - - private static final int MOVE_FORWARD = 4; - private static final int NOT_MOVE = 3; - - @Test - public void testGetWinnerList() { - Game game = new Game(); - game.carList.add(new Car("A")); - game.carList.add(new Car("B")); - game.carList.add(new Car("C")); - - game.carList.get(0).move(MOVE_FORWARD); - game.carList.get(1).move(NOT_MOVE); - game.carList.get(2).move(MOVE_FORWARD); - - game.makeWinnerList(); - assertThat(game.winnerList).containsOnly(game.carList.get(0), game.carList.get(2)); - } -} diff --git a/src/test/java/MovableNumberGenerator.java b/src/test/java/MovableNumberGenerator.java new file mode 100644 index 00000000..d1bf1088 --- /dev/null +++ b/src/test/java/MovableNumberGenerator.java @@ -0,0 +1,12 @@ +import domain.NumberGenerator; + +public class MovableNumberGenerator implements NumberGenerator { + + public static final int MOVABLE_NUMBER = 4; + + @Override + public int generateNumber() { + return MOVABLE_NUMBER; + } + +} diff --git a/src/test/java/NameTest.java b/src/test/java/NameTest.java new file mode 100644 index 00000000..8b81e929 --- /dev/null +++ b/src/test/java/NameTest.java @@ -0,0 +1,21 @@ +import domain.Name; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class NameTest { + + @Test + public void testCheckLength() { + String name = "HYUNDAI"; + Assertions.assertThatThrownBy(() -> Name.checkLength(name)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void testCheckBlank() { + String name = " "; + Assertions.assertThatThrownBy(() -> Name.checkBlank(name)) + .isInstanceOf(IllegalArgumentException.class); + } + +} diff --git a/src/test/java/NotMovableNumberGenerator.java b/src/test/java/NotMovableNumberGenerator.java new file mode 100644 index 00000000..908f11f7 --- /dev/null +++ b/src/test/java/NotMovableNumberGenerator.java @@ -0,0 +1,12 @@ +import domain.NumberGenerator; + +public class NotMovableNumberGenerator implements NumberGenerator { + + public static final int NOT_MOVABLE_NUMBER = 3; + + @Override + public int generateNumber() { + return NOT_MOVABLE_NUMBER; + } + +} diff --git a/src/test/java/RacingTest.java b/src/test/java/RacingTest.java new file mode 100644 index 00000000..25f16ad4 --- /dev/null +++ b/src/test/java/RacingTest.java @@ -0,0 +1,44 @@ +import static org.assertj.core.api.Assertions.assertThat; + +import domain.Car; +import domain.Cars; +import domain.Racing; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +public class RacingTest { + + @Test + public void testPlayRound() { + List carList = new ArrayList<>(); + + carList.add(new Car("A", new NotMovableNumberGenerator())); + carList.add(new Car("B", new MovableNumberGenerator())); + carList.add(new Car("C", new MovableNumberGenerator())); + + Racing racing = new Racing(Cars.from(carList)); + racing.playRound(); + + assertThat(carList.get(0).getDistance()).isEqualTo(0); + assertThat(carList.get(1).getDistance()).isEqualTo(1); + assertThat(carList.get(2).getDistance()).isEqualTo(1); + } + + @Test + public void testFindWinner() { + List carList = new ArrayList<>(); + + carList.add(new Car("A", new NotMovableNumberGenerator())); + carList.add(new Car("B", new MovableNumberGenerator())); + carList.add(new Car("C", new MovableNumberGenerator())); + + Racing racing = new Racing(Cars.from(carList)); + racing.playRound(); + + Cars winnerList = racing.findWinners(); + + assertThat(winnerList.getCars()).containsOnly(carList.get(1), carList.get(2)); + } + +} diff --git a/src/test/java/ViewTest.java b/src/test/java/ViewTest.java new file mode 100644 index 00000000..1d98f109 --- /dev/null +++ b/src/test/java/ViewTest.java @@ -0,0 +1,58 @@ +import static org.assertj.core.api.Assertions.assertThat; + +import domain.Car; +import java.util.Arrays; +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import view.InputView; +import view.OutputView; + +public class ViewTest { + + @Test + public void testFormatCarInfo() { + Car car = new Car("A", new MovableNumberGenerator()); + car.move(); + car.move(); + String formattedInfo = OutputView.formatCarInfo(car); + assertThat(formattedInfo).isEqualTo("A : --"); + } + + @Test + void testFormatWinnerNames() { + List winners = Arrays.asList("A", "B", "C"); + String formattedWinners = OutputView.formatWinnerNames(winners); + + assertThat(formattedWinners).isEqualTo("A, B, C"); + } + + @Test + public void testCheckLength() { + List names = Arrays.asList("HYUNDAI", "KIA", "FORD"); + Assertions.assertThatThrownBy(() -> InputView.checkLength(names)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void testCheckBlank() { + List names = Arrays.asList(" ", "KIA", "FORD"); + Assertions.assertThatThrownBy(() -> InputView.checkBlank(names)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void testCheckCarNumber() { + List names = Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"); + Assertions.assertThatThrownBy(() -> InputView.checkCarNumber(names)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void testCheckDuplicates() { + List names = Arrays.asList("KIA", "KIA", "FORD"); + Assertions.assertThatThrownBy(() -> InputView.checkDuplicates(names)) + .isInstanceOf(IllegalArgumentException.class); + } + +}