Skip to content

Commit

Permalink
[1단계 - 콘솔 기반 로또 게임] 버건디(전태헌) 미션 제출합니다. (#263)
Browse files Browse the repository at this point in the history
* chore: eslint prettier 세팅

Co-authored-by: brgndyy <brgndyy@gmail.com>

* docs: REQUIREMENT 작성

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>

* test: 구매 금액에 해당하는 만큼 로또 발행

Co-authored-by: brgndyy <brgndyy@gmail.com>

fix

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>

* feat: 구입 금액에 해당하는 금액 만큼 로또 발행

Co-authored-by: brgndyy <brgndyy@gmail.com>

fix

* test: 1~45이하의 숫자가 아닌 경우 에러 발생

Co-authored-by: brgndyy <brgndyy@gmail.com>

* test: 로또 번호 중복 숫자 혹은 6개 넘을 시 에러

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 로또 클래스 유효성 검증

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 무작위 1~45 숫자 6개 생성

Co-authored-by: brgndyy <brgndyy@gmail.com>

fix

* refactor: Lotto Number 클래스 분리

Co-authored-by: brgndyy <brgndyy@gmail.com>

* test: 로또 번호를 통해 등수를 저장한다.

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>

* chore: eslint 불필요한 기능 수정

Co-authored-by: brgndyy <brgndyy@gmail.com>

* refactor: Lotto 테스트 winNumbers -> winObj으로 수정

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 당첨 번호를 입력 받아서 몇 등인지 저장한다

Co-authored-by: brgndyy <brgndyy@gmail.com>

* refactor: Lotto 테스트 명세 수정

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com정

* docs: 설계 이미지 추가

Co-authored-by: brgndyy <brgndyy@gmail.com>

* test: WinLottoNumber 보너스 숫자 유효성 테스트

Co-authored-by: brgndyy <brgndyy@gmail.com>

* test: WinLottoNumber 테스트 수정

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: WinLottoNumber 유효성 검증 구현

Co-authored-by: brgndyy <brgndyy@gmail.com>

* test: 1000원 미만 입력인 경우 에러를 던진다

* feat: 1000원 미만의 경우 유효성 검증 구현

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 로또 구입 금액을 입력받는다.

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>

* fix: 함수 표현식 수정

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 로또 번호는 오름차순으로 정렬하여 출력

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>

* feat: 우승 번호 보너스 번호 입력 받는다

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>

* refactor: WinLottoNumber 테스트 코드 수정

보너스 숫자 setBonusNumber 추가

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 로또 등수 반환

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 당첨 내역 출력

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 로또 결과 출력

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 우승 로또 숫자, 보너스 숫자 재실행

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 통계 출력 이후 재시작/종료 여부 입력

Co-authored-by: brgndyy <brgndyy@gmail.com>

* refactor: 상수 분리

Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>

* refactor: 상수 줄바꿈 수정 및 에러 메세지 분리

Co-authored-by: brgndyy <brgndyy@gmail.com>

* feat: 깊은 동결 유틸함수 작성

* feat: 커스텀 에러 클래스 생성

* feat: 상수 관련 파일들 생성

* refactor: 기존 WinLottoNumbers 클래스를WinningLotto로 변경

* refactor: Controller 클래스를 LottoController로 변경

* feat: 입력값을 받을때의 try-catch 구문을 담은 유틸함수 생성

* refactor: Lotto 클래스는 단일 6개의 숫자만 취급하도록 수정

* refactor: LottoMachine 클래스 수정

* feat: 당첨 결과를 관리하는 RewardGenerator 클래스 생성

* feat: 시작값부터 끝의 범위 안의 랜덤 값을 만들어주는 유틸함수 생성

* refactor: inputview, outputview 코드 리팩토링

* refactor: 테스트코드 재작성

* refactor: 필요없는 파일 삭제 및 진입점 파일 컨트롤러 이름 수정

---------

Co-authored-by: lurgi <wahoo9040@naver.com>
Co-authored-by: JEON TAEHEON <brgndyy@users.noreply.github.com>
  • Loading branch information
3 people authored Feb 24, 2024
1 parent d0f3b95 commit d2d2375
Show file tree
Hide file tree
Showing 29 changed files with 8,696 additions and 3,363 deletions.
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

0 comments on commit d2d2375

Please sign in to comment.