mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-11 04:31:21 +00:00
Added factory pattern to handle this and also test case for conjured item
This commit is contained in:
parent
a21bde290f
commit
9dcbde01e8
15
python/factory_item.py
Normal file
15
python/factory_item.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from python.item import AgedBrie, Sulfuras, Backstage, Conjured, RegularItem
|
||||||
|
|
||||||
|
item_to_class_map = {
|
||||||
|
"Aged Brie": AgedBrie,
|
||||||
|
"Sulfuras, Hand of Ragnaros": Sulfuras,
|
||||||
|
"Backstage passes to a TAFKAL80ETC concert": Backstage,
|
||||||
|
"Conjured": Conjured
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class FactoryItem:
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def create_new_item(name, sell_in, quality):
|
||||||
|
return item_to_class_map.get(name, RegularItem)(name, sell_in, quality)
|
||||||
@ -1,19 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
def decrease_quality(item, decrease_quality_by=None):
|
|
||||||
if not decrease_quality_by:
|
|
||||||
if item.sell_in <= 0:
|
|
||||||
decrease_quality_by = 2
|
|
||||||
else:
|
|
||||||
decrease_quality_by = 1
|
|
||||||
|
|
||||||
item.quality = max(item.quality - decrease_quality_by, 0)
|
|
||||||
|
|
||||||
|
|
||||||
def increase_quality(item, increase_quality_by=1):
|
|
||||||
item.quality = min(item.quality + increase_quality_by, 50)
|
|
||||||
|
|
||||||
|
|
||||||
class GildedRose(object):
|
class GildedRose(object):
|
||||||
|
|
||||||
def __init__(self, items):
|
def __init__(self, items):
|
||||||
@ -21,30 +7,4 @@ class GildedRose(object):
|
|||||||
|
|
||||||
def update_quality(self):
|
def update_quality(self):
|
||||||
for item in self.items:
|
for item in self.items:
|
||||||
if item.name == "Sulfuras, Hand of Ragnaros":
|
item.update_quality()
|
||||||
continue
|
|
||||||
elif item.name == "Aged Brie":
|
|
||||||
increase_quality(item)
|
|
||||||
elif item.name == "Backstage passes to a TAFKAL80ETC concert":
|
|
||||||
if item.sell_in <= 0:
|
|
||||||
item.quality = 0
|
|
||||||
elif item.sell_in <= 5:
|
|
||||||
increase_quality(item, 3)
|
|
||||||
elif item.sell_in <= 10:
|
|
||||||
increase_quality(item, 2)
|
|
||||||
else:
|
|
||||||
increase_quality(item)
|
|
||||||
else:
|
|
||||||
decrease_quality(item)
|
|
||||||
|
|
||||||
item.sell_in = item.sell_in - 1
|
|
||||||
|
|
||||||
|
|
||||||
class Item:
|
|
||||||
def __init__(self, name, sell_in, quality):
|
|
||||||
self.name = name
|
|
||||||
self.sell_in = sell_in
|
|
||||||
self.quality = quality
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "%s, %s, %s" % (self.name, self.sell_in, self.quality)
|
|
||||||
|
|||||||
12
python/helper.py
Normal file
12
python/helper.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
def decrease_quality(quality, sell_in, decrease_quality_by=None) -> int:
|
||||||
|
if not decrease_quality_by:
|
||||||
|
if sell_in <= 0:
|
||||||
|
decrease_quality_by = 2
|
||||||
|
else:
|
||||||
|
decrease_quality_by = 1
|
||||||
|
|
||||||
|
return max(quality - decrease_quality_by, 0)
|
||||||
|
|
||||||
|
|
||||||
|
def increase_quality(quality, increase_quality_by=1) -> int:
|
||||||
|
return min(quality + increase_quality_by, 50)
|
||||||
58
python/item.py
Normal file
58
python/item.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
from python.helper import decrease_quality, increase_quality
|
||||||
|
|
||||||
|
|
||||||
|
class Item:
|
||||||
|
def __init__(self, name, sell_in, quality):
|
||||||
|
self.name = name
|
||||||
|
self.sell_in = sell_in
|
||||||
|
self.quality = quality
|
||||||
|
|
||||||
|
def update_quality(self):
|
||||||
|
"""Update the quality of an item"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "%s, %s, %s" % (self.name, self.sell_in, self.quality)
|
||||||
|
|
||||||
|
|
||||||
|
class RegularItem(Item):
|
||||||
|
|
||||||
|
def update_quality(self):
|
||||||
|
"""Update the quality of an item"""
|
||||||
|
self.quality = decrease_quality(quality=self.quality, sell_in=self.sell_in)
|
||||||
|
self.sell_in = self.sell_in - 1
|
||||||
|
|
||||||
|
|
||||||
|
class Sulfuras(Item):
|
||||||
|
|
||||||
|
def update_quality(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Backstage(Item):
|
||||||
|
|
||||||
|
def update_quality(self):
|
||||||
|
if self.sell_in <= 0:
|
||||||
|
self.quality = 0
|
||||||
|
elif self.sell_in <= 5:
|
||||||
|
self.quality = increase_quality(quality=self.quality, increase_quality_by=3)
|
||||||
|
elif self.sell_in <= 10:
|
||||||
|
self.quality = increase_quality(quality=self.quality, increase_quality_by=2)
|
||||||
|
else:
|
||||||
|
self.quality = increase_quality(quality=self.quality)
|
||||||
|
|
||||||
|
self.sell_in = self.sell_in - 1
|
||||||
|
|
||||||
|
|
||||||
|
class AgedBrie(Item):
|
||||||
|
|
||||||
|
def update_quality(self):
|
||||||
|
self.quality = increase_quality(quality=self.quality)
|
||||||
|
self.sell_in = self.sell_in - 1
|
||||||
|
|
||||||
|
|
||||||
|
class Conjured(Item):
|
||||||
|
|
||||||
|
def update_quality(self):
|
||||||
|
self.quality = decrease_quality(quality=self.quality, sell_in=self.sell_in, decrease_quality_by=2)
|
||||||
|
self.sell_in = self.sell_in - 1
|
||||||
@ -1,18 +1,19 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from gilded_rose import Item, GildedRose
|
from gilded_rose import GildedRose
|
||||||
|
from python.factory_item import FactoryItem
|
||||||
|
|
||||||
|
|
||||||
class GildedRoseTest(unittest.TestCase):
|
class GildedRoseTest(unittest.TestCase):
|
||||||
def test_normal_item_quality(self):
|
def test_normal_item_quality(self):
|
||||||
item = Item(name="foo", sell_in=5, quality=5)
|
item = FactoryItem.create_new_item(name="foo", sell_in=5, quality=5)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
self.assertEqual(4, item.quality)
|
self.assertEqual(4, item.quality)
|
||||||
|
|
||||||
def test_normal_item_quality_when_quality_is_zero(self):
|
def test_normal_item_quality_when_quality_is_zero(self):
|
||||||
item = Item(name="foo", sell_in=0, quality=0)
|
item = FactoryItem.create_new_item(name="foo", sell_in=0, quality=0)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
|
|
||||||
@ -20,7 +21,7 @@ class GildedRoseTest(unittest.TestCase):
|
|||||||
self.assertEqual(0, item.quality)
|
self.assertEqual(0, item.quality)
|
||||||
|
|
||||||
def test_normal_item_quality_if_sell_in_is_0(self):
|
def test_normal_item_quality_if_sell_in_is_0(self):
|
||||||
item = Item(name="foo", sell_in=0, quality=4)
|
item = FactoryItem.create_new_item(name="foo", sell_in=0, quality=4)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
|
|
||||||
@ -28,7 +29,7 @@ class GildedRoseTest(unittest.TestCase):
|
|||||||
self.assertEqual(2, item.quality)
|
self.assertEqual(2, item.quality)
|
||||||
|
|
||||||
def test_aged_brie_quality_exceeded(self):
|
def test_aged_brie_quality_exceeded(self):
|
||||||
item = Item(name="Aged Brie", sell_in=0, quality=50)
|
item = FactoryItem.create_new_item(name="Aged Brie", sell_in=0, quality=50)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
|
|
||||||
@ -36,13 +37,13 @@ class GildedRoseTest(unittest.TestCase):
|
|||||||
self.assertEqual(50, item.quality)
|
self.assertEqual(50, item.quality)
|
||||||
|
|
||||||
def test_aged_brie_sell_in(self):
|
def test_aged_brie_sell_in(self):
|
||||||
item = Item(name="Aged Brie", sell_in=10, quality=2)
|
item = FactoryItem.create_new_item(name="Aged Brie", sell_in=10, quality=2)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
self.assertEquals(9, item.sell_in)
|
self.assertEquals(9, item.sell_in)
|
||||||
|
|
||||||
def test_sulfuras_sell_in_and_quality(self):
|
def test_sulfuras_sell_in_and_quality(self):
|
||||||
item = Item(name="Sulfuras, Hand of Ragnaros", sell_in=10, quality=2)
|
item = FactoryItem.create_new_item(name="Sulfuras, Hand of Ragnaros", sell_in=10, quality=2)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
|
|
||||||
@ -51,7 +52,7 @@ class GildedRoseTest(unittest.TestCase):
|
|||||||
self.assertEquals(2, item.quality)
|
self.assertEquals(2, item.quality)
|
||||||
|
|
||||||
def test_backstage_quality_for_less_than_ten_days(self):
|
def test_backstage_quality_for_less_than_ten_days(self):
|
||||||
item = Item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=9, quality=2)
|
item = FactoryItem.create_new_item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=9, quality=2)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
self.assertEquals(8, item.sell_in)
|
self.assertEquals(8, item.sell_in)
|
||||||
@ -60,7 +61,7 @@ class GildedRoseTest(unittest.TestCase):
|
|||||||
self.assertEquals(4, item.quality)
|
self.assertEquals(4, item.quality)
|
||||||
|
|
||||||
def test_backstage_quality_for_less_than_five_days(self):
|
def test_backstage_quality_for_less_than_five_days(self):
|
||||||
item = Item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=2)
|
item = FactoryItem.create_new_item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=2)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
self.assertEquals(4, item.sell_in)
|
self.assertEquals(4, item.sell_in)
|
||||||
@ -69,7 +70,7 @@ class GildedRoseTest(unittest.TestCase):
|
|||||||
self.assertEquals(5, item.quality)
|
self.assertEquals(5, item.quality)
|
||||||
|
|
||||||
def test_backstage_quality_when_concert_is_over(self):
|
def test_backstage_quality_when_concert_is_over(self):
|
||||||
item = Item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=0, quality=2)
|
item = FactoryItem.create_new_item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=0, quality=2)
|
||||||
gilded_rose = GildedRose([item])
|
gilded_rose = GildedRose([item])
|
||||||
gilded_rose.update_quality()
|
gilded_rose.update_quality()
|
||||||
self.assertEquals(-1, item.sell_in)
|
self.assertEquals(-1, item.sell_in)
|
||||||
@ -77,6 +78,15 @@ class GildedRoseTest(unittest.TestCase):
|
|||||||
# For backstage, quality gets to 0 when concert is over that is sell_in <= 0
|
# For backstage, quality gets to 0 when concert is over that is sell_in <= 0
|
||||||
self.assertEquals(0, item.quality)
|
self.assertEquals(0, item.quality)
|
||||||
|
|
||||||
|
def test_conjured_quality(self):
|
||||||
|
item = FactoryItem.create_new_item(name="Conjured", sell_in=10, quality=2)
|
||||||
|
gilded_rose = GildedRose([item])
|
||||||
|
gilded_rose.update_quality()
|
||||||
|
self.assertEquals(9, item.sell_in)
|
||||||
|
|
||||||
|
# For conjured, quality is reduced by 2
|
||||||
|
self.assertEquals(0, item.quality)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user