-
Notifications
You must be signed in to change notification settings - Fork 168
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단계 - 콘솔 기반 로또 게임] 윤생(이윤성) 미션 제출합니다. #173
Changes from all commits
286ba48
e8edb1a
003f199
77eaa13
8951221
771bc53
385b61b
7b7b2a5
fed7cd4
e183e9f
7e7c120
83f4d4f
d38e64f
2e08722
987b906
1ea68ab
a0b74d5
6ec9738
b76fa5a
2fec3b5
bdb3558
f934e7b
9d7ce91
201b756
50e0b47
f8a26cf
860ae54
43bc87b
e0fc0e2
e15c175
a9a9f88
9991a5b
4086f15
b3a3147
027c11b
0d90f66
e26a21b
fd155ab
f24b8cb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,31 @@ | ||
{ | ||
"rules": {}, | ||
"env": { | ||
"es6": true, | ||
"node": true | ||
"node": true, | ||
"jest": true | ||
}, | ||
"extends": [ | ||
"eslint:recommended", | ||
"airbnb-base", | ||
"plugin:prettier/recommended", | ||
"eslint-config-prettier" | ||
], | ||
"parserOptions": { | ||
"ecmaVersion": "latest" | ||
"ecmaVersion": "latest", | ||
"sourceType": "module" | ||
}, | ||
"extends": ["eslint:recommended", "plugin:prettier/recommended"] | ||
"rules": { | ||
"max-depth": ["error", 1], | ||
"max-params": ["error", 2], | ||
"max-lines-per-function": ["error", 10], | ||
"lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }] | ||
}, | ||
"overrides": [ | ||
{ | ||
"files": ["__tests__/**/*.js"], | ||
"rules": { | ||
"max-lines-per-function": "off" | ||
} | ||
} | ||
] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,11 @@ | ||
{ | ||
"endOfLine": "auto" | ||
"endOfLine": "auto", | ||
"semi": true, | ||
"bracketSpacing": true, | ||
"trailingComma": "all", | ||
"useTabs": false, | ||
"tabWidth": 2, | ||
"printWidth": 100, | ||
"singleQuote": true, | ||
"arrowParens": "always" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import Lotto from '../src/domain/Lotto'; | ||
|
||
describe('Lotto 클래스 입니다.', () => { | ||
test.each([ | ||
[ | ||
[6, 5, 4, 3, 2, 1], | ||
[1, 2, 3, 4, 5, 6], | ||
], | ||
[ | ||
[7, 6, 5, 3, 2, 1], | ||
[1, 2, 3, 5, 6, 7], | ||
], | ||
])('로또 배열을 정렬한다.', (numbers, expected) => { | ||
const lotto = new Lotto(numbers); | ||
expect(lotto.getNumbers()).toEqual(expected); | ||
}); | ||
|
||
test('보너스 번호를 가지고 있으면 true를 반환한다.', () => { | ||
const lotto = new Lotto([1, 2, 3, 4, 5, 6]); | ||
const bonusBall = 5; | ||
|
||
expect(lotto.hasBonus(bonusBall)).toBeTruthy(); | ||
}); | ||
|
||
test('보너스 번호를 가지고 있지 않으면 false를 반환한다.', () => { | ||
const lotto = new Lotto([1, 2, 3, 4, 5, 6]); | ||
const bonusBall = 10; | ||
|
||
expect(lotto.hasBonus(bonusBall)).toBeFalsy(); | ||
}); | ||
|
||
test('로또 번호가 당첨 번호와 비교해 일치하는 갯수를 반환한다.', () => { | ||
const lotto = new Lotto([1, 2, 3, 4, 5, 6]); | ||
const winLotto = new Lotto([4, 5, 6, 9, 10, 11]); | ||
|
||
expect(lotto.countMatch(winLotto)).toBe(3); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import { isPositiveInteger, isValidRestartCommand } from '../src/validation'; | ||
|
||
describe('유효성 검증 테스트입니다.', () => { | ||
test.each([1.11, null, undefined, 'string', {}])( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 음 사용자가 정말로 다룰 만한 값으로 테스트 해보는건 어때요? |
||
'양의 정수가 아니면 false를 반환한다.', | ||
(value) => { | ||
expect(isPositiveInteger(Number(value))).toBeFalsy(); | ||
}, | ||
); | ||
|
||
test.each(['y', 'n'])('재시작 입력에서 y와 n를 받으면 true를 반환한다.', (input) => { | ||
expect(isValidRestartCommand(input)).toBeTruthy(); | ||
}); | ||
|
||
test.each([1, '1'])('재시작 입력에서 y와 n인 아닌 입력을 받으면 false를 반환한다.', (input) => { | ||
expect(isValidRestartCommand(input)).toBeFalsy(); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
## 기능 요구 사항 | ||
|
||
- [x] 구입 금액을 입력 받는다. - view | ||
- [x] 구입 금액 유효성 검사 - domain | ||
- [x] 로또를 발행한다. - domain | ||
- [x] 한 장당 가격 - domain | ||
- [x] 구매한 갯수 출력 - view | ||
- [x] 구매한 로또들을 오름차순 정렬한다. - domain | ||
- [x] 구매한 로또들을 출력한다. - view | ||
- [x] 당첨 번호를 입력 받는다. - view | ||
- [x] 당첨 번호 유효성 검사(중복, 범위) - domain | ||
- [x] 보너스 번호를 입력 받는다. - view | ||
- [x] 당첨 번호를 포함하여 유효성을 검사한다. - domain | ||
- [x] 로또 당첨 통계를 계산한다. - domain | ||
- [x] 로또 당첨 등수를 계산한다. - domain | ||
- [ ] 당첨 등수에 따른 당첨금을 계산한다. - domain | ||
- [ ] 수익률을 계산한다. - domain | ||
- [x] 재시작 여부를 입력 받는다. - view | ||
- [x] 재시작 입력에 대한 유효성을 검사한다. - view? controller? 등 domain 외부 | ||
- [x] 재시작할 경우 구입 금액 입력부터 게임을 다시 시작한다. - domain | ||
- [x] 종료하는 경우 그대로 프로그램을 종료시킨다. - domain | ||
- [x] 사용자가 잘못된 값을 입력한 경우 throw문을 사용해 예외를 발생시킨다. - domain/view 나뉨 | ||
- [x] 에러 메시지를 출력한다. - view | ||
- [x] 해당 부분부터 입력을 다시 받는다. - ? | ||
|
||
## 프로그래밍 요구 사항 | ||
|
||
### 로또 미션 프로그래밍 요구 사항 | ||
|
||
- 변수 선언시 const 만 사용한다. | ||
- 함수(또는 메서드)의 들여쓰기 depth는 1단계까지만 허용한다. | ||
- 함수의 매개변수는 2개 이하여야 한다. | ||
- 함수에서 부수 효과를 분리하고, 가능한 순수 함수를 많이 활용한다. | ||
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. | ||
- 모든 기능을 TDD로 구현하는 것을 시도하여, 테스트 할 수 있는 도메인 로직에 대해서는 모두 단위 테스트가 존재해야 한다. (단, UI 로직은 제외) | ||
- 로또 번호와 당첨 로또 번호의 유효성 검사시 발생하는 중복 코드를 제거해야 한다. | ||
- 클래스(또는 객체)를 사용하는 경우, 프로퍼티를 외부에서 직접 꺼내지 않는다. 객체에 메시지를 보내도록 한다. | ||
|
||
### 자동차 경주 미션 프로그래밍 요구 사항을 포함 | ||
|
||
- 코드 스타일 가이드(airbnb)에 따라 컨벤션을 준수하며 개발한다. | ||
- ~~변수 선언시 var를 사용하지 않는다. let, const를 사용한다.~~ | ||
- 전역 변수를 만들지 않는다. | ||
- 축약하지 않는다. | ||
- 하드 코딩된 값 대신에 의미 있는 상수를 활용한다. | ||
- 동등 연산자는 === 로만 사용한다. | ||
- 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다. | ||
- 함수(또는 메서드)가 한 가지 일만 하도록 만든다. | ||
- ~~함수(또는 메서드)의 들여쓰기 depth는 2단계까지만 허용한다.~~ | ||
- ~~예를 들어 while문 안에 if문이 있으면 depth는 2단계 이다.~~ | ||
Comment on lines
+42
to
+50
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 취소선은 왜 있는걸까요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이번 미션의 프로그래밍 요구사항이 depth는 1단계까지만 허용한다고 해서, 이 부분은 취소선으로 표기했습니다! |
||
- 힌트) 함수(또는 메서드) 분리는 들여쓰기 depth를 줄이는 좋은 방법이다. | ||
- else 예약어를 쓰지 않는다. | ||
- 도메인 로직과 UI 로직을 분리한다. | ||
- 모든 도메인 로직에 단위 테스트를 구현한다. (UI 로직은 제외) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
기본 설정들과 얼마나 겹치는지 확인해보세요~