Prohibit setting budget values greater than num_periods

* Add unit test to verify changes
* gnc_budget_set_account_period_value returns without doing anything
  if requested period value is greater than num_periods
* Add warning message when setting invalid period

Author: R Ratliff <ratliff.bobby@gmail.com>

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@23335 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Geert Janssens 2013-10-26 08:38:44 +00:00
parent 1c20648c42
commit 5f9a9489ed
2 changed files with 42 additions and 0 deletions

View File

@ -507,6 +507,11 @@ gnc_budget_set_account_period_value(GncBudget *budget, const Account *account,
gchar path[BUF_SIZE];
gchar *bufend;
if (period_num >= GET_PRIVATE(budget)->num_periods) {
PWARN("Period %i does not exist", period_num);
return;
}
gnc_budget_begin_edit(budget);
frame = qof_instance_get_slots(QOF_INSTANCE(budget));
guid = xaccAccountGetGUID(account);

View File

@ -2545,6 +2545,42 @@ test_gnc_set_budget_recurrence()
gnc_budget_destroy(budget);
}
static void
test_gnc_set_budget_account_period_value()
{
QofBook *book = qof_book_new();
GncBudget* budget = gnc_budget_new(book);
Account *acc;
gnc_numeric val;
guint log_level = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL;
gchar *log_domain = "gnc.engine";
gchar *msg = "[gnc_budget_set_account_period_value()] Period 12 does not exist";
guint hdlr;
TestErrorStruct check = { log_level, log_domain, msg, 0 };
GLogFunc oldlogger;
acc = gnc_account_create_root(book);
g_assert(!gnc_budget_is_account_period_value_set(budget, acc, 0));
gnc_budget_set_account_period_value(budget, acc, 0, gnc_numeric_create(100,1));
g_assert(gnc_budget_is_account_period_value_set(budget, acc, 0));
val = gnc_budget_get_account_period_value(budget, acc, 0);
g_assert (gnc_numeric_equal (val, gnc_numeric_create (100, 1)));
/* Budget has 12 periods by default, numbered from 0 to 11. Setting
* period 12 should throw an error. */
oldlogger = g_log_set_default_handler ((GLogFunc)test_null_handler, &check);
g_test_log_set_fatal_handler ((GTestLogFatalFunc)test_checked_handler, &check);
gnc_budget_set_account_period_value(budget, acc, 12, gnc_numeric_create(100,1));
g_assert_cmpint (check.hits, ==, 1);
g_log_set_default_handler (oldlogger, NULL);
g_object_unref(book);
g_object_unref(acc);
gnc_budget_destroy(budget);
}
void
test_suite_budget(void)
{
@ -2553,6 +2589,7 @@ test_suite_budget(void)
GNC_TEST_ADD_FUNC(suitename, "gnc_budget_set_description()", test_gnc_set_budget_description);
GNC_TEST_ADD_FUNC(suitename, "gnc_budget_set_num_periods()", test_gnc_set_budget_num_periods);
GNC_TEST_ADD_FUNC(suitename, "gnc_budget_set_recurrence()", test_gnc_set_budget_recurrence);
GNC_TEST_ADD_FUNC(suitename, "gnc_budget_set_account_period_value()", test_gnc_set_budget_account_period_value);
#if 0
GNC_TEST_ADD_FUNC (suitename, "gnc set account separator", test_gnc_set_account_separator);