Open7

js メソッド

しゅんしゅん

標準入力について
同期的に入力内容を取得する方法

    public static async stdin(text: string): Promise<string> {
        const answer = await this.question(text);
        return answer;
    }

    private static question(text: string): Promise<string> {
        const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true });
        return new Promise(resolve => {
            rl.question(text, (answer: string) => {
                resolve(answer);
                rl.close();
            });
        });
    }

https://maku77.github.io/nodejs/io/readline-from-keyboard.html

しゅんしゅん

while loopは基本使わない

// そもそもの仕様を相談
100回ループとか実際はあり得ない max10回

しゅんしゅん

シングルトンのjestテスト

import { StockManage } from '../classes/StockManage';
import { Item } from '../classes/Item';

const stockManage = StockManage.getInstance();
const expectedStockManage = StockManage.getInstance();

const zeroStock = 0;
const minusStock = -1;
const twoStock = 2;
const threeStock = 3;
const sixStock = 6;
const oneHundredYen = 100;
const twoHundredYen = 200;

describe('StockManage', function () {
    beforeEach(() => {
        // シングルトンクラスのクラス変数の値をリセット
        stockManage['stockMap'].clear();
        stockManage['minPrice'] = 0;
    });

    describe('constructor', function () {
        it('シングルトンクラスとしてインスタンスがexportされている', function () {
            expect(stockManage).toBe(expectedStockManage); //TODO:シングルトンクラスのテスト確認
        });
    });
    describe('addStock', function () {
        it('取り扱いがない場合新規作成する', function () {
            const itemParam = { name: 'test', price: 100 };
            stockManage.addStock(itemParam.name, itemParam.price, threeStock);

            expect(stockManage['stockMap'].get(stockManage.getItem(itemParam.name))).toBe(threeStock); // 在庫が追加されている
            expect(stockManage.getMinPrise()).toBe(itemParam.price); // 最小価格が更新されている
        });
        it('同じ名前の商品が既に存在する場合は、在庫数に追加する', function () {
            const itemParam = { name: 'test', price: 100 };
            stockManage.addStock(itemParam.name, itemParam.price, threeStock);
            stockManage.addStock(itemParam.name, itemParam.price, threeStock);

            expect(stockManage['stockMap'].get(stockManage.getItem(itemParam.name))).toBe(sixStock);
        });
        it('別の名前の商品が既にある存在する場合は、新規作成する', function () {
            const itemParam1 = { name: 'test1', price: 100 };
            const itemParam2 = { name: 'test2', price: 200 };
            stockManage.addStock(itemParam1.name, itemParam1.price, threeStock);
            stockManage.addStock(itemParam2.name, itemParam2.price, threeStock);
            expect(stockManage['stockMap'].get(stockManage.getItem(itemParam2.name))).toBe(threeStock);
            expect(stockManage['stockMap'].size).toBe(twoStock);
            expect(stockManage.getMinPrise()).toBe(itemParam1.price);
        });
        it('在庫追加数が不正(0個)の場合はエラーを投げる', function () {
            const itemParam = { name: 'test', price: 100 };
            expect(() => {
                stockManage.addStock(itemParam.name, itemParam.price, zeroStock);
            }).toThrowError('testの追加在庫数の値が不正です。: 0');
        });
        it('在庫追加数が不正(負数)の場合はエラーを投げる', function () {
            const itemParam = { name: 'test', price: 100 };
            expect(() => {
                stockManage.addStock(itemParam.name, itemParam.price, minusStock);
            }).toThrowError('testの追加在庫数の値が不正です。: -1');
        });
    });
    describe('decrementStockMap', function () {
        it('正常パターン。在庫数を1減らす', function () {
            const itemParam = { name: 'test', price: 100 };
            stockManage.addStock(itemParam.name, itemParam.price, twoStock);
            const item = stockManage.getItem(itemParam.name); // 追加した商品インスタンス取得
            stockManage.decrementStockMap(item);
            expect(stockManage['stockMap'].get(item)).toBe(1);
        });
        it('正常パターン。最小価格商品の在庫がなくなり最小価格が更新される', function () {
            const itemParam1 = { name: 'test1', price: 100 };
            const itemParam2 = { name: 'test2', price: 200 };
            const itemParam3 = { name: 'test3', price: 300 };
            stockManage.addStock(itemParam1.name, itemParam1.price, 1);
            stockManage.addStock(itemParam2.name, itemParam2.price, 1);
            stockManage.addStock(itemParam3.name, itemParam3.price, 1);
            const item1 = stockManage.getItem(itemParam1.name); // 追加した商品インスタンス取得
            expect(stockManage.getMinPrise()).toBe(oneHundredYen); // 最小価格
            stockManage.decrementStockMap(item1); // 在庫ひとつ減らす
            expect(stockManage['stockMap'].get(item1)).toBe(zeroStock);
            expect(stockManage.getMinPrise()).toBe(twoHundredYen); // 最小価格更新
        });
        it('在庫数切れの場合エラーを投げる', function () {
            const itemParam = { name: 'test', price: 100 };
            stockManage.addStock(itemParam.name, itemParam.price, 1);
            const item = stockManage.getItem(itemParam.name);
            stockManage.decrementStockMap(item); // 在庫ひとつ減らす
            // 在庫もうひとつ減らすと売り切れ
            expect(() => {
                stockManage.decrementStockMap(item);
            }).toThrowError('testは売り切れです。');
        });
    });
    describe('getItem', function () {
        it('正常パターン。商品のインスタンスを取得', function () {
            const itemParam = { name: 'test', price: 100 };
            stockManage.addStock(itemParam.name, itemParam.price, 1);
            const item = new Item(itemParam.name, itemParam.price);
            expect(JSON.stringify(stockManage.getItem(itemParam.name))).toBe(JSON.stringify(item)); //NOTE:別々で生成したインスタンスの中身の比較
        });
        it('取り扱いがない場合、エラーを投げる', function () {
            const itemParam = { name: 'test', price: 100 };
            expect(() => {
                stockManage.getItem(itemParam.name);
            }).toThrowError('testの取り扱いはありません。');
        });
    });
    describe('getMinPrise', function () {
        // その他のメソッドのテストに使用し動作確認
    });
});