package ru.orangesoftware.financisto2.test.model; import android.support.v4.util.LongSparseArray; import java.util.Map; import ru.orangesoftware.financisto2.model.Account; import ru.orangesoftware.financisto2.model.Budget; import ru.orangesoftware.financisto2.model.Category; import ru.orangesoftware.financisto2.model.MyEntity; import ru.orangesoftware.financisto2.model.Project; import ru.orangesoftware.financisto2.model.Transaction; import ru.orangesoftware.financisto2.test.builders.AccountBuilder; import ru.orangesoftware.financisto2.test.builders.CategoryBuilder; import ru.orangesoftware.financisto2.test.builders.DateTime; import ru.orangesoftware.financisto2.test.builders.TransactionBuilder; import ru.orangesoftware.financisto2.test.db.AbstractDbTest; /** * Created by IntelliJ IDEA. * User: Denis Solonenko * Date: 4/28/11 11:05 PM */ public class BudgetTest extends AbstractDbTest { Budget budgetOne; Account account; Project project; Map<String, Category> categoriesMap; LongSparseArray<Category> categories; LongSparseArray<Project> projects; @Override public void setUp() throws Exception { super.setUp(); account = AccountBuilder.createDefault(db); categoriesMap = CategoryBuilder.createDefaultHierarchy(categoryRepository); categories = categoryRepository.loadCategories().asIdMap(); project = new Project(); project.title = "P1"; db.saveOrUpdate(project); projects = MyEntity.asMap(db.getAllProjectsList(true)); createBudget(); } private void createBudget() { budgetOne = new Budget(); budgetOne.currency = account.currency; budgetOne.amount = 1000; budgetOne.categories = String.valueOf(categoriesMap.get("A").id); budgetOne.projects = String.valueOf(project.id); budgetOne.expanded = true; budgetOne.includeSubcategories = true; budgetOne.startDate = DateTime.date(2011, 4, 1).atMidnight().asLong(); budgetOne.endDate = DateTime.date(2011, 4, 30).at(23, 59, 59, 999).asLong(); db.saveOrUpdate(budgetOne); } public void test_should_calculate_budget_correctly_with_regular_transactions() { // zero initially long spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(0, spent); // yes, should affect budget TransactionBuilder.withDb(db).account(account).dateTime(DateTime.date(2011, 4, 1).atNoon()).amount(-100).category(categoriesMap.get("A")).create(); spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(-100, spent); // no, period is out TransactionBuilder.withDb(db).account(account).dateTime(DateTime.date(2011, 5, 1).atNoon()).amount(-200).category(categoriesMap.get("A")).create(); spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(-100, spent); // no, category is out TransactionBuilder.withDb(db).account(account).dateTime(DateTime.date(2011, 4, 1).atNoon()).amount(-200).category(categoriesMap.get("B")).create(); spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(-100, spent); // yes, child category TransactionBuilder.withDb(db).account(account).dateTime(DateTime.date(2011, 4, 2).atNoon()).amount(-200).category(categoriesMap.get("A1")).create(); spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(-300, spent); } public void test_should_calculate_budget_correctly_with_splits() { // zero initially long spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(0, spent); // yes, should affect budget Transaction t = TransactionBuilder.withDb(db).account(account).dateTime(DateTime.date(2011, 4, 1).atNoon()) .amount(-100) .category(Category.splitCategory(context)) .withSplit(categoriesMap.get("A1"), -60) .withSplit(categoriesMap.get("B"), -30) .withSplit(categoriesMap.get("B"), project, -10) .create(); spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(-70, spent); // back to zero when split gets deleted db.deleteTransaction(t.id); spent = db.fetchBudgetBalance(categories, projects, budgetOne); assertEquals(0, spent); } public void test_should_calculate_budget_total() { } }