Skip to content

Commit

Permalink
[1단계 - 자동차 경주 구현] 엽토(김건엽) 미션 제출합니다. (#167)
Browse files Browse the repository at this point in the history
* docs: 기능 구현 목록을 작성하다

* docs: 예외처리 목록을 추가하다

* chore: lint, prettier 적용하다

* chore: 파일구조를 구축하다

* chore: lint 수정하다

* feat: Console 객체를 생성하다

* feat: InputView 객체를 생성하다

* feat: RaceMessage를 상수화하다

* feat: 경주할 자동차 이름을 입력받는다

* feat: Car Class를 생성하다.

* feat: 자동차 이름 입력에 대한 값을 예외처리하다

* feat: 시도횟수가 1 이상의 숫자가 아닐 경우 예외처리한다

* feat: 자동차 이름이 한개 이하일 경우엔 예외처리한다

* feat: 시도할 횟수를 입력받는다

* style: 변수명을 수정하다

* feat: 난수 생성 메서드를 만들다

* feat: 난수가 4 이상일 경우 자동차를 전진시키다

* feat: 입력받은 수만큼 시도 후 자동차 경주 결과를 출력하다

* feat: 최종 우승자를 출력하고 종료한다

* refactor: 상수를 분리하다

* refactor: 메서드 명을 변경하다

* test: Car Class 테스트 코드를 작성하다

* test: Race Class 테스트 코드를 작성하다

* test: Validator 테스트 코드를 작성하다

* refactor: Validator에 대해 수정하다

* refactor: 자동차 이름 입력 값이 빈 값이거나 정의되지 않았다면 예외처리한다

* refactor: 자동차 이름이 중복될 경우 예외처리한다

* refactor: Validator 메서드 이름을 변경하다

* docs: 예외 처리 목록 추가

* chore: EOL를 처리하다

* chore: prettierignore을 삭제하다

node_modules만 있어서 삭제하다

* chore: Car Class 테스트 파일을 수정하다

* chore: .vscode 디렉토리를 gitignore에 추가하다

* chore: Validator 테스트 코드에서 설명을 수정하다

* refactor: 구분자를 상수화 하지 않다

* refactor: 이름에 숫자가 포함된 경우는 예외처리를 하지 않는다

* reafactor: Controller handleRace 메서드명을 변경하다

* chore: lock 파일을 지우다

lock 파일이 두개가 생성되어 yarn.lock을 지우다

* docs: 기능 구현 목록 수정하다

이름에 숫자만 있거나 이름이 특수문자라면 예외처리한다로 수정하다

* chore: EOL을 수동으로 설정하다

* refactor: 변하지 않는 값을 상수화하지 않다

* refactor: move 메서드 테스트 코드 설명을 수정하다

* chore: prettier printWidth를 변경하다

80은 defalut값이기도 하면서 요즘은 브라우저가 넓어서 오히려 좁을 수 있다

* refactor: Console Error Message를 변경하다

일관성이 있도록 한글로 변경하다
  • Loading branch information
yeopto authored Feb 11, 2023
1 parent 51fbb02 commit 52dfb46
Show file tree
Hide file tree
Showing 25 changed files with 17,670 additions and 4,015 deletions.
22 changes: 22 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: ['eslint:recommended', 'airbnb-base', 'prettier'],
plugins: ['prettier'],
rules: {
'import/prefer-default-export': 'off',
'import/extensions': ['off'],
'class-methods-use-this': 'off',
'no-alert': 'off',
'no-undef': 'off',
'no-new': 'off',
'lines-between-class-members': 'off',
},
parserOptions: {
ecmaVersion: 13,
sourceType: 'module',
},
};
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
node_modules/
dist/
.vscode
16 changes: 16 additions & 0 deletions .prettierrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/**
* Prettier 옵션
* - https://prettier.io/docs/en/options.html
*/
module.exports = {
printWidth: 110, // 한 줄 최대 문자 수
tabWidth: 2, // 들여쓰기 시, 탭 너비
useTabs: false, // 스페이스 대신 탭 사용
semi: true, // 문장 끝 세미콜론 사용
singleQuote: true, // 작은 따옴표 사용
trailingComma: 'all', // 꼬리 콤마 사용
bracketSpacing: true, // 중괄호 내에 공백 사용
arrowParens: 'avoid', // 화살표 함수 단일 인자 시, 괄호 생략
proseWrap: 'never', // 마크다운 포매팅 제외
endOfLine: 'auto', // 개행문자 유지 (혼합일 경우, 첫 줄 개행문자로 통일)
};
18 changes: 0 additions & 18 deletions .vscode/launch.json

