From 4e79a86e030628a8b597351fbed81299edb0ed9d Mon Sep 17 00:00:00 2001 From: Lucas van Dongen Date: Mon, 23 Nov 2020 17:31:04 +0100 Subject: [PATCH] Added sell-in modification rules --- swift/Sources/GildedRose/GildedRose.swift | 31 +++------------- .../Rules/SellInModificationRules.swift | 36 +++++++++++++++++++ .../TestSellInModificationRule.swift | 36 +++++++++++++++++++ 3 files changed, 77 insertions(+), 26 deletions(-) create mode 100644 swift/Sources/GildedRose/Rules/SellInModificationRules.swift create mode 100644 swift/Tests/GildedRoseTests/TestSellInModificationRule.swift diff --git a/swift/Sources/GildedRose/GildedRose.swift b/swift/Sources/GildedRose/GildedRose.swift index 7a95040c..e3e9c355 100644 --- a/swift/Sources/GildedRose/GildedRose.swift +++ b/swift/Sources/GildedRose/GildedRose.swift @@ -1,35 +1,14 @@ public class GildedRose { - var items:[Item] + private(set) var items: [Item] - public init(items:[Item]) { + public init(items: [Item]) { self.items = items } public func updateQuality() { - for i in 0.. 0) { -// if (items[i].name != "Sulfuras, Hand of Ragnaros") { -// items[i].quality = items[i].quality - 1 -// } -// } -// } else { -// items[i].quality = items[i].quality - items[i].quality -// } -// } else { -// if (items[i].quality < 50) { -// items[i].quality = items[i].quality + 1 -// } -// } -// } + items = items.map { item in + let qualityUpdatedItem = QualityModificationRule.process(item: item) + return SellInModificationRule.process(item: qualityUpdatedItem) } } } diff --git a/swift/Sources/GildedRose/Rules/SellInModificationRules.swift b/swift/Sources/GildedRose/Rules/SellInModificationRules.swift new file mode 100644 index 00000000..1d6b45f9 --- /dev/null +++ b/swift/Sources/GildedRose/Rules/SellInModificationRules.swift @@ -0,0 +1,36 @@ +// +// SellInModificationRule.swift +// +// +// Created by Lucas van Dongen on 23/11/2020. +// + +import Foundation + +enum SellInModificationRule: Rule { + typealias RuleType = Self + + case regular, legendary + + static func rule(for item: Item) -> RuleType { + switch item.name { + case "Sulfuras, Hand of Ragnaros": + return .legendary + default: + return .regular + } + } + + func apply(to item: Item) -> Item { + switch self { + case .regular: + return applyRegularRule(to: item) + case .legendary: + return item // Unmodified + } + } + + func applyRegularRule(to item: Item) -> Item { + return Item(name: item.name, sellIn: item.sellIn - 1, quality: item.quality) + } +} diff --git a/swift/Tests/GildedRoseTests/TestSellInModificationRule.swift b/swift/Tests/GildedRoseTests/TestSellInModificationRule.swift new file mode 100644 index 00000000..ed703c5b --- /dev/null +++ b/swift/Tests/GildedRoseTests/TestSellInModificationRule.swift @@ -0,0 +1,36 @@ +// +// TestQualityModificationRules.swift +// GildedRose +// +// Created by Lucas van Dongen on 23/11/2020. +// + +@testable import GildedRose +import XCTest + +class TestQualityModificationRules: XCTestCase { + private let regularItem = Item(name: "Regular Item", sellIn: 1, quality: 5) + private let sulfuras = Item(name: "Sulfuras, Hand of Ragnaros", sellIn: 0, quality: 50) + + //- All items have a SellIn value which denotes the number of days we have to sell the item + func testRuleSelection() { + XCTAssertEqual(SellInModificationRule.rule(for: regularItem), .regular) + XCTAssertEqual(SellInModificationRule.rule(for: sulfuras), .legendary) + } + + func testApplyLegendary() { + let initialSellIn = sulfuras.sellIn + let system = GildedRose(items: [sulfuras]) + system.updateQuality() + + XCTAssertEqual(system.items.first!.sellIn, initialSellIn) + } + + func testApplyRegular() { + let initialSellIn = regularItem.sellIn + let system = GildedRose(items: [regularItem]) + system.updateQuality() + + XCTAssertLessThan(system.items.first!.sellIn, initialSellIn) + } +}