test: add test case scenarios

This commit is contained in:
deliteser112 2025-09-16 15:47:31 +03:30
parent d46757243c
commit 8bdadae7e4
7 changed files with 252 additions and 1 deletions

View 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)

View 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

View 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)

View File

@ -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__':

View 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
View 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)

View 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