diff --git a/python/factory_item.py b/python/factory_item.py new file mode 100644 index 00000000..1caed8fe --- /dev/null +++ b/python/factory_item.py @@ -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) diff --git a/python/gilded_rose.py b/python/gilded_rose.py index aa7f9552..5622e55e 100755 --- a/python/gilded_rose.py +++ b/python/gilded_rose.py @@ -1,19 +1,5 @@ # -*- 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): def __init__(self, items): @@ -21,30 +7,4 @@ class GildedRose(object): def update_quality(self): for item in self.items: - if item.name == "Sulfuras, Hand of Ragnaros": - 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) + item.update_quality() diff --git a/python/helper.py b/python/helper.py new file mode 100644 index 00000000..3ee7e3a6 --- /dev/null +++ b/python/helper.py @@ -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) diff --git a/python/item.py b/python/item.py new file mode 100644 index 00000000..e9278c1a --- /dev/null +++ b/python/item.py @@ -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 diff --git a/python/test_gilded_rose.py b/python/test_gilded_rose.py index 0769edd3..b7afc18a 100644 --- a/python/test_gilded_rose.py +++ b/python/test_gilded_rose.py @@ -1,18 +1,19 @@ # -*- coding: utf-8 -*- import unittest -from gilded_rose import Item, GildedRose +from gilded_rose import GildedRose +from python.factory_item import FactoryItem class GildedRoseTest(unittest.TestCase): 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.update_quality() self.assertEqual(4, item.quality) 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.update_quality() @@ -20,7 +21,7 @@ class GildedRoseTest(unittest.TestCase): self.assertEqual(0, item.quality) 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.update_quality() @@ -28,7 +29,7 @@ class GildedRoseTest(unittest.TestCase): self.assertEqual(2, item.quality) 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.update_quality() @@ -36,13 +37,13 @@ class GildedRoseTest(unittest.TestCase): self.assertEqual(50, item.quality) 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.update_quality() self.assertEquals(9, item.sell_in) 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.update_quality() @@ -51,7 +52,7 @@ class GildedRoseTest(unittest.TestCase): self.assertEquals(2, item.quality) 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.update_quality() self.assertEquals(8, item.sell_in) @@ -60,7 +61,7 @@ class GildedRoseTest(unittest.TestCase): self.assertEquals(4, item.quality) 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.update_quality() self.assertEquals(4, item.sell_in) @@ -69,7 +70,7 @@ class GildedRoseTest(unittest.TestCase): self.assertEquals(5, item.quality) 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.update_quality() 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 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__': unittest.main()