From 09e9ec6e179bc1c212d03c40d67c85baa3f9c068 Mon Sep 17 00:00:00 2001 From: Arno Chauveau Date: Thu, 24 Jul 2025 15:39:19 +0200 Subject: [PATCH] Move Legendary item logic to legendary-item-behavior --- .../behavior-resolver.spec.ts | 7 +++++ .../app/update-behaviors/behavior-resolver.ts | 3 ++ .../implementations/legacy-behavior.spec.ts | 14 ---------- .../implementations/legacy-behavior.ts | 12 ++------ .../legendary-item/legendary-item-behavior.ts | 13 +++++++++ .../legendary-item/legendary-item.spec.ts | 28 +++++++++++++++++++ 6 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item-behavior.ts create mode 100644 TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item.spec.ts diff --git a/TypeScript/app/update-behaviors/behavior-resolver.spec.ts b/TypeScript/app/update-behaviors/behavior-resolver.spec.ts index 80c923bd..50b2729b 100644 --- a/TypeScript/app/update-behaviors/behavior-resolver.spec.ts +++ b/TypeScript/app/update-behaviors/behavior-resolver.spec.ts @@ -3,6 +3,7 @@ import { getUpdateBehaviorFor } from "./behavior-resolver"; import { AgedBrieBehavior } from "./implementations/aged-brie/aged-brie-behavior"; import { LegacyBehavior } from "./implementations/legacy-behavior"; import { BackstagePassBehavior } from "./implementations/backstage-pass/backstage-pass-behavior"; +import { LegendaryItemBehavior } from "./implementations/legendary-item/legendary-item-behavior"; describe("Behavior resolver", () => { it("should correctly resolve Aged Brie", () => { @@ -19,6 +20,12 @@ describe("Behavior resolver", () => { ).toBeInstanceOf(BackstagePassBehavior); }); + it("should correctly resolve Legendary Items", () => { + expect( + getUpdateBehaviorFor(new Item("Sulfuras, Hand of Ragnaros", 0, 0)) + ).toBeInstanceOf(LegendaryItemBehavior); + }); + it("should correctly resolve the rest to Legacy behavior", () => { expect( getUpdateBehaviorFor(new Item("some other item", 0, 0)) diff --git a/TypeScript/app/update-behaviors/behavior-resolver.ts b/TypeScript/app/update-behaviors/behavior-resolver.ts index c0e179fb..47a240c0 100644 --- a/TypeScript/app/update-behaviors/behavior-resolver.ts +++ b/TypeScript/app/update-behaviors/behavior-resolver.ts @@ -3,6 +3,7 @@ import { IUpdateBehavior } from "./update-behavior.interface"; import { LegacyBehavior } from "./implementations/legacy-behavior"; import { AgedBrieBehavior } from "./implementations/aged-brie/aged-brie-behavior"; import { BackstagePassBehavior } from "./implementations/backstage-pass/backstage-pass-behavior"; +import { LegendaryItemBehavior } from "./implementations/legendary-item/legendary-item-behavior"; export function getUpdateBehaviorFor(item: Item): IUpdateBehavior { switch (item.name) { @@ -10,6 +11,8 @@ export function getUpdateBehaviorFor(item: Item): IUpdateBehavior { return new AgedBrieBehavior(item); case "Backstage passes to a TAFKAL80ETC concert": return new BackstagePassBehavior(item); + case "Sulfuras, Hand of Ragnaros": + return new LegendaryItemBehavior(item); default: return new LegacyBehavior(item); } diff --git a/TypeScript/app/update-behaviors/implementations/legacy-behavior.spec.ts b/TypeScript/app/update-behaviors/implementations/legacy-behavior.spec.ts index 9bff7c86..0458c851 100644 --- a/TypeScript/app/update-behaviors/implementations/legacy-behavior.spec.ts +++ b/TypeScript/app/update-behaviors/implementations/legacy-behavior.spec.ts @@ -37,18 +37,4 @@ describe("Legacy Behavior", () => { quality: 0, }); }); - - it("should not change quality of Sulfuras", () => { - const behavior = new LegacyBehavior( - new Item("Sulfuras, Hand of Ragnaros", 0, 80) - ); - - const result = behavior.update(); - - expect(result).toMatchObject({ - name: "Sulfuras, Hand of Ragnaros", - sellIn: 0, - quality: 80, - }); - }); }); diff --git a/TypeScript/app/update-behaviors/implementations/legacy-behavior.ts b/TypeScript/app/update-behaviors/implementations/legacy-behavior.ts index c04b8e73..9bf81114 100644 --- a/TypeScript/app/update-behaviors/implementations/legacy-behavior.ts +++ b/TypeScript/app/update-behaviors/implementations/legacy-behavior.ts @@ -6,19 +6,13 @@ export class LegacyBehavior implements IUpdateBehavior { update(): Item { if (this.item.quality > 0) { - if (this.item.name !== "Sulfuras, Hand of Ragnaros") { - this.item.quality = this.item.quality - 1; - } + this.item.quality = this.item.quality - 1; } - if (this.item.name !== "Sulfuras, Hand of Ragnaros") { - this.item.sellIn = this.item.sellIn - 1; - } + this.item.sellIn = this.item.sellIn - 1; if (this.item.sellIn < 0) { if (this.item.quality > 0) { - if (this.item.name !== "Sulfuras, Hand of Ragnaros") { - this.item.quality = this.item.quality - 1; - } + this.item.quality = this.item.quality - 1; } } return this.item; diff --git a/TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item-behavior.ts b/TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item-behavior.ts new file mode 100644 index 00000000..cfe2750c --- /dev/null +++ b/TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item-behavior.ts @@ -0,0 +1,13 @@ +import { config } from "@app/config"; +import { Item } from "@app/item"; +import { IUpdateBehavior } from "@app/update-behaviors/update-behavior.interface"; + +export class LegendaryItemBehavior implements IUpdateBehavior { + constructor(public item: Item) {} + update(): Item { + if (this.item.quality !== 80) { + throw new Error("A Legendary Item cannot have a quality other than 80"); + } + return this.item; + } +} diff --git a/TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item.spec.ts b/TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item.spec.ts new file mode 100644 index 00000000..f3fef643 --- /dev/null +++ b/TypeScript/app/update-behaviors/implementations/legendary-item/legendary-item.spec.ts @@ -0,0 +1,28 @@ +import { Item } from "@app/item"; +import { LegendaryItemBehavior } from "./legendary-item-behavior"; + +describe("Legendary Item Behavior", () => { + it("should keep items of quality 80 the same", () => { + const behavior = new LegendaryItemBehavior( + new Item("Sulfuras, Hand of Ragnaros", 0, 80) + ); + + const result = behavior.update(); + + expect(result).toMatchObject({ + name: "Sulfuras, Hand of Ragnaros", + sellIn: 0, + quality: 80, + }); + }); + + it("should throw an error when a legendary item doesn't have a quality of 80", () => { + const behavior = new LegendaryItemBehavior( + new Item("Sulfuras, Hand of Ragnaros", 0, 5) + ); + + expect(() => behavior.update()).toThrow( + "A Legendary Item cannot have a quality other than 80" + ); + }); +});