diff --git a/app/gilded-rose.ts b/app/gilded-rose.ts index ee55134..06f0222 100644 --- a/app/gilded-rose.ts +++ b/app/gilded-rose.ts @@ -1,69 +1,55 @@ export class Item { - name: string; - sellIn: number; - quality: number; + name: string; + sellIn: number; + quality: number; - constructor(name, sellIn, quality) { - this.name = name; - this.sellIn = sellIn; - this.quality = quality; - } + constructor(name, sellIn, quality) { + this.name = name; + this.sellIn = sellIn; + this.quality = quality; + } } export class GildedRose { - items: Array; + items: Array; - constructor(items = [] as Array) { - this.items = items; - } + constructor(items = [] as Array) { + this.items = items; + } + + updateQuality() { + for (let i = 0; i < this.items.length; i++) { + if (this.items[i].name != "Sulfuras, Hand of Ragnaros") { + let qualityDifference = 1; + if (this.items[i].name.includes("Conjured")) { + qualityDifference = 2; + } + if (this.items[i].sellIn <= 0) { + qualityDifference *= 2; + } - updateQuality() { - for (let i = 0; i < this.items.length; i++) { - if (this.items[i].name != 'Aged Brie' && this.items[i].name != 'Backstage passes to a TAFKAL80ETC concert') { - if (this.items[i].quality > 0) { - if (this.items[i].name != 'Sulfuras, Hand of Ragnaros') { - this.items[i].quality = this.items[i].quality - 1 - } - } - } else { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1 - if (this.items[i].name == 'Backstage passes to a TAFKAL80ETC concert') { - if (this.items[i].sellIn < 11) { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1 - } - } - if (this.items[i].sellIn < 6) { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1 - } - } - } - } - } - if (this.items[i].name != 'Sulfuras, Hand of Ragnaros') { - this.items[i].sellIn = this.items[i].sellIn - 1; - } - if (this.items[i].sellIn < 0) { - if (this.items[i].name != 'Aged Brie') { - if (this.items[i].name != 'Backstage passes to a TAFKAL80ETC concert') { - if (this.items[i].quality > 0) { - if (this.items[i].name != 'Sulfuras, Hand of Ragnaros') { - this.items[i].quality = this.items[i].quality - 1 - } - } - } else { - this.items[i].quality = this.items[i].quality - this.items[i].quality - } - } else { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1 - } - } - } + if (this.items[i].name != "Aged Brie" && this.items[i].name != "Backstage passes to a TAFKAL80ETC concert" && this.items[i].quality > 0) { + this.items[i].quality = this.items[i].quality >= qualityDifference ? (this.items[i].quality - qualityDifference) : 0; } - return this.items; + if (this.items[i].name == "Aged Brie" && this.items[i].quality < 50) { + this.items[i].quality = (this.items[i].quality + qualityDifference) <= 50 ? (this.items[i].quality + qualityDifference) : 50; + } + + if (this.items[i].name == "Backstage passes to a TAFKAL80ETC concert" && this.items[i].quality < 50) { + if (this.items[i].sellIn > 10) { + this.items[i].quality += qualityDifference; + } else if (5 < this.items[i].sellIn && this.items[i].sellIn <= 10) { + this.items[i].quality = (this.items[i].quality + 2 * qualityDifference) <= 50 ? (this.items[i].quality + 2 * qualityDifference) : 50; + } else if (0 < this.items[i].sellIn && this.items[i].sellIn <= 5) { + this.items[i].quality = (this.items[i].quality + 3 * qualityDifference) <= 50 ? (this.items[i].quality + 3 * qualityDifference) : 50; + } else { + this.items[i].quality = 0; + } + } + this.items[i].sellIn -= 1; + } } -} \ No newline at end of file + return this.items; + } +} diff --git a/test/jest/gilded-rose.spec.ts b/test/jest/gilded-rose.spec.ts index 613639f..938c1f2 100644 --- a/test/jest/gilded-rose.spec.ts +++ b/test/jest/gilded-rose.spec.ts @@ -1,25 +1,164 @@ -import { Item, GildedRose } from '@/gilded-rose'; +import { Item, GildedRose } from "@/gilded-rose"; -describe('Gilded Rose', () => { - it('should foo', () => { - // Arrange - const gildedRose = new GildedRose([new Item('foo', 0, 0)]); +describe("Gilded Rose", () => { + it("should foo", () => { + // Arrange + const gildedRose = new GildedRose([new Item("foo", 0, 0)]); - // Act - const items = gildedRose.updateQuality(); + // Act + const items = gildedRose.updateQuality(); - // Assert - expect(items[0].name).toBe('bar'); - }); + // Assert + expect(items[0].name).toBe("foo"); + }); - it('sword quality drops by 1', () => { - // Arrange - const gildedRose = new GildedRose([new Item('Sword', 1, 1)]); + it("Sulfuras quality is 80 and it never alters", () => { + // Arrange + const gildedRose = new GildedRose([new Item("Sulfuras, Hand of Ragnaros", 1, 80)]); - // Act - const items = gildedRose.updateQuality(); + // Act + const items = gildedRose.updateQuality(); - // Assert - expect(items[0].quality).toBe(1); - }) + // Assert + expect(items[0].quality).toBe(80); + }); + + it("Sulfuras SellIn date never alters", () => { + // Arrange + const gildedRose = new GildedRose([new Item("Sulfuras, Hand of Ragnaros", 8, 80)]); + + // Act + const items = gildedRose.updateQuality(); + + // Assert + expect(items[0].sellIn).toBe(8); + }); + + it("SellIn date for items except Sulfuras decreases by 1", () => { + // Arrange + const gildedRose = new GildedRose([ + new Item("Sword", 0, 80), + new Item("Aged Brie", 4, 3), + new Item("Backstage passes to a TAFKAL80ETC concert", 5, 5), + ]); + + // Act + const items = gildedRose.updateQuality(); + + // Assert + expect(items[0].sellIn).toBe(-1); + expect(items[1].sellIn).toBe(3); + expect(items[2].sellIn).toBe(4); + }); + + it("sword quality drops by 1", () => { + // Arrange + const gildedRose = new GildedRose([new Item("Sword", 1, 1)]); + + // Act + const items = gildedRose.updateQuality(); + + // Assert + expect(items[0].quality).toBe(0); + }); + + it("Aged Brie quality increases", () => { + const gildedRose = new GildedRose([new Item("Aged Brie", 1, 0)]); + + const items = gildedRose.updateQuality(); + + expect(items[0].quality).toBe(1); + }); + + it("Backstage Pass quality increases by 2 when there are 10 days or less", () => { + const gildedRose = new GildedRose([ + new Item("Backstage passes to a TAFKAL80ETC concert", 10, 5), + new Item("Backstage passes to a TAFKAL80ETC concert", 7, 5), + ]); + + const items = gildedRose.updateQuality(); + + expect(items[0].quality).toBe(7); + expect(items[1].quality).toBe(7); + }); + + it("Backstage Pass quality increases by 3 when there are 5 days or less", () => { + const gildedRose = new GildedRose([ + new Item("Backstage passes to a TAFKAL80ETC concert", 5, 5), + new Item("Backstage passes to a TAFKAL80ETC concert", 3, 5), + ]); + + const items = gildedRose.updateQuality(); + + expect(items[0].quality).toBe(8); + expect(items[1].quality).toBe(8); + }); + + it("Backstage Pass item quality drops to 0 after the concert", () => { + const gildedRose = new GildedRose([ + new Item("Backstage passes to a TAFKAL80ETC concert", 0, 5), + ]); + + const items = gildedRose.updateQuality(); + + expect(items[0].sellIn).toBe(-1); + expect(items[0].quality).toBe(0); + }); + + it("quality is never negative", () => { + const gildedRose = new GildedRose([ + new Item("Sword", 1, 0), + new Item("Conjured Mana Cake", -3, 0), + ]); + + const items = gildedRose.updateQuality(); + + expect(items[0].quality).toBe(0); + expect(items[1].quality).toBe(0); + }); + + it("Aged Brie quality and Backstage Pass quality are never more than 50", () => { + const gildedRose = new GildedRose([ + new Item("Aged Brie", 1, 50), + new Item("Backstage passes to a TAFKAL80ETC concert", 1, 50), + ]); + + const items = gildedRose.updateQuality(); + + expect(items[0].quality).toBe(50); + expect(items[1].quality).toBe(50); + }); + + it("Once the sell by date has passed, Quality degrades twice as fast.", () => { + const gildedRose = new GildedRose([ + new Item("Aged Brie", -2, 6), + new Item("Sword", 0, 2), + new Item("Sword", 0, 3), + new Item("Sword", -1, 1), + ]); + + const items = gildedRose.updateQuality(); + + expect(items[0].quality).toBe(8); + expect(items[1].quality).toBe(0); + expect(items[2].quality).toBe(1); + expect(items[3].quality).toBe(0); + }); + + it('"Conjured" items degrade in Quality twice as fast as normal items.', () => { + const gildedRose = new GildedRose([ + new Item("Conjured Mana Cake", 3, 6), + new Item("Conjured Mana Cake", 0, 4), + new Item("Conjured Mana Cake", -3, 3), + ]); + + const items = gildedRose.updateQuality(); + + expect(items[0].sellIn).toBe(2); + expect(items[0].quality).toBe(4); + expect(items[1].sellIn).toBe(-1); + expect(items[1].quality).toBe(0); + expect(items[2].sellIn).toBe(-4); + expect(items[2].quality).toBe(0); + }); });