Skip to content

Instantly share code, notes, and snippets.

@samwho
Created June 8, 2022 21:26
Show Gist options
  • Select an option

  • Save samwho/a360c771b6e99051ab06fc0c6ac1a98f to your computer and use it in GitHub Desktop.

Select an option

Save samwho/a360c771b6e99051ab06fc0c6ac1a98f to your computer and use it in GitHub Desktop.
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()
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