public void ForDate_WithEarlierDateThanFirstBudget_ShouldReturnNull()
        {
            BudgetCollection subject = Arrange();

            BudgetModel result = subject.ForDate(DateTime.MinValue);

            Assert.IsNull(result);
        }
        public void ForDate_25_1_2014_ShouldReturnBudget2()
        {
            BudgetCollection subject = Arrange();

            BudgetModel result = subject.ForDate(new DateTime(2014, 1, 25));

            Assert.AreSame(subject.First(b => b.Name == TestDataConstants.Budget2Name), result);
        }
        private static decimal CalculateBudgetedTotalAmount(DateTime beginDate,
                                                            Func <BudgetModel, decimal> whichBudgetBucket, BudgetCollection budgets,
                                                            OverallPerformanceBudgetResult result)
        {
            if (!result.UsesMultipleBudgets)
            {
                return(whichBudgetBucket(budgets.ForDate(beginDate)) * result.DurationInMonths);
            }

            decimal budgetedAmount = 0;

            for (var month = 0; month < result.DurationInMonths; month++)
            {
                var budget = budgets.ForDate(beginDate.AddMonths(month));
                budgetedAmount += whichBudgetBucket(budget);
            }

            return(budgetedAmount);
        }
        private static void CalculateTotalsAndAverage(DateTime beginDate, StatementModel statement,
                                                      BudgetCollection budgets, OverallPerformanceBudgetResult result)
        {
            // First total the expenses without the saved up for expenses.
            var totalExpensesSpend = statement.Transactions
                                     .Where(t => t.BudgetBucket is ExpenseBucket)
                                     .Sum(t => t.Amount);

            var totalSurplusSpend = statement.Transactions
                                    .Where(t => t.BudgetBucket is SurplusBucket)
                                    .Sum(t => t.Amount);

            result.AverageSpend   = totalExpensesSpend / result.DurationInMonths; // Expected to be negative
            result.AverageSurplus = totalSurplusSpend / result.DurationInMonths;  // Expected to be negative

            for (var month = 0; month < result.DurationInMonths; month++)
            {
                var budget = budgets.ForDate(beginDate.AddMonths(month));
                result.TotalBudgetExpenses += budget.Expenses.Sum(e => e.Amount);
            }

            result.OverallPerformance = result.AverageSpend + result.TotalBudgetExpenses;
        }
        private static void CalculateTotalsAndAverage(DateTime beginDate, StatementModel statement,
                                                      BudgetCollection budgets, OverallPerformanceBudgetResult result)
        {
            // First total the expenses without the saved up for expenses.
            var totalExpensesSpend = statement.Transactions
                .Where(t => t.BudgetBucket is ExpenseBucket)
                .Sum(t => t.Amount);

            var totalSurplusSpend = statement.Transactions
                .Where(t => t.BudgetBucket is SurplusBucket)
                .Sum(t => t.Amount);

            result.AverageSpend = totalExpensesSpend / result.DurationInMonths; // Expected to be negative
            result.AverageSurplus = totalSurplusSpend / result.DurationInMonths; // Expected to be negative

            for (var month = 0; month < result.DurationInMonths; month++)
            {
                var budget = budgets.ForDate(beginDate.AddMonths(month));
                result.TotalBudgetExpenses += budget.Expenses.Sum(e => e.Amount);
            }

            result.OverallPerformance = result.AverageSpend + result.TotalBudgetExpenses;
        }
        private static decimal CalculateBudgetedTotalAmount(DateTime beginDate,
                                                            Func<BudgetModel, decimal> whichBudgetBucket, BudgetCollection budgets,
                                                            OverallPerformanceBudgetResult result)
        {
            if (!result.UsesMultipleBudgets)
            {
                return whichBudgetBucket(budgets.ForDate(beginDate)) * result.DurationInMonths;
            }

            decimal budgetedAmount = 0;
            for (var month = 0; month < result.DurationInMonths; month++)
            {
                var budget = budgets.ForDate(beginDate.AddMonths(month));
                budgetedAmount += whichBudgetBucket(budget);
            }

            return budgetedAmount;
        }