GREEN: add characterization tests for legacy Gilded Rose code

This commit is contained in:
fiatcode 2026-02-18 12:06:26 +07:00
parent cb38ddcd5d
commit 7f05229104
2 changed files with 798 additions and 0 deletions

71
lib/gilded_rose.dart Normal file
View file

@ -0,0 +1,71 @@
// WARNING: DO NOT modify the Item class - the goblin in the corner will insta-rage!
class Item {
String name;
int sellIn;
int quality;
Item(this.name, this.sellIn, this.quality);
@override
String toString() => '$name, $sellIn, $quality';
}
class GildedRose {
List<Item> items;
GildedRose(this.items);
void updateQuality() {
for (var i = 0; i < items.length; i++) {
if (items[i].name != 'Aged Brie' &&
items[i].name != 'Backstage passes to a TAFKAL80ETC concert') {
if (items[i].quality > 0) {
if (items[i].name != 'Sulfuras, Hand of Ragnaros') {
items[i].quality = items[i].quality - 1;
}
}
} else {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
if (items[i].name == 'Backstage passes to a TAFKAL80ETC concert') {
if (items[i].sellIn < 11) {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
if (items[i].sellIn < 6) {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
}
}
}
if (items[i].name != 'Sulfuras, Hand of Ragnaros') {
items[i].sellIn = items[i].sellIn - 1;
}
if (items[i].sellIn < 0) {
if (items[i].name != 'Aged Brie') {
if (items[i].name != 'Backstage passes to a TAFKAL80ETC concert') {
if (items[i].quality > 0) {
if (items[i].name != 'Sulfuras, Hand of Ragnaros') {
items[i].quality = items[i].quality - 1;
}
}
} else {
items[i].quality = items[i].quality - items[i].quality;
}
} else {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
}
}
}
}

727
test/gilded_rose_test.dart Normal file
View file

@ -0,0 +1,727 @@
import 'package:tdd_katas/gilded_rose.dart';
import 'package:test/test.dart';
void main() {
group('Gilded Rose Inn - Characterization Tests', () {
group('Normal items', () {
test('quality and sellIn both decrease each day', () {
final items = [Item('Normal Item', 10, 20)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].sellIn, equals(9));
expect(items[0].quality, equals(19));
});
test('quality degrades twice as fast after sell-by date', () {
final items = [Item('Normal Item', 0, 10)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].sellIn, equals(-1));
expect(items[0].quality, equals(8)); // -2 quality
});
test('quality never becomes negative', () {
final items = [Item('Normal Item', 5, 0)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].quality, equals(0));
});
});
group('Aged Brie - appreciates over time', () {
test('quality increases as it ages', () {
final items = [Item('Aged Brie', 10, 20)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].sellIn, equals(9));
expect(items[0].quality, equals(21));
});
test('quality increases twice as fast after sell-by date', () {
final items = [Item('Aged Brie', 0, 20)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].sellIn, equals(-1));
expect(items[0].quality, equals(22)); // +2 quality
});
test('quality never exceeds 50', () {
final items = [Item('Aged Brie', 5, 50)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].quality, equals(50));
});
});
group('Sulfuras - legendary item', () {
test('quality never changes', () {
final items = [Item('Sulfuras, Hand of Ragnaros', 10, 80)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].quality, equals(80));
});
test('sellIn never decreases', () {
final items = [Item('Sulfuras, Hand of Ragnaros', 10, 80)];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].sellIn, equals(10));
});
});
group('Backstage passes - concert tickets', () {
test('quality increases by 1 when more than 10 days away', () {
final items = [
Item('Backstage passes to a TAFKAL80ETC concert', 15, 20),
];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].quality, equals(21)); // +1
});
test('quality increases by 2 when 10 days or less', () {
final items = [
Item('Backstage passes to a TAFKAL80ETC concert', 10, 20),
];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].quality, equals(22)); // +2
});
test('quality increases by 3 when 5 days or less', () {
final items = [
Item('Backstage passes to a TAFKAL80ETC concert', 5, 20),
];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].quality, equals(23)); // +3
});
test('quality drops to 0 after concert', () {
final items = [
Item('Backstage passes to a TAFKAL80ETC concert', 0, 20),
];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].sellIn, equals(-1));
expect(items[0].quality, equals(0));
});
test('quality never exceeds 50', () {
final items = [
Item('Backstage passes to a TAFKAL80ETC concert', 5, 49),
];
final gildedRose = GildedRose(items);
gildedRose.updateQuality();
expect(items[0].quality, equals(50)); // capped at 50
});
});
group('Golden Master - 30-day simulation', () {
test('captures complete behavior of all item types over time', () {
final items = _createAllItemTypes();
final gildedRose = GildedRose(items);
final output = StringBuffer();
for (var day = 0; day <= 30; day++) {
output.writeln('-------- day $day --------');
output.writeln('name, sellIn, quality');
for (final item in items) {
output.writeln(item);
}
output.writeln();
gildedRose.updateQuality();
}
final expected = _goldenMasterBaseline();
expect(
output.toString(),
equals(expected),
reason: 'Golden Master mismatch - legacy behavior changed!',
);
});
});
});
}
List<Item> _createAllItemTypes() {
return [
// Normal items at various states
Item('Normal Item', 10, 20),
Item('Normal Item', 2, 5),
Item('Normal Item', 0, 10),
Item('Normal Item', -1, 10),
// Aged Brie
Item('Aged Brie', 10, 20),
Item('Aged Brie', 0, 30),
Item('Aged Brie', 5, 49),
// Sulfuras
Item('Sulfuras, Hand of Ragnaros', 10, 80),
Item('Sulfuras, Hand of Ragnaros', -1, 80),
// Backstage passes at critical thresholds
Item('Backstage passes to a TAFKAL80ETC concert', 15, 20),
Item('Backstage passes to a TAFKAL80ETC concert', 10, 20),
Item('Backstage passes to a TAFKAL80ETC concert', 5, 20),
Item('Backstage passes to a TAFKAL80ETC concert', 1, 20),
Item('Backstage passes to a TAFKAL80ETC concert', 0, 20),
];
}
String _goldenMasterBaseline() {
// Generated by running the legacy code
// This captures the exact behavior - our safety net!
return '''-------- day 0 --------
name, sellIn, quality
Normal Item, 10, 20
Normal Item, 2, 5
Normal Item, 0, 10
Normal Item, -1, 10
Aged Brie, 10, 20
Aged Brie, 0, 30
Aged Brie, 5, 49
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 15, 20
Backstage passes to a TAFKAL80ETC concert, 10, 20
Backstage passes to a TAFKAL80ETC concert, 5, 20
Backstage passes to a TAFKAL80ETC concert, 1, 20
Backstage passes to a TAFKAL80ETC concert, 0, 20
-------- day 1 --------
name, sellIn, quality
Normal Item, 9, 19
Normal Item, 1, 4
Normal Item, -1, 8
Normal Item, -2, 8
Aged Brie, 9, 21
Aged Brie, -1, 32
Aged Brie, 4, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 14, 21
Backstage passes to a TAFKAL80ETC concert, 9, 22
Backstage passes to a TAFKAL80ETC concert, 4, 23
Backstage passes to a TAFKAL80ETC concert, 0, 23
Backstage passes to a TAFKAL80ETC concert, -1, 0
-------- day 2 --------
name, sellIn, quality
Normal Item, 8, 18
Normal Item, 0, 3
Normal Item, -2, 6
Normal Item, -3, 6
Aged Brie, 8, 22
Aged Brie, -2, 34
Aged Brie, 3, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 13, 22
Backstage passes to a TAFKAL80ETC concert, 8, 24
Backstage passes to a TAFKAL80ETC concert, 3, 26
Backstage passes to a TAFKAL80ETC concert, -1, 0
Backstage passes to a TAFKAL80ETC concert, -2, 0
-------- day 3 --------
name, sellIn, quality
Normal Item, 7, 17
Normal Item, -1, 1
Normal Item, -3, 4
Normal Item, -4, 4
Aged Brie, 7, 23
Aged Brie, -3, 36
Aged Brie, 2, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 12, 23
Backstage passes to a TAFKAL80ETC concert, 7, 26
Backstage passes to a TAFKAL80ETC concert, 2, 29
Backstage passes to a TAFKAL80ETC concert, -2, 0
Backstage passes to a TAFKAL80ETC concert, -3, 0
-------- day 4 --------
name, sellIn, quality
Normal Item, 6, 16
Normal Item, -2, 0
Normal Item, -4, 2
Normal Item, -5, 2
Aged Brie, 6, 24
Aged Brie, -4, 38
Aged Brie, 1, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 11, 24
Backstage passes to a TAFKAL80ETC concert, 6, 28
Backstage passes to a TAFKAL80ETC concert, 1, 32
Backstage passes to a TAFKAL80ETC concert, -3, 0
Backstage passes to a TAFKAL80ETC concert, -4, 0
-------- day 5 --------
name, sellIn, quality
Normal Item, 5, 15
Normal Item, -3, 0
Normal Item, -5, 0
Normal Item, -6, 0
Aged Brie, 5, 25
Aged Brie, -5, 40
Aged Brie, 0, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 10, 25
Backstage passes to a TAFKAL80ETC concert, 5, 30
Backstage passes to a TAFKAL80ETC concert, 0, 35
Backstage passes to a TAFKAL80ETC concert, -4, 0
Backstage passes to a TAFKAL80ETC concert, -5, 0
-------- day 6 --------
name, sellIn, quality
Normal Item, 4, 14
Normal Item, -4, 0
Normal Item, -6, 0
Normal Item, -7, 0
Aged Brie, 4, 26
Aged Brie, -6, 42
Aged Brie, -1, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 9, 27
Backstage passes to a TAFKAL80ETC concert, 4, 33
Backstage passes to a TAFKAL80ETC concert, -1, 0
Backstage passes to a TAFKAL80ETC concert, -5, 0
Backstage passes to a TAFKAL80ETC concert, -6, 0
-------- day 7 --------
name, sellIn, quality
Normal Item, 3, 13
Normal Item, -5, 0
Normal Item, -7, 0
Normal Item, -8, 0
Aged Brie, 3, 27
Aged Brie, -7, 44
Aged Brie, -2, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 8, 29
Backstage passes to a TAFKAL80ETC concert, 3, 36
Backstage passes to a TAFKAL80ETC concert, -2, 0
Backstage passes to a TAFKAL80ETC concert, -6, 0
Backstage passes to a TAFKAL80ETC concert, -7, 0
-------- day 8 --------
name, sellIn, quality
Normal Item, 2, 12
Normal Item, -6, 0
Normal Item, -8, 0
Normal Item, -9, 0
Aged Brie, 2, 28
Aged Brie, -8, 46
Aged Brie, -3, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 7, 31
Backstage passes to a TAFKAL80ETC concert, 2, 39
Backstage passes to a TAFKAL80ETC concert, -3, 0
Backstage passes to a TAFKAL80ETC concert, -7, 0
Backstage passes to a TAFKAL80ETC concert, -8, 0
-------- day 9 --------
name, sellIn, quality
Normal Item, 1, 11
Normal Item, -7, 0
Normal Item, -9, 0
Normal Item, -10, 0
Aged Brie, 1, 29
Aged Brie, -9, 48
Aged Brie, -4, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 6, 33
Backstage passes to a TAFKAL80ETC concert, 1, 42
Backstage passes to a TAFKAL80ETC concert, -4, 0
Backstage passes to a TAFKAL80ETC concert, -8, 0
Backstage passes to a TAFKAL80ETC concert, -9, 0
-------- day 10 --------
name, sellIn, quality
Normal Item, 0, 10
Normal Item, -8, 0
Normal Item, -10, 0
Normal Item, -11, 0
Aged Brie, 0, 30
Aged Brie, -10, 50
Aged Brie, -5, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 5, 35
Backstage passes to a TAFKAL80ETC concert, 0, 45
Backstage passes to a TAFKAL80ETC concert, -5, 0
Backstage passes to a TAFKAL80ETC concert, -9, 0
Backstage passes to a TAFKAL80ETC concert, -10, 0
-------- day 11 --------
name, sellIn, quality
Normal Item, -1, 8
Normal Item, -9, 0
Normal Item, -11, 0
Normal Item, -12, 0
Aged Brie, -1, 32
Aged Brie, -11, 50
Aged Brie, -6, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 4, 38
Backstage passes to a TAFKAL80ETC concert, -1, 0
Backstage passes to a TAFKAL80ETC concert, -6, 0
Backstage passes to a TAFKAL80ETC concert, -10, 0
Backstage passes to a TAFKAL80ETC concert, -11, 0
-------- day 12 --------
name, sellIn, quality
Normal Item, -2, 6
Normal Item, -10, 0
Normal Item, -12, 0
Normal Item, -13, 0
Aged Brie, -2, 34
Aged Brie, -12, 50
Aged Brie, -7, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 3, 41
Backstage passes to a TAFKAL80ETC concert, -2, 0
Backstage passes to a TAFKAL80ETC concert, -7, 0
Backstage passes to a TAFKAL80ETC concert, -11, 0
Backstage passes to a TAFKAL80ETC concert, -12, 0
-------- day 13 --------
name, sellIn, quality
Normal Item, -3, 4
Normal Item, -11, 0
Normal Item, -13, 0
Normal Item, -14, 0
Aged Brie, -3, 36
Aged Brie, -13, 50
Aged Brie, -8, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 2, 44
Backstage passes to a TAFKAL80ETC concert, -3, 0
Backstage passes to a TAFKAL80ETC concert, -8, 0
Backstage passes to a TAFKAL80ETC concert, -12, 0
Backstage passes to a TAFKAL80ETC concert, -13, 0
-------- day 14 --------
name, sellIn, quality
Normal Item, -4, 2
Normal Item, -12, 0
Normal Item, -14, 0
Normal Item, -15, 0
Aged Brie, -4, 38
Aged Brie, -14, 50
Aged Brie, -9, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 1, 47
Backstage passes to a TAFKAL80ETC concert, -4, 0
Backstage passes to a TAFKAL80ETC concert, -9, 0
Backstage passes to a TAFKAL80ETC concert, -13, 0
Backstage passes to a TAFKAL80ETC concert, -14, 0
-------- day 15 --------
name, sellIn, quality
Normal Item, -5, 0
Normal Item, -13, 0
Normal Item, -15, 0
Normal Item, -16, 0
Aged Brie, -5, 40
Aged Brie, -15, 50
Aged Brie, -10, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, 0, 50
Backstage passes to a TAFKAL80ETC concert, -5, 0
Backstage passes to a TAFKAL80ETC concert, -10, 0
Backstage passes to a TAFKAL80ETC concert, -14, 0
Backstage passes to a TAFKAL80ETC concert, -15, 0
-------- day 16 --------
name, sellIn, quality
Normal Item, -6, 0
Normal Item, -14, 0
Normal Item, -16, 0
Normal Item, -17, 0
Aged Brie, -6, 42
Aged Brie, -16, 50
Aged Brie, -11, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -1, 0
Backstage passes to a TAFKAL80ETC concert, -6, 0
Backstage passes to a TAFKAL80ETC concert, -11, 0
Backstage passes to a TAFKAL80ETC concert, -15, 0
Backstage passes to a TAFKAL80ETC concert, -16, 0
-------- day 17 --------
name, sellIn, quality
Normal Item, -7, 0
Normal Item, -15, 0
Normal Item, -17, 0
Normal Item, -18, 0
Aged Brie, -7, 44
Aged Brie, -17, 50
Aged Brie, -12, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -2, 0
Backstage passes to a TAFKAL80ETC concert, -7, 0
Backstage passes to a TAFKAL80ETC concert, -12, 0
Backstage passes to a TAFKAL80ETC concert, -16, 0
Backstage passes to a TAFKAL80ETC concert, -17, 0
-------- day 18 --------
name, sellIn, quality
Normal Item, -8, 0
Normal Item, -16, 0
Normal Item, -18, 0
Normal Item, -19, 0
Aged Brie, -8, 46
Aged Brie, -18, 50
Aged Brie, -13, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -3, 0
Backstage passes to a TAFKAL80ETC concert, -8, 0
Backstage passes to a TAFKAL80ETC concert, -13, 0
Backstage passes to a TAFKAL80ETC concert, -17, 0
Backstage passes to a TAFKAL80ETC concert, -18, 0
-------- day 19 --------
name, sellIn, quality
Normal Item, -9, 0
Normal Item, -17, 0
Normal Item, -19, 0
Normal Item, -20, 0
Aged Brie, -9, 48
Aged Brie, -19, 50
Aged Brie, -14, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -4, 0
Backstage passes to a TAFKAL80ETC concert, -9, 0
Backstage passes to a TAFKAL80ETC concert, -14, 0
Backstage passes to a TAFKAL80ETC concert, -18, 0
Backstage passes to a TAFKAL80ETC concert, -19, 0
-------- day 20 --------
name, sellIn, quality
Normal Item, -10, 0
Normal Item, -18, 0
Normal Item, -20, 0
Normal Item, -21, 0
Aged Brie, -10, 50
Aged Brie, -20, 50
Aged Brie, -15, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -5, 0
Backstage passes to a TAFKAL80ETC concert, -10, 0
Backstage passes to a TAFKAL80ETC concert, -15, 0
Backstage passes to a TAFKAL80ETC concert, -19, 0
Backstage passes to a TAFKAL80ETC concert, -20, 0
-------- day 21 --------
name, sellIn, quality
Normal Item, -11, 0
Normal Item, -19, 0
Normal Item, -21, 0
Normal Item, -22, 0
Aged Brie, -11, 50
Aged Brie, -21, 50
Aged Brie, -16, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -6, 0
Backstage passes to a TAFKAL80ETC concert, -11, 0
Backstage passes to a TAFKAL80ETC concert, -16, 0
Backstage passes to a TAFKAL80ETC concert, -20, 0
Backstage passes to a TAFKAL80ETC concert, -21, 0
-------- day 22 --------
name, sellIn, quality
Normal Item, -12, 0
Normal Item, -20, 0
Normal Item, -22, 0
Normal Item, -23, 0
Aged Brie, -12, 50
Aged Brie, -22, 50
Aged Brie, -17, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -7, 0
Backstage passes to a TAFKAL80ETC concert, -12, 0
Backstage passes to a TAFKAL80ETC concert, -17, 0
Backstage passes to a TAFKAL80ETC concert, -21, 0
Backstage passes to a TAFKAL80ETC concert, -22, 0
-------- day 23 --------
name, sellIn, quality
Normal Item, -13, 0
Normal Item, -21, 0
Normal Item, -23, 0
Normal Item, -24, 0
Aged Brie, -13, 50
Aged Brie, -23, 50
Aged Brie, -18, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -8, 0
Backstage passes to a TAFKAL80ETC concert, -13, 0
Backstage passes to a TAFKAL80ETC concert, -18, 0
Backstage passes to a TAFKAL80ETC concert, -22, 0
Backstage passes to a TAFKAL80ETC concert, -23, 0
-------- day 24 --------
name, sellIn, quality
Normal Item, -14, 0
Normal Item, -22, 0
Normal Item, -24, 0
Normal Item, -25, 0
Aged Brie, -14, 50
Aged Brie, -24, 50
Aged Brie, -19, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -9, 0
Backstage passes to a TAFKAL80ETC concert, -14, 0
Backstage passes to a TAFKAL80ETC concert, -19, 0
Backstage passes to a TAFKAL80ETC concert, -23, 0
Backstage passes to a TAFKAL80ETC concert, -24, 0
-------- day 25 --------
name, sellIn, quality
Normal Item, -15, 0
Normal Item, -23, 0
Normal Item, -25, 0
Normal Item, -26, 0
Aged Brie, -15, 50
Aged Brie, -25, 50
Aged Brie, -20, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -10, 0
Backstage passes to a TAFKAL80ETC concert, -15, 0
Backstage passes to a TAFKAL80ETC concert, -20, 0
Backstage passes to a TAFKAL80ETC concert, -24, 0
Backstage passes to a TAFKAL80ETC concert, -25, 0
-------- day 26 --------
name, sellIn, quality
Normal Item, -16, 0
Normal Item, -24, 0
Normal Item, -26, 0
Normal Item, -27, 0
Aged Brie, -16, 50
Aged Brie, -26, 50
Aged Brie, -21, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -11, 0
Backstage passes to a TAFKAL80ETC concert, -16, 0
Backstage passes to a TAFKAL80ETC concert, -21, 0
Backstage passes to a TAFKAL80ETC concert, -25, 0
Backstage passes to a TAFKAL80ETC concert, -26, 0
-------- day 27 --------
name, sellIn, quality
Normal Item, -17, 0
Normal Item, -25, 0
Normal Item, -27, 0
Normal Item, -28, 0
Aged Brie, -17, 50
Aged Brie, -27, 50
Aged Brie, -22, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -12, 0
Backstage passes to a TAFKAL80ETC concert, -17, 0
Backstage passes to a TAFKAL80ETC concert, -22, 0
Backstage passes to a TAFKAL80ETC concert, -26, 0
Backstage passes to a TAFKAL80ETC concert, -27, 0
-------- day 28 --------
name, sellIn, quality
Normal Item, -18, 0
Normal Item, -26, 0
Normal Item, -28, 0
Normal Item, -29, 0
Aged Brie, -18, 50
Aged Brie, -28, 50
Aged Brie, -23, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -13, 0
Backstage passes to a TAFKAL80ETC concert, -18, 0
Backstage passes to a TAFKAL80ETC concert, -23, 0
Backstage passes to a TAFKAL80ETC concert, -27, 0
Backstage passes to a TAFKAL80ETC concert, -28, 0
-------- day 29 --------
name, sellIn, quality
Normal Item, -19, 0
Normal Item, -27, 0
Normal Item, -29, 0
Normal Item, -30, 0
Aged Brie, -19, 50
Aged Brie, -29, 50
Aged Brie, -24, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -14, 0
Backstage passes to a TAFKAL80ETC concert, -19, 0
Backstage passes to a TAFKAL80ETC concert, -24, 0
Backstage passes to a TAFKAL80ETC concert, -28, 0
Backstage passes to a TAFKAL80ETC concert, -29, 0
-------- day 30 --------
name, sellIn, quality
Normal Item, -20, 0
Normal Item, -28, 0
Normal Item, -30, 0
Normal Item, -31, 0
Aged Brie, -20, 50
Aged Brie, -30, 50
Aged Brie, -25, 50
Sulfuras, Hand of Ragnaros, 10, 80
Sulfuras, Hand of Ragnaros, -1, 80
Backstage passes to a TAFKAL80ETC concert, -15, 0
Backstage passes to a TAFKAL80ETC concert, -20, 0
Backstage passes to a TAFKAL80ETC concert, -25, 0
Backstage passes to a TAFKAL80ETC concert, -29, 0
Backstage passes to a TAFKAL80ETC concert, -30, 0
''';
}