public void SelectsIncreasingRuleWhenSellInBetweenFiveAndOne()
        {
            var services           = this.SetupRuleServices();
            var deprecationService = new DeprecationService(
                services.DecreasingService.Object,
                services.IncreasingService.Object,
                services.ZeroService.Object);

            var stockItem = this.TestStockItem;

            stockItem.SellIn = 3;

            var result = deprecationService.DeprecateItem(stockItem);

            Assert.Equal("Food 2 0", result);

            services.DecreasingService
            .Verify(service => service.RunRule(It.IsAny <DecreasingDeprecationRule>(), It.IsAny <StockItem>()), Times.Never);

            services.IncreasingService
            .Verify(service => service.RunRule(It.IsAny <IncreasingDeprecationRule>(), It.IsAny <StockItem>()), Times.Once);

            services.ZeroService
            .Verify(service => service.RunRule(It.IsAny <ZeroDeprecationRule>(), It.IsAny <StockItem>()), Times.Never);
        }
        public void SelectsNoRuleWhenTypeHasNoRules()
        {
            var services           = this.SetupRuleServices();
            var deprecationService = new DeprecationService(
                services.DecreasingService.Object,
                services.IncreasingService.Object,
                services.ZeroService.Object);

            var stockItem = this.TestStockItem;

            stockItem.SellIn = 0;
            stockItem.StockType.DeprecationRules = null;

            var result = deprecationService.DeprecateItem(stockItem);

            Assert.Equal("Food 0 0", result);

            services.DecreasingService
            .Verify(service => service.RunRule(It.IsAny <DecreasingDeprecationRule>(), It.IsAny <StockItem>()), Times.Never);

            services.IncreasingService
            .Verify(service => service.RunRule(It.IsAny <IncreasingDeprecationRule>(), It.IsAny <StockItem>()), Times.Never);

            services.ZeroService
            .Verify(service => service.RunRule(It.IsAny <ZeroDeprecationRule>(), It.IsAny <StockItem>()), Times.Never);
        }
        public void ReturnsNoSuchItemWhereNoType()
        {
            var services           = this.SetupRuleServices();
            var deprecationService = new DeprecationService(
                services.DecreasingService.Object,
                services.IncreasingService.Object,
                services.ZeroService.Object);

            var stockItem = this.TestStockItem;

            stockItem.SellIn    = 8;
            stockItem.Quality   = 25;
            stockItem.StockType = null;

            var result = deprecationService.DeprecateItem(stockItem);

            Assert.Equal("NO SUCH ITEM", result);
        }
        public void SetsQualityToFiftyIfGreaterThanFifty()
        {
            var services           = this.SetupRuleServices();
            var deprecationService = new DeprecationService(
                services.DecreasingService.Object,
                services.IncreasingService.Object,
                services.ZeroService.Object);

            var stockItem = this.TestStockItem;

            stockItem.SellIn  = 8;
            stockItem.Quality = 55;

            var result = deprecationService.DeprecateItem(stockItem);

            Assert.Equal("Food 7 50", result);
            Assert.Equal(50, stockItem.Quality);
        }
        public void SetsQualityToZeroIfNegative()
        {
            var services           = this.SetupRuleServices();
            var deprecationService = new DeprecationService(
                services.DecreasingService.Object,
                services.IncreasingService.Object,
                services.ZeroService.Object);

            var stockItem = this.TestStockItem;

            stockItem.SellIn  = 8;
            stockItem.Quality = -2;

            var result = deprecationService.DeprecateItem(stockItem);

            Assert.Equal("Food 7 0", result);
            Assert.Equal(0, stockItem.Quality);
        }