28 #include <glib/gstdio.h>
32 #include <sys/types.h>
36 #include "../gnc-xml-helper.h"
37 #include "../gnc-xml.h"
39 #include <cashobjects.h>
40 #include "../sixtp-parsers.h"
42 #include "../sixtp-dom-parsers.h"
44 #include "../io-gncxml-gen.h"
46 #include <test-stuff.h>
48 #include <test-file-stuff.h>
49 #include <unittest-support.h>
53 #include <TransactionP.h>
57 extern gboolean gnc_transaction_xml_v2_testing;
60 find_appropriate_node(xmlNodePtr node,
Split *spl)
64 for (mark = node->xmlChildrenNode; mark; mark = mark->next)
66 gboolean account_guid_good = FALSE;
67 gboolean amount_good = FALSE;
70 for (mark2 = mark->xmlChildrenNode; mark2; mark2 = mark2->next)
72 if (g_strcmp0((
char*)mark2->name,
"split:value") == 0)
83 else if (g_strcmp0((
char*)mark2->name,
"split:account") == 0)
85 GncGUID *accid = dom_tree_to_guid(mark2);
90 account_guid_good = TRUE;
95 if (account_guid_good && amount_good)
106 equals_node_val_vs_split_internal(xmlNodePtr node,
Split* spl)
110 for (mark = node->children; mark != NULL; mark = mark->next)
112 if (g_strcmp0((
char*)mark->name,
"split:id") == 0)
114 GncGUID *
id = dom_tree_to_guid(mark);
123 else if (g_strcmp0((
char*)mark->name,
"split:memo") == 0)
125 char *memo = dom_tree_to_text(mark);
130 return "memos differ";
134 else if (g_strcmp0((
char*)mark->name,
"split:reconciled-state") == 0)
136 char *rs = dom_tree_to_text(mark);
141 return "states differ";
145 else if (g_strcmp0((
char*)mark->name,
"split:value") == 0)
153 return g_strdup_printf (
"values differ: %" G_GINT64_FORMAT
"/%"
154 G_GINT64_FORMAT
" v %" G_GINT64_FORMAT
155 "/%" G_GINT64_FORMAT,
156 (*num).num, (*num).denom,
161 else if (g_strcmp0((
char*)mark->name,
"split:quantity") == 0)
168 return g_strdup_printf(
"quantities differ under _equal: %"
169 G_GINT64_FORMAT
"/%" G_GINT64_FORMAT
170 " v %" G_GINT64_FORMAT
"/%"
172 (*num).num, (*num).denom,
173 val.num, val.denom );
178 return g_strdup_printf (
"quantities differ: %" G_GINT64_FORMAT
179 "/%" G_GINT64_FORMAT
" v %"
180 G_GINT64_FORMAT
"/%" G_GINT64_FORMAT,
181 (*num).num, (*num).denom,
186 else if (g_strcmp0((
char*)mark->name,
"split:account") == 0)
188 GncGUID *
id = dom_tree_to_guid(mark);
194 return "accounts differ";
203 equals_node_val_vs_splits(xmlNodePtr node,
const Transaction *trn)
210 g_return_val_if_fail(node, FALSE);
211 g_return_val_if_fail(node->xmlChildrenNode, FALSE);
217 spl_node = find_appropriate_node(node, spl_mark);
223 g_print(
"Split GUID %s", guidstr );
224 return "no matching split found";
227 msg = equals_node_val_vs_split_internal(spl_node, spl_mark);
238 node_and_transaction_equal(xmlNodePtr node,
Transaction *trn)
242 while (g_strcmp0 ((
char*)node->name,
"text") == 0)
245 if (!check_dom_tree_version(node,
"2.0.0"))
247 return "version wrong. Not 2.0.0 or not there";
250 if (!node->name || g_strcmp0((
char*)node->name,
"gnc:transaction"))
252 return "Name of toplevel node is bad";
255 for (mark = node->xmlChildrenNode; mark; mark = mark->next)
257 if (g_strcmp0((
char*)mark->name,
"text") == 0)
260 else if (g_strcmp0((
char*)mark->name,
"trn:id") == 0)
271 else if (g_strcmp0((
char*)mark->name,
"trn:currency") == 0)
274 if (!equals_node_val_vs_commodity(
277 return g_strdup(
"currencies differ");
281 else if (g_strcmp0((
char*)mark->name,
"trn:num") == 0)
285 return "nums differ";
288 else if (g_strcmp0((
char*)mark->name,
"trn:date-posted") == 0)
292 return "posted dates differ";
295 else if (g_strcmp0((
char*)mark->name,
"trn:date-entered") == 0)
299 return "entered dates differ";
302 else if (g_strcmp0((
char*)mark->name,
"trn:description") == 0)
306 return "descriptions differ";
309 else if (g_strcmp0((
char*)mark->name,
"trn:slots") == 0)
311 if (!equals_node_val_vs_kvp_frame(mark, qof_instance_get_slots (QOF_INSTANCE (trn))))
313 return "slots differ";
316 else if (g_strcmp0((
char*)mark->name,
"trn:splits") == 0)
318 char *msg = equals_node_val_vs_splits (mark, trn);
326 return "unknown node";
351 test_add_transaction(
const char *tag, gpointer globaldata, gpointer data)
355 gboolean retval = TRUE;
361 if (!do_test_args(
xaccTransEqual(gdata->trn, trans, TRUE, TRUE, TRUE, FALSE),
362 "gnc_transaction_sixtp_parser_create",
367 gdata->new_trn = trans;
373 test_transaction(
void)
377 for (i = 0; i < 50; i++)
380 xmlNodePtr test_node;
388 get_random_account_tree(book);
389 ran_trn = get_random_transaction(book);
390 new_com = get_random_commodity( book );
393 failure_args(
"transaction_xml", __FILE__, __LINE__,
394 "get_random_transaction returned NULL");
402 for ( ; node; node = node->next)
404 Split * s = node->data;
418 test_node = gnc_transaction_dom_tree_create(ran_trn);
421 failure_args(
"transaction_xml", __FILE__, __LINE__,
422 "gnc_transaction_dom_tree_create returned NULL");
423 really_get_rid_of_transaction(ran_trn);
427 if ((compare_msg = node_and_transaction_equal(test_node, ran_trn)) !=
430 failure_args(
"transaction_xml", __FILE__, __LINE__,
431 "node and transaction were not equal: %s",
433 xmlElemDump(stdout, NULL, test_node);
436 xmlFreeNode(test_node);
437 really_get_rid_of_transaction(ran_trn);
442 success_args(
"transaction_xml", __FILE__, __LINE__,
"%d", i );
445 filename1 = g_strdup_printf(
"test_file_XXXXXX");
447 fd = g_mkstemp(filename1);
449 write_dom_node_to_file(test_node, fd);
455 for ( ; node; node = node->next)
457 Split * s = node->data;
472 gchar *msg =
"[xaccAccountScrubCommodity()] Account \"\" does not have a commodity!";
473 gchar *logdomain =
"gnc.engine.scrub";
474 guint loglevel = G_LOG_LEVEL_CRITICAL;
476 g_log_set_handler (logdomain, loglevel,
477 (GLogFunc)test_checked_handler, &check);
481 parser = gnc_transaction_sixtp_parser_create();
483 if (!gnc_xml_parse_file(parser, filename1, test_add_transaction,
484 (gpointer)&data, book))
486 failure_args(
"gnc_xml_parse_file returned FALSE",
487 __FILE__, __LINE__,
"%d", i);
490 really_get_rid_of_transaction (data.new_trn);
498 really_get_rid_of_transaction(ran_trn);
499 xmlFreeNode(test_node);
504 test_real_transaction(
const char *tag, gpointer global_data, gpointer data)
508 msg = node_and_transaction_equal((xmlNodePtr)global_data,
510 do_test_args(msg == NULL,
"test_real_transaction",
511 __FILE__, __LINE__, msg);
517 main (
int argc,
char ** argv)
520 cashobjects_register();
523 gnc_transaction_xml_v2_testing = TRUE;
529 test_files_in_dir(argc, argv, test_real_transaction,
530 gnc_transaction_sixtp_parser_create(),
531 "gnc:transaction", book);
538 print_test_results();
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
Split * xaccTransGetSplit(const Transaction *trans, int i)
int xaccAccountGetCommoditySCU(const Account *acc)
void xaccLogDisable(void)
char xaccSplitGetReconcile(const Split *split)
QofBook * qof_book_new(void)
gchar * guid_to_string_buff(const GncGUID *guid, gchar *buff)
const char * xaccTransGetNum(const Transaction *trans)
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
void xaccTransDestroy(Transaction *trans)
#define xaccAccountGetGUID(X)
gboolean xaccTransEqual(const Transaction *ta, const Transaction *tb, gboolean check_guids, gboolean check_splits, gboolean check_balances, gboolean assume_ordered)
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
#define GUID_ENCODING_LENGTH
Timespec xaccTransRetDateEnteredTS(const Transaction *trans)
const char * xaccTransGetDescription(const Transaction *trans)
#define xaccTransGetBook(X)
void xaccTransCommitEdit(Transaction *trans)
#define xaccSplitGetGUID(X)
void xaccTransBeginEdit(Transaction *trans)
All type declarations for the whole Gnucash engine.
void xaccAccountSetCommoditySCU(Account *acc, int scu)
#define xaccTransGetGUID(X)
API for the transaction logger.
void qof_close(void)
Safely close down the Query Object Framework.
gnc_numeric xaccSplitGetValue(const Split *split)
void xaccAccountBeginEdit(Account *acc)
Account * xaccSplitGetAccount(const Split *s)
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
#define xaccAccountInsertSplit(acc, s)
Timespec xaccTransRetDatePostedTS(const Transaction *trans)
Account * xaccMallocAccount(QofBook *book)
const char * xaccSplitGetMemo(const Split *split)
void qof_init(void)
Initialise the Query Object Framework.
API for Transactions and Splits (journal entries)
void xaccAccountCommitEdit(Account *acc)
SplitList * xaccTransGetSplitList(const Transaction *trans)
void xaccAccountSetCommodity(Account *acc, gnc_commodity *com)
gnc_numeric xaccSplitGetAmount(const Split *split)