mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Refactor make_trans_query into engine test-core.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@5775 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
a6d324ed3b
commit
f82f95a0a2
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user