gnucash maint: Multiple changes pushed
John Ralls
jralls at code.gnucash.org
Sun Aug 14 18:44:25 EDT 2022
Updated via https://github.com/Gnucash/gnucash/commit/e9737375 (commit)
via https://github.com/Gnucash/gnucash/commit/087501d3 (commit)
via https://github.com/Gnucash/gnucash/commit/410db42d (commit)
via https://github.com/Gnucash/gnucash/commit/229f6f5e (commit)
via https://github.com/Gnucash/gnucash/commit/4c1fc1d5 (commit)
from https://github.com/Gnucash/gnucash/commit/1e64f3bb (commit)
commit e9737375a29422958a6d6230ed767b212756458f
Merge: 1e64f3bb0 087501d31
Author: John Ralls <jralls at ceridwen.us>
Date: Sun Aug 14 15:42:13 2022 -0700
Merge branch 'bug798262' into maint
commit 087501d316f9627748560210a95a66841849a9c4
Author: John Ralls <jralls at ceridwen.us>
Date: Sun Aug 14 15:31:46 2022 -0700
Bug 798262 - Scheduled transactions with blank amounts do not get created.
Handle template transactions that don't have any splits with empty credit
and debit strings and those having no set transaction account.
Set the concrete transaction commodity to the first found of:
The template transaction's commodity
The commodity of the first split with a credit or debit string
The commodity of the first split.
diff --git a/libgnucash/app-utils/gnc-sx-instance-model.c b/libgnucash/app-utils/gnc-sx-instance-model.c
index 4e114eb11..1f69e1ee2 100644
--- a/libgnucash/app-utils/gnc-sx-instance-model.c
+++ b/libgnucash/app-utils/gnc-sx-instance-model.c
@@ -1206,7 +1206,8 @@ static gnc_commodity*
get_transaction_currency(SxTxnCreationData *creation_data,
SchedXaction *sx, Transaction *template_txn)
{
- gnc_commodity *first_currency = NULL, *first_cmdty = NULL;
+ gnc_commodity *first_currency = NULL, *first_cmdty = NULL,
+ *fallback_cmdty = NULL;
gboolean err_flag = FALSE, txn_cmdty_in_splits = FALSE;
gnc_commodity *txn_cmdty = xaccTransGetCurrency (template_txn);
GList* txn_splits = xaccTransGetSplitList (template_txn);
@@ -1234,6 +1235,9 @@ get_transaction_currency(SxTxnCreationData *creation_data,
/* Don't consider the commodity of a transaction that has
* neither a credit nor a debit formula. */
+ if (!fallback_cmdty)
+ fallback_cmdty = xaccAccountGetCommodity (split_account);
+
if (split_is_marker(t_split))
continue;
@@ -1256,9 +1260,11 @@ get_transaction_currency(SxTxnCreationData *creation_data,
if (first_currency &&
(!txn_cmdty_in_splits || !gnc_commodity_is_currency (txn_cmdty)))
return first_currency;
- if (!txn_cmdty_in_splits)
+ if (!txn_cmdty_in_splits && first_cmdty)
return first_cmdty;
- return txn_cmdty;
+ if (txn_cmdty)
+ return txn_cmdty;
+ return fallback_cmdty;
}
static gboolean
commit 410db42df00f9a6ad79ba2bd43a7a35e442e5e0a
Author: John Ralls <jralls at ceridwen.us>
Date: Sun Aug 14 15:28:14 2022 -0700
Test case where the template txn doesn't have a set currency.
diff --git a/libgnucash/app-utils/test/test-sx.cpp b/libgnucash/app-utils/test/test-sx.cpp
index a26d1cbcb..7047deb1f 100644
--- a/libgnucash/app-utils/test/test-sx.cpp
+++ b/libgnucash/app-utils/test/test-sx.cpp
@@ -234,7 +234,6 @@ make_one_transaction_begin(TTInfo **tti, Account **account1, Account **account2)
xaccAccountSetCommodity(*account2, xaccAccountGetCommodity(*account1));
xaccAccountCommitEdit(*account2);
- gnc_ttinfo_set_currency(*tti, xaccAccountGetCommodity(*account1));
}
static void
@@ -248,7 +247,8 @@ make_one_transaction_end(TTInfo **tti, SchedXaction *sx)
}
static void
-make_one_transaction_with_two_splits(SchedXaction *sx, const char *value1, const char *value2)
+make_one_transaction_with_two_splits(SchedXaction *sx, const char *value1,
+ const char *value2, int set_txcurr)
{
TTInfo *tti;
Account *account1;
@@ -256,6 +256,9 @@ make_one_transaction_with_two_splits(SchedXaction *sx, const char *value1, const
make_one_transaction_begin(&tti, &account1, &account2);
+ if (set_txcurr)
+ gnc_ttinfo_set_currency(tti, xaccAccountGetCommodity(account1));
+
TTSplitInfo *split1 = gnc_ttsplitinfo_malloc();
TTSplitInfo *split2 = gnc_ttsplitinfo_malloc();
@@ -273,19 +276,25 @@ make_one_transaction_with_two_splits(SchedXaction *sx, const char *value1, const
static void
make_one_transaction(SchedXaction *sx)
{
- make_one_transaction_with_two_splits(sx, "123", "123");
+ make_one_transaction_with_two_splits(sx, "123", "123", FALSE);
}
static void
make_one_zero_transaction(SchedXaction *sx)
{
- make_one_transaction_with_two_splits(sx, "0", "0");
+ make_one_transaction_with_two_splits(sx, "0", "0", FALSE);
}
static void
make_one_empty_transaction(SchedXaction *sx)
{
- make_one_transaction_with_two_splits(sx, "", "");
+ make_one_transaction_with_two_splits(sx, "", "", FALSE);
+}
+
+static void
+make_one_empty_transaction_with_txcurr(SchedXaction *sx)
+{
+ make_one_transaction_with_two_splits(sx, "", "", TRUE);
}
static void
@@ -347,6 +356,7 @@ real_main(void *closure, int argc, char **argv)
test_auto_create_transactions("make_one_transaction", make_one_transaction, 1);
test_auto_create_transactions("make_one_zero_transaction", make_one_zero_transaction, 1);
test_auto_create_transactions("make_one_empty_transaction", make_one_empty_transaction, 1);
+ test_auto_create_transactions("make_one_empty_transaction_with_txcurr", make_one_empty_transaction_with_txcurr, 1);
print_test_results();
exit(get_rv());
commit 229f6f5e85a8579b371d87f407862910a416d2dd
Author: John Ralls <jralls at ceridwen.us>
Date: Fri Aug 12 12:58:58 2022 -0700
Fix gdate adjustments.
diff --git a/libgnucash/app-utils/test/test-sx.cpp b/libgnucash/app-utils/test/test-sx.cpp
index aafbef9f1..a26d1cbcb 100644
--- a/libgnucash/app-utils/test/test-sx.cpp
+++ b/libgnucash/app-utils/test/test-sx.cpp
@@ -117,7 +117,10 @@ test_once()
gnc_gdate_set_today (when);
while (random_offset_within_one_year == 0)
random_offset_within_one_year = get_random_int_in_range(-365, 365);
- g_date_add_days(when, random_offset_within_one_year);
+ if (random_offset_within_one_year > 0)
+ g_date_add_days(when, random_offset_within_one_year);
+ else
+ g_date_subtract_days(when, -random_offset_within_one_year);
end = g_date_new();
g_date_clear(end, 1);
commit 4c1fc1d555a154f276ef093926ba821f8bd4fdd8
Author: Simon Arlott <sa.me.uk>
Date: Sun Sep 26 13:07:51 2021 +0100
Bug 798262 - Add test case for basic scheduled transactions
Test these scheduled transactions:
* 2 splits with fixed amounts "123"
* 2 splits with fixed amounts "0"
* 2 splits with empty amounts ""
Verify that automatically created scheduled transactions exist.
diff --git a/libgnucash/app-utils/test/CMakeLists.txt b/libgnucash/app-utils/test/CMakeLists.txt
index 77ba83976..962ab4197 100644
--- a/libgnucash/app-utils/test/CMakeLists.txt
+++ b/libgnucash/app-utils/test/CMakeLists.txt
@@ -26,7 +26,9 @@ add_app_utils_test(test-print-parse-amount test-print-parse-amount.cpp)
gnc_add_test_with_guile(test-scm-query-string test-scm-query-string.cpp
APP_UTILS_TEST_INCLUDE_DIRS APP_UTILS_TEST_LIBS
)
-add_app_utils_test(test-sx test-sx.cpp)
+gnc_add_test_with_guile(test-sx test-sx.cpp
+ APP_UTILS_TEST_INCLUDE_DIRS APP_UTILS_TEST_LIBS
+)
set(GUILE_DEPENDS
scm-test-engine
diff --git a/libgnucash/app-utils/test/test-sx.cpp b/libgnucash/app-utils/test/test-sx.cpp
index c6070d9ab..aafbef9f1 100644
--- a/libgnucash/app-utils/test/test-sx.cpp
+++ b/libgnucash/app-utils/test/test-sx.cpp
@@ -20,12 +20,15 @@
#include <config.h>
#include <glib.h>
+#include <libguile.h>
extern "C"
{
#include <stdlib.h>
#include "SX-book.h"
+#include "SX-ttinfo.h"
#include "gnc-date.h"
+#include "gnc-session.h"
#include "gnc-sx-instance-model.h"
#include "gnc-ui-util.h"
@@ -214,8 +217,116 @@ test_state_changes()
remove_sx(foo);
}
-int
-main(int argc, char **argv)
+static void
+make_one_transaction_begin(TTInfo **tti, Account **account1, Account **account2)
+{
+ QofBook *book = qof_session_get_book(gnc_get_current_session());
+
+ *account1 = get_random_account(book);
+ *account2 = get_random_account(book);
+ *tti = gnc_ttinfo_malloc();
+
+ // Both accounts need to have the same currency
+ xaccAccountBeginEdit(*account2);
+ xaccAccountSetCommodity(*account2, xaccAccountGetCommodity(*account1));
+ xaccAccountCommitEdit(*account2);
+
+ gnc_ttinfo_set_currency(*tti, xaccAccountGetCommodity(*account1));
+}
+
+static void
+make_one_transaction_end(TTInfo **tti, SchedXaction *sx)
+{
+ QofBook *book = qof_session_get_book(gnc_get_current_session());
+ GList *txns = g_list_append(NULL, *tti);
+ xaccSchedXactionSetTemplateTrans(sx, txns, book);
+ gnc_ttinfo_free(*tti);
+ *tti = NULL;
+}
+
+static void
+make_one_transaction_with_two_splits(SchedXaction *sx, const char *value1, const char *value2)
+{
+ TTInfo *tti;
+ Account *account1;
+ Account *account2;
+
+ make_one_transaction_begin(&tti, &account1, &account2);
+
+ TTSplitInfo *split1 = gnc_ttsplitinfo_malloc();
+ TTSplitInfo *split2 = gnc_ttsplitinfo_malloc();
+
+ gnc_ttsplitinfo_set_account(split1, account1);
+ gnc_ttsplitinfo_set_debit_formula(split1, value1);
+ gnc_ttinfo_append_template_split(tti, split1);
+
+ gnc_ttsplitinfo_set_account(split2, account2);
+ gnc_ttsplitinfo_set_credit_formula(split2, value2);
+ gnc_ttinfo_append_template_split(tti, split2);
+
+ make_one_transaction_end(&tti, sx);
+}
+
+static void
+make_one_transaction(SchedXaction *sx)
+{
+ make_one_transaction_with_two_splits(sx, "123", "123");
+}
+
+static void
+make_one_zero_transaction(SchedXaction *sx)
+{
+ make_one_transaction_with_two_splits(sx, "0", "0");
+}
+
+static void
+make_one_empty_transaction(SchedXaction *sx)
+{
+ make_one_transaction_with_two_splits(sx, "", "");
+}
+
+static void
+test_auto_create_transactions(const char *name, void (*populate_sx)(SchedXaction*), unsigned int expected_txns)
+{
+ GncSxInstanceModel *model;
+ GDate yesterday, today;
+ SchedXaction *one_sx;
+ GncSxSummary summary;
+ GList *auto_created_txns = NULL;
+
+ g_date_clear(&today, 1);
+ gnc_gdate_set_today(&today);
+
+ yesterday = today;
+ g_date_subtract_days(&yesterday, 1);
+
+ one_sx = add_daily_sx(name, &yesterday, NULL, NULL);
+
+ xaccSchedXactionSetNumOccur(one_sx, 1);
+ xaccSchedXactionSetRemOccur(one_sx, 1);
+ xaccSchedXactionSetAutoCreate(one_sx, TRUE, FALSE);
+
+ populate_sx(one_sx);
+
+ model = gnc_sx_get_current_instances();
+ gnc_sx_instance_model_summarize(model, &summary);
+ gnc_sx_instance_model_effect_change(model, TRUE, &auto_created_txns, NULL);
+
+ do_test_args(summary.need_dialog == 0, "Dialog not required",
+ __FILE__, __LINE__, "for %s", name);
+ do_test_args(summary.num_auto_create_no_notify_instances == 1, "1 automatically created instance",
+ __FILE__, __LINE__, "for %s", name);
+ do_test_args(g_list_length(auto_created_txns) == expected_txns, "Automatically created transactions",
+ __FILE__, __LINE__, "for %s: auto_created_txns = %u, expected_txns = %u",
+ name, g_list_length(auto_created_txns), expected_txns);
+
+ g_list_free(auto_created_txns);
+ g_object_unref(model);
+ remove_sx(one_sx);
+}
+
+static void
+real_main(void *closure, int argc, char **argv)
{
g_setenv ("GNC_UNINSTALLED", "1", TRUE);
qof_init();
@@ -230,6 +341,17 @@ main(int argc, char **argv)
test_basic();
test_state_changes();
+ test_auto_create_transactions("make_one_transaction", make_one_transaction, 1);
+ test_auto_create_transactions("make_one_zero_transaction", make_one_zero_transaction, 1);
+ test_auto_create_transactions("make_one_empty_transaction", make_one_empty_transaction, 1);
+
print_test_results();
exit(get_rv());
}
+
+int main(int argc, char **argv)
+{
+ /* do things this way so we can test scheme function calls from expressions */
+ scm_boot_guile(argc, argv, real_main, NULL);
+ return 0;
+}
Summary of changes:
libgnucash/app-utils/gnc-sx-instance-model.c | 12 ++-
libgnucash/app-utils/test/CMakeLists.txt | 4 +-
libgnucash/app-utils/test/test-sx.cpp | 141 ++++++++++++++++++++++++++-
3 files changed, 150 insertions(+), 7 deletions(-)
More information about the gnucash-changes
mailing list