mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-04 09:11:39 +00:00
test: add test case scenarios
This commit is contained in:
parent
d46757243c
commit
8bdadae7e4
39
python/tests/test_aged_brie.py
Normal file
39
python/tests/test_aged_brie.py
Normal file
@ -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)
|
||||
39
python/tests/test_backstage_passes.py
Normal file
39
python/tests/test_backstage_passes.py
Normal file
@ -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
|
||||
35
python/tests/test_conjured.py
Normal file
35
python/tests/test_conjured.py
Normal file
@ -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)
|
||||
@ -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__':
|
||||
|
||||
64
python/tests/test_gilded_rose_integration.py
Normal file
64
python/tests/test_gilded_rose_integration.py
Normal file
@ -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
|
||||
37
python/tests/test_item.py
Normal file
37
python/tests/test_item.py
Normal file
@ -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)
|
||||
37
python/tests/test_sulfuras.py
Normal file
37
python/tests/test_sulfuras.py
Normal file
@ -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
|
||||
Loading…
Reference in New Issue
Block a user