Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
5baf5cd
docs: README.md 기능 구현 목록과 예외 처리 목록 작성
ohwoong12 Nov 1, 2025
85c4dbb
feat: 문자열 상수 파일 생성
ohwoong12 Nov 1, 2025
190d685
feat: 사용자에게 값을 입력받는 파일 생성
ohwoong12 Nov 1, 2025
8779bd5
feat: 사용자에게 구입금액을 입력받는 기능 구현
ohwoong12 Nov 1, 2025
1c3fb44
feat: 사용자에게 당첨 번호를 입력받는 기능 구현
ohwoong12 Nov 1, 2025
258f7a2
feat: 사용자에게 보너스 번호를 입력받는 기능 구현
ohwoong12 Nov 1, 2025
9df66e5
feat: 로또 생성하는 함수 추가
ohwoong12 Nov 1, 2025
c8f393c
test: 로또 생성 함수 테스트 코드 추가
ohwoong12 Nov 1, 2025
33bbd17
feat: App.js 파일에 로또 함수 코드 추가와 구매 수량 출력 기능 구현
ohwoong12 Nov 1, 2025
5ac136a
feat: 생성된 로또 번호를 오름차순으로 정렬하는 기능 추가
ohwoong12 Nov 1, 2025
822bc94
test: 배열을 오름차순으로 정렬 함수 테스트 코드 추가
ohwoong12 Nov 1, 2025
d5576db
feat: 로또 번호 출력 기능 구현
ohwoong12 Nov 2, 2025
ca4c07d
feat: 로또 구매 번호와 당첨 번호를 비교하여 당첨된 번호의 개수를 계산 기능 구현
ohwoong12 Nov 2, 2025
4fd6e0c
feat: 로또 번호 중복된 번호 존재여부 유효성 검사 기능 구현
ohwoong12 Nov 2, 2025
6819e4d
feat: 로또 구매 번호가 숫자인지 유효성 검사 기능 구현
ohwoong12 Nov 2, 2025
a78be3b
feat: 로또 구매 번호에 보너스 번호 포함여부 확인하는 기능 구현
ohwoong12 Nov 2, 2025
21a777d
feat: 당첨된 번호의 개수를 기반으로 등수를 산정하는 기능 구현
ohwoong12 Nov 2, 2025
c84cbfd
feat: 최종 등수를 계산하여 반환하는 기능 구현
ohwoong12 Nov 2, 2025
bac0955
refactor: 유효성 검사 로직 추후 개선 주석 추가
ohwoong12 Nov 2, 2025
dc271b4
feat: 발행한 로또 구매 번호 출력
ohwoong12 Nov 2, 2025
f36bce1
feat: 당첨 통계 계산과 출력을 위한 파일 추가
ohwoong12 Nov 2, 2025
08ddace
docs: update README.md
ohwoong12 Nov 2, 2025
9c47b58
docs: update README.md
ohwoong12 Nov 2, 2025
15398e6
feat: 문자열 상수 파일 세부 항목 추가
ohwoong12 Nov 2, 2025
69bef97
docs: update README.md
ohwoong12 Nov 2, 2025
0ac381c
feat: 당첨된 로또 등수가 각각 몇개인지 계산하는 기능 구현
ohwoong12 Nov 2, 2025
046be4a
feat: 당첨 통계를 출력하는 기능 구현
ohwoong12 Nov 2, 2025
1ea89a6
feat: 로또 상금을 계산하는 기능 구현
ohwoong12 Nov 2, 2025
f70aa9a
feat: 수익률을 출력하는 기능 구현
ohwoong12 Nov 2, 2025
f6f6d0c
feat: 당첨 통계와 결과 출력에 필요한 반복되는 정보를 통합한 배열 추가
ohwoong12 Nov 2, 2025
6a6e380
refactor: 반복되는 Console 출력문 제거
ohwoong12 Nov 2, 2025
7570df0
refactor: 총 당첨금 구하는 함수에서 반복된 연산 제거 후 개선
ohwoong12 Nov 2, 2025
22ea3fc
refactor: 사용되지 않는 import문 제거
ohwoong12 Nov 2, 2025
a122326
refactor: 디버깅용 코드 제거
ohwoong12 Nov 2, 2025
37e9da1
refactor: MVC 패턴 적용을 위한 파일 및 폴더 생성
ohwoong12 Nov 2, 2025
629fbc5
refactor: MVC 패턴 적용을 위한 View 분리 및 파일 이름 변경
ohwoong12 Nov 2, 2025
c1ebdbd
refactor: MVC 패턴 적용에 따른 import 문 수정
ohwoong12 Nov 2, 2025
3d8627e
refactor: 발행된 로또 번호 기능을 OutputView로 분리
ohwoong12 Nov 2, 2025
6655a7e
refcator: 당첨 통계와 수익률 출력시마다 반복적인 함수 호출 제거
ohwoong12 Nov 2, 2025
ae62829
refactor: MVC 패턴 적용을 위한CalculateLottoResult의 출력 기능을 OutPutView로 분리
ohwoong12 Nov 2, 2025
0854c9c
comment: 발행된 로또 번호를 출력하는 함수 주석 추가
ohwoong12 Nov 2, 2025
772b205
refactor: MVC 패턴 적용을 위한 로또 구매 수량 출력 기능을 OutputView로 분리
ohwoong12 Nov 2, 2025
ce13d97
refactor: App.js에서 출력 간 공백 Print문 제거
ohwoong12 Nov 2, 2025
4082a19
refactor: 로또 생성기 함수 이름 명시적으로 변경
ohwoong12 Nov 2, 2025
a05b418
refactor: Controller 역할을 위해 로또 객체 생성과 정렬 기능 분리
ohwoong12 Nov 2, 2025
1201f04
refactor: MVC 패턴 적용을 위해 utils 폴더 생성 후 파일 이동
ohwoong12 Nov 2, 2025
627a32f
refactor: MVC 패턴 적용을 위해 model 폴더 생성 후 파일 이동
ohwoong12 Nov 2, 2025
5ca68a3
refactor: MVC 패턴 적용을 위해 controller 폴더 생성 후 파일 이동
ohwoong12 Nov 2, 2025
583e6ac
test: SortLotto 기능 변경으로 테스트 코드 변경
ohwoong12 Nov 2, 2025
65a5263
comment: Lotto 클래스의 showFinalResult 잘못된 주석 변경
ohwoong12 Nov 2, 2025
47cb6ec
refactor: MVC 패턴 적용에 의한 import문 변경
ohwoong12 Nov 2, 2025
1df87ec
refactor: Controller 역할을 위해 계산 로직 이동
ohwoong12 Nov 2, 2025
2a61482
rename: CalculateLottoResult 파일 이름 변경
ohwoong12 Nov 2, 2025
cddd8c3
test: 유효성 검사 함수 테스트를 위한 테스트 파일 생성
ohwoong12 Nov 3, 2025
16d50ad
comment: 최종 결과를 출력하는 함수와 당첨 통계 출력 함수 주석 가
ohwoong12 Nov 3, 2025
78f3870
docs: update README.md
ohwoong12 Nov 3, 2025
8835b3d
docs: update README.md
ohwoong12 Nov 3, 2025
cea1c13
refactor: 상수 파일 중 에러 메시지 누락으로 인한 수정
ohwoong12 Nov 3, 2025
7078c15
docs: update README.md
ohwoong12 Nov 3, 2025
c05993d
docs: update README.md
ohwoong12 Nov 3, 2025
2a38f18
feat: 유효성 검사 범주별로 분리한 유효성 검사 파일 생성
ohwoong12 Nov 3, 2025
f19ec49
test: 유효성 검사 범주 별로 분리한 파일의 테스트 코드 파일 생성
ohwoong12 Nov 3, 2025
b970c42
feat: 에러 메시지 수정 및 추가
ohwoong12 Nov 3, 2025
95c3174
feat: 공통 예외 처리 항목 기능 구현
ohwoong12 Nov 3, 2025
19f92a8
test: 공통 예외 처리 항목 기능 테스트 코드 추가
ohwoong12 Nov 3, 2025
e6ca98a
docs: update README.md
ohwoong12 Nov 3, 2025
06e2854
feat: 로또 구매 금액 예외 처리 기능 구현
ohwoong12 Nov 3, 2025
a1b15d5
test: 로또 구매 금액 예외 처리 테스트 코드 추가
ohwoong12 Nov 3, 2025
b3d1ba6
docs: update README.md
ohwoong12 Nov 3, 2025
3428071
feat: 당첨 번호 예외 처리 기능 구현
ohwoong12 Nov 3, 2025
ab21561
test: 당첨 번호 예외 처리 테스트 코드 추가
ohwoong12 Nov 3, 2025
1c5b9bb
update README.md
ohwoong12 Nov 3, 2025
e3a557b
feat: 보너스 번호 예외 처리 기능 구현
ohwoong12 Nov 3, 2025
0b98b8c
보너스 번호 예외 처리 테스트 코드 추가
ohwoong12 Nov 3, 2025
34ac212
docs: update README.md
ohwoong12 Nov 3, 2025
6323f3f
feat: 예외 처리 기능 추가
ohwoong12 Nov 3, 2025
efa7c7a
docs: update README.md
ohwoong12 Nov 3, 2025
21a558b
comment: 주석 제거
ohwoong12 Nov 3, 2025
0af7c40
refactor: 유효성 검사로 구현된 기능 제거
ohwoong12 Nov 3, 2025
1d5b4f6
rename: import문 변경
ohwoong12 Nov 3, 2025
5bc7d77
feat: 공백 입력 시 예외 처리 추가
ohwoong12 Nov 3, 2025
ce4d241
feat: 단일 책임 원칙 적용을 위한 App 기능 분리
ohwoong12 Nov 3, 2025
a7f5370
test: LottoGnerator 테스트 코드 변경
ohwoong12 Nov 3, 2025
448dae3
update README.md
ohwoong12 Nov 3, 2025
d9dd2fa
refactor: 하드코딩 된 숫자 상수 파일로 변경
ohwoong12 Nov 3, 2025
adcf212
test: Lotto 클래스 테스트 코드 추가
ohwoong12 Nov 3, 2025
54a103b
rename: import문 수정
ohwoong12 Nov 3, 2025
ae95bae
rename: import문 수정
ohwoong12 Nov 3, 2025
01c67d1
chore: cache clear
ohwoong12 Nov 3, 2025
3a1c928
rename: import문 수정 및 파일 이름 변경
ohwoong12 Nov 3, 2025
fe4e69b
rename: import문 수정
ohwoong12 Nov 3, 2025
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
231 changes: 231 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,232 @@
# javascript-lotto-precourse

