public void VolumesExcludedCurrentContractBillingMonths()
        {
            var currentContract     = ContractReaderStub.Contract();
            var contracts           = ContractReaderStub.Contracts();
            var previousSiteVolumes =
                ContractProductSiteVolumeReaderStub.PreviousSiteVolumes();
            var currentContractSiteVolumes =
                ContractProductSiteVolumeReaderStub.CurrentSiteVolume();
            var previousContractForTheClient =
                SiteVolumeCalculator.PreviousContractForClient(currentContract,
                                                               contracts);
            var previousContractSiteVolumes =
                SiteVolumeCalculator.SiteVolumesForContract(
                    previousContractForTheClient,
                    previousSiteVolumes);
            var currentContractBillingMonths =
                SiteVolumeCalculator.BillingMonths(
                    currentContractSiteVolumes);

            var actualResult =
                SiteVolumeCalculator
                .VolumesExcludedCurrentContractBillingMonths(
                    currentContractBillingMonths, previousContractSiteVolumes);

            //march 3rd 2015
            Assert.AreEqual(50, actualResult.ElementAt(0).Volume);
            Assert.AreEqual(30, actualResult.ElementAt(0).SiteId);
            Assert.AreEqual(new DateTime(2015, 3, 1),
                            actualResult.ElementAt(0).BillingMonth);
        }
        public void PreviousContractForTheClient()
        {
            var contract  = ContractReaderStub.Contract();
            var contracts = ContractReaderStub.Contracts();

            var previousContract =
                SiteVolumeCalculator.PreviousContractForClient(
                    contract, contracts);

            Assert.AreEqual(33, previousContract.ClientId);
            Assert.AreEqual(new DateTime(2015, 3, 1), previousContract.EndDate);
        }
        public void TotalContractedVolumeForNoVolumeAvailableContract()
        {
            var contract  = ContractReaderStub.Contract();
            var contracts = ContractReaderStub.Contracts();
            var products  = ContractProductReaderStub.Products();
            var sites     = ContractProductSiteReaderStub.Sites();
            var volumes   = ContractProductSiteVolumeReaderStub.PreviousSiteVolumes();

            var forecaster =
                new SiteVolumeCalculator();

            var totalContractedSiteVolume =
                forecaster.TotalContractedVolume(contract,
                                                 contracts,
                                                 products, sites, volumes);

            Assert.AreEqual(150, totalContractedSiteVolume);
        }
        public void DecoupleSiteVolumeCalculatorFromForecaster()
        {
            var contract  = ContractReaderStub.Contract();
            var contracts = ContractReaderStub.Contracts();
            var products  = ContractProductReaderStub.Products();
            var sites     = ContractProductSiteReaderStub.Sites();
            var volumes   = ContractProductSiteVolumeReaderStub.SomeVolumes();

            var volumeCalculator =
                new SiteVolumeCalculator();
            var volumeForecaster = new SiteVolumeForecaster(volumeCalculator);

            var actualResult = volumeForecaster.TotalContractedVolume(
                contract, contracts,
                products,
                sites,
                volumes);

            Assert.AreEqual(250, actualResult);
        }
        [TestMethod] public void NotAllVolumesAvailableAndNotNoVolumesAvailableContract()
        {
            var contract  = ContractReaderStub.Contract();
            var contracts = ContractReaderStub.Contracts();
            var products  = ContractProductReaderStub.Products();
            var sites     = ContractProductSiteReaderStub.Sites();
            var volumes   = ContractProductSiteVolumeReaderStub.NotAllVolumeNotNoVolume();

            var forecaster =
                new SiteVolumeCalculator();

            var actualResult =
                forecaster.TotalContractedVolume(
                    contract, contracts,
                    products,
                    sites,
                    volumes
                    );

            Assert.AreEqual(250, actualResult);
        }
        public void TotalContractedVolumeForAllVolumeAvailableContract()
        {
            var contract  = ContractReaderStub.Contract();
            var contracts = ContractReaderStub.Contracts();
            var products  = ContractProductReaderStub.Products();
            var sites     = ContractProductSiteReaderStub.Sites();
            var volumes   = ContractProductSiteVolumeReaderStub.AllVolumes();

            var forecaster =
                new SiteVolumeCalculator();

            var actualResult =
                forecaster.TotalContractedVolume(
                    contract, contracts,
                    products,
                    sites,
                    volumes
                    );

            Assert.AreEqual(300, actualResult);
        }