diff --git a/python/gilded_rose.py b/python/gilded_rose.py index 7b8299c1..8f0c56e2 100755 --- a/python/gilded_rose.py +++ b/python/gilded_rose.py @@ -83,6 +83,22 @@ class SulfurasStrategy: pass # legendary items are immutable; parameters required by Protocol +class ConjuredStrategy: + """ + Double-degradation strategy for Conjured items. + + Quality decreases by 2 per day; by 4 per day once the sell date + has passed. Quality never falls below 0. + """ + + def update(self, item: "Item", days: int) -> None: + for _ in range(days): + item.quality = max(0, item.quality - 2) + item.sell_in -= 1 + if item.sell_in < 0: + item.quality = max(0, item.quality - 2) + + class GildedRose(object): def __init__(self, items): diff --git a/python/tests/test_gilded_rose.py b/python/tests/test_gilded_rose.py index 734b73a4..4354b594 100644 --- a/python/tests/test_gilded_rose.py +++ b/python/tests/test_gilded_rose.py @@ -9,7 +9,7 @@ if str(_EXERCISE_ROOT) not in sys.path: from gilded_rose import ( Item, GildedRose, NormalStrategy, AgedBrieStrategy, - BackstagePassStrategy, SulfurasStrategy, + BackstagePassStrategy, SulfurasStrategy, ConjuredStrategy, ) @@ -169,5 +169,43 @@ class TestSulfurasStrategy(unittest.TestCase): self.assertEqual(0, item.sell_in) +class TestConjuredStrategy(unittest.TestCase): + """Tests for ConjuredStrategy — degrades twice as fast as normal.""" + + def setUp(self): + self.strategy = ConjuredStrategy() + + def test_quality_decrements_by_2_each_day(self): + item = Item("Conjured Mana Cake", sell_in=10, quality=20) + self.strategy.update(item, days=1) + self.assertEqual(18, item.quality) + self.assertEqual(9, item.sell_in) + + def test_quality_floors_at_zero(self): + item = Item("Conjured Mana Cake", sell_in=5, quality=1) + self.strategy.update(item, days=1) + self.assertEqual(0, item.quality) + + def test_quality_degrades_by_4_after_sell_date(self): + # Past sell date: -4 per day + item = Item("Conjured Mana Cake", sell_in=0, quality=20) + self.strategy.update(item, days=1) + self.assertEqual(16, item.quality) + self.assertEqual(-1, item.sell_in) + + def test_multi_day_crosses_sell_date(self): + # sell_in=1, quality=10, days=3 + # Day1: q=8 si=0 | Day2: q=4 si=-1 | Day3: q=0 si=-2 + item = Item("Conjured Mana Cake", sell_in=1, quality=10) + self.strategy.update(item, days=3) + self.assertEqual(0, item.quality) + self.assertEqual(-2, item.sell_in) + + def test_quality_floors_at_zero_post_sell_date(self): + item = Item("Conjured Mana Cake", sell_in=0, quality=2) + self.strategy.update(item, days=1) + self.assertEqual(0, item.quality) + + if __name__ == '__main__': unittest.main()