From bbeaef456ab92712056502a7681dafa49b6bb681 Mon Sep 17 00:00:00 2001 From: kiwioyster Date: Thu, 22 Jun 2023 12:34:31 +1200 Subject: [PATCH] implement conjured item --- TypeScript/app/gilded-rose.ts | 26 +++++++++++++++++++----- TypeScript/test/jest/gilded-rose.spec.ts | 23 +++++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/TypeScript/app/gilded-rose.ts b/TypeScript/app/gilded-rose.ts index b08d6c73..42c8ee1e 100644 --- a/TypeScript/app/gilded-rose.ts +++ b/TypeScript/app/gilded-rose.ts @@ -40,13 +40,15 @@ export class GildedRose { private _isBackstagePass = (name: string): boolean => name === "Backstage passes to a TAFKAL80ETC concert"; + private _isConjured = (name: string): boolean => name.includes("Conjured"); + private _decayGeneralItem = (item: Item): Item => { - const qualityDecay = item.sellIn > 0 ? 1 : 2; - return { + const newItem = { name: item.name, - quality: item.quality > 0 ? item.quality - qualityDecay : 0, + quality: item.quality - this._getDecayAmount(item), sellIn: item.sellIn - 1, }; + return this._applyQualityLimitation(newItem); }; private _decayLegendaryItem = (item: Item): Item => { @@ -82,11 +84,25 @@ export class GildedRose { }; private _applyQualityLimitation = (item: Item): Item => { + let newQuality = item.quality; + if (item.quality > this.QUALITY_LIM) { + newQuality = this.QUALITY_LIM; + } else if (item.quality < 0) { + newQuality = 0; + } return { name: item.name, - quality: - item.quality > this.QUALITY_LIM ? this.QUALITY_LIM : item.quality, + quality: newQuality, sellIn: item.sellIn, }; }; + + private _getDecayAmount = (item: Item): number => { + const decayAmount = item.sellIn > 0 ? 1 : 2; + if (this._isConjured(item.name)) { + return decayAmount * 2; + } else { + return decayAmount; + } + }; } diff --git a/TypeScript/test/jest/gilded-rose.spec.ts b/TypeScript/test/jest/gilded-rose.spec.ts index fcd72510..0cea4996 100644 --- a/TypeScript/test/jest/gilded-rose.spec.ts +++ b/TypeScript/test/jest/gilded-rose.spec.ts @@ -8,6 +8,8 @@ const legendaryItem = (sellIn: number, quality: number) => new Item("Sulfuras, Hand of Ragnaros", sellIn, quality); const backstagePassItem = (sellIn: number, quality: number) => new Item("Backstage passes to a TAFKAL80ETC concert", sellIn, quality); +const conjuredItem = (sellIn: number, quality: number) => + new Item("Conjured test item", sellIn, quality); describe("Gilded Rose", () => { it("should degrade quality", () => { @@ -102,4 +104,25 @@ describe("Gilded Rose", () => { expect(items[0].quality).toBe(50); }); }); + + describe("conjured", () => { + it("should degrade quality", () => { + const gildedRose = new GildedRose([conjuredItem(1, 3)]); + const items = gildedRose.updateQuality(); + expect(items[0].sellIn).toBe(0); + expect(items[0].quality).toBe(1); + }); + it("should degrade quality twice as fast past sell in date", () => { + const gildedRose = new GildedRose([conjuredItem(0, 4)]); + const items = gildedRose.updateQuality(); + expect(items[0].sellIn).toBe(-1); + expect(items[0].quality).toBe(0); + }); + it("should not degrade quality past 0", () => { + const gildedRose = new GildedRose([conjuredItem(0, 1)]); + const items = gildedRose.updateQuality(); + expect(items[0].sellIn).toBe(-1); + expect(items[0].quality).toBe(0); + }); + }); });