public void TestProductStockStartsWithFiveOfEachItem()
        {
            ProductStock productStock = new ProductStock();

            Assert.AreEqual(5, productStock.Count(Products.Cola));
            Assert.AreEqual(5, productStock.Count(Products.Chips));
            Assert.AreEqual(5, productStock.Count(Products.Candy));
        }
        public void TestCreatesADictionaryOfIProductsAndIntsForCandyColaAndChips()
        {
            ProductStock productStock = new ProductStock();

            Dictionary<IProduct, int> stock = productStock.Stock;

            Assert.AreEqual(3, stock.Count);

            Assert.AreEqual(5, stock[Products.Cola]);
            Assert.AreEqual(5, stock[Products.Candy]);
            Assert.AreEqual(5, stock[Products.Chips]);
        }
        public void TestRemovingACandyDecrementsCountForCandyOnly()
        {
            ProductStock productStock = new ProductStock();

            productStock.Remove(Products.Candy);

            Assert.AreEqual(4, productStock.Count(Products.Candy));
            Assert.AreEqual(5, productStock.Count(Products.Cola));
            Assert.AreEqual(5, productStock.Count(Products.Chips));

            productStock.Remove(Products.Candy);

            Assert.AreEqual(3, productStock.Count(Products.Candy));
            Assert.AreEqual(5, productStock.Count(Products.Cola));
            Assert.AreEqual(5, productStock.Count(Products.Chips));
        }
        public void TestCountCantGoBelowZero()
        {
            ProductStock productStock = new ProductStock();

            int originalCountAndMore = productStock.Count(Products.Cola) + 3;
            for (int i = 0; i < originalCountAndMore; i++)
            {
                productStock.Remove(Products.Cola);
                Assert.GreaterOrEqual(productStock.Count(Products.Cola), 0);
            }
        }
        public void TestRemovingAProductNotifesAllObservers()
        {
            ProductStock productStock = new ProductStock();
            MockProductStockObserver mockProductStockObserverOne = new MockProductStockObserver();
            MockProductStockObserver mockProductStockObserverTwo = new MockProductStockObserver();

            productStock.RegisterObserver(mockProductStockObserverOne);
            productStock.RegisterObserver(mockProductStockObserverTwo);

            productStock.Remove(Products.Cola);

            Assert.AreEqual(1, mockProductStockObserverOne.NumberOfTimesProductStockUpdatedWasCalled);
            Assert.AreEqual(Products.Cola, mockProductStockObserverOne.LastProductPassedToProductStockUpdated);

            Assert.AreEqual(1, mockProductStockObserverTwo.NumberOfTimesProductStockUpdatedWasCalled);
            Assert.AreEqual(Products.Cola, mockProductStockObserverTwo.LastProductPassedToProductStockUpdated);

            productStock.Remove(Products.Candy);

            Assert.AreEqual(2, mockProductStockObserverOne.NumberOfTimesProductStockUpdatedWasCalled);
            Assert.AreEqual(Products.Candy, mockProductStockObserverOne.LastProductPassedToProductStockUpdated);

            Assert.AreEqual(2, mockProductStockObserverTwo.NumberOfTimesProductStockUpdatedWasCalled);
            Assert.AreEqual(Products.Candy, mockProductStockObserverTwo.LastProductPassedToProductStockUpdated);
        }
        public void TestRegisterObserverAddsObserverToList()
        {
            ProductStock productStock = new ProductStock();
            List<IProductStockObserver> productStockObservers = productStock.Observers;

            Assert.AreEqual(0, productStockObservers.Count);

            productStock.RegisterObserver(new MockProductStockObserver());

            Assert.AreEqual(1, productStockObservers.Count);
        }
        public void TestHandlesUnknownProductsGracefully()
        {
            MockProduct mockProduct = new MockProduct();
            ProductStock productStock = new ProductStock();
            MockProductStockObserver mockProductStockObserver = new MockProductStockObserver();

            productStock.RegisterObserver(mockProductStockObserver);
            
            productStock.Remove(mockProduct);
            Assert.AreEqual(0, productStock.Count(mockProduct));
            Assert.AreEqual(0, mockProductStockObserver.NumberOfTimesProductStockUpdatedWasCalled);
        }