forked from woowacourse-precourse/javascript-lotto-6
-
Notifications
You must be signed in to change notification settings - Fork 3
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
[로또] 박지섭 미션 제출합니다. #2
Open
HarrySeop
wants to merge
40
commits into
gdgoc-skhu-missions:HarrySeop
Choose a base branch
from
HarrySeop:main
base: HarrySeop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
40 commits
Select commit
Hold shift + click to select a range
85b8cfc
Docs: 문서 양식 불러오기
HarrySeop 9a1f949
Docs: 구현할 기능 목록 최신화
HarrySeop 8e4001d
Feat: InputView 구현
SEYEON-PARK 0f29029
Docs: 가이드 수정
HarrySeop 8b2cb69
Merge branch 'main' of https://github.com/SEYEON-PARK/javascript-lotto
HarrySeop c2e80f1
Modify: 함수 선언 변경
HarrySeop 5a05a28
Add: Constant 사용을 위한 기본 구조 선언
HarrySeop 52f8f92
Feat: 로또 구입 금액 유효성 검사
HarrySeop c293d69
Add: TDD 구현
leemanjae02 26850b9
Modify: 구매 금액 TDD 완성
SEYEON-PARK 37f41aa
Modify: 페어 Prettier 설정 통일 + 구현 목록 업데이트
HarrySeop 4015299
Feat: 로또 당첨 번호 입력 유효성 검사 및 TDD 구현
leemanjae02 9bb0fec
Modify: Vanila JS 방식으로 구조 변경
HarrySeop 168e69d
Modify: 구입금액 관련 상수화 완료
HarrySeop 6be323f
Modify: 로또 당첨 금액 관련 상수화 완료
HarrySeop 1f0c886
Feat: 로또 번호 생성기 완성
leemanjae02 f8ef6b8
Feat: 보너스 번호 입력 구현
leemanjae02 4b61c3f
Add: 보너스 번호 유효성 검사 추가 및 TDD 구현
leemanjae02 0265fef
Modify: 진행상황 업데이트
HarrySeop a115b5b
Modify: 로또 유효성 검사 수정
SEYEON-PARK eefc62d
Modify: 로또 유효성 검사 추가 수정
SEYEON-PARK e01e156
Modify: 로또 유효성 검사 완료
SEYEON-PARK f12bb7e
Modify: 보너스 유효성 검사 완료, 진행상황 업데이트
HarrySeop 113ebe4
Add: 로또 클래스 함수 추가
HarrySeop facbad1
Feat: 출력문 구현 중, 오타 수정
HarrySeop 33dab06
Modify: 모듈 방식 수정...
HarrySeop bc71e2d
Modify: eslint 관련 코드 수정, 코드 최신화
SEYEON-PARK ab54c9d
Add: 로또 출력 메시지 구현
SEYEON-PARK 6758765
Add: 당첨번호 입력, 보너스 번호 입력 구현 완료, 모듈 형식 변경
HarrySeop cb8d3ed
Delete: 타입 검사 콘솔 제거
HarrySeop dbe6fa5
Add: 출력문 추가
HarrySeop d92a17a
Feat: 당첨 개수 반환 함수 추가
leemanjae02 5729a3d
Modify: export문 추가
leemanjae02 73c6d28
ADD : 맞은 개수 확인 코드 추가
SEYEON-PARK 058c284
Modify: 당첨 통계 출력 수정완료
HarrySeop 0923f1a
Docs: 구현할 기능 목록 최신화
HarrySeop a703b9e
Feat: 수익률 출력 구현 완료
HarrySeop dd526f3
Modify: 당첨통계 중복출력 수정
HarrySeop 6db3f81
Modify: 수익률 세자리마다 ,나오게 수정
HarrySeop 5dd55e7
Modify: 제출 전 파일 다듬기
HarrySeop File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* eslint-disable no-new */ | ||
/* eslint-disable import/extensions */ | ||
import Bonus from '../src/Bonus.js'; | ||
import { ERROR_MESSAGE } from '../src/constants/Message.js'; | ||
|
||
// eslint-disable-next-line max-lines-per-function | ||
describe('보너스 클래스 테스트', () => { | ||
test('보너스 번호가 숫자가 아니면 예외 발생', () => { | ||
expect(() => { | ||
new Bonus('굿'); | ||
}).toThrow(ERROR_MESSAGE.non_numeric_bonus); | ||
}); | ||
|
||
test('보너스 번호 테스트', () => { | ||
const bonus = new Bonus('5', [1, 2, 3, 4, 6, 7]); | ||
const bonusNumber = bonus.getBonusNumber(); | ||
expect(bonusNumber).toBe(5); | ||
}); | ||
|
||
test('보너스 번호가 1부터 45의 숫자가 아닌경우 예외 발생', () => { | ||
expect(() => { | ||
new Bonus('46'); | ||
}).toThrow(ERROR_MESSAGE.out_of_range_bonus); | ||
}); | ||
|
||
test('보너스 번호가 로또 번호와 중복된 경우 예외 발생', () => { | ||
expect(() => { | ||
new Bonus('6', [1, 2, 3, 4, 5, 6]); | ||
}).toThrow(ERROR_MESSAGE.duplicate_bonus); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,38 @@ | ||
import Lotto from "../src/Lotto.js"; | ||
/* eslint-disable no-new */ | ||
/* eslint-disable import/extensions */ | ||
import Lotto from '../src/Lotto.js'; | ||
import { ERROR_MESSAGE } from '../src/constants/Message.js'; | ||
|
||
describe("로또 클래스 테스트", () => { | ||
test("로또 번호의 개수가 6개가 넘어가면 예외가 발생한다.", () => { | ||
// eslint-disable-next-line max-lines-per-function | ||
describe('로또 클래스 테스트', () => { | ||
test('로또 번호의 개수가 6개가 넘어가면 예외가 발생한다.', () => { | ||
expect(() => { | ||
new Lotto([1, 2, 3, 4, 5, 6, 7]); | ||
}).toThrow("[ERROR]"); | ||
new Lotto('1,2,3,4,5,6,7'); | ||
}).toThrow(ERROR_MESSAGE.out_of_length_lotto); | ||
}); | ||
|
||
// TODO: 이 테스트가 통과할 수 있게 구현 코드 작성 | ||
test("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.", () => { | ||
test('로또 번호가 숫자가 아닐 경우 예외가 발생한다.', () => { | ||
expect(() => { | ||
new Lotto([1, 2, 3, 4, 5, 5]); | ||
}).toThrow("[ERROR]"); | ||
new Lotto('1,2,3,굿,6,7'); | ||
}).toThrow(ERROR_MESSAGE.non_numeric_lotto); | ||
}); | ||
|
||
// 아래에 추가 테스트 작성 가능 | ||
// // TODO: 이 테스트가 통과할 수 있게 구현 코드 작성 | ||
test('로또 번호가 1이상 45이하가 아닌경우 예외가 발생한다.', () => { | ||
expect(() => { | ||
new Lotto('0, 5, 100, 5, 2, 3'); | ||
}).toThrow(ERROR_MESSAGE.out_of_range_lotto); | ||
}); | ||
|
||
test('로또 당첨 번호는 중복일 수 없습니다.', () => { | ||
expect(() => { | ||
new Lotto('1,2,3,4,4,6'); | ||
}).toThrow(ERROR_MESSAGE.duplicate_lotto); | ||
}); | ||
|
||
test('로또 금액 배열로 변환 테스트', () => { | ||
const lotto = new Lotto('1,2,3,4,5,6'); | ||
const test = lotto.changeStringToArray('1,2,3,4,5,6'); | ||
expect(test).toStrictEqual([1, 2, 3, 4, 5, 6]); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* eslint-disable no-new */ | ||
/* eslint-disable import/extensions */ | ||
import Purchase from '../src/Purchase.js'; | ||
import { ERROR_MESSAGE } from '../src/constants/Message.js'; | ||
|
||
describe('로또 구입금액 테스트', () => { | ||
test('입력금액을 통해 구매수량 구하기', () => { | ||
const purchase = new Purchase('10000'); | ||
const amount = purchase.getQuantity(); | ||
expect(amount).toBe(10); | ||
}); | ||
|
||
test('0이하의 숫자를 입력할 경우 에러 발생', () => { | ||
expect(() => { | ||
new Purchase('-1'); | ||
}).toThrow(ERROR_MESSAGE.non_positive_money); | ||
}); | ||
|
||
test('숫자가 아닌 경우 에러 발생', () => { | ||
expect(() => { | ||
new Purchase('굿'); | ||
}).toThrow('[ERROR]'); | ||
}); | ||
|
||
test('공백을 입력한 경우 에러 발생', () => { | ||
expect(() => { | ||
new Purchase(' '); | ||
}).toThrow('[ERROR]'); | ||
}); | ||
|
||
test('1000으로 나누어 떨어지지 않으면 에러 발생', () => { | ||
expect(() => { | ||
new Purchase('30'); | ||
}).toThrow('[ERROR]'); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
# GDSC Pair Programming Guide | ||
|
||
코드 컨벤션의 기반 스타일 가이드는 [Airbnb 자바스크립트 스타일 가이드](https://github.com/airbnb/javascript)를 기준으로 합니다. | ||
기본 Airbnb 스타일 가이드 외의 아래의 가이드를 지켜야 합니다. | ||
|
||
## 네이밍 컨벤션 | ||
|
||
- 소스의 변수명, 클래스명 등에는 영문 이외의 언어를 사용하지 않습니다. | ||
- 클래스, 메서드 등의 이름에는 특수 문자를 사용하지 않습니다. | ||
|
||
| 폴더명 | • snake_case | | ||
| -------- | ------------ | | ||
| 파일명 | • PascalCase | | ||
| 클래스명 | • PascalCase | | ||
|
||
## 함수 이름 짓기 | ||
|
||
- 함수 하나는 한 가지의 일만 해야 하므로 함수명은 직관적으로 작성해야 합니다. | ||
|
||
| 함수명 | 의미 | 예시 | | ||
| --------- | -------------------- | ------------- | | ||
| show... | 무엇을 보여주는 함수 | showMessage() | | ||
| get... | 값을 반환하는 함수 | getNumber() | | ||
| calc... | 값을 반환하는 함수 | calcSum() | | ||
| create... | 무엇을 생성하는 함수 | createForm() | | ||
|
||
--- | ||
|
||
# 커밋 컨벤션 | ||
|
||
💡커밋은 논리적으로 구분이 되고, 일관성이 유지되는 단위로 최대한 작게 쪼개서 작성합니다. | ||
|
||
## 커밋 메세지 컨벤션 | ||
|
||
1. 영어 컨벤션은 5개만 사용 (**Feat, Add, Modify, Docs, Delete**) | ||
|
||
- **Feat** : 기능 추가 (초기 기능 추가할 때) | ||
- **Add** : 코드 추가 (어떠한 기능 내에 기능을 더 추가할 때) | ||
- **Modify** : 코드 수정 ( 버그 수정, 코드 지우고, 추가하고, 수정하는 모든 과정들 ) | ||
- **Docs** : 문서 수정 (기능 구현 목록 수정, 추가 등등) | ||
- **Delete** : 코드 삭제 (코드만 지우는 것) | ||
|
||
2. **영어 컨벤션** + **커밋 메시지** 형식으로 작성 | ||
- 예시 : Feat: 로그인 기능구현 (영어:(공백)한글 커밋 메세지) | ||
- 깃모지는 선택사항이지만 사용 시 영어 앞에 사용합니다. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
## 📈 구현할 기능 목록 | ||
|
||
- 입력 | ||
|
||
- [x] 로또를 위한 구입 금액 입력받기 | ||
- [x] 로또 당첨번호 입력받기(번호는 쉼표를 기준으로 구분한다.) | ||
- [x] 로또 보너스 번호 입력받기 | ||
|
||
- 출력 | ||
|
||
- [x] 발행한 로또 수량 출력하기 | ||
- [x] 발행한 로또 번호 출력하기 | ||
- [x] 당첨 내역(통계) 출력하기 | ||
- [x] 수익률 출력하기(소수점 둘째자리에서 반올림 하기) | ||
|
||
- 기능 | ||
|
||
- [x] 입력받은 금액을 1000원으로 나눠서 장수로 반환하는 기능 구현하기 | ||
- [x] 1부터 45까지 6개의 숫자를 랜덤으로 반환하는 기능 구현하기 | ||
- 우테코 라이브러리 사용하기 | ||
- [x] 당첨번호 비교 후, 당첨된 매수 반환하는 기능 구현하기 | ||
- [x] 수익률 계산하는 기능 구현하기 | ||
- [x] 세자리 마다 쉼표로 구분하기 | ||
- [x] 소수점 둘째 자리에서 반올림 하기 | ||
- [ ] 수익률이 정수일 경우 소수점 첫째 자리에 0을 표시한다(ex: 100.0%) | ||
|
||
## 🎯 예외 예상 상황 목록 | ||
|
||
- 로또를 위한 구입 금액 입력 부분 | ||
|
||
- [x] 숫자가 아닌 것을 입력했을 경우 | ||
- [x] 0 이하의 숫자를 입력했을 경우 (0, 음수) | ||
- [x] 입력을 하지 않았을 경우 | ||
- [x] 1,000원으로 나누어 떨어지지 않는 경우 | ||
|
||
- 로또 당첨번호 입력 부분 | ||
|
||
- [x] 1이상 45 이하 숫자가 아닌 경우 | ||
- [x] (쉼표로 구분한 당첨번호가) 6개가 아닌 경우 | ||
- [x] 중복을 입력한 경우 | ||
|
||
- [ ] ,가 맨 앞에 오는 경우 | ||
- [ ] ,가 맨 뒤에 오는 경우 | ||
- [ ] ,가 중복되서 입력 되는 경우 | ||
|
||
- 로또 보너스 번호 입력 | ||
|
||
- [x] 숫자가 아닌 것을 입력했을 경우 | ||
- [x] 1이상 45 이하 숫자가 아닌 경우 | ||
- [x] 당첨번호랑 중복일 경우 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,15 @@ | ||
/* eslint-disable import/extensions */ | ||
import Game from './Game.js'; | ||
|
||
class App { | ||
async play() {} | ||
// eslint-disable-next-line class-methods-use-this | ||
play() { | ||
const game = new Game(); | ||
game.start(); | ||
} | ||
} | ||
|
||
const app = new App(); | ||
app.play(); | ||
|
||
export default App; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/* eslint-disable class-methods-use-this */ | ||
/* eslint-disable import/extensions */ | ||
import { ERROR_MESSAGE } from './constants/Message.js'; | ||
import { LOTTO } from './constants/Constants.js'; | ||
|
||
class Bonus { | ||
#bonusNumber; | ||
|
||
constructor(bonusNumber, winningNumbers) { | ||
this.validate(bonusNumber, winningNumbers); | ||
this.#bonusNumber = Number(bonusNumber); | ||
} | ||
|
||
validate(bonusNumber, winningNumbers) { | ||
const parseNumber = Number(bonusNumber); | ||
this.checkNunNumber(parseNumber); | ||
this.checkBonusRange(parseNumber); | ||
this.checkDuplicateBonus(parseNumber, winningNumbers); | ||
} | ||
|
||
checkNunNumber(parseNumber) { | ||
if (Number.isNaN(parseNumber)) { | ||
throw new Error(ERROR_MESSAGE.non_numeric_bonus); | ||
} | ||
} | ||
|
||
checkBonusRange(parseNumber) { | ||
if (parseNumber < LOTTO.minimum || parseNumber > LOTTO.maximum) { | ||
throw new Error(ERROR_MESSAGE.out_of_range_bonus); | ||
} | ||
} | ||
|
||
checkDuplicateBonus(parseNumber, winningNumbers) { | ||
if (winningNumbers.includes(parseNumber)) { | ||
throw new Error(ERROR_MESSAGE.duplicate_bonus); | ||
} | ||
} | ||
|
||
getBonusNumber() { | ||
return this.#bonusNumber; | ||
} | ||
} | ||
|
||
export default Bonus; |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
해당 유효성 검사도 구현하려고 했으나 실패했었고 우선순위에서 밀린다고 생각해서 포기하고 해당 미션을 먼저 수행했습니다. jest를 통한 검사가 아닌 node를 통해 실행해서 검사하는 과정에서 해당 조건을 입력하면 [ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다. 를 출력하여 본의아니게(?) 검사과정에서 걸러졌습니다.
이런 경우에 추가적으로 유효성 검사를 추가하는 것이 좋은지 아니면 검사할 필요가 없는 조건인지 확인부탁드립니다!
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.
지섭님의 말씀대로 해당 조건과 다른 구현사항을 비교해보았을 때, 우선순위에서 밀리는 것에 저도 동의합니다!
다만 요렇게 꼼꼼하게 입력에 대해 검증하는 것도 필요해요!
테스트 한다면
InputView로 넘어오는 입력값
을 검증하면 되겠죠?!