mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-10-13 17:49:25 +00:00
Add conjured items
Conjured items degrade twice as fast as normal ones. Matched by name prefix so any "Conjured ..." item works, not just the Mana Cake. Wrote the tests first, then the updater. Only the Mana Cake lines changed in the approved output.
This commit is contained in:
1 parent
fc9ceaad09
commit
b835c7e1da
3 files changed
+37
-5
No files matched your search
+14
-1
@@ -3,6 +3,7 @@
|
||||
AGED_BRIE = "Aged Brie"
|
||||
BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert"
|
||||
SULFURAS = "Sulfuras, Hand of Ragnaros"
|
||||
CONJURED_PREFIX = "Conjured"
|
||||
|
||||
MIN_QUALITY = 0
|
||||
MAX_QUALITY = 50
|
||||
@@ -71,17 +72,29 @@ class SulfurasUpdater(ItemUpdater):
|
||||
pass
|
||||
|
||||
|
||||
class ConjuredUpdater(ItemUpdater):
|
||||
"""Degrades twice as fast as an ordinary item."""
|
||||
|
||||
def _quality_delta(self, item):
|
||||
return 2 * super()._quality_delta(item)
|
||||
|
||||
|
||||
_UPDATERS_BY_NAME = {
|
||||
AGED_BRIE: AgedBrieUpdater(),
|
||||
BACKSTAGE_PASS: BackstagePassUpdater(),
|
||||
SULFURAS: SulfurasUpdater(),
|
||||
}
|
||||
_CONJURED_UPDATER = ConjuredUpdater()
|
||||
_DEFAULT_UPDATER = ItemUpdater()
|
||||
|
||||
|
||||
def updater_for(item):
|
||||
"""Pick the rule set that applies to an item. Updaters are stateless."""
|
||||
return _UPDATERS_BY_NAME.get(item.name, _DEFAULT_UPDATER)
|
||||
if item.name in _UPDATERS_BY_NAME:
|
||||
return _UPDATERS_BY_NAME[item.name]
|
||||
if item.name.startswith(CONJURED_PREFIX):
|
||||
return _CONJURED_UPDATER
|
||||
return _DEFAULT_UPDATER
|
||||
|
||||
|
||||
class Item:
|
||||
|
||||
+4
-4
@@ -21,7 +21,7 @@ Sulfuras, Hand of Ragnaros, -1, 80
|
||||
Backstage passes to a TAFKAL80ETC concert, 14, 21
|
||||
Backstage passes to a TAFKAL80ETC concert, 9, 50
|
||||
Backstage passes to a TAFKAL80ETC concert, 4, 50
|
||||
Conjured Mana Cake, 2, 5
|
||||
Conjured Mana Cake, 2, 4
|
||||
|
||||
-------- day 2 --------
|
||||
name, sellIn, quality
|
||||
@@ -33,7 +33,7 @@ Sulfuras, Hand of Ragnaros, -1, 80
|
||||
Backstage passes to a TAFKAL80ETC concert, 13, 22
|
||||
Backstage passes to a TAFKAL80ETC concert, 8, 50
|
||||
Backstage passes to a TAFKAL80ETC concert, 3, 50
|
||||
Conjured Mana Cake, 1, 4
|
||||
Conjured Mana Cake, 1, 2
|
||||
|
||||
-------- day 3 --------
|
||||
name, sellIn, quality
|
||||
@@ -45,7 +45,7 @@ Sulfuras, Hand of Ragnaros, -1, 80
|
||||
Backstage passes to a TAFKAL80ETC concert, 12, 23
|
||||
Backstage passes to a TAFKAL80ETC concert, 7, 50
|
||||
Backstage passes to a TAFKAL80ETC concert, 2, 50
|
||||
Conjured Mana Cake, 0, 3
|
||||
Conjured Mana Cake, 0, 0
|
||||
|
||||
-------- day 4 --------
|
||||
name, sellIn, quality
|
||||
@@ -57,7 +57,7 @@ Sulfuras, Hand of Ragnaros, -1, 80
|
||||
Backstage passes to a TAFKAL80ETC concert, 11, 24
|
||||
Backstage passes to a TAFKAL80ETC concert, 6, 50
|
||||
Backstage passes to a TAFKAL80ETC concert, 1, 50
|
||||
Conjured Mana Cake, -1, 1
|
||||
Conjured Mana Cake, -1, 0
|
||||
|
||||
-------- day 5 --------
|
||||
name, sellIn, quality
|
||||
|
||||
@@ -12,6 +12,7 @@ from gilded_rose import GildedRose, Item
|
||||
AGED_BRIE = "Aged Brie"
|
||||
SULFURAS = "Sulfuras, Hand of Ragnaros"
|
||||
BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert"
|
||||
CONJURED_CAKE = "Conjured Mana Cake"
|
||||
|
||||
|
||||
def update(name, sell_in, quality):
|
||||
@@ -81,12 +82,29 @@ class TestBackstagePasses:
|
||||
assert quality == 0
|
||||
|
||||
|
||||
class TestConjuredItem:
|
||||
def test_quality_degrades_twice_as_fast_as_a_normal_item(self):
|
||||
assert update(CONJURED_CAKE, 3, 6) == (2, 4)
|
||||
|
||||
def test_quality_degrades_four_per_day_once_sell_by_date_has_passed(self):
|
||||
assert update(CONJURED_CAKE, 0, 6) == (-1, 2)
|
||||
|
||||
@pytest.mark.parametrize("sell_in, quality", [(3, 1), (0, 3), (-2, 0)])
|
||||
def test_quality_is_never_negative(self, sell_in, quality):
|
||||
_, new_quality = update(CONJURED_CAKE, sell_in, quality)
|
||||
assert new_quality == 0
|
||||
|
||||
def test_any_item_whose_name_starts_with_conjured_is_conjured(self):
|
||||
assert update("Conjured +5 Dexterity Vest", 10, 20) == (9, 18)
|
||||
|
||||
|
||||
def test_all_items_in_the_inventory_are_updated():
|
||||
items = [
|
||||
Item("+5 Dexterity Vest", 10, 20),
|
||||
Item(AGED_BRIE, 2, 0),
|
||||
Item(SULFURAS, 0, 80),
|
||||
Item(BACKSTAGE_PASS, 5, 20),
|
||||
Item(CONJURED_CAKE, 3, 6),
|
||||
]
|
||||
GildedRose(items).update_quality()
|
||||
assert [(i.sell_in, i.quality) for i in items] == [
|
||||
@@ -94,6 +112,7 @@ def test_all_items_in_the_inventory_are_updated():
|
||||
(1, 1),
|
||||
(0, 80),
|
||||
(4, 23),
|
||||
(2, 4),
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user