## 프리코스 3주차 - 로또

### 과제 진행 요구 사항

- 미션은 로또 저장소를 포크하고 클론하는 것으로 시작한다.
- 기능을 구현하기 전 README.md에 구현할 기능 목록을 정리해 추가한다.
- Git의 커밋 단위는 앞 단계에서 README.md에 정리한 기능 목록 단위로 추가한다.
- [AngularJS Git Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)을 참고해 커밋 메시지를 작성한다.
- 자세한 과제 진행 방법은 프리코스 진행 가이드 문서를 참고한다.

---

### 기능 요구 사항

간단한 로또 발매기를 구현한다.

- 로또 번호의 숫자 범위는 1~45까지이다.
- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
- 1등: 6개 번호 일치 / 2,000,000,000원
- 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
- 3등: 5개 번호 일치 / 1,500,000원
- 4등: 4개 번호 일치 / 50,000원
- 5등: 3개 번호 일치 / 5,000원
- 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
- 로또 1장의 가격은 1,000원이다.
- 당첨 번호와 보너스 번호를 입력받는다.
- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
- 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 해당 지점부터 다시 입력을 받는다.

---

### 입출력 요구 사항

### 입력

- 로또 구입 금액을 입력 받는다. 구입 금액은 1,000원 단위로 입력 받으며 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다.

