Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
163 changes: 163 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,164 @@
# javascript-planetlotto-precourse

<!-- 프리코스에서 학습한 개발 방식(문제 분해, 설계, TDD)이 코드에 드러나는 것 -->

## 공통 예외처리

**출력 형식**

사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지 출력

**재입력 방식**

오류가 발생한 해당 지점부터 다시 입력

## 흐름

```
구입금액을 입력해 주세요.
1000

2개를 구매했습니다.
[8, 11, 13, 21, 22]
[1, 3, 6, 14, 22]

당첨 번호를 입력해 주세요.
1, 2, 3, 4, 5

보너스 번호 번호를 입력해 주세요.
6

당첨 통계
---
5개 일치 (100,000,000원) - 0개
4개 일치, 보너스 번호 일치 (10,000,000원) - 0개
4개 일치 (1,500,000원) - 0개
3개 일치, 보너스 번호 일치 (500,000원) - 0개
2개 일치, 보너스 번호 일치 (5,000원) - 1개
0개 일치 (0원) - 1개
```

```
1. 구입금액 입력

2. 구매 로또 수량 출력
3. 구매 로또 번호 출력

4. 당첨 번호 입력

5. 보너스 번호 번호 입력

6. 당첨 통계 계산
7. 통계 출력
```

## 기능

1. 입력 및 유효성 검사

1. 로또 구입 금액 입력

2. 로또 번호 입력

- 1 ~ 30 사이의 숫자 6개 입력 (`,`으로 구분)
- 예외 처리
- 문자가 포함된 경우
- 숫자가 아닌 경우
- 1~30 사이의 숫자가 아닌 경우
- 번호 수량이 5개가 아닌 경우
- 중복된 숫자가 포함된 경우

3. 보너스 번호 입력

2. 출력

1. 로또 개수 출력

- 출력 예시

