-
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단계 - 콘솔 기반 로또 게임] 센트(김영우) 미션 제출합니다. #174
Changes from all commits
aa2cb08
87e601a
2f05918
b70385c
985fade
c3a01fe
07ef6a9
310cf75
ed5ad95
0a204c2
50c5ae5
bd636c9
3ca1dc8
943f7ed
92a0198
2af4b53
853d6ad
798048e
9b01e6e
57db5bd
b295031
ab08662
cc3904f
a42c6b5
a1b8292
02a2e32
ed281f4
4439fda
d8abddd
2f8bbe2
fc2e2ff
316d7c9
316b085
e12107e
0ec3bd8
cc931f0
cc62a94
f4ecc14
10ea448
42d6916
4cad90b
4dece78
7b07aad
979d32e
7cacc14
61e66da
bda4f74
2636e6b
53a430a
c308849
109b261
daf00cb
1fe7289
7d39c97
701bd06
8ac62d7
0157f5e
01c60f5
3247eab
d24cb62
7485474
a885dda
22e668a
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,40 @@ | ||
{ | ||
"rules": {}, | ||
"env": { | ||
"browser": true, | ||
"es6": true, | ||
"node": true | ||
}, | ||
"parserOptions": { | ||
"ecmaVersion": "latest" | ||
}, | ||
"extends": ["eslint:recommended", "plugin:prettier/recommended"] | ||
"extends": ["airbnb", "plugin:prettier/recommended"], | ||
"rules": { | ||
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. 5기는 |
||
"prettier/prettier": [ | ||
"error", | ||
{ "singleQuote": true, "endOfLine": "auto" } | ||
], | ||
"indent": ["error", 2], | ||
"quotes": ["error", "single"], | ||
"max-lines-per-function": ["error", 12], | ||
"max-depth": ["error", 2], | ||
"no-else-return": ["error", { "allowElseIf": false }], | ||
"max-params": ["error", 3], | ||
"no-confusing-arrow": [ | ||
"error", | ||
{ "allowParens": true, "onlyOneSimpleParam": false } | ||
], | ||
"prefer-destructuring": [ | ||
"error", | ||
{ | ||
"array": true, | ||
"object": true | ||
}, | ||
{ | ||
"enforceForRenamedProperties": false | ||
} | ||
], | ||
"spaced-comment": ["error", "always", { "exceptions": ["-", "+"] }], | ||
"eol-last": ["error", "always"], | ||
"no-var": "error" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,4 @@ | ||
node_modules/ | ||
dist/ | ||
|
||
TODO.md |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
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. 여기도..ㅠㅠ주석이.. |
||
"editor.formatOnSave": true, | ||
"[javascript]": { | ||
"editor.formatOnSave": true | ||
}, | ||
"editor.codeActionsOnSave": { | ||
"source.fixAll.eslint": true | ||
}, | ||
"eslint.alwaysShowStatus": true, | ||
"prettier.disableLanguages": ["js"], | ||
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. 아니 이것은... 👀 |
||
"files.autoSave": "onFocusChange" | ||
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. "[javascript]": {
"editor.formatOnSave": true
}, 위의 설정이랑 겹치지 않을까요? |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
/*eslint-disable */ | ||
const { profitByRank } = require("../src/constants/constants"); | ||
const Lotto = require("../src/domain/model/Lotto"); | ||
const { calculateProfit } = require("../src/utils"); | ||
|
||
describe("로또 클래스 테스트", () => { | ||
test.each([ | ||
[8, 21, 23, 41, 42, 43], | ||
[3, 5, 11, 16, 32, 38], | ||
[7, 11, 16, 35, 36, 44], | ||
[1, 8, 11, 31, 41, 42], | ||
])( | ||
"당첨 번호를 넘겨주었을 때, 해당 값을 필드로 갖는 인스턴스를 생성 기능", | ||
(lottoNumbers) => { | ||
const lotto = new Lotto(lottoNumbers); | ||
|
||
expect(lottoNumbers).toEqual(lotto.getNumbers()); | ||
} | ||
); | ||
|
||
test.each([ | ||
{ input: [1, 2, 3, 4, 5, 6], caculatedRank: 1 }, | ||
{ input: [1, 2, 3, 4, 5, 7], caculatedRank: 2 }, | ||
{ input: [1, 2, 3, 4, 5, 8], caculatedRank: 3 }, | ||
{ input: [1, 2, 3, 4, 8, 9], caculatedRank: 4 }, | ||
{ input: [1, 2, 3, 8, 9, 10], caculatedRank: 5 }, | ||
{ input: [8, 9, 10, 11, 12, 13], caculatedRank: undefined }, | ||
])( | ||
"당첨 번호와 보너스 번호를 넘겨주었을 때, 로또 번호와 비교하여 등수를 계산 기능", | ||
({ input, caculatedRank }) => { | ||
const lotto = new Lotto(input); | ||
const winningNumbers = [1, 2, 3, 4, 5, 6]; | ||
const bonusNumber = 7; | ||
|
||
lotto.calculateRank(winningNumbers, bonusNumber); | ||
|
||
expect(lotto.getRank()).toEqual(caculatedRank); | ||
} | ||
); | ||
|
||
test.each([ | ||
{ lottoNumber: [1, 2, 3, 4, 5, 6], caculatedProfit: profitByRank[0] }, | ||
{ lottoNumber: [1, 2, 3, 4, 5, 7], caculatedProfit: profitByRank[1] }, | ||
{ lottoNumber: [1, 2, 3, 4, 5, 8], caculatedProfit: profitByRank[2] }, | ||
{ lottoNumber: [1, 2, 3, 4, 8, 9], caculatedProfit: profitByRank[3] }, | ||
{ lottoNumber: [1, 2, 3, 8, 9, 10], caculatedProfit: profitByRank[4] }, | ||
{ lottoNumber: [8, 9, 10, 11, 12, 13], caculatedProfit: 0 }, | ||
])("등수 입력시 수익을 반환하는 기능", ({ lottoNumber, caculatedProfit }) => { | ||
const lotto = new Lotto(lottoNumber); | ||
const winningNumbers = [1, 2, 3, 4, 5, 6]; | ||
const bonusNumber = 7; | ||
|
||
lotto.calculateRank(winningNumbers, bonusNumber); | ||
|
||
const profit = calculateProfit(lotto.getRank()); | ||
|
||
expect(profit).toBe(caculatedProfit); | ||
}); | ||
|
||
test.each([ | ||
{ lottoNumber: [1, 2, 3, 4, 5, 6], caculatedProfit: profitByRank[0] }, | ||
{ lottoNumber: [1, 2, 3, 4, 5, 7], caculatedProfit: profitByRank[1] }, | ||
{ lottoNumber: [1, 2, 3, 4, 5, 8], caculatedProfit: profitByRank[2] }, | ||
{ lottoNumber: [1, 2, 3, 4, 8, 9], caculatedProfit: profitByRank[3] }, | ||
{ lottoNumber: [1, 2, 3, 8, 9, 10], caculatedProfit: profitByRank[4] }, | ||
{ lottoNumber: [8, 9, 10, 11, 12, 13], caculatedProfit: 0 }, | ||
])("등수 입력시 수익을 반환하는 기능", ({ lottoNumber, caculatedProfit }) => { | ||
const lotto = new Lotto(lottoNumber); | ||
const winningNumbers = [1, 2, 3, 4, 5, 6]; | ||
const bonusNumber = 7; | ||
|
||
lotto.calculateRank(winningNumbers, bonusNumber); | ||
|
||
const profit = calculateProfit(lotto.getRank()); | ||
|
||
expect(profit).toBe(caculatedProfit); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
/*eslint-disable */ | ||
const Validator = require('../src/domain/validation/validator'); | ||
|
||
describe('기능 테스트', () => { | ||
test('구입 금액에 따라 로또 개수 반환하기', () => { | ||
//given | ||
const LottoGameController = require('../src/controller/LottoGameController'); | ||
const lottoGameController = new LottoGameController(); | ||
const purchasePrice = '8000'; | ||
|
||
//when | ||
const lottoCount = lottoGameController.calculateLottoCount(purchasePrice); | ||
|
||
//then | ||
expect(lottoCount).toBe(8); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/*eslint-disable */ | ||
const Lottos = require("../src/domain/model/Lottos"); | ||
|
||
describe("Lottos 테스트", () => { | ||
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. 아주 깔끔한 테스트군요 ㅎㅎ |
||
test("로또 개수에 맞는 Lotto 인스턴스 생성 기능", () => { | ||
// given | ||
const lottoCount = 1000; | ||
|
||
// when | ||
const lottos = new Lottos(lottoCount); | ||
const winningNumbers = [1, 2, 3, 4, 5, 6]; | ||
const bonusNumber = 7; | ||
|
||
lottos.calculateAllRanks(winningNumbers, bonusNumber); | ||
|
||
// then | ||
expect(lottos.getLottos().length).toEqual(lottoCount); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/*eslint-disable */ | ||
const Validator = require("../src/domain/validation/validator"); | ||
|
||
describe("Validator 테스트", () => { | ||
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. 유효성 검사가 꼼꼼하네요 |
||
test.each([ | ||
{ input: "우테코", expected: false }, | ||
{ input: "1000", expected: true }, | ||
])("입력된 구입 금액이 숫자인지 판별하기.", ({ input, expected }) => { | ||
expect(Validator.isNumber(input)).toBe(expected); | ||
}); | ||
|
||
test.each([ | ||
{ input: " ", expected: true }, | ||
{ input: "1000", expected: false }, | ||
])( | ||
"입력된 구입 금액이 공백을 포함하는지 판별하기.", | ||
({ input, expected }) => { | ||
expect(Validator.isBlankIncluded(input)).toBe(expected); | ||
} | ||
); | ||
|
||
test.each([ | ||
{ input: "", expected: true }, | ||
{ input: "1000", expected: false }, | ||
])("입력된 구입 금액이 빈 문자열인지 판별하기.", ({ input, expected }) => { | ||
expect(Validator.isEmpty(input)).toBe(expected); | ||
}); | ||
|
||
test.each([ | ||
{ input: "-1000", expected: true }, | ||
{ input: "0", expected: true }, | ||
{ input: "1000", expected: false }, | ||
])("입력된 구입 금액이 0또는 음수인지 판별하기.", ({ input, expected }) => { | ||
expect(Validator.isSmallerOrEqualThanZero(input)).toBe(expected); | ||
}); | ||
|
||
test.each([ | ||
{ input: "700", expected: false }, | ||
{ input: "1200", expected: false }, | ||
{ input: "3000", expected: true }, | ||
])("입력된 구입 금액이 1000원 단위인지 판별하기.", ({ input, expected }) => { | ||
expect(Validator.checkUnit(input)).toBe(expected); | ||
}); | ||
|
||
test.each([ | ||
{ input: " ", expected: false }, | ||
{ input: "-1000", expected: false }, | ||
{ input: "0", expected: false }, | ||
{ input: "700", expected: false }, | ||
{ input: "1200", expected: false }, | ||
{ input: "k", expected: false }, | ||
{ input: "3000", expected: true }, | ||
])("구입 금액 입력값이 유효한지 판별하기.", ({ input, expected }) => { | ||
expect(Validator.purchasePrice(input)).toBe(expected); | ||
}); | ||
|
||
test.each([ | ||
{ input: "", expected: false }, | ||
{ input: "1, 2, 3, 4, 5, 6", expected: false }, | ||
{ input: "1,2,3,4,5", expected: false }, | ||
{ input: "1,1,2,3,4,5", expected: false }, | ||
{ input: "0,1,2,3,4,5", expected: false }, | ||
{ input: "1,2,3,4,5,46", expected: false }, | ||
{ input: "1,2,3,4,5,6", expected: true }, | ||
])("당첨 번호 입력값이 유효한지 판별하기.", ({ input, expected }) => { | ||
expect(Validator.winningNumbers(input)).toBe(expected); | ||
}); | ||
|
||
test.each([ | ||
{ input: "", expected: false }, | ||
{ input: "k", expected: false }, | ||
{ input: "0", expected: false }, | ||
{ input: "46", expected: false }, | ||
{ input: "6", expected: false }, | ||
{ input: "7", expected: true }, | ||
])("보너스 번호 입력값이 유효한지 판별하기.", ({ input, expected }) => { | ||
const winningNumbers = [1, 2, 3, 4, 5, 6]; | ||
expect(Validator.bonusNumber(winningNumbers, input)).toBe(expected); | ||
}); | ||
|
||
test.each([ | ||
{ input: "", expected: false }, | ||
{ input: "yk", expected: false }, | ||
{ input: "y ", expected: false }, | ||
{ input: "y", expected: true }, | ||
{ input: "n", expected: true }, | ||
])("다시 시작 명령어 입력값이 유효한지 판별하기.", ({ input, expected }) => { | ||
expect(Validator.checkRestartCommand(input)).toBe(expected); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
/* eslint-disable no-undef */ | ||
const WinningLotto = require('../src/domain/model/WinningLotto'); | ||
|
||
describe('WinningLotto 클래스 테스트', () => { | ||
test('당첨번호와 보너스 번호가 중복되면 에러를 발생시킨다.', () => { | ||
const winningNumbers = [1, 2, 3, 4, 5, 6]; | ||
const bonusNumber = 6; | ||
|
||
expect(() => { | ||
const winningLotto = new WinningLotto(winningNumbers, bonusNumber); | ||
}).toThrow(); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
# 기능 목록 | ||
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. 체크박스 추가했습니다! 진행상황을 중간중간 체크하기 위해서 체크박스를 쓰는 것이 좋을 것 같네요!! 감사합니다😀😀 수정된 커밋: c308849 |
||
|
||
- [x] 구입금액 입력하기 | ||
|
||
- [x] 콘솔로 입력 받기 (view) | ||
- [x] 숫자가 아닌 경우 에러 발생 (domain) | ||
- [x] 띄어쓰기(또는 아무것도 입력하지 않은 경우)인 경우 에러 발생 (domain) | ||
- [x] 0 이하의 값을 입력할 경우 에러 발생 | ||
- [x] 1,000원 단위가 아닌 경우 에러 발생 (domain) | ||
- [x] 입력된 금액으로 로또 개수 계산 (domain) | ||
- [x] 계산된 로또 개수로 LottoGame 클래스 인스턴스 생성 (domain) | ||
|
||
<hr> | ||
|
||
- [x] 로또 번호 랜덤으로 생성하기 | ||
|
||
- [x] 랜덤 숫자 생성 함수 구현 | ||
|
||
<hr> | ||
|
||
- [x] 구입한 로또 개수 및 번호 보여주기 (view) | ||
|
||
- [x] 발행된 로또 번호순으로 정렬하기 (domain) | ||
|
||
<hr> | ||
|
||
- [x] 당첨번호 입력하기 | ||
|
||
- [x] 콘솔로 입력 받기 (view) | ||
- [x] 숫자가 아닌 경우 에러 발생 (domain) | ||
- [x] 띄어쓰기(또는 아무것도 입력하지 않은 경우)인 경우 에러 발생 (domain) | ||
- [x] 당첨번호가 6개 아닌 경우 (domain) | ||
- [x] 당첨번호가 중복되는 경우 (domain) | ||
- [x] 숫자 범위가 1 ~ 45가 아닌 경우 에러 발생 (domain) | ||
|
||
<hr> | ||
|
||
- [x] 보너스 번호 입력하기 | ||
|
||
- [x] 콘솔로 입력 받기 (view) | ||
- [x] 숫자가 아닌 경우 에러 발생 (domain) | ||
- [x] 띄어쓰기(또는 아무것도 입력하지 않은 경우)인 경우 에러 발생 (domain) | ||
- [x] 당첨번호 6개 중 중복되는 경우 에러 발생 (domain) | ||
- [x] 숫자 범위가 1 ~ 45가 아닌 경우 에러 발생 (domain) | ||
|
||
<hr> | ||
|
||
- [x] 당첨 통계 계산하기 (Lotto Class) | ||
|
||
- [x] 번호 일치하는 개수를 당첨 금액에 따라 계산하기 (domain) | ||
- [x] 총 수익률 계산하기 (domain) | ||
- [x] 콘솔에 출력하기 (view) | ||
|
||
<hr> | ||
|
||
- [x] 다시 시작/종료 명령어 입력하기 | ||
|
||
- [x] 콘솔로 입력 받기 (view) | ||
- [x] y 또는 n 이 아닌 경우 에러 발생 (domain) | ||
|
||
<hr> | ||
|
||
- [x] 예외 상황 처리 | ||
- [x] 에러 메시지 출력 후 그 부분부터 다시 입력 (view) |
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.
OMG... 😱
프론트엔드 개발자라면 다양한 확장자를 주의해서 다뤄야합니다.
HTML.. CSS... JS 모두 주석 사용 방법도 다른데요. JSON은 설정 파일이기때문에 더 주의해야합니다.
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.
JSON에 주석이 지원되지 않는다는 것을 모르고 그동안 사용했던 것 같네요 😭😭
수정한 커밋: bda4f74
추가로 주신 질문들을 보고 학습 한 내용입니다!
Q: JSON은 누가? 왜? 무엇을 대체하기 위해 만들어졌을까요?
A: XML로 정보를 주고 받을 때 헤더와 태그 등 여러 요소들로 인해 가독성이 떨어지고, 쓸데 없는 용량을 잡아먹는다는 단점을 갖고 있어 이를 대체하기 위해 더글라스 크록포드에 의해 만들어졌습니다!
Q: JSON에서는 주석이 가능할까요?
A: JSON에는 주석을 지원하지 않아 설정파일에 주로 사용됩니다! (이걸 몰랐네요 ㅠㅠㅠ)
Q: 현재 이 JSON을 파싱해보면 잘 동작할까요?
A:
주석이 있을 때 파싱이 이루어질 수 있는지 판별해보고자 간단한 예시 코드를 실행시켜 보았더니 오류가 발생하는 것을 확인할 수 있었습니다😭
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.
오 완벽합니다!!
JSON
에게 어쩌면 주석조차도 데이터가 아닐까요? 후후