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));
|
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);
|
const char *get_random_commodity_namespace(void);
|
||||||
|
|
||||||
Query* get_random_query(void);
|
Query* get_random_query(void);
|
||||||
|
Query * make_trans_query (Transaction *trans);
|
||||||
|
|
||||||
GNCBook * get_random_book (GNCSession *session);
|
GNCBook * get_random_book (GNCSession *session);
|
||||||
GNCSession * get_random_session (void);
|
GNCSession * get_random_session (void);
|
||||||
|
@ -10,123 +10,6 @@
|
|||||||
#include "test-engine-stuff.h"
|
#include "test-engine-stuff.h"
|
||||||
#include "test-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
|
static gboolean
|
||||||
test_trans_query (Transaction *trans, gpointer data)
|
test_trans_query (Transaction *trans, gpointer data)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user