```
2개를 구매했습니다.
[8, 11, 13, 21, 22]
[1, 3, 6, 14, 22]`
```

- 출력 설명

```
number[][]
[[ 로또 1 번호 배열 ], [ 로또 2 번호 배열 ] ...]
```

2. 당첨 통계 출력

- 출력 예시

```
당첨 통계
---
5개 일치 (100,000,000원) - 0개
4개 일치, 보너스 번호 일치 (10,000,000원) - 0개
4개 일치 (1,500,000원) - 0개
3개 일치, 보너스 번호 일치 (500,000원) - 0개
2개 일치, 보너스 번호 일치 (5,000원) - 1개
0개 일치 (0원) - 1개
```

- 출력 설명

- 당첨 결과를 기반으로 당첨 통계 출력

```
Map<number, number> {
0: 0 // MATCH_0
1: 0 // MATCH_5
2: 0 // MATCH_4_BONUS
3: 0 // MATCH_4
4: 0 // MATCH_3_BONUS
5: 0 // MATCH_2_BONUS
}
```

3. 핵심 로직

1. 로또

- 번호 검증
- 번호 반환
- 당첨 결과 key 반환(당첨 번호, 보너스)

2. 유틸리티 함수

- 입력 검증
- Map 기반 key 개수 카운트
- 재입력
- 번호 생성
- 로또 생성

## 도전 과제 "리팩토링"

1. 설계

- MVC 역할이 명확한지

2. 구현

- 제한 시간 내 구현했는지

- 테스트 전부 통과하는지

3. 코드 품질

- depth는 2를 넘지 않는지

- 라인이 15줄을 넘지 않는지

- 코드를 읽었을 때 이해가 되는지

- 매서드, 변수명이 명확한지

4. 테스트

- 테스트 코드를 통해 구현했는지

- 테스트 케이스가 다양한지
67 changes: 67 additions & 0 deletions __tests__/model/LottoTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { Lotto } from "../../src/model/Lotto"

describe('Lotto 모델 테스트', () => {
test('로또에 빈 배열을 전달하면 오류가 발생한다.', () => {
function errorBox() {
new Lotto([])
}
expect(errorBox).toThrow()
})

test('로또 번호를 반환한다.', () => {
const NUMBERS = [1, 2, 3, 4, 5]

const lotto = new Lotto(NUMBERS)

expect(lotto.getNumbers()).toEqual(NUMBERS)
})

test('5개 매치 되었을 때 1등 key를 반환한다.', () => {
const jackpotLotto = [1, 2, 3, 4, 5]
const jackpotBonus = 12
const lotto = new Lotto([1, 2, 3, 4, 5])

expect(lotto.getMatchResult(jackpotLotto, jackpotBonus)).toBe(1)
})

test('4개 매치, 보너스 번호 매치 되었을 때 2등 key를 반환한다.', () => {
const jackpotLotto = [1, 2, 3, 4, 5]
const jackpotBonus = 12
const lotto = new Lotto([1, 2, 3, 4, 12])

expect(lotto.getMatchResult(jackpotLotto, jackpotBonus)).toBe(2)
})

test('4개 매치 되었을 때 3등 key를 반환한다.', () => {
const jackpotLotto = [1, 2, 3, 4, 5]
const jackpotBonus = 12
const lotto = new Lotto([1, 2, 3, 4, 6])

expect(lotto.getMatchResult(jackpotLotto, jackpotBonus)).toBe(3)
})

test('3개 매치, 보너스 번호 매치 되었을 때 4등 key를 반환한다.', () => {
const jackpotLotto = [1, 2, 3, 4, 5]
const jackpotBonus = 12
const lotto = new Lotto([1, 2, 3, 14, 12])

expect(lotto.getMatchResult(jackpotLotto, jackpotBonus)).toBe(4)
})

test('2개 매치, 보너스 번호 매치 되었을 때 5등 key를 반환한다.', () => {
const jackpotLotto = [1, 2, 3, 4, 5]
const jackpotBonus = 12
const lotto = new Lotto([1, 2, 13, 14, 12])

expect(lotto.getMatchResult(jackpotLotto, jackpotBonus)).toBe(5)
})

test('2개 매치 되었을 때 0등 key를 반환한다.', () => {
const jackpotLotto = [1, 2, 3, 4, 5]
const jackpotBonus = 12
const lotto = new Lotto([1, 2, 13, 14, 17])

expect(lotto.getMatchResult(jackpotLotto, jackpotBonus)).toBe(0)
})

})
11 changes: 11 additions & 0 deletions __tests__/util/GenerateLottoByTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { generateLottoBy } from "../../src/util/GenerateLottoBy"

describe('generateLottoBy 유틸리티 테스트', () => {
test('금액(1,000원) 만큼 로또 배열(2)을 반환한다.', () => {
expect(generateLottoBy(1000).length).toBe(2);
})

test('금액(2,000원) 만큼 로또 배열(4)을 반환한다.', () => {
expect(generateLottoBy(2000).length).toBe(4);
})
})
23 changes: 23 additions & 0 deletions __tests__/util/GetLottoMatchResultMapOfTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { LOTTO_MATCH_KEY } from "../../src/util/Const"
import { getLottoMatchResultMapOf } from "../../src/util/GetLottoMatchResultMapOf"

describe('getLottoMatchResultMapOf 유틸리티 테스트', () => {
test('로또 결과 key 배열을 전달하면 로또 결과(Map)을 반환한다.', () => {
const INPUT = [
LOTTO_MATCH_KEY.MATCH_0,
LOTTO_MATCH_KEY.MATCH_2_BONUS,
LOTTO_MATCH_KEY.MATCH_0
]

const OUTPUT = new Map([
[LOTTO_MATCH_KEY.MATCH_0, 2],
[LOTTO_MATCH_KEY.MATCH_2_BONUS, 1],
[LOTTO_MATCH_KEY.MATCH_3_BONUS, 0],
[LOTTO_MATCH_KEY.MATCH_4, 0],
[LOTTO_MATCH_KEY.MATCH_4_BONUS, 0],
[LOTTO_MATCH_KEY.MATCH_5, 0],
]);

expect(getLottoMatchResultMapOf(INPUT)).toEqual(OUTPUT);
})
})
61 changes: 61 additions & 0 deletions __tests__/util/ValidatorTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { Validator } from "../../src/Util/Validator"


describe('Validator 테스트', () => {
describe('validateLottoNumbers', () => {
test('빈 배열을 입력하면 오류를 발생시킨다.', () => {
function errorBox() {
Validator.validateLottoNumbers([]);
}
expect(errorBox).toThrow();
})

test('문자를 입력하면 오류를 발생시킨다.', () => {
function errorBox() {
Validator.validateLottoNumbers(['ㅁㄴㅇ', 'ㄴㅇ']);
}
expect(errorBox).toThrow();
})

test('중복된 번호를 입력하면 오류를 발생시킨다.', () => {
function errorBox() {
Validator.validateLottoNumbers([1, 1, 2, 3, 4], [1, 1, 3, 4]);
}
expect(errorBox).toThrow();
})

test('소수를 입력하면 오류를 발생시킨다.', () => {
function errorBox() {
Validator.validateLottoNumbers([1.2, 2, 3, 4, 5]);
}
expect(errorBox).toThrow();
})

test('음수를 입력하면 오류를 발생시킨다.', () => {
function errorBox() {
Validator.validateLottoNumbers(['-1', 1, 2, 3, 4]);
}
expect(errorBox).toThrow();
})

test('번호 5개 이상을 입력하면 오류가 발생한다.', () => {
function errorBox() {
Validator.validateLottoNumbers([1, 2, 3, 4, 5, 6, 7, 8]);
}
expect(errorBox).toThrow();
})

test('1~30 외의 숫자를 입력하면 오류가 발생한다.', () => {
const UNDER_NUMBERS = [0, 2, 3, 4, 5]
const EXCEED_NUMBERS = [31, 2, 3, 4, 5]
const inputs = [UNDER_NUMBERS, EXCEED_NUMBERS]

inputs.forEach((numbers) => {
function errorBox() {
Validator.validateLottoNumbers(numbers);
}
expect(errorBox).toThrow();
})
})
})
})
Loading