Created
June 8, 2022 21:26
-
-
Save samwho/a360c771b6e99051ab06fc0c6ac1a98f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from typing import List | |
| class Item: | |
| name: str | |
| degradation: int = 1 | |
| quality_min: int = 0 | |
| quality_max: int = 50 | |
| def __init__(self, name: str, sell_in: int, quality: int): | |
| assert quality >= self.quality_min | |
| assert quality <= self.quality_max | |
| self.name = name | |
| self.sell_in = sell_in | |
| self.quality = quality | |
| def next_day(self): | |
| self.sell_in -= 1 | |
| diff = self.degradation | |
| if self.sell_in < 0: | |
| diff *= 2 | |
| self.quality = self.quality - diff | |
| self.quality = max(self.quality_min, self.quality) | |
| self.quality = min(self.quality_max, self.quality) | |
| class AgedBrie(Item): | |
| degradation = -1 | |
| def __init__(self, sell_in: int, quality: int): | |
| super().__init__("Aged Brie", sell_in, quality) | |
| class Conjured(Item): | |
| degradation = 2 | |
| class Sulfuras(Item): | |
| degradation = 0 | |
| quality_min = 80 | |
| quality_max = 80 | |
| def __init__(self): | |
| super().__init__("Sulfuras, Hand of Ragnaros", sell_in=0, quality=80) | |
| def next_day(self): | |
| super().next_day() | |
| self.sell_in = 0 | |
| class Tickets(Item): | |
| def next_day(self): | |
| if self.sell_in <= 0: | |
| self.quality = 0 | |
| self.sell_in -= 1 | |
| return | |
| if self.sell_in <= 5: | |
| self.degradation = -3 | |
| elif self.sell_in <= 10: | |
| self.degradation = -2 | |
| else: | |
| self.degradation = -1 | |
| super().next_day() | |
| class GildedRose(object): | |
| items: List[Item] | |
| def __init__(self, items): | |
| self.items = items | |
| def update_quality(self): | |
| for item in self.items: | |
| item.next_day() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import pytest | |
| from gilded_rose import AgedBrie, Conjured, Sulfuras, Tickets | |
| from collections import namedtuple | |
| ItemValues = namedtuple("ItemValues", ["sell_in", "quality"]) | |
| @pytest.mark.parametrize( | |
| "item,expected_values", | |
| [ | |
| [ | |
| Sulfuras(), | |
| [ | |
| ItemValues(sell_in=0, quality=80), | |
| ItemValues(sell_in=0, quality=80), | |
| ItemValues(sell_in=0, quality=80), | |
| ItemValues(sell_in=0, quality=80), | |
| ], | |
| ], | |
| [ | |
| AgedBrie(sell_in=2, quality=0), | |
| [ | |
| ItemValues(sell_in=2, quality=0), | |
| ItemValues(sell_in=1, quality=1), | |
| ItemValues(sell_in=0, quality=2), | |
| ItemValues(sell_in=-1, quality=4), | |
| ItemValues(sell_in=-2, quality=6), | |
| ], | |
| ], | |
| [ | |
| Tickets( | |
| "Backstage passes to a TAFKAL80ETC concert", sell_in=15, quality=20 | |
| ), | |
| [ | |
| ItemValues(sell_in=15, quality=20), | |
| ItemValues(sell_in=14, quality=21), | |
| ItemValues(sell_in=13, quality=22), | |
| ItemValues(sell_in=12, quality=23), | |
| ItemValues(sell_in=11, quality=24), | |
| ItemValues(sell_in=10, quality=25), | |
| ItemValues(sell_in=9, quality=27), | |
| ItemValues(sell_in=8, quality=29), | |
| ItemValues(sell_in=7, quality=31), | |
| ItemValues(sell_in=6, quality=33), | |
| ItemValues(sell_in=5, quality=35), | |
| ItemValues(sell_in=4, quality=38), | |
| ItemValues(sell_in=3, quality=41), | |
| ItemValues(sell_in=2, quality=44), | |
| ItemValues(sell_in=1, quality=47), | |
| ItemValues(sell_in=0, quality=50), | |
| ItemValues(sell_in=-1, quality=0), | |
| ], | |
| ], | |
| [ | |
| Conjured("Conjured Mana Potion", sell_in=2, quality=20), | |
| [ | |
| ItemValues(sell_in=2, quality=20), | |
| ItemValues(sell_in=1, quality=18), | |
| ItemValues(sell_in=0, quality=16), | |
| ItemValues(sell_in=-1, quality=12), | |
| ItemValues(sell_in=-2, quality=8), | |
| ], | |
| ], | |
| ], | |
| ) | |
| def test_items(item, expected_values): | |
| for values in expected_values: | |
| assert item.quality == values.quality | |
| assert item.sell_in == values.sell_in | |
| item.next_day() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment