Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[자동차 경주] 김기영 미션 제출합니다. #756

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
51 changes: 40 additions & 11 deletions __tests__/ApplicationTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,36 @@ const getLogSpy = () => {
return logSpy;
};

const getReadLineSpy = () => {
const logSpy = jest.spyOn(MissionUtils.Console, "readLineAsync");
logSpy.mockClear();
return logSpy;
};

describe("자동차 경주 게임", () => {
test("입력 문구 테스트", async () => {
const inputs = ["pobi,woni"];
const output =
"경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)";
const logSpy = getReadLineSpy();

mockQuestions(inputs);

const app = new App();
await app.enterCarNames();
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(output));
});

test("자동차 이름 예외처리 : 5자이하 차 이름 입력", async () => {
const inputs = ["pobi,woniaaaaa"];
mockQuestions(inputs);

const app = new App();
await expect(app.play()).rejects.toThrow(
"[ERROR] : 자동차 이름을 5자 이하로 입력해주세요"
);
});

test("전진-정지", async () => {
// given
const MOVING_FORWARD = 4;
Expand All @@ -46,17 +75,17 @@ describe("자동차 경주 게임", () => {
});
});

test.each([
[["pobi,javaji"]],
[["pobi,eastjun"]]
])("이름에 대한 예외 처리", async (inputs) => {
// given
mockQuestions(inputs);
test.each([[["pobi,javaji"]], [["pobi,eastjun"]]])(
"이름에 대한 예외 처리",
async (inputs) => {
// given
mockQuestions(inputs);

// when
const app = new App();
// when
const app = new App();

// then
await expect(app.play()).rejects.toThrow("[ERROR]");
});
// then
await expect(app.play()).rejects.toThrow("[ERROR]");
}
);
});
44 changes: 44 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
## 구현할 기능 목록

- **Git의 커밋 단위는 앞 단계에서 docs/README.md에 정리한 기능 목록 단위**
- **indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.**
- **Jest를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.**
- **@woowacourse/mission-utils에서 제공하는 Random 및 Console API를 사용하여 구현해야 한다.**
<br>
<br>

- [ ] 자동차 이름 입력 받기 (문구 출력 및 이름 변수 초기화)
- [ ] 🧪TEST🧪 자동차 이름 입력 받기 (문구 출력 및 이름 변수 초기화)
<br>

- [ ] 이름 예외 처리

- 이름은 5자 이하만 가능

- [ ] 🧪TEST🧪 이름 예외 처리
- [ ] 시도할 횟수 입력 받기 (문구 출력 및 횟수 변수 초기화)
- [ ] 🧪TEST🧪 시도할 횟수 입력 받기 (문구 출력 및 횟수 변수 초기화)
- [ ] 횟수 예외 처리

- 숫자 외 값 입력
- 0 이하의 값 입력
- [ ] 🧪TEST🧪 횟수 예외 처리
- [ ] 자동차 이동하기 구현

- 이동조건 : 0~9사이 무작위 값이 4이상인 경우
- [ ] 🧪TEST🧪 자동차 이동하기 구현
- [ ] 자동차별 이동하기 구현
- [ ] 🧪TEST🧪 자동차별 이동하기 구현
- [ ] 1회 시행에 대한 결과 출력

- 결과 출력 후 줄 바꿈 되어야함
- [ ] 🧪TEST🧪 1회 시행에 대한 결과 출력
- [ ] 입력받은 횟수 만큼 시행하는 기능 구현
- [ ] 🧪TEST🧪 입력받은 횟수 만큼 시행하는 기능 구현
- [ ] 종료 시(입력 횟수 만큼 시행) 결과 문구 출력

- 단독 우승: '최종 우승자 : pobi'
- 공동 우승: '최종 우승자 : pobi, jun'
- [ ] 🧪TEST🧪 종료 시(입력 횟수 만큼 시행) 결과 문구 출력
- [ ] 결과 확인 후 버그 수정

56 changes: 55 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,59 @@
import { Console, Random } from "@woowacourse/mission-utils";
import { Car } from "./Car.js";

class App {
async play() {}
async play() {
try {
const carNames = await this.enterCarNames();
let tryCount = await this.enterTryCount();

const cars = {};
carNames.forEach((carName) => {
cars[carName] = new Car(carName);
});

Console.print("실행 결과");
while (tryCount > 0) {
carNames.forEach((carName) => {
const car = cars[carName];
car.moveSimulate(Random.pickNumberInRange(0, 9));
Console.print(car.printResult());
});
Console.print("\n");
tryCount -= 1;
}
} catch (e) {
throw new Error(`[ERROR] : ${e.message}`);
}
}

async enterCarNames() {
const inputCarNames = await Console.readLineAsync(
"경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)\n"
);
const ret = inputCarNames.split(",");
if (ret.every((carName) => carName.length <= 5)) {
return ret;
}
throw new Error("자동차 이름을 5자 이하로 입력해주세요");
}

async enterTryCount() {
let inputTryCount = await Console.readLineAsync(
"시도할 횟수는 몇 회인가요?\n"
);
if (isNaN(inputTryCount)) {
throw new Error("입력 값은 숫자여야 합니다.");
}
inputTryCount = parseInt(inputTryCount);
if (inputTryCount <= 0) {
throw new Error("1 이상의 값을 입력해야 합니다.");
}
return inputTryCount;
}
}

const app = new App();
app.play();

export default App;
14 changes: 14 additions & 0 deletions src/Car.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export class Car {
name;
result = "";
constructor(name) {
this.name = name;
}

moveSimulate(count) {
if (count >= 4) this.result += "-";
}
printResult() {
return `${this.name} : ${this.result}`;
}
}