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
15 changes: 15 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# node_modules는 무조건 제외
node_modules/

# 빌드 폴더 / 배포용 폴더
dist/
build/

# 환경 설정 파일 제외 (선택적)
*.config.js


test/
tests/
**/*.test.js
**/*.spec.js
Empty file added .eslintrc.json
Empty file.
12 changes: 12 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# 빌드/배포 폴더
node_modules/
dist/
build/

# 설정 파일 제외 (선택적)
*.config.js

# 테스트용 파일 제외 (시험 중 필요없으면)
*.test.js

.npmrc
10 changes: 10 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"trailingComma": "all",
"bracketSpacing": true,
"arrowParens": "always"
}
66 changes: 66 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,67 @@
# javascript-planetlotto-precourse

# 프로그램 목적

- 행성 로또를 구현
- 프리코스에서 학습한 개발 방식(문제 분해, 설계, TDD)이 코드에 드러나는 것

# 기능 요구 사항

1. 로또 구입금액을 입력

- 500으로 나누어 떨어지는 숫자를 입력해야 한다

2. 로또를 구입 갯수 출력

- 로또 한장당 500원 이다.
- 로또 입력 금액 만큼의 갯수를 출력한다. 예를 들어 1000원을 냈으면은 2장인 것이다.

3. 발행된 로또 번호들을 출력

- 1개의 로또를 발행할 때 중복되지 않는 5개의 숫자를 뽑는다.
- Randoms.pickUniqueNumbersInRange 메서드를 사용한다

4. 당천 번호 입력 기능

- 로또 번호는 1 ~ 30까지 입력해야 한다
- 로또 번호는 중복이 되어서는 안된다
- 번호는 쉼표(,)를 기준으로 구분한다.

5. 보너스 번호 입력 기능

- 보너스 번호는 당첨번호에서 입력하지 않은 번호여야 한다

6. 당첨 통계 계산 기능

- 로또번호 5개 일치 1등 (100,000,000)
- 로또번호 4개 일치 + 보너스 번호 (10,000,000)
- 로또번호 4개 일치 (1,500,000)
- 로또번호 3개 일치 + 보너스 번호 (500,000)
- 로또번호 2개 일치 + 보너스 번호 (5000)

7. 당첨 통계 출력 기능

- 기존에 생성되어 있던 printResult 메서드를 사용하여 구현

# 예외 처리

- [공통]:사용자 입력이 빈값이 경우 예외 처리
- [구입금액 입력]
1. 숫자가 아닐 경우 예외
2. 500원 미만일 경우 예외

- [로또 번호 입력]
1. 입력한 번호가 5개가 아닐 경우 예외
2. 입력한 번호가 숫자가 아닐 경우 예외
3. 입력한 번호가 중복일 있을 경우 예외
4. 입력한 번호가 1 ~ 30 사이의 숫자가 아닌 경우 예외

- [보너스 번호 입력]
1. 숫자가 아닐 경우 예외
2. 입력한 번호가 1 ~ 30 사이의 숫자가 아닌 경우 예외
3. 로또 번호와 중복일 경우 예외
- 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 해당 지점부터 다시 입력을 받는다

# 프로그래밍 요구 사항

- @woowacourse/mission-utils에서 제공하는 Random 및 Console API를 사용하여 구현해야 한다.
40 changes: 20 additions & 20 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 { MissionUtils } from '@woowacourse/mission-utils';
import App from '../src/App.js';

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];
const INPUT_NUMBERS_TO_END = ["500", "1,2,3,4,5", "6"];
const INPUT_NUMBERS_TO_END = ['500', '1,2,3,4,5', '6'];

mockRandoms([RANDOM_NUMBERS_TO_END]);
mockQuestions([input, ...INPUT_NUMBERS_TO_END]);
Expand All @@ -39,48 +39,48 @@ 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();

mockRandoms([
[8, 11, 13, 21, 22],
[1, 3, 6, 14, 22],
]);
mockQuestions(["1000", "1,2,3,4,5", "6"]);
mockQuestions(['1000', '1,2,3,4,5', '6']);

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

// then
const logs = [
"2개를 구매했습니다.",
"[8, 11, 13, 21, 22]",
"[1, 3, 6, 14, 22]",
"당첨 통계",
"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개",
'2개를 구매했습니다.',
'[8, 11, 13, 21, 22]',
'[1, 3, 6, 14, 22]',
'당첨 통계',
'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개',
];

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

test("예외 테스트", async () => {
await runException("500j");
test('예외 테스트', async () => {
await runException('500j');
});
});
Loading