GildedRose-Refactoring-Kata/python/tests/test_gilded_rose.py
ahmernajar 116dc702dd Add comprehensive test suite for all item types
- Add tests for normal items (degradation, quality bounds, sell-by date)
- Add tests for Aged Brie (quality increase, quality cap, after sell-by)
- Add tests for Sulfuras (never changes)
- Add tests for Backstage passes (various sell-in ranges, quality cap, after concert)
- Add tests for Conjured items (double degradation, after sell-by, quality bounds)
- Add integration test for multiple items

This follows TDD approach - tests for Conjured items will initially fail until implementation is added.
2025-12-06 12:46:59 +00:00

161 lines
6.8 KiB
Python

# -*- coding: utf-8 -*-
import unittest
from gilded_rose import Item, GildedRose
class GildedRoseTest(unittest.TestCase):
def test_normal_item_degradation(self):
"""Normal items decrease quality by 1 each day"""
items = [Item("+5 Dexterity Vest", 10, 20)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(9, items[0].sell_in)
self.assertEqual(19, items[0].quality)
def test_normal_item_quality_never_negative(self):
"""Quality never goes below 0"""
items = [Item("Normal Item", 5, 0)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(0, items[0].quality)
def test_normal_item_after_sell_by_date(self):
"""Normal items degrade twice as fast after sell by date"""
items = [Item("Normal Item", 0, 10)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(-1, items[0].sell_in)
self.assertEqual(8, items[0].quality) # Degrades by 2 (1 before, 1 after)
def test_aged_brie_increases_quality(self):
"""Aged Brie increases in quality as it gets older"""
items = [Item("Aged Brie", 2, 0)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(1, items[0].sell_in)
self.assertEqual(1, items[0].quality)
def test_aged_brie_quality_cap(self):
"""Aged Brie quality never exceeds 50"""
items = [Item("Aged Brie", 2, 50)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(50, items[0].quality)
def test_aged_brie_after_sell_by_date(self):
"""Aged Brie increases quality by 2 after sell by date"""
items = [Item("Aged Brie", 0, 10)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(-1, items[0].sell_in)
self.assertEqual(12, items[0].quality) # +1 normal, +1 after sell by
def test_sulfuras_never_changes(self):
"""Sulfuras never has to be sold and never decreases in quality"""
items = [Item("Sulfuras, Hand of Ragnaros", 0, 80)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(0, items[0].sell_in)
self.assertEqual(80, items[0].quality)
def test_sulfuras_negative_sell_in(self):
"""Sulfuras maintains quality even with negative sell_in"""
items = [Item("Sulfuras, Hand of Ragnaros", -1, 80)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(-1, items[0].sell_in)
self.assertEqual(80, items[0].quality)
def test_backstage_passes_more_than_10_days(self):
"""Backstage passes increase quality by 1 when more than 10 days left"""
items = [Item("Backstage passes to a TAFKAL80ETC concert", 15, 20)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(14, items[0].sell_in)
self.assertEqual(21, items[0].quality)
def test_backstage_passes_10_days_or_less(self):
"""Backstage passes increase quality by 2 when 10 days or less"""
items = [Item("Backstage passes to a TAFKAL80ETC concert", 10, 20)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(9, items[0].sell_in)
self.assertEqual(22, items[0].quality) # +1 base, +1 for <=10 days
def test_backstage_passes_5_days_or_less(self):
"""Backstage passes increase quality by 3 when 5 days or less"""
items = [Item("Backstage passes to a TAFKAL80ETC concert", 5, 20)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(4, items[0].sell_in)
self.assertEqual(23, items[0].quality) # +1 base, +1 for <=10, +1 for <=5
def test_backstage_passes_quality_cap(self):
"""Backstage passes quality never exceeds 50"""
items = [Item("Backstage passes to a TAFKAL80ETC concert", 5, 49)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(50, items[0].quality)
def test_backstage_passes_after_concert(self):
"""Backstage passes quality drops to 0 after the concert"""
items = [Item("Backstage passes to a TAFKAL80ETC concert", 0, 20)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(-1, items[0].sell_in)
self.assertEqual(0, items[0].quality)
def test_conjured_item_degradation(self):
"""Conjured items degrade in quality twice as fast as normal items"""
items = [Item("Conjured Mana Cake", 3, 6)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(2, items[0].sell_in)
self.assertEqual(4, items[0].quality) # Degrades by 2 instead of 1
def test_conjured_item_after_sell_by_date(self):
"""Conjured items degrade twice as fast after sell by date (4x total)"""
items = [Item("Conjured Mana Cake", 0, 10)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(-1, items[0].sell_in)
self.assertEqual(6, items[0].quality) # -2 normal, -2 after sell by = -4 total
def test_conjured_item_quality_never_negative(self):
"""Conjured items quality never goes below 0"""
items = [Item("Conjured Mana Cake", 3, 1)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(0, items[0].quality) # Would be -1, but capped at 0
def test_conjured_item_quality_never_negative_after_sell_by(self):
"""Conjured items quality never goes below 0 even after sell by date"""
items = [Item("Conjured Mana Cake", 0, 1)]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(0, items[0].quality) # Would be -3, but capped at 0
def test_multiple_items(self):
"""Test that multiple items are updated correctly"""
items = [
Item("Normal Item", 5, 10),
Item("Aged Brie", 5, 10),
Item("Sulfuras, Hand of Ragnaros", 5, 80),
Item("Backstage passes to a TAFKAL80ETC concert", 5, 10),
Item("Conjured Mana Cake", 5, 10)
]
gilded_rose = GildedRose(items)
gilded_rose.update_quality()
self.assertEqual(9, items[0].quality) # Normal: -1
self.assertEqual(11, items[1].quality) # Aged Brie: +1
self.assertEqual(80, items[2].quality) # Sulfuras: unchanged
self.assertEqual(13, items[3].quality) # Backstage: +3
self.assertEqual(8, items[4].quality) # Conjured: -2
if __name__ == '__main__':
unittest.main()