From c2de10168c40a8347b01260b905b858f721ccf62 Mon Sep 17 00:00:00 2001 From: junilhwang Date: Tue, 18 Jun 2024 21:35:30 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/Car.test.js | 28 ++++++++++++++++++++++++++++ src/domain/Car.js | 26 ++++++++++++++++++++++++++ src/main.js | 9 +++++++-- src/readLineAsync.js | 25 +++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/__tests__/Car.test.js create mode 100644 src/domain/Car.js create mode 100644 src/readLineAsync.js diff --git a/src/__tests__/Car.test.js b/src/__tests__/Car.test.js new file mode 100644 index 0000000..634c0c4 --- /dev/null +++ b/src/__tests__/Car.test.js @@ -0,0 +1,28 @@ +import { describe, test, expect } from "vitest"; +import Car from "../domain/Car.js"; + +describe('Car >', () => { + test('자동차의 이름이 5글자보다 길면 오류가 발생한다.', () => { + expect(() => new Car('123456')).toThrow(); + }) + + test.each([ + { name: '', }, + { name: '1', }, + { name: '12', }, + { name: '1 2', }, + { name: '123', }, + { name: '1 2 3', }, + { name: '1234', }, + { name: '12345', }, + { name: ' 12345 ', }, + ])('자동차의 이름이 5글자 이하($name)이면 오류가 발생하지 않는다.', ({ name }) => { + expect(() => new Car(name)).not.toThrow(); + }) + + test('자동차는 전진할 수 있다.', () => { + const car = new Car('이름'); + car.move(); + expect(car.position).toBe(1); + }) +}) diff --git a/src/domain/Car.js b/src/domain/Car.js new file mode 100644 index 0000000..0673256 --- /dev/null +++ b/src/domain/Car.js @@ -0,0 +1,26 @@ +export default class Car { + static NAME_SIZE = 5; + + #position; + #name; + + constructor(name) { + Car.#validateName(name); + this.#position = 0; + this.#name = name; + } + + move() { + this.#position += 1; + } + + get position() { + return this.#position; + } + + static #validateName(name) { + if (name.trim().length > this.NAME_SIZE) { + throw new Error('자동차의 이름은 5글자 이하여야 합니다.') + } + } +} diff --git a/src/main.js b/src/main.js index 96bab59..846e797 100644 --- a/src/main.js +++ b/src/main.js @@ -1,5 +1,10 @@ -function main() { - console.log('main의 내용을 채워주세요'); +import readLineAsync from "./readLineAsync.js"; + + + +async function main() { + const name = await readLineAsync("자동차 이름을 입력하세요 > "); + console.log(`자동차 이름은 ${name}입니다.`); } main(); diff --git a/src/readLineAsync.js b/src/readLineAsync.js new file mode 100644 index 0000000..bb474c6 --- /dev/null +++ b/src/readLineAsync.js @@ -0,0 +1,25 @@ +import readline from "readline"; + +function readLineAsync(query) { + return new Promise((resolve, reject) => { + if (arguments.length !== 1) { + reject(new Error("arguments must be 1")); + } + + if (typeof query !== "string") { + reject(new Error("query must be string")); + } + + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + + rl.question(query, (input) => { + rl.close(); + resolve(input); + }); + }); +} + +export default readLineAsync