From 60aafd40e1bfa77d1b8392256b8ce27a774df8fd Mon Sep 17 00:00:00 2001 From: Gayun00 Date: Mon, 25 Sep 2023 21:53:58 +0900 Subject: [PATCH 1/5] Refactor: seperate to handleSellIn, handleQuality --- TypeScript/app/gilded-rose.ts | 65 +++++++++++------------- TypeScript/test/jest/gilded-rose.spec.ts | 3 +- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/TypeScript/app/gilded-rose.ts b/TypeScript/app/gilded-rose.ts index 15d316bf..ea8adf4b 100644 --- a/TypeScript/app/gilded-rose.ts +++ b/TypeScript/app/gilded-rose.ts @@ -1,16 +1,5 @@ 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 { Item } from "./itemClasses"; export class GildedRose { items: Array; @@ -19,6 +8,26 @@ export class GildedRose { this.items = items; } + handleSellIn(item) { + if (item.name != ITEMS.SURFRAS) { + item.sellIn -= 1; + } + if (item.sellIn >= 0) return; + if (item.quality >= 50) return; + + switch (item.name) { + case ITEMS.BRIE: + item.quality = item.quality + 1; + break; + case ITEMS.SURFRAS: + item.quality = 0; + break; + default: + item.quality -= 1; + break; + } + } + handlePassesQuality(item) { if (item.name !== ITEMS.PASSES) return; if (6 <= item.sellIn && item.sellIn < 11) { @@ -30,41 +39,25 @@ export class GildedRose { } } - handleIfSellInIs0(item) { - if (item.sellIn >= 0) return; - + handleQuality(item) { switch (item.name) { - case ITEMS.BRIE: - if (item.quality >= 50) return; - item.quality = item.quality + 1; + case ITEMS.PASSES: + this.handlePassesQuality(item); break; case ITEMS.SURFRAS: - item.quality = 0; - break; - default: - if (!item.quality) return; item.quality -= 1; break; } + + if (item.quality >= 50) return; + item.quality += 1; } updateQuality() { for (const item of this.items) { if (!item.quality) break; - if (item.name != ITEMS.SURFRAS) { - item.sellIn -= 1; - } - this.handleIfSellInIs0(item); - - 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); + this.handleSellIn(item); + this.handleQuality(item); } return this.items; diff --git a/TypeScript/test/jest/gilded-rose.spec.ts b/TypeScript/test/jest/gilded-rose.spec.ts index e89a60f6..c9a6c81b 100644 --- a/TypeScript/test/jest/gilded-rose.spec.ts +++ b/TypeScript/test/jest/gilded-rose.spec.ts @@ -1,4 +1,5 @@ -import { Item, GildedRose } from "@/gilded-rose"; +import { GildedRose } from "@/gilded-rose"; +import { Item } from "@/itemClasses"; describe("Aged Brie 테스트", () => { let gildedRose = new GildedRose([new Item("Aged Brie", 1, 0)]); From 5d670ac6725cb701142c5b5222f6924fdbc29b41 Mon Sep 17 00:00:00 2001 From: Gayun00 Date: Mon, 25 Sep 2023 22:34:24 +0900 Subject: [PATCH 2/5] Refactor: add item classes --- TypeScript/app/itemClasses.ts | 59 ++++++++++++++++++++++ TypeScript/test/golden-master-text-test.ts | 3 +- TypeScript/test/jest/gilded-rose.spec.ts | 30 ++++------- 3 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 TypeScript/app/itemClasses.ts diff --git a/TypeScript/app/itemClasses.ts b/TypeScript/app/itemClasses.ts new file mode 100644 index 00000000..7507b2b5 --- /dev/null +++ b/TypeScript/app/itemClasses.ts @@ -0,0 +1,59 @@ +export class Item { + name: string; + sellIn: number; + quality: number; + + constructor(name, sellIn, quality) { + this.name = name; + this.sellIn = sellIn; + this.quality = quality; + } + + handleQuality() { + // + } + + handleSellIn() { + // + } +} + +export class AgedBrie extends Item { + constructor(sellIn, quality) { + super("Aged Brie", sellIn, quality); + } + handleQuality() { + // + } + + handleSellIn() { + // + } +} + +export class Passes extends Item { + constructor(sellIn, quality) { + super("Backstage passes to a TAFKAL80ETC concert", sellIn, quality); + } + + handleQuality() { + // + } + + handleSellIn() { + // + } +} + +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 c9a6c81b..3f0f0c64 100644 --- a/TypeScript/test/jest/gilded-rose.spec.ts +++ b/TypeScript/test/jest/gilded-rose.spec.ts @@ -1,11 +1,11 @@ import { GildedRose } from "@/gilded-rose"; -import { Item } from "@/itemClasses"; +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 감소", () => { @@ -16,7 +16,7 @@ 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); @@ -25,12 +25,10 @@ describe("Aged Brie 테스트", () => { }); 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 변하지 않음", () => { @@ -42,14 +40,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증가", () => { @@ -60,9 +54,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); @@ -70,9 +62,7 @@ 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); From 77c82c95b31e33f7767385ef1a1bc275c9af3828 Mon Sep 17 00:00:00 2001 From: Gayun00 Date: Mon, 25 Sep 2023 23:29:27 +0900 Subject: [PATCH 3/5] Refactor: add handleQuality, handleSellIn of item classes --- TypeScript/app/gilded-rose.ts | 4 ++++ TypeScript/app/itemClasses.ts | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/TypeScript/app/gilded-rose.ts b/TypeScript/app/gilded-rose.ts index ea8adf4b..b08314d1 100644 --- a/TypeScript/app/gilded-rose.ts +++ b/TypeScript/app/gilded-rose.ts @@ -9,12 +9,14 @@ export class GildedRose { } handleSellIn(item) { + // if (item.name != ITEMS.SURFRAS) { item.sellIn -= 1; } if (item.sellIn >= 0) return; if (item.quality >= 50) return; + // switch (item.name) { case ITEMS.BRIE: item.quality = item.quality + 1; @@ -29,6 +31,7 @@ export class GildedRose { } handlePassesQuality(item) { + // if (item.name !== ITEMS.PASSES) return; if (6 <= item.sellIn && item.sellIn < 11) { item.quality += 1; @@ -40,6 +43,7 @@ export class GildedRose { } handleQuality(item) { + // switch (item.name) { case ITEMS.PASSES: this.handlePassesQuality(item); diff --git a/TypeScript/app/itemClasses.ts b/TypeScript/app/itemClasses.ts index 7507b2b5..0bbc09fb 100644 --- a/TypeScript/app/itemClasses.ts +++ b/TypeScript/app/itemClasses.ts @@ -23,11 +23,12 @@ export class AgedBrie extends Item { super("Aged Brie", sellIn, quality); } handleQuality() { - // + this.quality++; + this.quality++; } handleSellIn() { - // + this.sellIn--; } } @@ -37,11 +38,20 @@ export class Passes extends Item { } handleQuality() { - // + this.quality--; + + if (6 <= this.sellIn && this.sellIn < 11) { + this.quality += 1; + } + + if (this.sellIn < 6) { + this.quality += 2; + } + this.quality++; } handleSellIn() { - // + this.sellIn--; } } @@ -50,7 +60,9 @@ export class Surfras extends Item { super("Sulfuras, Hand of Ragnaros", sellIn, quality); } handleQuality() { - // + this.quality = 0; + this.quality--; + this.quality++; } handleSellIn() { From b7857cb77b16c73fb0c6e2c320daad200c56e8a5 Mon Sep 17 00:00:00 2001 From: Gayun00 Date: Tue, 26 Sep 2023 00:07:59 +0900 Subject: [PATCH 4/5] Refactor: check test, delete previous functions --- TypeScript/app/gilded-rose.ts | 70 +++++------------------------------ TypeScript/app/itemClasses.ts | 16 +------- 2 files changed, 12 insertions(+), 74 deletions(-) diff --git a/TypeScript/app/gilded-rose.ts b/TypeScript/app/gilded-rose.ts index b08314d1..5404c076 100644 --- a/TypeScript/app/gilded-rose.ts +++ b/TypeScript/app/gilded-rose.ts @@ -1,69 +1,19 @@ -import { ITEMS } from "./constants"; -import { Item } from "./itemClasses"; +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; } - handleSellIn(item) { - // - if (item.name != ITEMS.SURFRAS) { - item.sellIn -= 1; - } - if (item.sellIn >= 0) return; - if (item.quality >= 50) return; - - // - switch (item.name) { - case ITEMS.BRIE: - item.quality = item.quality + 1; - break; - case ITEMS.SURFRAS: - item.quality = 0; - break; - default: - item.quality -= 1; - break; - } - } - - 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; - } - } - - handleQuality(item) { - // - switch (item.name) { - case ITEMS.PASSES: - this.handlePassesQuality(item); - break; - case ITEMS.SURFRAS: - item.quality -= 1; - break; - } - - if (item.quality >= 50) return; - item.quality += 1; - } - updateQuality() { - for (const item of this.items) { - if (!item.quality) break; - this.handleSellIn(item); - this.handleQuality(item); - } + const updatedItems = this.items.map((item) => { + item.handleQuality(); - return this.items; + item.handleSellIn(); + return item; + }); + return updatedItems as ItemClasses; } } diff --git a/TypeScript/app/itemClasses.ts b/TypeScript/app/itemClasses.ts index 0bbc09fb..b89da25e 100644 --- a/TypeScript/app/itemClasses.ts +++ b/TypeScript/app/itemClasses.ts @@ -8,14 +8,6 @@ export class Item { this.sellIn = sellIn; this.quality = quality; } - - handleQuality() { - // - } - - handleSellIn() { - // - } } export class AgedBrie extends Item { @@ -23,7 +15,7 @@ export class AgedBrie extends Item { super("Aged Brie", sellIn, quality); } handleQuality() { - this.quality++; + if (this.quality >= 50) return; this.quality++; } @@ -38,8 +30,6 @@ export class Passes extends Item { } handleQuality() { - this.quality--; - if (6 <= this.sellIn && this.sellIn < 11) { this.quality += 1; } @@ -60,9 +50,7 @@ export class Surfras extends Item { super("Sulfuras, Hand of Ragnaros", sellIn, quality); } handleQuality() { - this.quality = 0; - this.quality--; - this.quality++; + // } handleSellIn() { From 833f59f2ba049b966b8bc1c93958f64413567c8b Mon Sep 17 00:00:00 2001 From: Gayun00 Date: Tue, 26 Sep 2023 08:09:16 +0900 Subject: [PATCH 5/5] Refactor: add test cases --- TypeScript/app/gilded-rose.ts | 2 +- TypeScript/app/itemClasses.ts | 27 ++++++++++------ TypeScript/test/jest/gilded-rose.spec.ts | 40 ++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/TypeScript/app/gilded-rose.ts b/TypeScript/app/gilded-rose.ts index 5404c076..31bf931f 100644 --- a/TypeScript/app/gilded-rose.ts +++ b/TypeScript/app/gilded-rose.ts @@ -9,9 +9,9 @@ export class GildedRose { updateQuality() { const updatedItems = this.items.map((item) => { + item.handleSellIn(); item.handleQuality(); - item.handleSellIn(); return item; }); return updatedItems as ItemClasses; diff --git a/TypeScript/app/itemClasses.ts b/TypeScript/app/itemClasses.ts index b89da25e..8a1b6aac 100644 --- a/TypeScript/app/itemClasses.ts +++ b/TypeScript/app/itemClasses.ts @@ -15,7 +15,11 @@ export class AgedBrie extends Item { super("Aged Brie", sellIn, quality); } handleQuality() { - if (this.quality >= 50) return; + if (this.quality >= 50 || this.quality === 0) return; + if (this.sellIn === 0) { + this.quality = this.quality / 2; + return; + } this.quality++; } @@ -30,14 +34,20 @@ export class Passes extends Item { } 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 += 1; + this.quality += 2; } if (this.sellIn < 6) { - this.quality += 2; + this.quality += 3; } - this.quality++; } handleSellIn() { @@ -49,11 +59,8 @@ export class Surfras extends Item { constructor(sellIn, quality) { super("Sulfuras, Hand of Ragnaros", sellIn, quality); } - handleQuality() { - // - } - handleSellIn() { - // - } + handleQuality() {} + + handleSellIn() {} } diff --git a/TypeScript/test/jest/gilded-rose.spec.ts b/TypeScript/test/jest/gilded-rose.spec.ts index 3f0f0c64..664a5072 100644 --- a/TypeScript/test/jest/gilded-rose.spec.ts +++ b/TypeScript/test/jest/gilded-rose.spec.ts @@ -22,6 +22,22 @@ describe("Aged Brie 테스트", () => { 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 테스트", () => { @@ -68,4 +84,28 @@ describe("Backstage passes 테스트", () => { 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); + }); });