public void CanAddIfExistOtherInSamePeriodSameUnits()
        {
            var sku = new Sku(_testSkuName);

            sku.AddSkuOfferPrice(_testMinNumberUnits1, _testPricePerUnit, _testOfferStart1);

            Assert.Throws <OverlapOfferException>(() => sku.AddSkuOfferPrice(_testMinNumberUnits1, _testPricePerUnit, _testOfferStart3));
        }
        public void AddIfExistOtherInDifferentPeriodSameUnits()
        {
            var sku = new Sku(_testSkuName);

            sku.AddSkuOfferPrice(_testMinNumberUnits1, _testPricePerUnit, _testOfferStart1);
            sku.AddSkuOfferPrice(_testMinNumberUnits1, _testPricePerUnit, _testOfferStart2, _testOfferEnd2);

            Assert.Equal(2, sku.SkuPrices.Count());
        }
        private static IEnumerable <Sku> GetPreconfiguredSkus()
        {
            var actualDate = DateTime.UtcNow;

            var skuA = new Sku("A");

            skuA.AddSkuBasePrice(50);
            skuA.AddSkuOfferPrice(3, 43.3m, actualDate);

            var skuB = new Sku("B");

            skuB.AddSkuBasePrice(30);
            skuB.AddSkuOfferPrice(2, 22.5m, actualDate);

            var skuC = new Sku("C");

            skuC.AddSkuBasePrice(20);

            var skuD = new Sku("D");

            skuD.AddSkuBasePrice(15);

            return(new List <Sku>()
            {
                skuA, skuB, skuC, skuD
            });
        }
        public void AddIfNotExistInSamePeriod()
        {
            var sku = new Sku(_testSkuName);

            sku.AddSkuOfferPrice(_testMinNumberUnits1, _testPricePerUnit, _testOfferStart1);

            var firstSkuPrice = sku.SkuPrices.Single();

            Assert.Equal(firstSkuPrice.OfferStart, _testOfferStart1);
        }
        public void CalculatePriceWithDiscountAndOtherWithoutDiscount()
        {
            var sku = new Sku(_testSkuName);

            sku.AddSkuBasePrice(_testPricePerUnit1);
            sku.AddSkuOfferPrice(_testNumberOfUnits2, _testPricePerUnit2, _testActualDate);

            var price = sku.CalculatePrice(_testActualDate, 4);

            Assert.Equal(180, decimal.Round(price));
        }
        public void CalculatePriceWithoutDiscount()
        {
            var sku = new Sku(_testSkuName);

            sku.AddSkuBasePrice(_testPricePerUnit1);
            sku.AddSkuOfferPrice(_testNumberOfUnits2, _testPricePerUnit2, _testActualDate);

            var price = sku.CalculatePrice(_testActualDate, 2);

            Assert.Equal(100, price);
        }
        public void CanCalculateNegativeNumberOfUnits()
        {
            var sku = new Sku(_testSkuName);

            Assert.Throws <ArgumentException>(() => sku.AddSkuOfferPrice(_testNegativeNumberUnits, _testPricePerUnit, _testOfferStart1));
        }