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

[자동차 경주] 김동률 미션 제출합니다. #742

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
174 changes: 0 additions & 174 deletions README.md

This file was deleted.

21 changes: 21 additions & 0 deletions __tests__/AttemptsTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import User from "../src/User";

describe("시도 횟수 테스트", () => {
test("숫자 외 타입에 대한 예외 처리", () => {
const input = "string";
const result = () => User.validateAttempts(input);
expect(result).toThrow("[ERROR] 잘못된 타입입니다. 숫자를 입력해주세요.");
});

test("0 이하 숫자에 대한 예외 처리", () => {
const input = "-1";
const result = () => User.validateAttempts(input);
expect(result).toThrow("[ERROR] 1 이상의 숫자를 입력해주세요.");
});

test("정수가 아닌 숫자에 대한 예외 처리", () => {
const input = "3.14";
const result = () => User.validateAttempts(input);
expect(result).toThrow("[ERROR] 잘못된 숫자 형식입니다.");
});
});
45 changes: 45 additions & 0 deletions __tests__/CarNameTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import User from "../src/User.js";

describe("자동차 이름 테스트", () => {
test("빈 문자열에 대한 예외 처리", () => {
const input = "";
const result = () => User.validateCarName(input);
expect(result).toThrow("[ERROR] 입력 값이 없습니다.");
});

test(",로 시작하는 이름에 대한 예외 처리", () => {
const input = ",pobi,drk";
const result = () => User.validateCarName(input);
expect(result).toThrow(
"[ERROR] 입력 값이 쉼표로 시작하거나 끝날 수 없습니다.",
);
});

test(",로 끝나는 이름에 대한 예외 처리", () => {
const input = "pobi,drk,";
const result = () => User.validateCarName(input);
expect(result).toThrow(
"[ERROR] 입력 값이 쉼표로 시작하거나 끝날 수 없습니다.",
);
});

test("1개만 입력받은 이름에 대한 예외 처리", () => {
const input = "pobi";
const result = () => User.validateCarName(input);
expect(result).toThrow("[ERROR] 최소 2개의 자동차 이름을 입력해주십시오.");
});

test("5자 초과 이름에 대한 예외 처리", () => {
const input = "Rodriguez,pobi";
const result = () => User.validateCarName(input);
expect(result).toThrow(`[ERROR] 각 자동차의 이름은 5자 이하이어야 합니다.`);
});

test("중복된 이름에 대한 예외 처리", () => {
const input = "pobi,pobi";
const result = () => User.validateCarName(input);
expect(result).toThrow(
`[ERROR] 같은 이름이 존재합니다. 각 자동차의 이름은 모두 달라야 합니다.`,
);
});
});
25 changes: 25 additions & 0 deletions __tests__/PrintWinnerTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import Computer from "../src/Computer";

describe("최종결과 테스트", () => {
test("단독우승자 찾기", () => {
const input = [
{ name: "pobi", position: 3 },
{ name: "drk", position: 2 },
{ name: "hw", position: 1 },
];
const expected = "pobi";
const result = Computer.makeWinnerString(Computer.findWinner(input));
expect(result).toBe(expected);
});

test("공동우승자 찾기", () => {
const input = [
{ name: "pobi", position: 2 },
{ name: "drk", position: 2 },
{ name: "hw", position: 1 },
];
const expected = "pobi, drk";
const result = Computer.makeWinnerString(Computer.findWinner(input));
expect(result).toBe(expected);
});
});
46 changes: 46 additions & 0 deletions __tests__/RunRaceTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import Car from "../src/Car";
import Computer from "../src/Computer";
import { NUMBER } from "../src/constant";

describe("차수별 테스트", () => {
test("자동차 인스턴스 생성 ", () => {
const input = ["pobi", "drk"];
const result = Computer.generateCars(input);
const expected = [
{ name: "pobi", position: 0 },
{ name: "drk", position: 0 },
];
expect(result).toEqual(expected);
});

test.each([
{
input: {
name: "pobi",
randomNumber: NUMBER.CAN_FORWARD,
},
expected: { name: "pobi", position: 1 },
},
{
input: {
name: "drk",
randomNumber: NUMBER.CAN_FORWARD - 1,
},
expected: { name: "drk", position: 0 },
},
{
input: {
name: "hw",
randomNumber: NUMBER.CAN_FORWARD,
},
expected: { name: "hw", position: 1 },
},
])(
"진행 가능 숫자 판별 결과에 따른 이동여부 검증",
({ input: { name, randomNumber }, expected }) => {
const car = new Car(name);
Computer.evaluateGoOrStop(car, randomNumber);
expect(car.position).toBe(expected.position);
},
);
});
26 changes: 26 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# 미션 - 자동차 경주

## 구현 기능 목록

### 1. 자동차 이름 입력 기능
- 입력받은 이름을 쉼표 단위로 구분한다.
- 5자 초과의 이름을 가진 경우, 예외를 발생시킨다.
- 인풋이 없는 경우, 예외를 발생시킨다.
- 쉼표로 시작하거나, 끝나면 예외를 발생시킨다.
- 자동차 이름을 1개만 입력받은 경우, 경주를 진행할 수 없기에 예외를 발생시킨다.
- 같은 이름이 있는 경우, 예외를 발생시킨다.

### 2. 시도 횟수 입력 기능
- 자연수가 아닌 숫자를 입력한 경우, 게임을 진행할 수 없기 때문에 예외를 발생시킨다.
- 숫자 타입이 아닌 경우, 예외를 발생시킨다.

### 3. 각 차수 실행 및 출력 기능
- 각 참가자별로 0에서 9사이 랜덤값을 추출한다.
- 추출값에 따라 4 이상인 경우 전진시킨다.
- 각 차수의 결과를 출력한다.
- 전체 차수 데이터에 현재 차수 데이터를 반영한다.

### 4. 최종 우승자 출력 및 게임 종료 기능
- 각 차수들의 결과를 취합한 데이터를 바탕으로 가장 높은 최종 우승자를 출력한다.
- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
- 게임을 종료한다.
13 changes: 12 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
import Computer from "./Computer.js";
import User from "./User.js";

class App {
async play() {}
async play() {
this.carNameList = await User.inputCarName();
this.attempts = await User.inputAttempts();

const cars = Computer.generateCars(this.carNameList);

Computer.runRace(cars, this.attempts);
Computer.printRaceResult(cars);
}
}

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 @@
import { GAME_SETTING } from "./constant.js";

class Car {
constructor(name) {
this.name = name;
this.position = GAME_SETTING.START_POINT;
}

forward() {
this.position += GAME_SETTING.STEP;
}
}

export default Car;
Loading