diff --git a/src/engine/test-core/test-engine-stuff.c b/src/engine/test-core/test-engine-stuff.c index b2f000bd6c..dbed4c9625 100644 --- a/src/engine/test-core/test-engine-stuff.c +++ b/src/engine/test-core/test-engine-stuff.c @@ -1476,3 +1476,120 @@ make_random_changes_to_session (GNCSession *session) make_random_changes_to_book (session, gnc_session_get_book (session)); } + +typedef struct +{ + kvp_match_where_t where; + GSList *path; + Query *q; +} KVPQueryData; + +static void +add_kvp_value_query (const char *key, kvp_value *value, gpointer data) +{ + KVPQueryData *kqd = data; + GSList *node; + + kqd->path = g_slist_append (kqd->path, (gpointer) key); + + if (kvp_value_get_type (value) == KVP_TYPE_FRAME) + kvp_frame_for_each_slot (kvp_value_get_frame (value), + add_kvp_value_query, data); + else + xaccQueryAddKVPMatch (kqd->q, kqd->path, value, + KVP_MATCH_EQ, kqd->where, + QUERY_AND); + + node = g_slist_last (kqd->path); + kqd->path = g_slist_remove_link (kqd->path, node); + g_slist_free_1 (node); +} + +static void +add_kvp_query (Query *q, kvp_frame *frame, kvp_match_where_t where) +{ + KVPQueryData kqd; + + kqd.where = where; + kqd.path = NULL; + kqd.q = q; + + kvp_frame_for_each_slot (frame, add_kvp_value_query, &kqd); +} + +Query * +make_trans_query (Transaction *trans) +{ + Account *a; + double d; + Query *q; + Split *s; + + q = xaccMallocQuery (); + + s = xaccTransGetSplit (trans, 0); + a = xaccSplitGetAccount (s); + + xaccQueryAddSingleAccountMatch (q, xaccSplitGetAccount (s), QUERY_AND); + + xaccQueryAddDescriptionMatch (q, xaccTransGetDescription (trans), + TRUE, FALSE, QUERY_AND); + + xaccQueryAddNumberMatch (q, xaccTransGetNum (trans), TRUE, FALSE, QUERY_AND); + + xaccQueryAddActionMatch (q, xaccSplitGetAction (s), TRUE, FALSE, QUERY_AND); + + d = gnc_numeric_to_double (xaccSplitGetValue (s)); + DxaccQueryAddAmountMatch (q, d, AMT_SGN_MATCH_EITHER, + AMT_MATCH_EXACTLY, QUERY_AND); + + d = gnc_numeric_to_double (xaccSplitGetSharePrice (s)); + DxaccQueryAddSharePriceMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND); + + d = gnc_numeric_to_double (xaccSplitGetAmount (s)); + DxaccQueryAddSharesMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND); + + { + Timespec ts; + + xaccTransGetDatePostedTS (trans, &ts); + xaccQueryAddDateMatchTS (q, TRUE, ts, TRUE, ts, QUERY_AND); + } + + xaccQueryAddMemoMatch (q, xaccSplitGetMemo (s), TRUE, FALSE, QUERY_AND); + + { + cleared_match_t how; + + switch (xaccSplitGetReconcile (s)) + { + case NREC: + how = CLEARED_NO; + break; + case CREC: + how = CLEARED_CLEARED; + break; + case YREC: + how = CLEARED_RECONCILED; + break; + case FREC: + how = CLEARED_FROZEN; + break; + case VREC: + how = CLEARED_VOIDED; + break; + default: + failure ("bad reconcile flag"); + xaccFreeQuery (q); + return NULL; + } + + xaccQueryAddClearedMatch (q, how, QUERY_AND); + } + + add_kvp_query (q, xaccSplitGetSlots (s), KVP_MATCH_SPLIT); + add_kvp_query (q, xaccTransGetSlots (trans), KVP_MATCH_TRANS); + add_kvp_query (q, xaccAccountGetSlots (a), KVP_MATCH_ACCOUNT); + + return q; +} diff --git a/src/engine/test-core/test-engine-stuff.h b/src/engine/test-core/test-engine-stuff.h index 9ce190315b..3cc806a612 100644 --- a/src/engine/test-core/test-engine-stuff.h +++ b/src/engine/test-core/test-engine-stuff.h @@ -52,6 +52,7 @@ gnc_commodity* get_random_commodity(GNCSession *session); const char *get_random_commodity_namespace(void); Query* get_random_query(void); +Query * make_trans_query (Transaction *trans); GNCBook * get_random_book (GNCSession *session); GNCSession * get_random_session (void); diff --git a/src/engine/test/test-query.c b/src/engine/test/test-query.c index 8de916883c..595f669164 100644 --- a/src/engine/test/test-query.c +++ b/src/engine/test/test-query.c @@ -10,123 +10,6 @@ #include "test-engine-stuff.h" #include "test-stuff.h" -typedef struct -{ - kvp_match_where_t where; - GSList *path; - Query *q; -} KVPQueryData; - -static void -add_kvp_value_query (const char *key, kvp_value *value, gpointer data) -{ - KVPQueryData *kqd = data; - GSList *node; - - kqd->path = g_slist_append (kqd->path, (gpointer) key); - - if (kvp_value_get_type (value) == KVP_TYPE_FRAME) - kvp_frame_for_each_slot (kvp_value_get_frame (value), - add_kvp_value_query, data); - else - xaccQueryAddKVPMatch (kqd->q, kqd->path, value, - KVP_MATCH_EQ, kqd->where, - QUERY_AND); - - node = g_slist_last (kqd->path); - kqd->path = g_slist_remove_link (kqd->path, node); - g_slist_free_1 (node); -} - -static void -add_kvp_query (Query *q, kvp_frame *frame, kvp_match_where_t where) -{ - KVPQueryData kqd; - - kqd.where = where; - kqd.path = NULL; - kqd.q = q; - - kvp_frame_for_each_slot (frame, add_kvp_value_query, &kqd); -} - -static Query * -make_trans_query (Transaction *trans) -{ - Account *a; - double d; - Query *q; - Split *s; - - q = xaccMallocQuery (); - - s = xaccTransGetSplit (trans, 0); - a = xaccSplitGetAccount (s); - - xaccQueryAddSingleAccountMatch (q, xaccSplitGetAccount (s), QUERY_AND); - - xaccQueryAddDescriptionMatch (q, xaccTransGetDescription (trans), - TRUE, FALSE, QUERY_AND); - - xaccQueryAddNumberMatch (q, xaccTransGetNum (trans), TRUE, FALSE, QUERY_AND); - - xaccQueryAddActionMatch (q, xaccSplitGetAction (s), TRUE, FALSE, QUERY_AND); - - d = gnc_numeric_to_double (xaccSplitGetValue (s)); - DxaccQueryAddAmountMatch (q, d, AMT_SGN_MATCH_EITHER, - AMT_MATCH_EXACTLY, QUERY_AND); - - d = gnc_numeric_to_double (xaccSplitGetSharePrice (s)); - DxaccQueryAddSharePriceMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND); - - d = gnc_numeric_to_double (xaccSplitGetAmount (s)); - DxaccQueryAddSharesMatch (q, d, AMT_MATCH_EXACTLY, QUERY_AND); - - { - Timespec ts; - - xaccTransGetDatePostedTS (trans, &ts); - xaccQueryAddDateMatchTS (q, TRUE, ts, TRUE, ts, QUERY_AND); - } - - xaccQueryAddMemoMatch (q, xaccSplitGetMemo (s), TRUE, FALSE, QUERY_AND); - - { - cleared_match_t how; - - switch (xaccSplitGetReconcile (s)) - { - case NREC: - how = CLEARED_NO; - break; - case CREC: - how = CLEARED_CLEARED; - break; - case YREC: - how = CLEARED_RECONCILED; - break; - case FREC: - how = CLEARED_FROZEN; - break; - case VREC: - how = CLEARED_VOIDED; - break; - default: - failure ("bad reconcile flag"); - xaccFreeQuery (q); - return NULL; - } - - xaccQueryAddClearedMatch (q, how, QUERY_AND); - } - - add_kvp_query (q, xaccSplitGetSlots (s), KVP_MATCH_SPLIT); - add_kvp_query (q, xaccTransGetSlots (trans), KVP_MATCH_TRANS); - add_kvp_query (q, xaccAccountGetSlots (a), KVP_MATCH_ACCOUNT); - - return q; -} - static gboolean test_trans_query (Transaction *trans, gpointer data) {