GildedRose-Refactoring-Kata/csharp.xUnit/GildedRoseTests/GildedRoseTest.cs
Artur Goloyad a0066f58cd test: add failing specification tests for Conjured items
Conjured items must degrade twice as fast: -2 before sell-by, -4 after,
never below 0. Red on purpose (TDD) - the legacy code still treats
Conjured as a normal item; they go green once ConjuredItemUpdater lands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 20:49:08 +02:00

199 lines
5.2 KiB
C#

using Xunit;
using System.Collections.Generic;
using GildedRoseKata;
namespace GildedRoseTests;
public class GildedRoseTest
{
private const string AgedBrie = "Aged Brie";
private const string Sulfuras = "Sulfuras, Hand of Ragnaros";
private const string BackstagePass = "Backstage passes to a TAFKAL80ETC concert";
private static Item UpdateOne(string name, int sellIn, int quality)
{
var item = new Item { Name = name, SellIn = sellIn, Quality = quality };
var app = new GildedRose(new List<Item> { item });
app.UpdateQuality();
return item;
}
[Fact]
public void UpdateQuality_DoesNotChangeItemName()
{
var item = UpdateOne("foo", 0, 0);
Assert.Equal("foo", item.Name);
}
// ---------- Normal items ----------
[Fact]
public void NormalItem_BeforeSellBy_QualityDropsByOne()
{
var item = UpdateOne("+5 Dexterity Vest", 10, 20);
Assert.Equal(9, item.SellIn);
Assert.Equal(19, item.Quality);
}
[Fact]
public void NormalItem_OnSellByDate_QualityDropsByTwo()
{
var item = UpdateOne("+5 Dexterity Vest", 0, 20);
Assert.Equal(-1, item.SellIn);
Assert.Equal(18, item.Quality);
}
[Fact]
public void NormalItem_AfterSellBy_QualityDropsByTwo()
{
var item = UpdateOne("+5 Dexterity Vest", -1, 20);
Assert.Equal(-2, item.SellIn);
Assert.Equal(18, item.Quality);
}
[Fact]
public void NormalItem_QualityNeverNegative()
{
var item = UpdateOne("+5 Dexterity Vest", 5, 0);
Assert.Equal(0, item.Quality);
}
[Fact]
public void NormalItem_AfterSellByWithQualityOne_QualityStopsAtZero()
{
var item = UpdateOne("+5 Dexterity Vest", 0, 1);
Assert.Equal(0, item.Quality);
}
// ---------- Aged Brie ----------
[Fact]
public void AgedBrie_BeforeSellBy_QualityIncreasesByOne()
{
var item = UpdateOne(AgedBrie, 2, 0);
Assert.Equal(1, item.SellIn);
Assert.Equal(1, item.Quality);
}
[Fact]
public void AgedBrie_AfterSellBy_QualityIncreasesByTwo()
{
var item = UpdateOne(AgedBrie, 0, 10);
Assert.Equal(-1, item.SellIn);
Assert.Equal(12, item.Quality);
}
[Fact]
public void AgedBrie_QualityNeverExceedsFifty()
{
var item = UpdateOne(AgedBrie, 5, 50);
Assert.Equal(50, item.Quality);
}
[Fact]
public void AgedBrie_AfterSellByAtFortyNine_QualityCapsAtFifty()
{
var item = UpdateOne(AgedBrie, 0, 49);
Assert.Equal(50, item.Quality);
}
// ---------- Sulfuras ----------
[Fact]
public void Sulfuras_AtSellInZero_NeverChanges()
{
var item = UpdateOne(Sulfuras, 0, 80);
Assert.Equal(0, item.SellIn);
Assert.Equal(80, item.Quality);
}
[Fact]
public void Sulfuras_AtSellInMinusOne_NeverChanges()
{
var item = UpdateOne(Sulfuras, -1, 80);
Assert.Equal(-1, item.SellIn);
Assert.Equal(80, item.Quality);
}
// ---------- Backstage passes ----------
[Fact]
public void BackstagePass_MoreThanTenDays_QualityIncreasesByOne()
{
var item = UpdateOne(BackstagePass, 11, 20);
Assert.Equal(10, item.SellIn);
Assert.Equal(21, item.Quality);
}
[Fact]
public void BackstagePass_TenDaysOrLess_QualityIncreasesByTwo()
{
var item = UpdateOne(BackstagePass, 10, 20);
Assert.Equal(9, item.SellIn);
Assert.Equal(22, item.Quality);
}
[Fact]
public void BackstagePass_SixDays_QualityIncreasesByTwo()
{
var item = UpdateOne(BackstagePass, 6, 20);
Assert.Equal(22, item.Quality);
}
[Fact]
public void BackstagePass_FiveDaysOrLess_QualityIncreasesByThree()
{
var item = UpdateOne(BackstagePass, 5, 20);
Assert.Equal(4, item.SellIn);
Assert.Equal(23, item.Quality);
}
[Fact]
public void BackstagePass_AfterConcert_QualityDropsToZero()
{
var item = UpdateOne(BackstagePass, 0, 20);
Assert.Equal(-1, item.SellIn);
Assert.Equal(0, item.Quality);
}
[Fact]
public void BackstagePass_AtFortyNineCloseToConcert_QualityCapsAtFifty()
{
var item = UpdateOne(BackstagePass, 5, 49);
Assert.Equal(50, item.Quality);
}
// ---------- Conjured items ----------
[Fact]
public void ConjuredItem_BeforeSellBy_QualityDropsByTwo()
{
var item = UpdateOne("Conjured Mana Cake", 3, 6);
Assert.Equal(2, item.SellIn);
Assert.Equal(4, item.Quality);
}
[Fact]
public void ConjuredItem_OnSellByDate_QualityDropsByFour()
{
var item = UpdateOne("Conjured Mana Cake", 0, 6);
Assert.Equal(-1, item.SellIn);
Assert.Equal(2, item.Quality);
}
[Fact]
public void ConjuredItem_AfterSellBy_QualityDropsByFour()
{
var item = UpdateOne("Conjured Mana Cake", -1, 6);
Assert.Equal(-2, item.SellIn);
Assert.Equal(2, item.Quality);
}
[Fact]
public void ConjuredItem_QualityNeverNegative()
{
var item = UpdateOne("Conjured Mana Cake", 0, 3);
Assert.Equal(0, item.Quality);
}
}