diff --git a/python/gilded_rose.py b/python/gilded_rose.py index 4f21ea64..b5cb0034 100755 --- a/python/gilded_rose.py +++ b/python/gilded_rose.py @@ -1,40 +1,10 @@ # -*- coding: utf-8 -*- -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 - else: - if item.quality < 50: - item.quality = item.quality + 1 - +""" +Refactoring the Gilded Rose kata +We use **polymorphism**: each item type has a specific `update_quality()` method, called uniformly. +This makes the system extensible (new item types can be added without changing existing code). +""" class Item: def __init__(self, name, sell_in, quality): @@ -42,5 +12,99 @@ class Item: self.sell_in = sell_in self.quality = quality + def update_quality(self): + """ + Default behavior: + Quality decreases by 1 every day. + and by 2 if the expiration date has passed. + The Quality of an item is never negative. + """ + self.sell_in -= 1 + if self.quality > 0: + self.quality -= 1 + if self.sell_in < 0 and self.quality > 0: + self.quality -= 1 + def __repr__(self): return "%s, %s, %s" % (self.name, self.sell_in, self.quality) + +# --------- Defining subclasses by Item using Polymorphism --------- + +class AgedBrie(Item): + """ + Aged Brie actually increases in Quality the older it gets. + The Quality of an item is never more than 50. + """ + def update_quality(self): + self.sell_in -= 1 + if self.quality >= 50: + return + self.quality += 1 + if self.sell_in < 0 and self.quality < 50: + self.quality += 1 + + +class Sulfuras(Item): + """ + Sulfuras is a legendary item and as such its Quality is 80 and it never alters. + Sulfuras, being a legendary item, never has to be sold or decreases in Quality. + """ + def __init__(self, name, sell_in, quality): + super().__init__(name, sell_in, 80) # quality forcée à 80 + def update_quality(self): + pass + +class BackstagePasses(Item): + def update_quality(self): + """ + Backstage passes, like aged brie, increases in Quality as its SellIn value approaches; + Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less but + Quality drops to 0 after the concert + """ + self.sell_in -= 1 + if self.sell_in < 0: + self.quality = 0 + return + + if self.quality < 50: + self.quality += 1 + if self.sell_in < 10 and self.quality < 50: + self.quality += 1 + if self.sell_in < 5 and self.quality < 50: + self.quality += 1 + +class Conjured(Item): + def update_quality(self): + """ + Conjured items degrade in Quality twice as fast as normal items + """ + self.sell_in -= 1 + if self.quality > 0: + self.quality -= 2 + if self.sell_in < 0 and self.quality > 0: + self.quality -= 2 + + +def generate_item(name, sell_in, quality): + """ + returns the correct class based on the name of items. + """ + if name == "Aged Brie": + return AgedBrie(name, sell_in, quality) + elif name == "Sulfuras, Hand of Ragnaros": + return Sulfuras(name, sell_in, quality) + elif name.startswith("Backstage passes"): + return BackstagePasses(name, sell_in, quality) + elif name.startswith("Conjured"): + return Conjured(name, sell_in, quality) + else: + return Item(name, sell_in, quality) + + +class GildedRose: #In Python 3, it's not necessary to explicitly inherit from object. + def __init__(self, items): + self.items = items + + def update_quality(self): + for item in self.items: + item.update_quality() diff --git a/python/tests/approved_files/test_gilded_rose_approvals.test_gilded_rose_approvals.approved.txt b/python/tests/approved_files/test_gilded_rose_approvals.test_gilded_rose_approvals.approved.txt index e69de29b..6ae666ff 100644 --- a/python/tests/approved_files/test_gilded_rose_approvals.test_gilded_rose_approvals.approved.txt +++ b/python/tests/approved_files/test_gilded_rose_approvals.test_gilded_rose_approvals.approved.txt @@ -0,0 +1,372 @@ +OMGHAI! +-------- day 0 -------- +name, sellIn, quality ++5 Dexterity Vest, 10, 20 +Aged Brie, 2, 0 +Elixir of the Mongoose, 5, 7 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 15, 20 +Backstage passes to a TAFKAL80ETC concert, 10, 49 +Backstage passes to a TAFKAL80ETC concert, 5, 49 +Conjured Mana Cake, 3, 6 + +-------- day 1 -------- +name, sellIn, quality ++5 Dexterity Vest, 9, 19 +Aged Brie, 1, 1 +Elixir of the Mongoose, 4, 6 +Sulfuras, Hand of Ragnaros, 0, 80 +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, 4 + +-------- day 2 -------- +name, sellIn, quality ++5 Dexterity Vest, 8, 18 +Aged Brie, 0, 2 +Elixir of the Mongoose, 3, 5 +Sulfuras, Hand of Ragnaros, 0, 80 +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, 2 + +-------- day 3 -------- +name, sellIn, quality ++5 Dexterity Vest, 7, 17 +Aged Brie, -1, 4 +Elixir of the Mongoose, 2, 4 +Sulfuras, Hand of Ragnaros, 0, 80 +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, 0 + +-------- day 4 -------- +name, sellIn, quality ++5 Dexterity Vest, 6, 16 +Aged Brie, -2, 6 +Elixir of the Mongoose, 1, 3 +Sulfuras, Hand of Ragnaros, 0, 80 +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, 0 + +-------- day 5 -------- +name, sellIn, quality ++5 Dexterity Vest, 5, 15 +Aged Brie, -3, 8 +Elixir of the Mongoose, 0, 2 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 10, 25 +Backstage passes to a TAFKAL80ETC concert, 5, 50 +Backstage passes to a TAFKAL80ETC concert, 0, 50 +Conjured Mana Cake, -2, 0 + +-------- day 6 -------- +name, sellIn, quality ++5 Dexterity Vest, 4, 14 +Aged Brie, -4, 10 +Elixir of the Mongoose, -1, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 9, 27 +Backstage passes to a TAFKAL80ETC concert, 4, 50 +Backstage passes to a TAFKAL80ETC concert, -1, 0 +Conjured Mana Cake, -3, 0 + +-------- day 7 -------- +name, sellIn, quality ++5 Dexterity Vest, 3, 13 +Aged Brie, -5, 12 +Elixir of the Mongoose, -2, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 8, 29 +Backstage passes to a TAFKAL80ETC concert, 3, 50 +Backstage passes to a TAFKAL80ETC concert, -2, 0 +Conjured Mana Cake, -4, 0 + +-------- day 8 -------- +name, sellIn, quality ++5 Dexterity Vest, 2, 12 +Aged Brie, -6, 14 +Elixir of the Mongoose, -3, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 7, 31 +Backstage passes to a TAFKAL80ETC concert, 2, 50 +Backstage passes to a TAFKAL80ETC concert, -3, 0 +Conjured Mana Cake, -5, 0 + +-------- day 9 -------- +name, sellIn, quality ++5 Dexterity Vest, 1, 11 +Aged Brie, -7, 16 +Elixir of the Mongoose, -4, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 6, 33 +Backstage passes to a TAFKAL80ETC concert, 1, 50 +Backstage passes to a TAFKAL80ETC concert, -4, 0 +Conjured Mana Cake, -6, 0 + +-------- day 10 -------- +name, sellIn, quality ++5 Dexterity Vest, 0, 10 +Aged Brie, -8, 18 +Elixir of the Mongoose, -5, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 5, 35 +Backstage passes to a TAFKAL80ETC concert, 0, 50 +Backstage passes to a TAFKAL80ETC concert, -5, 0 +Conjured Mana Cake, -7, 0 + +-------- day 11 -------- +name, sellIn, quality ++5 Dexterity Vest, -1, 8 +Aged Brie, -9, 20 +Elixir of the Mongoose, -6, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 4, 38 +Backstage passes to a TAFKAL80ETC concert, -1, 0 +Backstage passes to a TAFKAL80ETC concert, -6, 0 +Conjured Mana Cake, -8, 0 + +-------- day 12 -------- +name, sellIn, quality ++5 Dexterity Vest, -2, 6 +Aged Brie, -10, 22 +Elixir of the Mongoose, -7, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 3, 41 +Backstage passes to a TAFKAL80ETC concert, -2, 0 +Backstage passes to a TAFKAL80ETC concert, -7, 0 +Conjured Mana Cake, -9, 0 + +-------- day 13 -------- +name, sellIn, quality ++5 Dexterity Vest, -3, 4 +Aged Brie, -11, 24 +Elixir of the Mongoose, -8, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 2, 44 +Backstage passes to a TAFKAL80ETC concert, -3, 0 +Backstage passes to a TAFKAL80ETC concert, -8, 0 +Conjured Mana Cake, -10, 0 + +-------- day 14 -------- +name, sellIn, quality ++5 Dexterity Vest, -4, 2 +Aged Brie, -12, 26 +Elixir of the Mongoose, -9, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 1, 47 +Backstage passes to a TAFKAL80ETC concert, -4, 0 +Backstage passes to a TAFKAL80ETC concert, -9, 0 +Conjured Mana Cake, -11, 0 + +-------- day 15 -------- +name, sellIn, quality ++5 Dexterity Vest, -5, 0 +Aged Brie, -13, 28 +Elixir of the Mongoose, -10, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, 0, 50 +Backstage passes to a TAFKAL80ETC concert, -5, 0 +Backstage passes to a TAFKAL80ETC concert, -10, 0 +Conjured Mana Cake, -12, 0 + +-------- day 16 -------- +name, sellIn, quality ++5 Dexterity Vest, -6, 0 +Aged Brie, -14, 30 +Elixir of the Mongoose, -11, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -1, 0 +Backstage passes to a TAFKAL80ETC concert, -6, 0 +Backstage passes to a TAFKAL80ETC concert, -11, 0 +Conjured Mana Cake, -13, 0 + +-------- day 17 -------- +name, sellIn, quality ++5 Dexterity Vest, -7, 0 +Aged Brie, -15, 32 +Elixir of the Mongoose, -12, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -2, 0 +Backstage passes to a TAFKAL80ETC concert, -7, 0 +Backstage passes to a TAFKAL80ETC concert, -12, 0 +Conjured Mana Cake, -14, 0 + +-------- day 18 -------- +name, sellIn, quality ++5 Dexterity Vest, -8, 0 +Aged Brie, -16, 34 +Elixir of the Mongoose, -13, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -3, 0 +Backstage passes to a TAFKAL80ETC concert, -8, 0 +Backstage passes to a TAFKAL80ETC concert, -13, 0 +Conjured Mana Cake, -15, 0 + +-------- day 19 -------- +name, sellIn, quality ++5 Dexterity Vest, -9, 0 +Aged Brie, -17, 36 +Elixir of the Mongoose, -14, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -4, 0 +Backstage passes to a TAFKAL80ETC concert, -9, 0 +Backstage passes to a TAFKAL80ETC concert, -14, 0 +Conjured Mana Cake, -16, 0 + +-------- day 20 -------- +name, sellIn, quality ++5 Dexterity Vest, -10, 0 +Aged Brie, -18, 38 +Elixir of the Mongoose, -15, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -5, 0 +Backstage passes to a TAFKAL80ETC concert, -10, 0 +Backstage passes to a TAFKAL80ETC concert, -15, 0 +Conjured Mana Cake, -17, 0 + +-------- day 21 -------- +name, sellIn, quality ++5 Dexterity Vest, -11, 0 +Aged Brie, -19, 40 +Elixir of the Mongoose, -16, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -6, 0 +Backstage passes to a TAFKAL80ETC concert, -11, 0 +Backstage passes to a TAFKAL80ETC concert, -16, 0 +Conjured Mana Cake, -18, 0 + +-------- day 22 -------- +name, sellIn, quality ++5 Dexterity Vest, -12, 0 +Aged Brie, -20, 42 +Elixir of the Mongoose, -17, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -7, 0 +Backstage passes to a TAFKAL80ETC concert, -12, 0 +Backstage passes to a TAFKAL80ETC concert, -17, 0 +Conjured Mana Cake, -19, 0 + +-------- day 23 -------- +name, sellIn, quality ++5 Dexterity Vest, -13, 0 +Aged Brie, -21, 44 +Elixir of the Mongoose, -18, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -8, 0 +Backstage passes to a TAFKAL80ETC concert, -13, 0 +Backstage passes to a TAFKAL80ETC concert, -18, 0 +Conjured Mana Cake, -20, 0 + +-------- day 24 -------- +name, sellIn, quality ++5 Dexterity Vest, -14, 0 +Aged Brie, -22, 46 +Elixir of the Mongoose, -19, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -9, 0 +Backstage passes to a TAFKAL80ETC concert, -14, 0 +Backstage passes to a TAFKAL80ETC concert, -19, 0 +Conjured Mana Cake, -21, 0 + +-------- day 25 -------- +name, sellIn, quality ++5 Dexterity Vest, -15, 0 +Aged Brie, -23, 48 +Elixir of the Mongoose, -20, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -10, 0 +Backstage passes to a TAFKAL80ETC concert, -15, 0 +Backstage passes to a TAFKAL80ETC concert, -20, 0 +Conjured Mana Cake, -22, 0 + +-------- day 26 -------- +name, sellIn, quality ++5 Dexterity Vest, -16, 0 +Aged Brie, -24, 50 +Elixir of the Mongoose, -21, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -11, 0 +Backstage passes to a TAFKAL80ETC concert, -16, 0 +Backstage passes to a TAFKAL80ETC concert, -21, 0 +Conjured Mana Cake, -23, 0 + +-------- day 27 -------- +name, sellIn, quality ++5 Dexterity Vest, -17, 0 +Aged Brie, -25, 50 +Elixir of the Mongoose, -22, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -12, 0 +Backstage passes to a TAFKAL80ETC concert, -17, 0 +Backstage passes to a TAFKAL80ETC concert, -22, 0 +Conjured Mana Cake, -24, 0 + +-------- day 28 -------- +name, sellIn, quality ++5 Dexterity Vest, -18, 0 +Aged Brie, -26, 50 +Elixir of the Mongoose, -23, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -13, 0 +Backstage passes to a TAFKAL80ETC concert, -18, 0 +Backstage passes to a TAFKAL80ETC concert, -23, 0 +Conjured Mana Cake, -25, 0 + +-------- day 29 -------- +name, sellIn, quality ++5 Dexterity Vest, -19, 0 +Aged Brie, -27, 50 +Elixir of the Mongoose, -24, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -14, 0 +Backstage passes to a TAFKAL80ETC concert, -19, 0 +Backstage passes to a TAFKAL80ETC concert, -24, 0 +Conjured Mana Cake, -26, 0 + +-------- day 30 -------- +name, sellIn, quality ++5 Dexterity Vest, -20, 0 +Aged Brie, -28, 50 +Elixir of the Mongoose, -25, 0 +Sulfuras, Hand of Ragnaros, 0, 80 +Sulfuras, Hand of Ragnaros, -1, 80 +Backstage passes to a TAFKAL80ETC concert, -15, 0 +Backstage passes to a TAFKAL80ETC concert, -20, 0 +Backstage passes to a TAFKAL80ETC concert, -25, 0 +Conjured Mana Cake, -27, 0 \ No newline at end of file diff --git a/python/tests/test_gilded_rose.py b/python/tests/test_gilded_rose.py index 1c92f638..5e1ab243 100644 --- a/python/tests/test_gilded_rose.py +++ b/python/tests/test_gilded_rose.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import unittest -from gilded_rose import Item, GildedRose +from gilded_rose import Item, GildedRose, AgedBrie, Sulfuras, BackstagePasses, Conjured class GildedRoseTest(unittest.TestCase): @@ -9,8 +9,143 @@ class GildedRoseTest(unittest.TestCase): items = [Item("foo", 0, 0)] gilded_rose = GildedRose(items) gilded_rose.update_quality() - self.assertEqual("fixme", items[0].name) + self.assertEqual("foo", items[0].name) +# ---------------- tests Aged Brie ------------------- +def test_aged_brie_quality_increase_one_before_sellin_decrease(): + item = AgedBrie(name="Aged Brie", sell_in=2, quality=0) + item.update_quality() + assert item.sell_in == 1 + assert item.quality == 1 + +def test_aged_brie_quality_increase_2_before_sellin_under_0(): + item = AgedBrie(name="Aged Brie", sell_in=0, quality=1) + item.update_quality() + assert item.sell_in == -1 + assert item.quality == 3 + + +def test_aged_brie_quality_never_more_50(): + """ + The Quality of an item is never more than 50. + """ + item = AgedBrie(name="Aged Brie", sell_in=-15, quality=49) + item.update_quality() + assert item.sell_in == -16 + assert item.quality == 50 + +def test_aged_brie_failed_test(): + item = AgedBrie(name="Aged Brie", sell_in=0, quality=1) + item.update_quality() + assert item.sell_in == -1 + assert item.quality == 2 + +# ---------------- tests Sulfuras ------------------- + +def test_sulfuras_quality_is_80_and_it_never_change(): + """ + Sulfuras is a legendary item and as such its Quality is 80 and it never alters. + """ + item = Sulfuras(name="Sulfuras, Hand of Ragnaros", sell_in=-1, quality=85) + item.update_quality() + assert item.sell_in == -1 + assert item.quality == 80 + +def test_sulfuras_quality_is_forced_to_80(): + """ + Sulfuras, being a legendary item, never has to be sold or decreases in Quality. + """ + item = Sulfuras(name="Sulfuras, Hand of Ragnaros", sell_in=0, quality=80) + item.update_quality() + assert item.sell_in == 0 + assert item.quality == 80 + + +# ---------------- tests BackstagePasses ------------------- + +def test_backstage_passes_quality_increase_one_before_sellin_decrease(): + """ + Backstage passes, like aged brie, increases in Quality as its SellIn value approaches + """ + item = BackstagePasses(name="Backstage passes to a TAFKAL80ETC concert", sell_in=15, quality=20) + item.update_quality() + assert item.sell_in == 14 + assert item.quality == 21 + +def test_backstage_passes_quality_increase_2_when_there_are_10_days_or_less(): + """ + Quality increases by 2 when there are 10 days or less. + """ + item = BackstagePasses(name="Backstage passes to a TAFKAL80ETC concert", sell_in=10, quality=44) + item.update_quality() + assert item.sell_in == 9 + assert item.quality == 46 + +def test_backstage_passes_quality_increase_2_when_there_are_10_days_or_less(): + """ + Quality increases by by 3 when there are 5 days or less but. + """ + item = BackstagePasses(name="Backstage passes to a TAFKAL80ETC concert", sell_in=4, quality=43) + item.update_quality() + assert item.sell_in == 3 + assert item.quality == 46 + +def test_backstage_passes_quality_drops_to_0_after_the_concert(): + """ + Quality drops to 0 after the concert + """ + item = BackstagePasses(name="Backstage passes to a TAFKAL80ETC concert", sell_in=0, quality=49) + item.update_quality() + assert item.sell_in == -1 + assert item.quality == 0 + +def test_backstage_passes_quality_never_more_50(): + """ + The Quality of an item is never more than 50 + """ + item = BackstagePasses(name="Backstage passes to a TAFKAL80ETC concert", sell_in=0, quality=49) + item.update_quality() + assert item.sell_in == -1 + assert item.quality == 0 + +def test_backstage_passes_quality_never_more_50(): + """ + The Quality of an item is never more than 50. + """ + item = BackstagePasses(name="Backstage passes to a TAFKAL80ETC concert", sell_in=3, quality=49) + item.update_quality() + assert item.sell_in == 2 + assert item.quality == 50 + +def test_backstage_passes_failed_test(): + """ + The Quality of an item is never more than 50. + """ + item = BackstagePasses(name="Backstage passes to a TAFKAL80ETC concert", sell_in=3, quality=49) + item.update_quality() + assert item.sell_in == 2 + assert item.quality == 52 +# ---------------- tests Conjured ------------------- + +def test_conjured_degrade_in_quality_twice_as_fast_as_normal_items(): + """ + Conjured items degrade in Quality twice as fast as normal items + """ + item = Conjured(name="Conjured Mana Cake", sell_in=3, quality=6) + item.update_quality() + assert item.sell_in == 2 + assert item.quality == 4 + +def test_conjured_failed_test(): + """ + Conjured items degrade in Quality one + """ + item = Conjured(name="Conjured Mana Cake", sell_in=0, quality=4) + item.update_quality() + assert item.sell_in == -1 + assert item.quality == 3 + if __name__ == '__main__': unittest.main() + diff --git a/python/texttest_fixture.py b/python/texttest_fixture.py index 8f7e4940..c091fe4c 100644 --- a/python/texttest_fixture.py +++ b/python/texttest_fixture.py @@ -7,15 +7,15 @@ from gilded_rose import * def main(): 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 + generate_item(name="+5 Dexterity Vest", sell_in=10, quality=20), + generate_item(name="Aged Brie", sell_in=2, quality=0), + generate_item(name="Elixir of the Mongoose", sell_in=5, quality=7), + generate_item(name="Sulfuras, Hand of Ragnaros", sell_in=0, quality=80), + generate_item(name="Sulfuras, Hand of Ragnaros", sell_in=-1, quality=80), + generate_item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=15, quality=20), + generate_item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=10, quality=49), + generate_item(name="Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=49), + generate_item(name="Conjured Mana Cake", sell_in=3, quality=6), # <-- :O ] days = 2 import sys