This file was deleted.

11 changes: 0 additions & 11 deletions .vscode/tasks.json

This file was deleted.

16 changes: 16 additions & 0 deletions __tests__/Car.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const Car = require('../src/Models/Car');

test('move 인자로 4이상의 수가 들어온다면 position을 1만큼 이동한다.', () => {
// given
const car = new Car('garam');
const numbers = [1, 3, 4, 5, 6, 2, 0];
const resultPosition = 3;

// when
numbers.forEach(number => {
car.move(number);
});

// then
expect(car.getPosition()).toEqual(resultPosition);
});
34 changes: 34 additions & 0 deletions __tests__/Race.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const Car = require('../src/Models/Car');
const Race = require('../src/Models/Race');
const RandomNumGenerator = require('../src/Utils/RandomNumGenerator');

const mockRandoms = numbers => {
RandomNumGenerator.generateNumber = jest.fn();
numbers.reduce(
(acc, number) => acc.mockReturnValueOnce(number),
RandomNumGenerator.generateNumber,
);
};

test('Race Class 테스트', () => {
// given
const cars = [];
['garam', 'yeop'].forEach(name => {
cars.push(new Car(name));
});
const race = new Race(cars);
const tryCount = 3;
mockRandoms([1, 2, 3, 4, 5, 6]);
const result = new Map([
['garam', 1],
['yeop', 2],
]);

// when
for (let i = 0; i < tryCount; i += 1) {
race.go();
}

// then
expect(race.getResult()).toEqual(result);
});
46 changes: 46 additions & 0 deletions __tests__/Validator.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
const { RACE_ERROR_MESSAGE } = require('../src/Constant/ErrorMessage');
const Validator = require('../src/Utils/Validator');

describe('Validator 테스트', () => {
test.each([[['garam'], [''], ['garam', 'garam']]])(
'자동차 이름이 한개 이하거나 중복될 경우 예외처리한다.',
input => {
expect(() => {
Validator.validateNamesOfCars(input);
}).toThrow(RACE_ERROR_MESSAGE.numberOfNames);
},
);

test.each([['yeopto'], ['garame']])(
'이름이 5자를 초과하는 경우 예외처리한다.',
input => {
expect(() => {
Validator.validateCarName(input);
}).toThrow(RACE_ERROR_MESSAGE.lengthOfName);
},
);

test.each([[' '], ['!'], [''], ['123']])(
'자동차 이름이 문자이거나 숫자만 들어간 경우 경우 예외처리한다.',
input => {
expect(() => {
Validator.validateCarName(input);
}).toThrow(RACE_ERROR_MESSAGE.invalidInput);
},
);

test.each([[0], [-1]])('시도 횟수가 1이상이 아니면 예외처리한다', input => {
expect(() => {
Validator.validateTryCount(input);
}).toThrow(RACE_ERROR_MESSAGE.rangeOfTryCount);
});

test.each([['aa'], [' '], ['한']])(
'숫자가 아니라면 예외처리를 한다',
input => {
expect(() => {
Validator.validateTryCount(input);
}).toThrow(RACE_ERROR_MESSAGE.rangeOfTryCount);
},
);
});
17 changes: 17 additions & 0 deletions docs/REQUIREMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## 기능 구현 목록

- [x] 경주할 자동차 이름을 입력받는다.(쉼표를 기준으로)
- [x] 시도할 횟수를 입력받는다. (수 제한 없음)
- 각 자동차 마다 0에서 9까지의 무작위 값을 구한다.
- [x] 0에서 9까지의 무작위 값을 구한다.
- [x] 4 이상인 자동차인 경우는 전진시킨다.
- [x] 입력받은 수만큼 시도 후 자동차 경주 결과를 출력한다.
- [x] 최종 우승자를 출력하고 종료한다.

## 예외 처리

- [x] 시도횟수가 1이상의 숫자가 아닐 경우 예외처리한다.
- [x] 이름이 다섯자 이하가 아닐 경우 예외처리한다.
- [x] 이름에 숫자만 있거나 이름이 특수문자라면 예외처리한다.
- [x] 자동차 이름이 한개 이하일 경우엔 예외처리한다.
- [x] 자동차 이름이 중복된 경우엔 예외처리한다.
Loading

0 comments on commit 52dfb46

Please sign in to comment.