diff --git a/TypeScript/app/gilded-rose.ts b/TypeScript/app/gilded-rose.ts index 15d316bf..31bf931f 100644 --- a/TypeScript/app/gilded-rose.ts +++ b/TypeScript/app/gilded-rose.ts @@ -1,72 +1,19 @@ -import { ITEMS } from "./constants"; - -export class Item { - name: string; - sellIn: number; - quality: number; - - constructor(name, sellIn, quality) { - this.name = name; - this.sellIn = sellIn; - this.quality = quality; - } -} +import { AgedBrie, Passes, Surfras } from "./itemClasses"; +type ItemClasses = AgedBrie[] | Surfras[] | Passes[]; export class GildedRose { - items: Array; - - constructor(items = [] as Array) { + items: ItemClasses; + constructor(items = [] as ItemClasses) { this.items = items; } - handlePassesQuality(item) { - if (item.name !== ITEMS.PASSES) return; - if (6 <= item.sellIn && item.sellIn < 11) { - item.quality += 1; - } - - if (item.sellIn < 6) { - item.quality += 2; - } - } - - handleIfSellInIs0(item) { - if (item.sellIn >= 0) return; - - switch (item.name) { - case ITEMS.BRIE: - if (item.quality >= 50) return; - item.quality = item.quality + 1; - break; - case ITEMS.SURFRAS: - item.quality = 0; - break; - default: - if (!item.quality) return; - item.quality -= 1; - break; - } - } - updateQuality() { - for (const item of this.items) { - if (!item.quality) break; - if (item.name != ITEMS.SURFRAS) { - item.sellIn -= 1; - } - this.handleIfSellInIs0(item); + const updatedItems = this.items.map((item) => { + item.handleSellIn(); + item.handleQuality(); - if (item.name != ITEMS.BRIE && item.name != ITEMS.PASSES) { - if (item.name === ITEMS.SURFRAS) break; - item.quality -= 1; - } - - if (item.quality >= 50) break; - item.quality += 1; - - this.handlePassesQuality(item); - } - - return this.items; + return item; + }); + return updatedItems as ItemClasses; } } diff --git a/TypeScript/app/itemClasses.ts b/TypeScript/app/itemClasses.ts new file mode 100644 index 00000000..8a1b6aac --- /dev/null +++ b/TypeScript/app/itemClasses.ts @@ -0,0 +1,66 @@ +export class Item { + name: string; + sellIn: number; + quality: number; + + constructor(name, sellIn, quality) { + this.name = name; + this.sellIn = sellIn; + this.quality = quality; + } +} + +export class AgedBrie extends Item { + constructor(sellIn, quality) { + super("Aged Brie", sellIn, quality); + } + handleQuality() { + if (this.quality >= 50 || this.quality === 0) return; + if (this.sellIn === 0) { + this.quality = this.quality / 2; + return; + } + this.quality++; + } + + handleSellIn() { + this.sellIn--; + } +} + +export class Passes extends Item { + constructor(sellIn, quality) { + super("Backstage passes to a TAFKAL80ETC concert", sellIn, quality); + } + + handleQuality() { + if (this.quality >= 50 || this.quality === 0) return; + + if (this.sellIn === 0) { + this.quality = 0; + return; + } + + if (6 <= this.sellIn && this.sellIn < 11) { + this.quality += 2; + } + + if (this.sellIn < 6) { + this.quality += 3; + } + } + + handleSellIn() { + this.sellIn--; + } +} + +export class Surfras extends Item { + constructor(sellIn, quality) { + super("Sulfuras, Hand of Ragnaros", sellIn, quality); + } + + handleQuality() {} + + handleSellIn() {} +} diff --git a/TypeScript/test/golden-master-text-test.ts b/TypeScript/test/golden-master-text-test.ts index 6fa5537a..3ee77ab2 100644 --- a/TypeScript/test/golden-master-text-test.ts +++ b/TypeScript/test/golden-master-text-test.ts @@ -1,4 +1,5 @@ -import { Item, GildedRose } from "../app/gilded-rose"; +import { Item } from "@/itemClasses"; +import { GildedRose } from "../app/gilded-rose"; const items = [ new Item("+5 Dexterity Vest", 10, 20), // diff --git a/TypeScript/test/jest/gilded-rose.spec.ts b/TypeScript/test/jest/gilded-rose.spec.ts index e89a60f6..664a5072 100644 --- a/TypeScript/test/jest/gilded-rose.spec.ts +++ b/TypeScript/test/jest/gilded-rose.spec.ts @@ -1,10 +1,11 @@ -import { Item, GildedRose } from "@/gilded-rose"; +import { GildedRose } from "@/gilded-rose"; +import { AgedBrie, Passes, Surfras } from "@/itemClasses"; describe("Aged Brie 테스트", () => { - let gildedRose = new GildedRose([new Item("Aged Brie", 1, 0)]); + let gildedRose = new GildedRose([new AgedBrie(1, 0)]); beforeEach(() => { - gildedRose = new GildedRose([new Item("Aged Brie", 2, 3)]); + gildedRose = new GildedRose([new AgedBrie(2, 3)]); }); it("Aged Brie의 quality는 1 증가, sellIn은 1 감소", () => { @@ -15,21 +16,35 @@ describe("Aged Brie 테스트", () => { }); it("quality는 50을 초과할 수 없음", () => { - const gildedRose = new GildedRose([new Item("Aged Brie", 2, 50)]); + const gildedRose = new GildedRose([new AgedBrie(2, 50)]); const items = gildedRose.updateQuality(); expect(items[0].sellIn).toBe(1); expect(items[0].quality).toBe(50); }); + + it("quality는 음수가 될 수 없음", () => { + const gildedRose = new GildedRose([new AgedBrie(2, 0)]); + const items = gildedRose.updateQuality(); + + expect(items[0].sellIn).toBe(1); + expect(items[0].quality).toBe(0); + }); + + it("sellIn값이 0이 되면 Quality는 2배로 감소", () => { + const gildedRose = new GildedRose([new AgedBrie(1, 4)]); + const items = gildedRose.updateQuality(); + + expect(items[0].sellIn).toBe(0); + expect(items[0].quality).toBe(2); + }); }); describe("Surfras 테스트", () => { - let gildedRose = new GildedRose([ - new Item("Sulfuras, Hand of Ragnaros", 1, 0), - ]); + let gildedRose = new GildedRose([new Surfras(1, 0)]); beforeEach(() => { - gildedRose = new GildedRose([new Item("Sulfuras, Hand of Ragnaros", 2, 3)]); + gildedRose = new GildedRose([new Surfras(2, 3)]); }); it("Surfras의 quality는 변하지 않음, sellIn 변하지 않음", () => { @@ -41,14 +56,10 @@ describe("Surfras 테스트", () => { }); describe("Backstage passes 테스트", () => { - let gildedRose = new GildedRose([ - new Item("Backstage passes to a TAFKAL80ETC concert", 1, 0), - ]); + let gildedRose = new GildedRose([new Passes(1, 0)]); beforeEach(() => { - gildedRose = new GildedRose([ - new Item("Backstage passes to a TAFKAL80ETC concert", 2, 3), - ]); + gildedRose = new GildedRose([new Passes(2, 3)]); }); it("Backstage passes의 sellIn값 1감소, quality 1증가", () => { @@ -59,9 +70,7 @@ describe("Backstage passes 테스트", () => { }); it("Backstage passes의 sellIn값 10일부터, quality 2증가", () => { - const gildedRose = new GildedRose([ - new Item("Backstage passes to a TAFKAL80ETC concert", 10, 3), - ]); + const gildedRose = new GildedRose([new Passes(10, 3)]); const items = gildedRose.updateQuality(); expect(items[0].sellIn).toBe(9); @@ -69,12 +78,34 @@ describe("Backstage passes 테스트", () => { }); it("Backstage passes의 sellIn값 5일부터, quality 3증가", () => { - const gildedRose = new GildedRose([ - new Item("Backstage passes to a TAFKAL80ETC concert", 5, 3), - ]); + const gildedRose = new GildedRose([new Passes(5, 3)]); const items = gildedRose.updateQuality(); expect(items[0].sellIn).toBe(4); expect(items[0].quality).toBe(6); }); + + it("Backstage passes의 sellIn값 0일 때, quality 0으로 변경", () => { + const gildedRose = new GildedRose([new Passes(1, 3)]); + const items = gildedRose.updateQuality(); + + expect(items[0].sellIn).toBe(0); + expect(items[0].quality).toBe(0); + }); + + it("quality는 50을 초과할 수 없음", () => { + const gildedRose = new GildedRose([new AgedBrie(2, 50)]); + const items = gildedRose.updateQuality(); + + expect(items[0].sellIn).toBe(1); + expect(items[0].quality).toBe(50); + }); + + it("quality는 음수가 될 수 없음", () => { + const gildedRose = new GildedRose([new Passes(1, 0)]); + const items = gildedRose.updateQuality(); + + expect(items[0].sellIn).toBe(0); + expect(items[0].quality).toBe(0); + }); });