public static void Main(string[] args)
        {
            Console.WriteLine("OMGHAI!");

            IList <Item> Items = new List <Item> {
                new Item {
                    Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20
                },
                new Item {
                    Name = "Aged Brie", SellIn = 2, Quality = 0
                },
                new Item {
                    Name = "Elixir of the Mongoose", SellIn = 5, Quality = 7
                },
                new Item {
                    Name = "Sulfuras, Hand of Ragnaros", SellIn = 0, Quality = 80
                },
                new Item {
                    Name = "Sulfuras, Hand of Ragnaros", SellIn = -1, Quality = 80
                },
                new Item
                {
                    Name    = "Backstage passes to a TAFKAL80ETC concert",
                    SellIn  = 15,
                    Quality = 20
                },
                new Item
                {
                    Name    = "Backstage passes to a TAFKAL80ETC concert",
                    SellIn  = 10,
                    Quality = 49
                },
                new Item
                {
                    Name    = "Backstage passes to a TAFKAL80ETC concert",
                    SellIn  = 5,
                    Quality = 49
                },
                // this conjured item does not work properly yet
                new Item {
                    Name = "Conjured Mana Cake", SellIn = 3, Quality = 6
                }
            };

            GildedRose.GildedRose app = new GildedRose.GildedRose(Items);


            for (int i = 0; i < 31; i++)
            {
                Console.WriteLine("-------- day " + i + " --------");
                Console.WriteLine("name, sellIn, quality");
                for (int j = 0; j < Items.Count; j++)
                {
                    Console.WriteLine(Items[j]);
                }
                Console.WriteLine("");
                app.UpdateQuality();
            }
        }
        public void Given_Sulfuras_Should_KeepSellIn()
        {
            IList <Item> items = ListWithItem("Sulfuras, Hand of Ragnaros", 10, 80);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(10, items[0].SellIn);
        }
        public void Given_BackstagePasses_WithSellIn0_Should_DropToZeroQuality()
        {
            IList <Item> items = ListWithItem("Backstage passes to a TAFKAL80ETC concert", 0, 2);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(0, items[0].Quality);
        }
        public void Given_AgedBrie_Should_IncreaseQualityTwiceAfterSellIn()
        {
            IList <Item> items = ListWithItem("Aged Brie", 0, 2);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(4, items[0].Quality);
        }
        public void Given_AgedBrie_Should_NotPass50Quality()
        {
            IList <Item> items = ListWithItem("Aged Brie", 10, 50);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(50, items[0].Quality);
        }
        public void Given_RegularItem_Should_DecreaseQualityTwiceAfterSellIn()
        {
            IList <Item> items = ListWithItem("foo", 0, 10);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(8, items[0].Quality);
        }
        public void Given_RegularItem_Should_DecreaseQualityOnceWhenSellInIsOne()
        {
            IList <Item> items = ListWithItem("foo", 1, 10);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(9, items[0].Quality);
        }
        public void Given_ConjuredItem_Should_DegradeInQualityTwiceAsFastAlsoPastSellIn()
        {
            IList <Item> items = ListWithItem("Conjured Mana Cake", 0, 10);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(6, items[0].Quality);
        }
        public void Given_BackstagePasses_WithSellIn1_Should_Increase3InQuality()
        {
            IList <Item> items = ListWithItem("Backstage passes to a TAFKAL80ETC concert", 1, 2);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(5, items[0].Quality);
        }
        public void Given_BackstagePasses_WithTripleSellIn_Should_NotPass50Quality()
        {
            IList <Item> items = ListWithItem("Backstage passes to a TAFKAL80ETC concert", 4, 48);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual(50, items[0].Quality);
        }
        public void Given_RegularItem_Should_NotDecreaseQualityBelowZero()
        {
            IList <Item> items = ListWithItem("foo", 5, 1);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            app.UpdateQuality();
            app.UpdateQuality();
            Assert.AreEqual(0, items[0].Quality);
        }
        public void Given_RegularItem_Should_DecreaseSellInAndQuality()
        {
            IList <Item> items = ListWithItem("foo", 2, 2);

            GildedRose.GildedRose app = new GildedRose.GildedRose(items);
            app.UpdateQuality();
            Assert.AreEqual("foo", items[0].Name);
            Assert.AreEqual(1, items[0].SellIn);
            Assert.AreEqual(1, items[0].Quality);
        }
        public void DexterityVest_Tests(int day, string name, int expectedsellin, int expectedquality)
        {
            var items = new List <Item> {
                new Item {
                    Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20
                }
            };
            var app = new GildedRose.GildedRose(items);

            for (var i = 0; i < day; i++)
            {
                app.UpdateQuality();
            }
            items[0].Name.Should().Be(name);
            items[0].SellIn.Should().Be(expectedsellin);
            items[0].Quality.Should().Be(expectedquality);
        }
        public void Sulfuras2_Tests(int day, string name, int expectedsellin, int expectedquality)
        {
            var items = new List <Item> {
                new Sulfuras {
                    Name = "Sulfuras, Hand of Ragnaros", SellIn = -1, Quality = 80
                }
            };
            var app = new GildedRose.GildedRose(items);

            for (var i = 0; i < day; i++)
            {
                app.UpdateQuality();
            }
            items[0].Name.Should().Be(name);
            items[0].SellIn.Should().Be(expectedsellin);
            items[0].Quality.Should().Be(expectedquality);
        }
        public void Elixir_Tests(int day, string name, int expectedsellin, int expectedquality)
        {
            var items = new List <Item> {
                new Item {
                    Name = "Elixir of the Mongoose", SellIn = 5, Quality = 7
                }
            };
            var app = new GildedRose.GildedRose(items);

            for (var i = 0; i < day; i++)
            {
                app.UpdateQuality();
            }
            items[0].Name.Should().Be(name);
            items[0].SellIn.Should().Be(expectedsellin);
            items[0].Quality.Should().Be(expectedquality);
        }
        public void AgedBrie_Tests(int day, string name, int expectedsellin, int expectedquality)
        {
            var items = new List <Item> {
                new Cheese {
                    Name = "Aged Brie", SellIn = 2, Quality = 0
                }
            };
            var app = new GildedRose.GildedRose(items);

            for (var i = 0; i < day; i++)
            {
                app.UpdateQuality();
            }
            items[0].Name.Should().Be(name);
            items[0].SellIn.Should().Be(expectedsellin);
            items[0].Quality.Should().Be(expectedquality);
        }
        public void Conjured_Tests(int day, string name, int expectedsellin, int expectedquality)
        {
            var items = new List <Item> {
                new Conjured(new Item {
                    Name = "Conjured Mana Cake", SellIn = 3, Quality = 6
                })
            };
            var app = new GildedRose.GildedRose(items);

            for (var i = 0; i < day; i++)
            {
                app.UpdateQuality();
            }
            items[0].Name.Should().Be(name);
            items[0].SellIn.Should().Be(expectedsellin);
            items[0].Quality.Should().Be(expectedquality);
        }
        public void BackstagePass3_Tests(int day, string name, int expectedsellin, int expectedquality)
        {
            var items = new List <Item> {
                new BackstagePass
                {
                    Name    = "Backstage passes to a TAFKAL80ETC concert",
                    SellIn  = 5,
                    Quality = 49
                }
            };
            var app = new GildedRose.GildedRose(items);

            for (var i = 0; i < day; i++)
            {
                app.UpdateQuality();
            }
            items[0].Name.Should().Be(name);
            items[0].SellIn.Should().Be(expectedsellin);
            items[0].Quality.Should().Be(expectedquality);
        }