From 238c672073de139102a03c014c75738e93956a32 Mon Sep 17 00:00:00 2001 From: Jinho622 <68678755+Jinho622@users.noreply.github.com> Date: Mon, 28 Oct 2024 23:18:24 +0900 Subject: [PATCH 1/6] Update README.md --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index d0286c859f..afdd47c3a6 100644 --- a/README.md +++ b/README.md @@ -1 +1,23 @@ # java-racingcar-precourse + +## 구현할 기능 목록 + +1. RacingManager라는 클래스를 만들어 구체적인 함수들 포함. + 1. RacingManager의 생성자에서 자동차 이름들과 횟수 입력받기 + 2. 자동차이름 ‘,’기준으로 나눠 자동차이름, 전진한 횟수(position)를 멤버 변수로 가진 Car클래스의 객체 리스트에 저장 + 3. 객체 리스트를 하나씩 확인하며 랜덤숫자가 4이상이면 전진한 횟수를 +1시킨다. + 4. 한번의 횟수(스텝)마다 전진한 횟수대로 ‘-’를 생성하여 출력 + 5. 입력한 횟수가 끝나면 전진한 횟수를 비교해 우승자 출력 +2. 예외처리 해주기 + 1. `자동차이름입력값_빈값일때_예외_테스트` + 2. `반복횟수_빈값일때_예외_테스트` + 3. `반복횟수_0일때_예외_테스트` + 4. `반복횟수_음수일때_예외_테스트` + 5. `유효하지않은_구분자_예외_테스트` : ‘,’이외의 구분자가 입력으로 들어왔을 때 + 6. `자동차이름에_숫자_포함돼있을시_예외_테스트` + 7. `자동차이름에_다른구분자_포함돼있을시_예외_테스트` + 8. `구분자가_맨앞에있을때_예외_테스트` + 9. `구분자가_겹쳐있을때_예외_테스트` + 10. `구분자가_맨뒤에있을때_예외_테스트` +3. 예외처리 테스트 +4. 우승자 여러명일 때 테스트 From 9a915e5b918978045a2703562fb14686cf90b2cf Mon Sep 17 00:00:00 2001 From: Jinho622 Date: Mon, 28 Oct 2024 23:27:42 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat():=20RacingManager=EC=9D=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=EC=97=90=EC=84=9C=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=B0=A8=20=EC=9D=B4=EB=A6=84=EB=93=A4=EA=B3=BC=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B3=A0=20','?= =?UTF-8?q?=20split=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RacingManager의 생성자에서 자동차 이름들과 횟수를 입력받고 split함수를 사용해 ','기준으로 차 이름을 string배열에 저장 --- src/main/java/racingcar/Application.java | 10 +++++ src/main/java/racingcar/Car.java | 23 +++++++++++ src/main/java/racingcar/ExceptionManager.java | 0 src/main/java/racingcar/RacingManager.java | 39 +++++++++++++++++++ src/test/java/racingcar/ApplicationTest.java | 16 ++++---- 5 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 src/main/java/racingcar/Car.java create mode 100644 src/main/java/racingcar/ExceptionManager.java create mode 100644 src/main/java/racingcar/RacingManager.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..61d2d62e79 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,17 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + RacingManager racingManager = new RacingManager(); + racingManager.runRacing(); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000000..0974bcec70 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,23 @@ +package racingcar; + +public class Car { + private String name; + private int POSITION; + + public Car (String name, int position){ + this.name = name; + this.POSITION = position; + } + + public void moveForword(){ + this.POSITION += 1; + } + + public String getName() { + return name; + } + + public int getPosition() { + return POSITION; + } +} diff --git a/src/main/java/racingcar/ExceptionManager.java b/src/main/java/racingcar/ExceptionManager.java new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/racingcar/RacingManager.java b/src/main/java/racingcar/RacingManager.java new file mode 100644 index 0000000000..ceb50e0e75 --- /dev/null +++ b/src/main/java/racingcar/RacingManager.java @@ -0,0 +1,39 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class RacingManager { + + private String input = ""; + private int NUMBER; + private String[] inputCars; + private List carList = new ArrayList<>(); + private int MAX_POSITION; + private List names = new ArrayList<>(); + + + RacingManager(){ + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + this.input = Console.readLine(); // 사용자 입력을 받는 메소드 + System.out.println("시도할 횟수는 몇 회인가요?"); + try { + this.NUMBER = Integer.parseInt(Console.readLine()); + } catch (NumberFormatException e){ + throw new IllegalArgumentException("숫자를 입력하지 않았습니다."); + } + splitInputCars(); + } + + private void splitInputCars() { + this.inputCars = input.split(","); + } + + public void runRacing() { + } +} diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 1d35fc33fe..332d423354 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -15,19 +15,19 @@ class ApplicationTest extends NsTest { @Test void 기능_테스트() { assertRandomNumberInRangeTest( - () -> { - run("pobi,woni", "1"); - assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); - }, - MOVING_FORWARD, STOP + () -> { + run("pobi,woni", "1"); + assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); + }, + MOVING_FORWARD, STOP ); } @Test void 예외_테스트() { assertSimpleTest(() -> - assertThatThrownBy(() -> runException("pobi,javaji", "1")) - .isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> runException("pobi,javaji", "1")) + .isInstanceOf(IllegalArgumentException.class) ); } @@ -35,4 +35,4 @@ class ApplicationTest extends NsTest { public void runMain() { Application.main(new String[]{}); } -} +} \ No newline at end of file From 212867336ab4c8883740dbe5222def76c19c59d6 Mon Sep 17 00:00:00 2001 From: Jinho622 Date: Mon, 28 Oct 2024 23:33:35 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat():=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=EC=9D=B4=EB=A6=84,=20=EC=A0=84=EC=A7=84=ED=95=9C=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98(position)=EB=A5=BC=20=EB=A9=A4=EB=B2=84=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EA=B0=80=EC=A7=84=20Car=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=9D=98=20=EA=B0=9D=EC=B2=B4=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=ED=95=98?= =?UTF-8?q?=EB=82=98=EC=94=A9=20=ED=99=95=EC=9D=B8=ED=95=98=EB=A9=B0=20?= =?UTF-8?q?=EB=9E=9C=EB=8D=A4=EC=88=AB=EC=9E=90=EA=B0=80=204=EC=9D=B4?= =?UTF-8?q?=EC=83=81=EC=9D=B4=EB=A9=B4=20=EC=A0=84=EC=A7=84=ED=95=9C=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98=EB=A5=BC=20+1=EC=8B=9C=ED=82=A8=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 자동차이름, 전진한 횟수(position)를 멤버 변수로 가진 Car클래스의 객체 리스트에 저장 저장 시 createCar()함수 사용 객체 리스트를 하나씩 확인하며 랜덤숫자가 4이상이면 전진한 횟수를 +1시킨다. startRacing()함수와 startMove()함수, checkMove()함수로 나누어 while문 for문, 랜덤숫자 확인을 각각 다른 함수에서 시행 --- src/main/java/racingcar/RacingManager.java | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/main/java/racingcar/RacingManager.java b/src/main/java/racingcar/RacingManager.java index ceb50e0e75..7a0c085198 100644 --- a/src/main/java/racingcar/RacingManager.java +++ b/src/main/java/racingcar/RacingManager.java @@ -34,6 +34,42 @@ private void splitInputCars() { this.inputCars = input.split(","); } + private void createCar() { + for(int i = 0; i < inputCars.length; i++){ + Car car = new Car(inputCars[i], 0); + carList.add(car); + } + } + + private void startRacing() { + System.out.println(); + System.out.println("실행 결과"); + while(NUMBER > 0){ + startMove(carList); + System.out.println(); + NUMBER -= 1; + } + } + + private void startMove(List carList) { + int RANDOM_NUM; + for(int i = 0; i < carList.size(); i++) { + String position = ""; + Car car = carList.get(i); + checkMove(car); + } + } + + private void checkMove(Car car) { + int RANDOM_NUM = Randoms.pickNumberInRange(0, 9); + int MOVE_FORWARD_NUM = 4; + if(RANDOM_NUM >= MOVE_FORWARD_NUM) { + car.moveForword(); + } + } + public void runRacing() { + createCar(); + startRacing(); } } From bdc5c7c3b4024c2ee9ebd99d928947147d721995 Mon Sep 17 00:00:00 2001 From: Jinho622 Date: Mon, 28 Oct 2024 23:36:24 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat():=20=ED=95=9C=EB=B2=88=EC=9D=98=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98(=EC=8A=A4=ED=85=9D)=EB=A7=88=EB=8B=A4=20?= =?UTF-8?q?=EC=A0=84=EC=A7=84=ED=95=9C=20=ED=9A=9F=EC=88=98=EB=8C=80?= =?UTF-8?q?=EB=A1=9C=20=E2=80=98-=E2=80=99=EB=A5=BC=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=ED=95=9C=20=ED=9A=9F=EC=88=98=EA=B0=80=20=EB=81=9D?= =?UTF-8?q?=EB=82=98=EB=A9=B4=20=EC=A0=84=EC=A7=84=ED=95=9C=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EB=B9=84=EA=B5=90=ED=95=B4=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=EC=9E=90=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getMaxPosition()함수에서 전진한 최대횟수를 찾고 getMaxPostionCars()함수에서 우승자를 찾고 printMaxPositionCars()함수에서 우승자 출력 --- src/main/java/racingcar/RacingManager.java | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/racingcar/RacingManager.java b/src/main/java/racingcar/RacingManager.java index 7a0c085198..66ee481db2 100644 --- a/src/main/java/racingcar/RacingManager.java +++ b/src/main/java/racingcar/RacingManager.java @@ -57,6 +57,7 @@ private void startMove(List carList) { String position = ""; Car car = carList.get(i); checkMove(car); + printPosition(car, position); } } @@ -68,8 +69,39 @@ private void checkMove(Car car) { } } + private void printPosition(Car car, String position) { + for(int j = 0; j < car.getPosition(); j++) { + position += '-'; + } + System.out.println(car.getName() + " : " + position); + } + + public void getMaxPosition() { + MAX_POSITION = carList.stream() + .max(Comparator.comparingInt(Car::getPosition)) + .map(Car::getPosition) + .orElse(-1); + } + + public void getMaxPostionCars() { + // 최대 position을 가진 모든 객체의 name을 리스트로 추출 + names = carList.stream() + .filter(o -> o.getPosition() == MAX_POSITION) + .map(Car::getName) + .collect(Collectors.toList()); + } + + public void printMaxPositionCars() { + String result = names.stream() + .collect(Collectors.joining(", ")); + System.out.println("최종 우승자 : " + result); + } + public void runRacing() { createCar(); startRacing(); + getMaxPosition(); + getMaxPostionCars(); + printMaxPositionCars(); } } From 6c3f9c2522e13f90f4c9d85781ee4ac6bcbe5d4d Mon Sep 17 00:00:00 2001 From: Jinho622 Date: Mon, 28 Oct 2024 23:38:22 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat():=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=95=B4=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 자동차이름입력값_빈값일때_예외_테스트 반복횟수_빈값일때_예외_테스트 반복횟수_0일때_예외_테스트 반복횟수_음수일때_예외_테스트 유효하지않은_구분자_예외_테스트 : ‘,’이외의 구분자가 입력으로 들어왔을 때 자동차이름에_숫자_포함돼있을시_예외_테스트 자동차이름에_다른구분자_포함돼있을시_예외_테스트 구분자가_맨앞에있을때_예외_테스트 구분자가_겹쳐있을때_예외_테스트 구분자가_맨뒤에있을때_예외_테스트 --- src/main/java/racingcar/ExceptionManager.java | 70 +++++++++++++++++++ src/main/java/racingcar/RacingManager.java | 3 + 2 files changed, 73 insertions(+) diff --git a/src/main/java/racingcar/ExceptionManager.java b/src/main/java/racingcar/ExceptionManager.java index e69de29bb2..14ab316a39 100644 --- a/src/main/java/racingcar/ExceptionManager.java +++ b/src/main/java/racingcar/ExceptionManager.java @@ -0,0 +1,70 @@ +package racingcar; + +public class ExceptionManager { + + private String input = ""; + private String[] inputCars; + private int NUMBER; + + ExceptionManager(String input, String[] inputCars, int NUMBER){ + this.input = input; + this.inputCars = inputCars; + this.NUMBER = NUMBER; + } + + // 빈값 확인 + private void checkInputCarsIsNull(){ + if(input.equals("")){ + throw new IllegalArgumentException("입력된 값이 없습니다."); + } + } + + // NUMBER 0또는 음수인지 확인 + private void checkWrongInputNumber(){ + if(NUMBER <= 0){ + throw new IllegalArgumentException("양수를 입력해야합니다."); + } + } + + private void checkWrongWord(){ + // 다른 구분자나 숫자가 포함되어 있는지 확인하기 + if(!input.matches("^[a-zA-Z,]*$")) { + throw new IllegalArgumentException("문자와 구분자','외에 다른문자가 포함되어 있습니다."); + } + } + + private void checkWrongDelimiter(){ + // input의 delimiter 위치 확인(','가 맨앞에 오거나 겹치는 경우) + for(String inputCar : inputCars) { + if(inputCar.isEmpty()){ + throw new IllegalArgumentException("구분자가 겹쳐있거나 문자열 맨앞에 위치해 있습니다."); + } + } + // input의 delimiter 위치 확인(','가 맨앞 맨뒤에 있는 경우) + if(input.charAt(input.length() - 1) == ','){ + throw new IllegalArgumentException("구분자가 문자열 맨뒤에 위치해 있습니다."); + } + } + + private void checkWrongLength(){ + // input의 차 이름이 5글자 이하인지 확인 + for(String inputCar : inputCars) { + checkNumOfCarName(inputCar); + } + } + + private void checkNumOfCarName(String inputCar) { + int MAX_NUM_OF_CAR_NAME = 5; + if(inputCar.length() > MAX_NUM_OF_CAR_NAME){ + throw new IllegalArgumentException("자동차 이름이 5글자 이하여야합니다."); + } + } + + public void checkException(){ + checkInputCarsIsNull(); + checkWrongInputNumber(); + checkWrongWord(); + checkWrongDelimiter(); + checkWrongLength(); + } +} diff --git a/src/main/java/racingcar/RacingManager.java b/src/main/java/racingcar/RacingManager.java index 66ee481db2..12c5107a98 100644 --- a/src/main/java/racingcar/RacingManager.java +++ b/src/main/java/racingcar/RacingManager.java @@ -13,6 +13,7 @@ public class RacingManager { private String input = ""; private int NUMBER; private String[] inputCars; + private ExceptionManager exceptionManager; private List carList = new ArrayList<>(); private int MAX_POSITION; private List names = new ArrayList<>(); @@ -28,6 +29,7 @@ public class RacingManager { throw new IllegalArgumentException("숫자를 입력하지 않았습니다."); } splitInputCars(); + exceptionManager = new ExceptionManager(input, inputCars, NUMBER); } private void splitInputCars() { @@ -98,6 +100,7 @@ public void printMaxPositionCars() { } public void runRacing() { + exceptionManager.checkException(); createCar(); startRacing(); getMaxPosition(); From 7274cbdccdfcc3fec267a1eeb28a9cb75af71f3f Mon Sep 17 00:00:00 2001 From: Jinho622 Date: Mon, 28 Oct 2024 23:40:12 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat():=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 자동차이름입력값_빈값일때_예외_테스트 반복횟수_빈값일때_예외_테스트 반복횟수_0일때_예외_테스트 반복횟수_음수일때_예외_테스트 유효하지않은_구분자_예외_테스트 : ‘,’이외의 구분자가 입력으로 들어왔을 때 자동차이름에_숫자_포함돼있을시_예외_테스트 자동차이름에_다른구분자_포함돼있을시_예외_테스트 구분자가_맨앞에있을때_예외_테스트 구분자가_겹쳐있을때_예외_테스트 구분자가_맨뒤에있을때_예외_테스트 우승자가 여러명일 때 기능 테스트 --- src/test/java/racingcar/ApplicationTest.java | 100 ++++++++++++++++++- 1 file changed, 95 insertions(+), 5 deletions(-) diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 332d423354..ea4a2b5574 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -15,18 +15,108 @@ class ApplicationTest extends NsTest { @Test void 기능_테스트() { assertRandomNumberInRangeTest( + () -> { + run("pobi,woni", "1"); + assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); + }, + MOVING_FORWARD, STOP + ); + } + + @Test + void 우승자_여러명일때_기능_테스트() { + assertSimpleTest( () -> { run("pobi,woni", "1"); - assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); - }, - MOVING_FORWARD, STOP + assertThat(output()).contains("pobi : -", "woni : -", "최종 우승자 : pobi, woni"); + } ); } @Test void 예외_테스트() { assertSimpleTest(() -> - assertThatThrownBy(() -> runException("pobi,javaji", "1")) + assertThatThrownBy(() -> runException("pobi,javaji", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 자동차이름입력값_빈값일때_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 반복횟수_빈값일때_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,java", null)) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 반복횟수_0일때_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,java", "0")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 반복횟수_음수일때_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,java", "-1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 유효하지않은_구분자_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi@java", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 자동차이름에_숫자_포함돼있을시_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,java2", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 자동차이름에_다른구분자_포함돼있을시_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi:java", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 구분자가_맨앞에있을때_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException(",pobi,java", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 구분자가_겹쳐있을때_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,,java", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } + + @Test + void 구분자가_맨뒤에있을때_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,java,", "1")) .isInstanceOf(IllegalArgumentException.class) ); } @@ -35,4 +125,4 @@ class ApplicationTest extends NsTest { public void runMain() { Application.main(new String[]{}); } -} \ No newline at end of file +}