```bash
14000
```

- 당첨번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다.

```bash
1,2,3,4,5,6
```

- 보너스 번호를 입력 받는다.

```bash
7
```

### 출력

- 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다.

```sql
8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]
```

- 당첨 내역을 출력한다.

```sql
3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개
```

- 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)

```sql
총 수익률은 62.5% 입니다.
```

- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.

```sql
[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.
```

### 실행 결과 예시

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

8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]

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

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

## 당첨 통계

3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개
총 수익률은 62.5%입니다.
```

### 기능 구현 목록

- [x] 로또 구입금액을 입력 받는다.

- [x] 당첨 번호를 입력 받는다.

- [x] 보너스 번호를 입력 받는다.

- [x] 발행한 로또 수량 및 번호를 출력한다.
- [x] 오름차순으로 정렬하여 출력한다.

- [x] 당첨 내역을 출력한다.

- [x] 수익률은 소수점 둘째 자리에서 반올림하여 출력한다.

---

### 예외 처리 목록

- [x] 공통 예외 처리 항목
- [x] 사용자가 입력한 값이 숫자가 아닌 경우
- [x] 양의 정수가 아닌 경우
- [x] 로또 번호가 `1~45` 범위에 있지 않은 경우

- [x] 로또 구매 금액 예외 처리 항목
- [x] 1,000원으로 나누어 떨어지지 않는 경우
- [x] 음수를 입력한 경우
- [x] 소수를 입력한 경우

- [x] 당첨 번호 예외 처리 항목
- [x] 음수를 입력한 경우
- [x] 소수를 입력한 경우
- [x] 당첨 번호가 6개가 아닌 경우
- [x] 당첨 번호가 중복되는 경우
- [x] 당첨 번호에 구분자가 쉼표(`,`)가 아닌 경우
- [x] 당첨 번호가 `1~45` 사이의 숫자가 아닌 경우

- [x] 보너스 번호 예외 처리 항목
- [x] 음수를 입력한 경우
- [x] 소수를 입력한 경우
- [x] 당첨 번호와 보너스 번호가 중복 되는 경우
- [x] 보너스 번호가 `1~45` 사이의 숫자가 아닌 경우

---

### 생성한 테스트 함수 목록

-LottoGenerator.test.js: 로또 번호가 정상적으로 생성되는지 테스트

SortLotto.test.js: 이차원 배열을 오름차순으로 정렬되는지 테스트

CommonValidator.test.js: 유효성 검사에 공통적으로 사용되는 함수 테스트

PurchaseCostValidator.test.js: 구매 금액과 관련된 유효성 검사 함수 테스트

WinningNumberValidator.test.js: 당첨 번호와 관련된 유효성 검사 함수 테스트

BonusNumberValidator.test.js: 보너스 번호와 관련된 유효성 검사 함수 테스트

### 어려웠던 점

기존 객체지향에 대해 깊게 알지 못했고, 그러다보니 실제로 사용하는데 어려움이 많이 있었다.

하지만 하루종일 객체지향에 대해 찾아보고 디자인 패턴과 객체지향적 설계 원칙을 찾았다.

그러다보니 어느샌가 코드를 쓰면서 이 부분은 어떻게 써야 하겠다가 감이 조금씩 오기 시작했다.

### 파일 구조

```plain
javascript-lotto-8
├─ .npmrc
├─ package-lock.json
├─ package.json
├─ README.md
├─ src
│ ├─ controller
│ │ ├─ App.js
│ │ └─ LottoController.js
│ ├─ index.js
│ ├─ model
│ │ ├─ CalculateFinalResults.js
│ │ ├─ Lotto.js
│ │ └─ LottoGnerator.js
│ ├─ utils
│ │ ├─ BonusNumberValidator.js
│ │ ├─ CommonValidator.js
│ │ ├─ Constants.js
│ │ ├─ PurchaseCostValidator.js
│ │ ├─ SortLotto.js
│ │ └─ WinningNumberValidator.js
│ └─ view
│ ├─ InputView.js
│ └─ OutputView.js
└─ __tests__
├─ ApplicationTest.js
├─ BonusNumberValidator.test.js
├─ CommonValidator.test.js
├─ LottoGnerator.test.js
├─ LottoTest.js
├─ PurchaseCostValidator.test.js
├─ SortLotto.test.js
└─ WinningNumberValidator.test.js

