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단계 - 콘솔 기반 로또 게임] 버건디(전태헌) 미션 제출합니다. #263

Merged
merged 45 commits into from
Feb 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
fdfcd07
chore: eslint prettier 세팅
lurgi Feb 20, 2024
c253530
docs: REQUIREMENT 작성
lurgi Feb 20, 2024
69229a1
test: 구매 금액에 해당하는 만큼 로또 발행
lurgi Feb 20, 2024
f6a82ea
feat: 구입 금액에 해당하는 금액 만큼 로또 발행
lurgi Feb 20, 2024
30663f4
test: 1~45이하의 숫자가 아닌 경우 에러 발생
lurgi Feb 20, 2024
95befe2
test: 로또 번호 중복 숫자 혹은 6개 넘을 시 에러
lurgi Feb 20, 2024
809ad41
feat: 로또 클래스 유효성 검증
lurgi Feb 20, 2024
bc8db2a
feat: 무작위 1~45 숫자 6개 생성
lurgi Feb 20, 2024
397fa59
refactor: Lotto Number 클래스 분리
lurgi Feb 20, 2024
78789df
test: 로또 번호를 통해 등수를 저장한다.
lurgi Feb 20, 2024
40534e9
chore: eslint 불필요한 기능 수정
lurgi Feb 20, 2024
725017c
refactor: Lotto 테스트 winNumbers -> winObj으로 수정
lurgi Feb 20, 2024
c472560
feat: 당첨 번호를 입력 받아서 몇 등인지 저장한다
lurgi Feb 20, 2024
afa9e77
refactor: Lotto 테스트 명세 수정
lurgi Feb 21, 2024
c6887ec
docs: 설계 이미지 추가
lurgi Feb 21, 2024
508421f
test: WinLottoNumber 보너스 숫자 유효성 테스트
lurgi Feb 21, 2024
9e7379c
test: WinLottoNumber 테스트 수정
lurgi Feb 21, 2024
1eb10a2
feat: WinLottoNumber 유효성 검증 구현
lurgi Feb 21, 2024
fd87bfc
test: 1000원 미만 입력인 경우 에러를 던진다
lurgi Feb 21, 2024
70c32e1
feat: 1000원 미만의 경우 유효성 검증 구현
lurgi Feb 21, 2024
57e8da5
feat: 로또 구입 금액을 입력받는다.
lurgi Feb 21, 2024
b231ab2
fix: 함수 표현식 수정
lurgi Feb 21, 2024
3e6406d
feat: 로또 번호는 오름차순으로 정렬하여 출력
lurgi Feb 22, 2024
a6b5882
feat: 우승 번호 보너스 번호 입력 받는다
lurgi Feb 22, 2024
664aa91
refactor: WinLottoNumber 테스트 코드 수정
lurgi Feb 22, 2024
69137d9
feat: 로또 등수 반환
lurgi Feb 22, 2024
418ce55
feat: 당첨 내역 출력
lurgi Feb 22, 2024
15cf4ce
feat: 로또 결과 출력
lurgi Feb 22, 2024
2e569a2
feat: 우승 로또 숫자, 보너스 숫자 재실행
lurgi Feb 22, 2024
10f90da
feat: 통계 출력 이후 재시작/종료 여부 입력
lurgi Feb 22, 2024
1cc0870
refactor: 상수 분리
lurgi Feb 22, 2024
6d49a41
refactor: 상수 줄바꿈 수정 및 에러 메세지 분리
lurgi Feb 22, 2024
b16c0fb
feat: 깊은 동결 유틸함수 작성
brgndyy Feb 24, 2024
449235f
feat: 커스텀 에러 클래스 생성
brgndyy Feb 24, 2024
cef738a
feat: 상수 관련 파일들 생성
brgndyy Feb 24, 2024
0a25e49
refactor: 기존 WinLottoNumbers 클래스를WinningLotto로 변경
brgndyy Feb 24, 2024
9d864e6
refactor: Controller 클래스를 LottoController로 변경
brgndyy Feb 24, 2024
ac843b7
feat: 입력값을 받을때의 try-catch 구문을 담은 유틸함수 생성
brgndyy Feb 24, 2024
496c66b
refactor: Lotto 클래스는 단일 6개의 숫자만 취급하도록 수정
brgndyy Feb 24, 2024
faefdb8
refactor: LottoMachine 클래스 수정
brgndyy Feb 24, 2024
33ef117
feat: 당첨 결과를 관리하는 RewardGenerator 클래스 생성
brgndyy Feb 24, 2024
45bb854
feat: 시작값부터 끝의 범위 안의 랜덤 값을 만들어주는 유틸함수 생성
brgndyy Feb 24, 2024
1277912
refactor: inputview, outputview 코드 리팩토링
brgndyy Feb 24, 2024
96e58fa
refactor: 테스트코드 재작성
brgndyy Feb 24, 2024
7b08843
refactor: 필요없는 파일 삭제 및 진입점 파일 컨트롤러 이름 수정
brgndyy Feb 24, 2024
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
18 changes: 15 additions & 3 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
{
"rules": {},
"rules": {
"max-depth": ["error", 1],
"max-params": ["error", 2],
"class-methods-use-this": "off",
"no-useless-constructor": "off"
},
"overrides": [
{
"files": ["./src/**"],
"rules": { "max-lines-per-function": ["error", { "max": 10 }] }
}
],
"env": {
"es6": true,
"node": true
"node": true,
"jest": true
},
"parserOptions": {
"ecmaVersion": "latest"
},
"extends": ["eslint:recommended", "plugin:prettier/recommended"]
"extends": ["airbnb", "prettier"]
}
8 changes: 8 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
{
"singleQuote": true,
"semi": true,
"useTabs": false,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 120,
"bracketSpacing": true,
"arrowParens": "always",
"endOfLine": "auto"
}
23 changes: 23 additions & 0 deletions __tests__/Lotto.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import Lotto from '../src/Domain/Lotto';

