Added advanced rules

This commit is contained in:
Lucas van Dongen 2020-11-23 14:51:14 +01:00
parent 6dcf0c233e
commit d5c6b9f9ce

View File

@ -0,0 +1,97 @@
//
// AdvancedRules.swift
// GildedRose
//
// Created by Lucas van Dongen on 23/11/2020.
//
@testable import GildedRose
import XCTest
class AdvancedRules: XCTestCase {
private let expiringItem = Item(name: "Expiring Item", sellIn: 1, quality: 5)
private let noQualityItem = Item(name: "No quality Item", sellIn: 1, quality: 0)
private let brieItem = Item(name: "Aged Brie", sellIn: 2, quality: 0)
private let veryGoodBrieItem = Item(name: "Aged Brie", sellIn: 2, quality: 50)
private let sulfuras = Item(name: "Sulfuras, Hand of Ragnaros", sellIn: 0, quality: 50)
//- Once the sell by date has passed, Quality degrades twice as fast
func testQualityDegradationAfterExpire() {
let initialQuality = expiringItem.quality
let system = GildedRose(items: [expiringItem])
system.updateQuality()
let qualityAfterUpdateNotExpiredYet = system.items.first!.quality
let qualityLossNotExpired = initialQuality - qualityAfterUpdateNotExpiredYet
system.updateQuality()
let qualityAfterUpdateExpired = system.items.first!.quality
let qualityLossExpired = qualityAfterUpdateNotExpiredYet - qualityAfterUpdateExpired
XCTAssertEqual(qualityLossNotExpired * 2, qualityLossExpired)
}
//- The Quality of an item is never negative
func testQualityNeverNegative() {
let system = GildedRose(items: [noQualityItem])
system.updateQuality()
let qualityAfterUpdate = system.items.first!.quality
XCTAssertEqual(0, noQualityItem.quality)
XCTAssertEqual(0, qualityAfterUpdate)
}
//- "Aged Brie" actually increases in Quality the older it gets
func testBrieIncreasesInQuality() {
let initialQuality = brieItem.quality
let system = GildedRose(items: [brieItem])
system.updateQuality()
XCTAssertGreaterThan(system.items.first!.quality, initialQuality)
}
//- The Quality of an item is never more than 50
func testQualityNeverOverMaximum() {
let initialQuality = veryGoodBrieItem.quality
let system = GildedRose(items: [veryGoodBrieItem])
system.updateQuality()
XCTAssertEqual(initialQuality, 50)
XCTAssertEqual(system.items.first!.quality, 50)
}
//- "Sulfuras", being a legendary item, never has to be sold, never decreases in Quality
func testLegendaryNoExpire() {
let initialSellIn = sulfuras.sellIn
let initialQuality = sulfuras.quality
let system = GildedRose(items: [sulfuras])
system.updateQuality()
XCTAssertEqual(initialSellIn, system.items.first!.sellIn)
XCTAssertEqual(initialQuality, system.items.first!.quality)
}
//- "Backstage passes", like aged brie, increases in Quality as its SellIn value approaches;
// Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less but
// Quality drops to 0 after the concert
func testBackstagePasses() {
let backstagePassMoreThan10Days = Item(name: "Backstage passes to a TAFKAL80ETC concert", sellIn: 15, quality: 20)
let backstagePassLessThan10Days = Item(name: "Backstage passes to a TAFKAL80ETC concert", sellIn: 10, quality: 20)
let backstagePassLessThan5Days = Item(name: "Backstage passes to a TAFKAL80ETC concert", sellIn: 5, quality: 20)
let backstagePassExpired = Item(name: "Backstage passes to a TAFKAL80ETC concert", sellIn: 0, quality: 20)
XCTAssertTrue(hasExpectedQuality(item: backstagePassMoreThan10Days, quality: 21))
XCTAssertTrue(hasExpectedQuality(item: backstagePassLessThan10Days, quality: 22))
XCTAssertTrue(hasExpectedQuality(item: backstagePassLessThan5Days, quality: 23))
XCTAssertTrue(hasExpectedQuality(item: backstagePassExpired, quality: 0))
}
private func hasExpectedQuality(item: Item, quality: Int) -> Bool {
let system = GildedRose(items: [item])
system.updateQuality()
return item.quality == quality
}
}