```
50 changes: 25 additions & 25 deletions __tests__/ApplicationTest.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import App from "../src/App.js";
import { MissionUtils } from "@woowacourse/mission-utils";
import App from '../src/controller/App.js';
import { MissionUtils } from '@woowacourse/mission-utils';

const mockQuestions = (inputs) => {
MissionUtils.Console.readLineAsync = jest.fn();
Expand All @@ -19,7 +19,7 @@ const mockRandoms = (numbers) => {
};

const getLogSpy = () => {
const logSpy = jest.spyOn(MissionUtils.Console, "print");
const logSpy = jest.spyOn(MissionUtils.Console, 'print');
logSpy.mockClear();
return logSpy;
};
Expand All @@ -29,7 +29,7 @@ const runException = async (input) => {
const logSpy = getLogSpy();

const RANDOM_NUMBERS_TO_END = [1, 2, 3, 4, 5, 6];
const INPUT_NUMBERS_TO_END = ["1000", "1,2,3,4,5,6", "7"];
const INPUT_NUMBERS_TO_END = ['1000', '1,2,3,4,5,6', '7'];

mockRandoms([RANDOM_NUMBERS_TO_END]);
mockQuestions([input, ...INPUT_NUMBERS_TO_END]);
Expand All @@ -39,15 +39,15 @@ const runException = async (input) => {
await app.run();

// then
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("[ERROR]"));
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('[ERROR]'));
};

describe("로또 테스트", () => {
describe('로또 테스트', () => {
beforeEach(() => {
jest.restoreAllMocks();
});

test("기능 테스트", async () => {
test('기능 테스트', async () => {
// given
const logSpy = getLogSpy();

Expand All @@ -61,37 +61,37 @@ describe("로또 테스트", () => {
[2, 13, 22, 32, 38, 45],
[1, 3, 5, 14, 22, 45],
]);
mockQuestions(["8000", "1,2,3,4,5,6", "7"]);
mockQuestions(['8000', '1,2,3,4,5,6', '7']);

// when
const app = new App();
await app.run();

// then
const logs = [
"8개를 구매했습니다.",
"[8, 21, 23, 41, 42, 43]",
"[3, 5, 11, 16, 32, 38]",
"[7, 11, 16, 35, 36, 44]",
"[1, 8, 11, 31, 41, 42]",
"[13, 14, 16, 38, 42, 45]",
"[7, 11, 30, 40, 42, 43]",
"[2, 13, 22, 32, 38, 45]",
"[1, 3, 5, 14, 22, 45]",
"3개 일치 (5,000원) - 1개",
"4개 일치 (50,000원) - 0개",
"5개 일치 (1,500,000원) - 0개",
"5개 일치, 보너스 볼 일치 (30,000,000원) - 0개",
"6개 일치 (2,000,000,000원) - 0개",
"총 수익률은 62.5%입니다.",
'8개를 구매했습니다.',
'[8, 21, 23, 41, 42, 43]',
'[3, 5, 11, 16, 32, 38]',
'[7, 11, 16, 35, 36, 44]',
'[1, 8, 11, 31, 41, 42]',
'[13, 14, 16, 38, 42, 45]',
'[7, 11, 30, 40, 42, 43]',
'[2, 13, 22, 32, 38, 45]',
'[1, 3, 5, 14, 22, 45]',
'3개 일치 (5,000원) - 1개',
'4개 일치 (50,000원) - 0개',
'5개 일치 (1,500,000원) - 0개',
'5개 일치, 보너스 볼 일치 (30,000,000원) - 0개',
'6개 일치 (2,000,000,000원) - 0개',
'총 수익률은 62.5%입니다.',
];

logs.forEach((log) => {
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(log));
});
});

test("예외 테스트", async () => {
await runException("1000j");
test('예외 테스트', async () => {
await runException('1000j');
});
});
39 changes: 39 additions & 0 deletions __tests__/BonusNumberValidator.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import validateBonusNumber from '../src/utils/BonusNumberValidator.js';
import { ERROR_MESSAGE } from '../src/utils/Constants.js';

describe('BonusNumberValidator 테스트', () => {
const winningNumber = [1, 2, 3, 4, 5, 6];

test('보너스 번호가 숫자가 아닐 시 에러 발생 (from validateTypeNumber)', () => {
const input = 'a';
expect(() => validateBonusNumber(input, winningNumber)).toThrow(
`${ERROR_MESSAGE.COMMON.TYPE}\n`,
);
});

test('보너스 번호가 정수가 아닐 시 에러 발생 (from validateNumberIsInteger)', () => {
const input = 7.5;
expect(() => validateBonusNumber(input, winningNumber)).toThrow(
ERROR_MESSAGE.COMMON.TYPE,
);
});

test('보너스 번호가 1~45 범위를 벗어날 시 에러 발생 (from validateBonusNumberRange)', () => {
const input = 46;
expect(() => validateBonusNumber(input, winningNumber)).toThrow(
ERROR_MESSAGE.COMMON.RANGE,
);
});

test('보너스 번호가 당첨 번호와 중복될 시 에러 발생 (from validateWinningNumberAndBounusNumberDuplicate)', () => {
const input = 6; // winningNumber에 6이 포함되어 있음
expect(() => validateBonusNumber(input, winningNumber)).toThrow(
ERROR_MESSAGE.BONUS_NUMBER.DUPLICATE,
);
});

test('유효한 보너스 번호(7) 입력 시 에러가 발생하지 않음', () => {
const input = 7;
expect(() => validateBonusNumber(input, winningNumber)).not.toThrow();
});
});
Loading