From 83750d99a66e64a082a5dcd22bfb6afe48f534aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20Pu=C4=8Dek?= Date: Sat, 6 Aug 2022 19:10:32 +0200 Subject: [PATCH] added tests and refactoring --- .gitignore | 2 + python/gilded_rose.py | 71 +++++++++++++++---------- python/test_gilded_rose.py | 106 +++++++++++++++++++++++++++++++++++-- python/texttest_fixture.py | 33 +++++++----- 4 files changed, 169 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index 95bd72b9..e0c04452 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ obj vendor .idea *.iml +venv +settings.json \ No newline at end of file diff --git a/python/gilded_rose.py b/python/gilded_rose.py index 4f21ea64..72677de3 100755 --- a/python/gilded_rose.py +++ b/python/gilded_rose.py @@ -1,39 +1,56 @@ # -*- coding: utf-8 -*- -class GildedRose(object): +class GildedRose(object): def __init__(self, items): self.items = items def update_quality(self): for item in self.items: - if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert": - if item.quality > 0: - if item.name != "Sulfuras, Hand of Ragnaros": - item.quality = item.quality - 1 - else: - if item.quality < 50: - item.quality = item.quality + 1 - if item.name == "Backstage passes to a TAFKAL80ETC concert": - if item.sell_in < 11: - if item.quality < 50: - item.quality = item.quality + 1 - if item.sell_in < 6: - if item.quality < 50: - item.quality = item.quality + 1 - if item.name != "Sulfuras, Hand of Ragnaros": - item.sell_in = item.sell_in - 1 - if item.sell_in < 0: - if item.name != "Aged Brie": - if item.name != "Backstage passes to a TAFKAL80ETC concert": - if item.quality > 0: - if item.name != "Sulfuras, Hand of Ragnaros": - item.quality = item.quality - 1 - else: - item.quality = item.quality - item.quality + + if item.name == "Sulfuras, Hand of Ragnaros": + # Sulfuras has quality 80, sell in value does not update + if item.quality != 80: + raise ValueError( + "Sulfuras, Hand of Ragnaros has to have a quality equal 80." # noqa: E501 + ) + + elif item.name == "Aged Brie": + if item.sell_in > 0: + item.quality += 1 else: - if item.quality < 50: - item.quality = item.quality + 1 + item.quality += 2 + item.quality = min(item.quality, 50) + item.sell_in -= 1 + + elif item.name == "Backstage passes to a TAFKAL80ETC concert": + if item.sell_in <= 0: + item.quality = 0 + elif item.sell_in <= 5: + item.quality += 3 + elif item.sell_in <= 10: + item.quality += 2 + else: + item.quality += 1 + item.quality = min(item.quality, 50) + item.sell_in -= 1 + + elif "conjured" in item.name.lower(): + if item.sell_in > 0: + item.quality -= 2 + else: + item.quality -= 4 + item.quality = max(item.quality, 0) + item.sell_in -= 1 + + else: + # Standard goods + if item.sell_in > 0: + item.quality -= 1 + else: + item.quality -= 2 + item.sell_in -= 1 + item.quality = max(item.quality, 0) class Item: diff --git a/python/test_gilded_rose.py b/python/test_gilded_rose.py index 616934e0..ccb51cd7 100644 --- a/python/test_gilded_rose.py +++ b/python/test_gilded_rose.py @@ -9,8 +9,108 @@ class GildedRoseTest(unittest.TestCase): items = [Item("foo", 0, 0)] gilded_rose = GildedRose(items) gilded_rose.update_quality() - self.assertEquals("fixme", items[0].name) + self.assertEquals("foo", items[0].name) - -if __name__ == '__main__': + def test_sulfuras_constant_quality_and_sell_in_value_update(self): + items = [Item("Sulfuras, Hand of Ragnaros", 20, 80)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(80, items[0].quality) + self.assertEqual(20, items[0].sell_in) + + def test_normal_goods_fresh_quality_and_sell_in_value_update(self): + items = [Item("Rat Soup", 20, 10)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(9, items[0].quality) + self.assertEqual(19, items[0].sell_in) + + def test_normal_goods_rotten_quality_and_sell_in_value_update(self): + items = [Item("Rat Soup", 0, 5)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(3, items[0].quality) + self.assertEqual(-1, items[0].sell_in) + + def test_normal_goods_non_negative_quality(self): + items = [Item("Rat Soup light", 0, 0)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(0, items[0].quality) + self.assertEqual(-1, items[0].sell_in) + + def test_aged_brie_quality_and_sell_in_value_standard_update(self): + items = [Item("Aged Brie", 20, 30)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(31, items[0].quality) + self.assertEqual(19, items[0].sell_in) + + def test_aged_brie_quality_and_sell_in_value_double_update(self): + items = [Item("Aged Brie", 0, 30)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(32, items[0].quality) + self.assertEqual(-1, items[0].sell_in) + + def test_aged_brie_quality_hit_50(self): + items = [Item("Aged Brie", -5, 49)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(50, items[0].quality) + self.assertEqual(-6, items[0].sell_in) + + def test_backstage_passes_quality_and_sell_in_value_standard_update(self): + items = [Item("Backstage passes to a TAFKAL80ETC concert", 20, 10)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(11, items[0].quality) + self.assertEqual(19, items[0].sell_in) + + def test_backstage_passes_quality_and_sell_in_value_double_update(self): + items = [Item("Backstage passes to a TAFKAL80ETC concert", 8, 10)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(12, items[0].quality) + self.assertEqual(7, items[0].sell_in) + + def test_backstage_passes_quality_and_sell_in_value_triple_update(self): + items = [Item("Backstage passes to a TAFKAL80ETC concert", 4, 10)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(13, items[0].quality) + self.assertEqual(3, items[0].sell_in) + + def test_backstage_passes_quality_and_sell_in_value_after_concert_update( + self, + ): # noqa: E501 + items = [Item("Backstage passes to a TAFKAL80ETC concert", 0, 10)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(0, items[0].quality) + self.assertEqual(-1, items[0].sell_in) + + def test_conjured_items_quality_and_sell_in_value_standard_update(self): + items = [Item("Conjured Pizza", 5, 10)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(8, items[0].quality) + self.assertEqual(4, items[0].sell_in) + + def test_conjured_items_quality_and_sell_in_value_rotten_update(self): + items = [Item("Conjured Pizza", 0, 10)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(6, items[0].quality) + self.assertEqual(-1, items[0].sell_in) + + def test_conjured_items_quality_hit_0(self): + items = [Item("Conjured Pizza", 0, 1)] + gilded_rose = GildedRose(items) + gilded_rose.update_quality() + self.assertEqual(0, items[0].quality) + self.assertEqual(-1, items[0].sell_in) + + +if __name__ == "__main__": unittest.main() diff --git a/python/texttest_fixture.py b/python/texttest_fixture.py index 86af5ef7..41605842 100644 --- a/python/texttest_fixture.py +++ b/python/texttest_fixture.py @@ -1,24 +1,31 @@ # -*- coding: utf-8 -*- +import sys from __future__ import print_function +from gilded_rose import Item, GildedRose -from gilded_rose import * if __name__ == "__main__": - print ("OMGHAI!") + print("OMGHAI!") items = [ - Item(name="+5 Dexterity Vest", sell_in=10, quality=20), - Item(name="Aged Brie", sell_in=2, quality=0), - Item(name="Elixir of the Mongoose", sell_in=5, quality=7), - Item(name="Sulfuras, Hand of Ragnaros", sell_in=0, quality=80), - Item(name="Sulfuras, Hand of Ragnaros", sell_in=-1, quality=80), - Item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=15, quality=20), - Item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=10, quality=49), - Item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=49), - Item(name="Conjured Mana Cake", sell_in=3, quality=6), # <-- :O - ] + Item(name="+5 Dexterity Vest", sell_in=10, quality=20), + Item(name="Aged Brie", sell_in=2, quality=0), + Item(name="Elixir of the Mongoose", sell_in=5, quality=7), + Item(name="Sulfuras, Hand of Ragnaros", sell_in=0, quality=80), + Item(name="Sulfuras, Hand of Ragnaros", sell_in=-1, quality=80), + Item( + name="Backstage passes to a TAFKAL80ETC concert", sell_in=15, quality=20 + ), # noqa: E501 + Item( + name="Backstage passes to a TAFKAL80ETC concert", sell_in=10, quality=49 + ), # noqa: E501 + Item( + name="Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=49 + ), # noqa: E501 + Item(name="Conjured Mana Cake", sell_in=3, quality=6), # <-- :O + ] days = 2 - import sys + if len(sys.argv) > 1: days = int(sys.argv[1]) + 1 for day in range(days):