public void TestBackstagePass()
        {
            var app = new Program();
            var ticket = new Item
                {
                    Name = "Backstage passes to a TAFKAL80ETC concert",
                    SellIn = 15,
                    Quality = 0
                };
            // Ticket value at day 0
            // (1 * 5) + (2 * 5) + (3 * 5)
            var finalTicketQuality = 30;
            var ticketSellIn = ticket.SellIn;

            app.AddItems(ticket);
            // Update the ticket quality until SellIn = 0
            for (var i = 0; i < ticketSellIn; i++)
            {
                app.UpdateQuality();
            }

            Assert.True(ticket.Quality == finalTicketQuality,
                "Final backstage pass tickets do not match. Actual final quality = " + ticket.Quality);

            // Go past expiry date
            app.UpdateQuality();

            Assert.True(ticket.Quality == 0, "Backstage pass quality is not 0. Actual quality = " + ticket.Quality);
        }
        public void TestAgedBrie()
        {
            var app = new Program();
            var agedBrie = new Item {Name = "Aged Brie", SellIn = 2, Quality = 0};
            var expectedQuality = 1;

            app.AddItems(agedBrie);
            app.UpdateQuality();

            Assert.True(agedBrie.Quality == expectedQuality,
                "Test #1 - Aged Brie quality is not as expected. Expected = " + expectedQuality
                + ". Actual quality = " + agedBrie.Quality);

            // Go past the expiry date and check quality again
            for (var i = 0; i < 3; i++)
            {
                app.UpdateQuality();
            }

            expectedQuality = 6;

            Assert.True(agedBrie.Quality == expectedQuality,
                "Test #2 - Aged Brie quality is not as expected. Expected = " + expectedQuality
                + ". Actual quality = " + agedBrie.Quality);
        }
        public void TestAgedBrieUpperLimit()
        {
            var app = new Program();
            var agedBrie = new Item { Name = "Aged Brie", SellIn = 5, Quality = 49 };
            var expectedQuality = 50;
            var sellIn = agedBrie.SellIn;

            app.AddItems(agedBrie);

            for (var i = 0; i < sellIn; i++)
            {
                app.UpdateQuality();
            }

            Assert.True(agedBrie.Quality == expectedQuality,
                "Aged Brie quality is not as expected. Expected = " + expectedQuality
                + ". Actual quality = " + agedBrie.Quality);
        }
        public void TestBackstagePassUpperBounds()
        {
            var app = new Program();
            var ticket = new Item
            {
                Name = "Backstage passes to a TAFKAL80ETC concert",
                SellIn = 15,
                Quality = 48
            };
            // Ticket value at day 0 should be 50 (upper bound for the quality of items)
            var finalTicketQuality = 50;
            var ticketSellIn = ticket.SellIn;

            app.AddItems(ticket);
            // Update the ticket quality until SellIn = 0
            for (var i = 0; i < ticketSellIn; i++)
            {
                app.UpdateQuality();
            }

            Assert.True(ticket.Quality == finalTicketQuality,
                "Final backstage pass tickets do not match. Actual final quality = " + ticket.Quality);
        }
        public void TestSulfuras()
        {
            var app = new Program();
            var sulfuras = new Item {Name = "Sulfuras, Hand of Ragnaros", SellIn = 0, Quality = 80};
            var expectedQuality = sulfuras.Quality;
            var expectedSellIn = sulfuras.SellIn;

            app.AddItems(sulfuras);

            app.UpdateQuality();

            Assert.True(sulfuras.Quality == expectedQuality, "The quality of Sulfuras has degraded");
            Assert.True(sulfuras.SellIn == expectedSellIn, "The SellIn value of Sulfuras has changed");
        }
        public void TestStandardItemLowerBounds()
        {
            var app = new Program();
            var vest = new Item { Name = "+5 Dexterity Vest", SellIn = 10, Quality = 5 };
            var sellIn = vest.SellIn;
            var expectedQuality = 0;

            app.AddItems(vest);

            for (var i = 0; i < sellIn; i++)
            {
                app.UpdateQuality();
            }
            // Test value where SellIn = 0
            Assert.True(vest.Quality == expectedQuality,
                "Vest quality incorrect. Expected = " + expectedQuality + ". Actual = " + vest.Quality);
        }
        public void TestStandardItem()
        {
            var app = new Program();
            var vest = new Item {Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20};
            var sellIn = vest.SellIn;
            var expectedQuality = 10;

            app.AddItems(vest);

            for (var i = 0; i < sellIn; i++)
            {
                app.UpdateQuality();
            }
            // Test value where SellIn = 0
            Assert.True(vest.Quality == expectedQuality,
                "Vest quality incorrect. Expected = " + expectedQuality + ". Actual = " + vest.Quality);

            // Test the item degrades twice as fast once SellIn goes below 0
            expectedQuality -= 2;
            app.UpdateQuality();

            Assert.True(vest.Quality == expectedQuality,
                "Vest quality incorrect. Expected = " + expectedQuality + ". Actual = " + vest.Quality);
        }
        public void TestProgramSetup()
        {
            var app = new Program();
            var count = app.GetItems().Count;
            var items = new List<Item>();
            var vest = new Item {Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20};

            items.Add(vest);

            // Test the program with the standard constructor
            Assert.True(count == 0, "Intial list is not empty");
            app.AddItems(vest);

            // Test adding an item to the Program
            count = app.GetItems().Count;
            Assert.True(count == 1, "Total items in App should be one. Actual = " + count);

            // Test Program with the list passed via the constructor
            app = new Program(items);
            count = app.GetItems().Count;

            Assert.True(count == 1, "Initial list should have one item");
        }
        public void TestMultipleItems()
        {
            var app = new Program();
            var vest = new Item {Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20};
            var elixir = new Item {Name = "Elixir of the Mongoose", SellIn = 5, Quality = 7};
            var expectedVestQuality = 10;
            var expectedElixirQuality = 0;
            var timesToUpdate = vest.SellIn;

            app.AddItems(vest, elixir);

            for (var i = 0; i < timesToUpdate; i++)
            {
                app.UpdateQuality();
            }

            Assert.True(elixir.Quality == expectedElixirQuality,
                "Elixir quality is not correct. Expected = " + expectedElixirQuality
                + ". Actual = " + elixir.Quality);

            Assert.True(vest.Quality == expectedVestQuality,
                            "Vest quality is not correct. Expected = " + expectedVestQuality
                            + ". Actual = " + vest.Quality);
        }
        public void TestConjuredItemLowerLimit()
        {
            var app = new Program();
            var manaCake = new Item { Name = "Conjured Mana Cake", SellIn = 5, Quality = 6 };
            var sellIn = manaCake.SellIn;

            app.AddItems(manaCake);

            for (var i = 0; i < sellIn; i++)
            {
                app.UpdateQuality();
            }

            Assert.True(manaCake.Quality == 0,
                "Mana cake quality incorrect. Expected 0. Actual result = " + manaCake.Quality);
        }
        public void TestConjuredItem()
        {
            var app = new Program();
            var manaCake = new Item {Name = "Conjured Mana Cake", SellIn = 3, Quality = 7};
            var sellIn = manaCake.SellIn;
            var expectedQuality = 1;

            app.AddItems(manaCake);

            for (var i = 0; i < sellIn; i++)
            {
                app.UpdateQuality();
            }

            Assert.True(manaCake.Quality == expectedQuality,
                "Mana cake quality incorrect. Expected " + expectedQuality + ". Actual result = " + manaCake.Quality);
        }