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

[1단계 - 자동차 경주 구현] 엽토(김건엽) 미션 제출합니다. #167

Merged
merged 44 commits into from
Feb 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
63fe28e
docs: 기능 구현 목록을 작성하다
yeopto Feb 7, 2023
c376996
docs: 예외처리 목록을 추가하다
yeopto Feb 8, 2023
575f4cb
chore: lint, prettier 적용하다
yeopto Feb 8, 2023
f1ed4ce
chore: 파일구조를 구축하다
yeopto Feb 8, 2023
77c07a8
chore: lint 수정하다
yeopto Feb 8, 2023
1070382
feat: Console 객체를 생성하다
yeopto Feb 8, 2023
bab84d4
feat: InputView 객체를 생성하다
yeopto Feb 8, 2023
de22e5a
feat: RaceMessage를 상수화하다
yeopto Feb 8, 2023
815eda5
feat: 경주할 자동차 이름을 입력받는다
yeopto Feb 8, 2023
2539980
feat: Car Class를 생성하다.
yeopto Feb 8, 2023
6c957ef
feat: 자동차 이름 입력에 대한 값을 예외처리하다
yeopto Feb 8, 2023
4eb367b
feat: 시도횟수가 1 이상의 숫자가 아닐 경우 예외처리한다
yeopto Feb 8, 2023
a400357
feat: 자동차 이름이 한개 이하일 경우엔 예외처리한다
yeopto Feb 8, 2023
2c35975
feat: 시도할 횟수를 입력받는다
yeopto Feb 8, 2023
a3857da
style: 변수명을 수정하다
yeopto Feb 8, 2023
24c0bfc
feat: 난수 생성 메서드를 만들다
yeopto Feb 8, 2023
a91a9fe
feat: 난수가 4 이상일 경우 자동차를 전진시키다
yeopto Feb 8, 2023
5fb9de4
feat: 입력받은 수만큼 시도 후 자동차 경주 결과를 출력하다
yeopto Feb 8, 2023
7a3c937
feat: 최종 우승자를 출력하고 종료한다
yeopto Feb 8, 2023
c016507
refactor: 상수를 분리하다
yeopto Feb 9, 2023
648f1a8
refactor: 메서드 명을 변경하다
yeopto Feb 9, 2023
49d8c49
test: Car Class 테스트 코드를 작성하다
yeopto Feb 9, 2023
6b8cf2e
test: Race Class 테스트 코드를 작성하다
yeopto Feb 9, 2023
4eb34ff
test: Validator 테스트 코드를 작성하다
yeopto Feb 9, 2023
403aebd
refactor: Validator에 대해 수정하다
yeopto Feb 9, 2023
99d068e
refactor: 자동차 이름 입력 값이 빈 값이거나 정의되지 않았다면 예외처리한다
yeopto Feb 9, 2023
3adbecd
refactor: 자동차 이름이 중복될 경우 예외처리한다
yeopto Feb 9, 2023
93f8ecf
refactor: Validator 메서드 이름을 변경하다
yeopto Feb 9, 2023
6f4e2ff
docs: 예외 처리 목록 추가
yeopto Feb 9, 2023
09b5089
chore: EOL를 처리하다
yeopto Feb 10, 2023
8a33842
chore: prettierignore을 삭제하다
yeopto Feb 10, 2023
dc979c6
chore: Car Class 테스트 파일을 수정하다
yeopto Feb 10, 2023
5f1e671
chore: .vscode 디렉토리를 gitignore에 추가하다
yeopto Feb 10, 2023
3b87d0b
chore: Validator 테스트 코드에서 설명을 수정하다
yeopto Feb 10, 2023
d126011
refactor: 구분자를 상수화 하지 않다
yeopto Feb 10, 2023
9924ec6
refactor: 이름에 숫자가 포함된 경우는 예외처리를 하지 않는다
yeopto Feb 10, 2023
5610618
reafactor: Controller handleRace 메서드명을 변경하다
yeopto Feb 10, 2023
2f08f21
chore: lock 파일을 지우다
yeopto Feb 10, 2023
03b85ce
docs: 기능 구현 목록 수정하다
yeopto Feb 10, 2023
cf10bd2
chore: EOL을 수동으로 설정하다
yeopto Feb 10, 2023
c07fbde
refactor: 변하지 않는 값을 상수화하지 않다
yeopto Feb 10, 2023
c8af6cc
refactor: move 메서드 테스트 코드 설명을 수정하다
yeopto Feb 11, 2023
e2fc29e
chore: prettier printWidth를 변경하다
yeopto Feb 11, 2023
c9d815a
refactor: Console Error Message를 변경하다
yeopto Feb 11, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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',
},
};

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EOL을 수동으로 처리하는 것 외에 자동화할 수 있는 방법은 뭐가 있을지 고민해보면 좋을 것 같아요~

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

prettier 설정으로 endOfLine을 'auto'로 해주었습니다. 이것도 수동으로 보아야할까요?

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] 최종 우승자를 출력하고 종료한다.

## 예외 처리

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

예외상황이 좋은 것 같아요. 다만, 예외상황이 발생했을 때의 처리는 기능구현목록에 없네용

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코멘트에 대해 이해가 잘 가지 않아서 질문드립니다! 예외상황이 발생했을 때의 처리하는 것을 기능구현목록에 추가하라는 말씀이신가요?!


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