mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-05-13 13:27:58 +00:00
feat: add ConjuredStrategy
This commit is contained in:
parent
253c445e31
commit
4db0d990a7
@ -83,6 +83,22 @@ class SulfurasStrategy:
|
|||||||
pass # legendary items are immutable; parameters required by Protocol
|
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):
|
class GildedRose(object):
|
||||||
|
|
||||||
def __init__(self, items):
|
def __init__(self, items):
|
||||||
|
|||||||
@ -9,7 +9,7 @@ if str(_EXERCISE_ROOT) not in sys.path:
|
|||||||
|
|
||||||
from gilded_rose import (
|
from gilded_rose import (
|
||||||
Item, GildedRose, NormalStrategy, AgedBrieStrategy,
|
Item, GildedRose, NormalStrategy, AgedBrieStrategy,
|
||||||
BackstagePassStrategy, SulfurasStrategy,
|
BackstagePassStrategy, SulfurasStrategy, ConjuredStrategy,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -169,5 +169,43 @@ class TestSulfurasStrategy(unittest.TestCase):
|
|||||||
self.assertEqual(0, item.sell_in)
|
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__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user