diff --git a/README.md b/README.md index 8fe711203..ccf48a099 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,29 @@ git checkout main // 기본 브랜치가 main인 경우 git checkout -b 브랜치이름 ex) git checkout -b apply-feedback ``` + +[] 자동차 이름,위치 정보를 가지는 객체 생성 - Car +[] 자동차 이름 , 에따라 주어지면 split 해서 Car 객체를 가지는 Cars 그룹 생성 - Cars +[] Validation체크 + []이름 5자 체크 + []null체크 + []isempty체크 + []정상적으로 들어왔는지 체크 + [](,)에 따라 객체 생성 안될시 오류) - Cars +[] 자동차 움직임 구현 0~1 - Car , move +[] 자동차 그룹으로 움직임 구현 0~1 - Cars , move +[] 횟수에 따른 움직임 구현 + [] 횟수가 음수 일시 오류 발생 + +[] 위치 정보에 따른 승자 뽑아내기 + +----- 출력 +[] 자동차 이름 입력하세요 +[] 도할 회수 몇회 +[] 실행 결과 +[] 횟수에 따른 이동 결과 +[] 최종 우승 자동차 + [] 1명, 0명 , 2명이상 +----- 입력 +[ ] 자동차 이름 입력 +[ ] 횟수 입력 diff --git a/build.gradle b/build.gradle index 8172fb73f..1cdbe77ed 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'eclipse' group = 'camp.nextstep' version = '1.0.0' -sourceCompatibility = '1.8' +sourceCompatibility = "11" repositories { mavenCentral() @@ -17,3 +17,4 @@ dependencies { test { useJUnitPlatform() } +targetCompatibility = JavaVersion.VERSION_11 diff --git a/src/main/java/StringAddCalculator.java b/src/main/java/StringAddCalculator.java new file mode 100644 index 000000000..114023014 --- /dev/null +++ b/src/main/java/StringAddCalculator.java @@ -0,0 +1,45 @@ +import java.util.Arrays; + +public class StringAddCalculator { + public static int splitAndSum(String o) { + if (isNullOrEmpty(o)) return 0; + if(isCustom(o)) return customSplit(o); + if(isOneNumber(o)) return Integer.parseInt(o); + NegativeCheck(SplitNumber(o, ",|:")); + return Sum(SplitNumber(o, ",|:")); + } + + private static String[] SplitNumber(String o, String s) { + return o.split(s); + } + + private static boolean isNullOrEmpty(String o) { + return o == null || o.isEmpty(); + } + + private static boolean isCustom(String o) { + return o.contains("\n"); + } + + private static boolean isOneNumber(String o) { + return o.length() == 1; + } + + private static void NegativeCheck(String[] splitNumber) { + if (isNegative(splitNumber)) throw new RuntimeException(); + } + + private static boolean isNegative(String[] splitNumber) { + return Arrays.stream(splitNumber).mapToInt(a -> Integer.parseInt(a)).anyMatch(t -> t < 0); + } + + private static int customSplit(String o) { + String[] custom = SplitNumber(o.substring(2), "\n"); + NegativeCheck(SplitNumber(custom[1], custom[0])); + return Sum(SplitNumber(custom[1], custom[0])); + } + + private static int Sum(String[] splitNumber) { + return Arrays.stream(splitNumber).mapToInt(a -> Integer.parseInt(a)).sum(); + } +} diff --git a/src/main/java/racing/Application.java b/src/main/java/racing/Application.java new file mode 100644 index 000000000..d4644bc75 --- /dev/null +++ b/src/main/java/racing/Application.java @@ -0,0 +1,7 @@ +package racing; + +public class Application { + public static void main(String[] args) { + RacingCar.run(); + } +} diff --git a/src/main/java/racing/Car.java b/src/main/java/racing/Car.java new file mode 100644 index 000000000..8e11c2215 --- /dev/null +++ b/src/main/java/racing/Car.java @@ -0,0 +1,31 @@ +package racing; + +import javax.xml.stream.Location; + +public class Car { + private final String name; + private LocationCar location; + + public Car(String name) { + Validation.CheckName(name); + this.name =name; + this.location = new LocationCar(0); + } + + public String getName() { + return name; + } + + public int getLocation() { + return location.distance(); + } + + public void move(int v) { + location = location.move(v); + } + + @Override + public String toString() { + return name + ": " + location +'\n'; + } +} diff --git a/src/main/java/racing/Cars.java b/src/main/java/racing/Cars.java new file mode 100644 index 000000000..1d454c79b --- /dev/null +++ b/src/main/java/racing/Cars.java @@ -0,0 +1,33 @@ +package racing; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class Cars { + private final List carList; + + public Cars(List carList) { + this.carList = carList; + } + + public List getCar() { + return carList; + } + + public void move(List carList) { + carList.stream().forEach(car -> car.move((int) Math.round(Math.random()))); + } + + public int Maxdistance() { + return carList.stream().mapToInt(car -> car.getLocation()).max().getAsInt(); + } + + + public List WinName(int distance) { + return carList.stream(). + filter(car -> car.getLocation() == distance). + map(name -> name.getName()). + collect(Collectors.toList()); + } +} diff --git a/src/main/java/racing/Create.java b/src/main/java/racing/Create.java new file mode 100644 index 000000000..2cd4a946e --- /dev/null +++ b/src/main/java/racing/Create.java @@ -0,0 +1,11 @@ +package racing; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Create { + public static List NewCar(String[] car) { + return Arrays.stream(car).map(a -> new Car(a)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/racing/LocationCar.java b/src/main/java/racing/LocationCar.java new file mode 100644 index 000000000..c07a0de43 --- /dev/null +++ b/src/main/java/racing/LocationCar.java @@ -0,0 +1,28 @@ +package racing; + +public class LocationCar { + + + private final int location; + + public LocationCar(int location) { + this.location = location; + } + + public int distance() { + return this.location; + } + + public LocationCar move(int v) { + return new LocationCar(this.location + v); + } + + @Override + public String toString() { + String s = ""; + for (int i = 0; i carList = Create.NewCar(InputView.start()); + Cars cars = new Cars(carList); + OutPutView.result(cars,InputView.count()); + } catch (IOException e) { + e.printStackTrace(); + run(); + } catch (IllegalArgumentException illegalArgumentException) { + System.out.println(illegalArgumentException.getMessage()); + run(); + } + } + + private static class InputView { + + static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + public static String[] start() throws IOException { + System.out.println("경주할 자동차 이름을 입력하세요 "); + return (br.readLine()).split(","); + } + + public static int count() throws IOException { + System.out.println("시도할 횟수는 몇회 인가요?"); + return Validation.checkNegative(Integer.parseInt(br.readLine())); + } + } + + + private static class OutPutView { + static StringBuilder st = new StringBuilder(); + public static void result(Cars cars, int count) { + System.out.println("실행 결과"); + for (int i = 0; i < count; i++) { + cars.move(cars.getCar()); + cars.getCar().stream().forEach(car -> st.append(car.toString())); + st.append("\n"); + } + cars.WinName(cars.Maxdistance()).stream().forEach(car->st.append(car).append(",")); + st.replace(st.length() - 1, st.length(), "가 최종 우승했습니다."); + System.out.println(st); + } + } +} diff --git a/src/main/java/racing/Validation.java b/src/main/java/racing/Validation.java new file mode 100644 index 000000000..9c05ff61f --- /dev/null +++ b/src/main/java/racing/Validation.java @@ -0,0 +1,22 @@ +package racing; + +public class Validation { + + public static final int NAME_SIZE = 6; + + public static void CheckName(String name) { + ValidationName(name == null, "잘못된 이름 입니다 다시 입력 해 주세요"); + ValidationName(name.isEmpty() || name.isBlank(), "잘못된 이름 입니다 다시 입력 해 주세요"); + ValidationName(name.length() >= NAME_SIZE, "이름이 6글자 이상입니다. : "+name); + } + + + private static void ValidationName(boolean b, String s) { + if (b) throw new IllegalArgumentException(s); + } + + public static int checkNegative(int parseInt) { + if(parseInt < 0) throw new IllegalArgumentException("음수는 입력할 수 없습니다."); + return parseInt; + } +} diff --git a/src/test/java/StringAddCalculatorTest.java b/src/test/java/StringAddCalculatorTest.java new file mode 100644 index 000000000..a0fb53116 --- /dev/null +++ b/src/test/java/StringAddCalculatorTest.java @@ -0,0 +1,45 @@ +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class StringAddCalculatorTest { + @Test + public void splitAndSum_null_또는_빈문자() { + int result = StringAddCalculator.splitAndSum(null); + assertThat(result).isEqualTo(0); + + result = StringAddCalculator.splitAndSum(""); + assertThat(result).isEqualTo(0); + } + + @Test + public void splitAndSum_숫자하나() throws Exception { + int result = StringAddCalculator.splitAndSum("1"); + assertThat(result).isEqualTo(1); + } + + @Test + public void splitAndSum_쉼표구분자() throws Exception { + int result = StringAddCalculator.splitAndSum("1,2"); + assertThat(result).isEqualTo(3); + } + + @Test + public void splitAndSum_쉼표_또는_콜론_구분자() throws Exception { + int result = StringAddCalculator.splitAndSum("1,2:3"); + assertThat(result).isEqualTo(6); + } + + @Test + public void splitAndSum_custom_구분자() throws Exception { + int result = StringAddCalculator.splitAndSum("//;\n1;2;3"); + assertThat(result).isEqualTo(6); + } + + @Test + public void splitAndSum_negative() throws Exception { + assertThatThrownBy(() -> StringAddCalculator.splitAndSum("-1,2,3")) + .isInstanceOf(RuntimeException.class); + } +} \ No newline at end of file diff --git a/src/test/java/racing/CarTest.java b/src/test/java/racing/CarTest.java new file mode 100644 index 000000000..4a8d28d40 --- /dev/null +++ b/src/test/java/racing/CarTest.java @@ -0,0 +1,34 @@ +package racing; + +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Random; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CarTest { + @Test + void 자동차_객체_생성_확인() { + assertThat((new Car("abc")).getName()).isEqualTo("abc"); + } + + @Test + void 자동차_움직임_구현() { + Car car = new Car("test1"); + car.move((int) Math.round(Math.random())); + assertThat(car.getLocation()).isLessThanOrEqualTo(1); + } + + @Test + void 자동차_5번_움직임_구현() { + Car car = new Car("test1"); + for (int i = 0; i <= 5; i++) { + car.move((int) Math.round(Math.random())); + } + System.out.println(car.getLocation()); + assertThat(car.getLocation()).isGreaterThanOrEqualTo(1); + assertThat(car.getLocation()).isLessThanOrEqualTo(5); + } + +} diff --git a/src/test/java/racing/CarsTest.java b/src/test/java/racing/CarsTest.java new file mode 100644 index 000000000..906ab44a2 --- /dev/null +++ b/src/test/java/racing/CarsTest.java @@ -0,0 +1,51 @@ +package racing; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CarsTest { + + List carList; + Cars cars; + + @BeforeEach + public void setUp() { + String carsName = "a,b,c"; + String[] car = carsName.split(","); + carList = Create.NewCar(car); + cars = new Cars(carList); + } + @Test + void 문자열_자동차_객체_생성() { + assertThat(cars.getCar().size()).isEqualTo(3); + } + + @Test + void 자동차_그룹_움직임_구현() { + cars.move(carList); + cars.getCar().stream().forEach(a -> System.out.println(a.toString())); + } + + @Test + void 자동차_그룹_5번_움직임_구현() { + for (int i = 0; i <= 5; i++) { + cars.move(carList); + } + cars.getCar().stream().forEach(a -> System.out.println(a.toString())); + } + + @Test + void 자동차_승자_확인() { + for (int i = 0; i <= 5; i++) { + cars.move(carList); + } + cars.getCar().stream().forEach(a -> System.out.println(a.toString())); + cars.WinName(cars.Maxdistance()).forEach(System.out::println); + assertThat(cars.WinName(cars.Maxdistance())).hasSizeGreaterThanOrEqualTo(1); + } +} diff --git a/src/test/java/racing/ValidationCheck.java b/src/test/java/racing/ValidationCheck.java new file mode 100644 index 000000000..bc424629e --- /dev/null +++ b/src/test/java/racing/ValidationCheck.java @@ -0,0 +1,21 @@ +package racing; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +public class ValidationCheck { + + @Test + void 자동차_이름_5자() { + assertThatCode(() -> Validation.CheckName("abcdef")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("이름이 6글자 이상입니다"); + assertThatCode(() -> Validation.CheckName("abcd")).doesNotThrowAnyException(); + } + + @Test + void 자동차_이름_null_empty_공백_확인() { + assertThatCode(() -> Validation.CheckName(null)).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("잘못된 이름 입니다 다시 입력 해 주세요"); + assertThatCode(() -> Validation.CheckName(" ")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("잘못된 이름 입니다 다시 입력 해 주세요"); + assertThatCode(() -> Validation.CheckName("")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("잘못된 이름 입니다 다시 입력 해 주세요"); + } +}