describe('6개의 숫자를 관리하는 로또 클래스 테스트', () => {
test('정상적으로 6개의 숫자를 가진 배열이 입력 되면, 해당 값을 필드 값으로 가질 수 있다.', () => {
const validInput = [1, 2, 3, 4, 5, 6];
const lotto = new Lotto(validInput);
expect(lotto.getLottoNumbers()).toEqual(validInput);
});

test('중복 된 숫자를 가진 배열이 Lotto 클래스의 인스턴스가 된다면 예외처리 한다.', () => {
const invalidInput = [1, 2, 2, 4, 5, 6];
expect(() => new Lotto(invalidInput)).toThrow();
});

test.each([
[
[0, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 46],
],
])('1 이상 45 이하가 아닌 번호가 Lotto 클래스의 인스턴스가 됐을 시에 예외 처리한다.', (invalidInput) => {
expect(() => new Lotto(invalidInput)).toThrow();
});
});
17 changes: 17 additions & 0 deletions __tests__/LottoMachine.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import LottoMachine from '../src/Domain/LottoMachine';
import LOTTO_SETTING from '../src/Constants/lottoSetting';

describe('로또를 생성해주고 결과를 반환해주는 로또 머신 클래스에 대한 테스트', () => {
test.each([[7000], [8000]])('구입금액에 해당하는 만큼 로또를 발행한다.', (validInput) => {
// arrange
const lottoMachine = new LottoMachine(validInput);

const totalLottoLength = lottoMachine.getLottos().length;

expect(totalLottoLength).toBe(validInput / LOTTO_SETTING.MIN_PRICE);
});

test.each([0, -1000, 999])('1000원 미만인 경우, (%i 인 경우) 에러를 던진다.', (money) => {
expect(() => new LottoMachine(money)).toThrow();
});
});
25 changes: 25 additions & 0 deletions __tests__/WinningLotto.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import WinningLotto from '../src/Domain/WinningLotto';

describe('WinLottoNumber 클래스에서 보너스 번호에 대한 테스트 코드 작성', () => {
test('보너스 번호를 입력받았을때, 당첨 번호와 겹치는 숫자 있을시에 예외처리한다.', () => {
const winLottoNumber = new WinningLotto();

const winNumbers = [1, 2, 3, 4, 5, 6];

winLottoNumber.setWinLottoNumbers(winNumbers);

const invalidInput = 6;

expect(() => winLottoNumber.setBonusNumber(invalidInput)).toThrow();
});

test.each([0, 46])('입력 받은 보너스 번호가 1미만 45를 초과하는 %i 인 경우 예외 처리 한다.', (invalidInput) => {
const winLottoNumber = new WinningLotto();

const winNumbers = [1, 2, 3, 4, 5, 6];

winLottoNumber.setWinLottoNumbers(winNumbers);

expect(() => winLottoNumber.setBonusNumber(invalidInput)).toThrow();
});
});
66 changes: 66 additions & 0 deletions docs/REQUIREMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
## 😛기능 구현 목록

### Domain

1. Lotto Number

1. 필드
- LottoNumbers
2. Valid
- [x] 1~45 숫자인지 확인하고, 중복 검사, 숫자가 6개인지 검사

2. Lotto

1. 필드
-Rank
2. [x] 당첨 번호를 입력 받아서 몇 등인지 Rank에 저장. 당첨은 1등부터 5등까지 있다.

3. Lotto_machine

1. 필드

- winLottoNumbers
- lottos
- money

1. [x] 구입 금액에 해당하는 만큼 로또를 발행
1. [x] 로또 1장의 가격은 1,000원이다.
- 최소 1000원 이상이어야 한다.
1. [x] Lotto 번호를 발행.( 1 ~ 45의 중복되지 않은 숫자를 발행한다.)

4. WinLottoNumbers
1. [x] 당첨 번호 입력 값을 통해 WinLottoNumbers에 대한 유효성 검증
2. [x] bonusNumber에 대한 유효성 검증

### View

1. [x] 로또 구입 금액을 입력한다.
2. [x] 로또 번호는 오름차순으로 정렬하여 보여준다.
3. [x] 당첨 번호와 보너스 번호를 입력받는다.
4. [x] 당첨 내역 및 수익률을 출력한다.
5. [x] 당첨 통계 출력
```
1등: 6개 번호 일치 / 2,000,000,000원
2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
3등: 5개 번호 일치 / 1,500,000원
4등: 4개 번호 일치 / 50,000원
5등: 3개 번호 일치 / 5,000원
총 수익률은 62.5%입니다.
```
6. [x] 당첨 통계를 출력한 뒤에는 재시작/종료 여부를 입력받는다.

## 😛기타 요구 사항

1. 재시작할 경우 구입 금액 입력부터 게임을 다시 시작하고, 종료하는 경우 그대로 프로그램을 종료시킨다.
2. 사용자가 잘못된 값을 입력한 경우 throw문을 사용해 예외를 발생시키고, 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.

## 😛설계

1. 기본적인 설계 => MVC가 나누어 짐. 어떤 객체를 만들어야할지 감 잡기.
2. 기능 목록을 작성하면서, 테스트 코드를 같이 쓴다. RED 3. 기능 구현을 합니다.
3. 다시 2번으로 -> test: 커밋
4. 기능구현을 하나씩 하면서, todo check commit -> docs/requirement commit
5. App 말고 모든게 구현됨.
6. App 합체 -> 기능구현 완료.

![Lotto Mission](../public/Lotto_Mission_Diagram.png)
Loading