diff --git a/python/tests/test_aged_brie.py b/python/tests/test_aged_brie.py new file mode 100644 index 00000000..2d2c3952 --- /dev/null +++ b/python/tests/test_aged_brie.py @@ -0,0 +1,39 @@ +import pytest + +from gilded_rose import Item, AgedBrie + + +def test_aged_brie_increases_quality_by_1_before_sell_date(): + # constructing via Item maps to AgedBrie automatically + item = Item("Aged Brie", sell_in=10, quality=10) + item.daily_step() + assert isinstance(item, AgedBrie) + assert item.sell_in == 9 + assert item.quality == 11 + + +def test_aged_brie_increases_quality_by_2_after_sell_date(): + item = Item("Aged Brie", sell_in=0, quality=10) + item.daily_step() + assert item.sell_in == -1 + assert item.quality == 12 + + +def test_aged_brie_quality_capped_at_50(): + item = Item("Aged Brie", sell_in=5, quality=49) + item.daily_step() + assert item.quality == 50 + item.daily_step() + assert item.quality == 50 + + +def test_aged_brie_stays_at_50_if_already_max(): + item = Item("Aged Brie", sell_in=5, quality=50) + item.daily_step() + assert item.quality == 50 + + +def test_aged_brie_init_over_50_raises(): + with pytest.raises(AssertionError): + # AgedBrie inherits Item constraints: must be <= 50 + Item("Aged Brie", sell_in=5, quality=51) diff --git a/python/tests/test_backstage_passes.py b/python/tests/test_backstage_passes.py new file mode 100644 index 00000000..7fa57478 --- /dev/null +++ b/python/tests/test_backstage_passes.py @@ -0,0 +1,39 @@ +import pytest + +from gilded_rose import Item, BackstagePasses + + +def test_backstage_passes_increase_by_1_when_more_than_10_days(): + item = Item("Backstage passes to a TAFKAL80ETC concert", sell_in=15, quality=10) + item.daily_step() + assert isinstance(item, BackstagePasses) + assert item.sell_in == 14 + assert item.quality == 11 + + +def test_backstage_passes_increase_by_2_between_10_and_6_days(): + item = Item("Backstage passes to a TAFKAL80ETC concert", sell_in=10, quality=10) + item.daily_step() + assert item.sell_in == 9 + assert item.quality == 12 + + +def test_backstage_passes_increase_by_3_between_5_and_1_days(): + item = Item("Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=10) + item.daily_step() + assert item.sell_in == 4 + assert item.quality == 13 + + +def test_backstage_passes_drop_to_zero_after_concert(): + item = Item("Backstage passes to a TAFKAL80ETC concert", sell_in=0, quality=40) + item.daily_step() + assert item.sell_in == -1 + assert item.quality == 0 + + +def test_backstage_passes_quality_capped_at_50(): + # At 5 days, would add +3 but must cap at 50 + item = Item("Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=49) + item.daily_step() + assert item.quality == 50 diff --git a/python/tests/test_conjured.py b/python/tests/test_conjured.py new file mode 100644 index 00000000..2e26edd9 --- /dev/null +++ b/python/tests/test_conjured.py @@ -0,0 +1,35 @@ +import pytest + +from gilded_rose import Item, Conjured + + +def test_conjured_degrades_by_2_before_sell_date(): + item = Item("Conjured Mana Cake", sell_in=3, quality=10) + item.daily_step() + assert isinstance(item, Conjured) + assert item.sell_in == 2 + assert item.quality == 8 + + +def test_conjured_degrades_by_4_after_sell_date(): + item = Item("Conjured Mana Cake", sell_in=0, quality=10) + item.daily_step() + assert item.sell_in == -1 + assert item.quality == 6 + + +def test_conjured_never_negative(): + item = Item("Conjured Mana Cake", sell_in=0, quality=3) + item.daily_step() + assert item.quality == 0 + + +def test_conjured_sell_in_decrements(): + item = Item("Conjured Mana Cake", sell_in=5, quality=10) + item.daily_step() + assert item.sell_in == 4 + + +def test_conjured_mapping_via_item_new(): + item = Item("Conjured Mana Cake", sell_in=5, quality=10) + assert isinstance(item, Conjured) diff --git a/python/tests/test_gilded_rose.py b/python/tests/test_gilded_rose.py index 1c92f638..84600f0c 100644 --- a/python/tests/test_gilded_rose.py +++ b/python/tests/test_gilded_rose.py @@ -9,7 +9,7 @@ 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) if __name__ == '__main__': diff --git a/python/tests/test_gilded_rose_integration.py b/python/tests/test_gilded_rose_integration.py new file mode 100644 index 00000000..e774686c --- /dev/null +++ b/python/tests/test_gilded_rose_integration.py @@ -0,0 +1,64 @@ +from gilded_rose import Item, GildedRose, AgedBrie, BackstagePasses, Sulfuras, Conjured + + +def test_gilded_rose_updates_normal_item(): + items = [Item("Normal", sell_in=2, quality=5)] + gr = GildedRose(items) + gr.update_quality() + assert items[0].sell_in == 1 + assert items[0].quality == 4 + + +def test_gilded_rose_updates_aged_brie(): + items = [Item("Aged Brie", sell_in=2, quality=0)] + gr = GildedRose(items) + gr.update_quality() + assert isinstance(items[0], AgedBrie) + assert items[0].sell_in == 1 + assert items[0].quality == 1 + + +def test_gilded_rose_updates_backstage_passes_near_concert(): + items = [Item("Backstage passes to a TAFKAL80ETC concert", sell_in=5, quality=10)] + gr = GildedRose(items) + gr.update_quality() + assert isinstance(items[0], BackstagePasses) + assert items[0].sell_in == 4 + assert items[0].quality == 13 + + +def test_gilded_rose_keeps_sulfuras_constant(): + items = [Item("Sulfuras, Hand of Ragnaros", sell_in=10, quality=80)] + gr = GildedRose(items) + gr.update_quality() + assert isinstance(items[0], Sulfuras) + assert items[0].sell_in == 0 + assert items[0].quality == 80 + + +def test_gilded_rose_updates_mixed_items(): + items = [ + Item("Normal", sell_in=1, quality=2), + Item("Aged Brie", sell_in=1, quality=49), + Item("Backstage passes to a TAFKAL80ETC concert", sell_in=10, quality=48), + Item("Conjured Mana Cake", sell_in=3, quality=6), + Item("Sulfuras, Hand of Ragnaros", sell_in=0, quality=80), + ] + gr = GildedRose(items) + gr.update_quality() + + # Normal + assert items[0].sell_in == 0 and items[0].quality == 1 + + # Aged Brie capped at 50 + assert items[1].sell_in == 0 and items[1].quality == 50 + + # Backstage +2 at 10 days, capped at 50 + assert items[2].sell_in == 9 and items[2].quality == 50 + + # Conjured -2 + assert isinstance(items[3], Conjured) + assert items[3].sell_in == 2 and items[3].quality == 4 + + # Sulfuras constant + assert items[4].sell_in == 0 and items[4].quality == 80 diff --git a/python/tests/test_item.py b/python/tests/test_item.py new file mode 100644 index 00000000..70e4ca4a --- /dev/null +++ b/python/tests/test_item.py @@ -0,0 +1,37 @@ +import pytest + +from gilded_rose import Item + + +def test_item_decreases_quality_and_sell_in(): + item = Item("foo", sell_in=10, quality=20) + item.daily_step() + assert item.sell_in == 9 + assert item.quality == 19 + + +def test_item_quality_never_negative(): + item = Item("bar", sell_in=5, quality=0) + item.daily_step() + assert item.quality == 0 + + +def test_item_degrades_twice_as_fast_after_sell_date(): + item = Item("baz", sell_in=0, quality=10) + # After sell-in passes, degradation doubles + item.daily_step() + assert item.sell_in == -1 + assert item.quality == 8 + + +def test_item_quality_floor_boundary(): + item = Item("qux", sell_in=1, quality=1) + item.daily_step() + assert item.quality == 0 + item.daily_step() # now past sell date, but cannot drop below 0 + assert item.quality == 0 + + +def test_item_init_with_negative_quality_raises(): + with pytest.raises(AssertionError): + Item("oops", sell_in=5, quality=-1) diff --git a/python/tests/test_sulfuras.py b/python/tests/test_sulfuras.py new file mode 100644 index 00000000..e50d068a --- /dev/null +++ b/python/tests/test_sulfuras.py @@ -0,0 +1,37 @@ +import pytest + +from gilded_rose import Item, Sulfuras + + +def test_sulfuras_is_immutable_over_time(): + item = Item("Sulfuras, Hand of Ragnaros", sell_in=5, quality=80) + item.daily_step() + assert isinstance(item, Sulfuras) + assert item.sell_in == 0 # forced to 0 in constructor + assert item.quality == 80 + + +def test_sulfuras_constructor_forces_quality_and_sell_in(): + item = Item("Sulfuras, Hand of Ragnaros", sell_in=999, quality=10) + assert item.sell_in == 0 + assert item.quality == 80 + + +def test_sulfuras_multiple_days_unchanged(): + item = Item("Sulfuras, Hand of Ragnaros", sell_in=0, quality=80) + for _ in range(10): + item.daily_step() + assert item.sell_in == 0 + assert item.quality == 80 + + +def test_sulfuras_mapping_via_item_new(): + # Ensure mapping creates Sulfuras instance + item = Item("Sulfuras, Hand of Ragnaros", sell_in=1, quality=80) + assert isinstance(item, Sulfuras) + + +def test_sulfuras_ignores_input_quality_not_80(): + # Even if we try to pass a non-80 quality, constructor forces 80 + item = Item("Sulfuras, Hand of Ragnaros", sell_in=1, quality=0) + assert item.quality == 80