26 #include <glib/gprintf.h>
30 #include "test-stuff.h"
32 #define GRAND_MODULE_NAME "recursive-grandparent"
33 #define PARENT_MODULE_NAME "recursive-parent"
34 #define CHILD_MODULE_NAME "recursive-child"
35 #define GRAND_MODULE_DESC "Recursive Grand Parent Test"
36 #define PARENT_MODULE_DESC "Recursive Parent Test"
37 #define CHILD_MODULE_DESC "Recursive Child Test"
38 #define OBJ_NAME "somename"
39 #define OBJ_AMOUNT "anamount"
40 #define OBJ_DATE "nottoday"
41 #define OBJ_DISCOUNT "hefty"
42 #define OBJ_VERSION "early"
43 #define OBJ_MINOR "tiny"
44 #define OBJ_ACTIVE "ofcourse"
45 #define OBJ_FLAG "tiny_flag"
46 #define OBJ_RELATIVE "family"
47 #define OBJ_LIST "descendents"
51 static gboolean debug = FALSE;
54 typedef struct child_s
68 typedef struct parent_s
83 typedef struct grand_s
98 mygrand *grand_create (
QofBook *);
99 myparent *parent_create (
QofBook *);
100 mychild *child_create (
QofBook *);
102 gboolean mygrandRegister (
void);
103 gboolean myparentRegister (
void);
104 gboolean mychildRegister (
void);
107 void grand_setName (mygrand *, gchar *);
109 void grand_setDate (mygrand *,
QofTime *h);
110 void grand_setDiscount (mygrand *, gdouble);
111 void grand_setActive (mygrand *, gboolean);
112 void grand_setVersion (mygrand *, gint32);
113 void grand_setMinor (mygrand *, gint64);
114 void grand_setFlag (mygrand *, gchar);
117 gchar *grand_getName (mygrand *);
119 QofTime *grand_getDate (mygrand *);
120 gdouble grand_getDiscount (mygrand *);
121 gboolean grand_getActive (mygrand *);
122 gint32 grand_getVersion (mygrand *);
123 gint64 grand_getMinor (mygrand *);
124 gchar grand_getFlag (mygrand *);
127 void parent_setName (myparent *, gchar *);
128 void parent_setAmount (myparent *,
QofNumeric);
129 void parent_setDate (myparent *,
QofTime *h);
130 void parent_setDiscount (myparent *, gdouble);
131 void parent_setActive (myparent *, gboolean);
132 void parent_setVersion (myparent *, gint32);
133 void parent_setMinor (myparent *, gint64);
134 void parent_setFlag (myparent *, gchar);
137 gchar *parent_getName (myparent *);
139 QofTime *parent_getDate (myparent *);
140 gdouble parent_getDiscount (myparent *);
141 gboolean parent_getActive (myparent *);
142 gint32 parent_getVersion (myparent *);
143 gint64 parent_getMinor (myparent *);
144 gchar parent_getFlag (myparent *);
147 void child_setName (mychild *, gchar *);
149 void child_setDate (mychild *,
QofTime *h);
150 void child_setDiscount (mychild *, gdouble);
151 void child_setActive (mychild *, gboolean);
152 void child_setVersion (mychild *, gint32);
153 void child_setMinor (mychild *, gint64);
154 void child_setFlag (mychild *, gchar);
157 gchar *child_getName (mychild *);
159 QofTime *child_getDate (mychild *);
160 gdouble child_getDiscount (mychild *);
161 gboolean child_getActive (mychild *);
162 gint32 child_getVersion (mychild *);
163 gint64 child_getMinor (mychild *);
164 gchar child_getFlag (mychild *);
171 g_return_val_if_fail (book, NULL);
172 g = g_new0 (mygrand, 1);
176 g->discount = get_random_double ();;
177 g->active = get_random_boolean ();
178 g->version = get_random_int_in_range (1, 10000);
179 g->minor = get_random_int_in_range (100001, 99999999);
180 g->flag = get_random_character ();
181 g->Name = get_random_string ();
182 g->Amount = get_random_qof_numeric ();
194 g_return_val_if_fail (book, NULL);
195 g = g_new0 (myparent, 1);
198 g->discount = get_random_double ();
199 g->active = get_random_boolean ();
200 g->version = get_random_int_in_range (1, 10000);
201 g->minor = get_random_int_in_range (100001, 99999999);
202 g->flag = get_random_character ();
203 g->Name = get_random_string ();
204 g->Amount = get_random_qof_numeric ();
215 g_return_val_if_fail (book, NULL);
216 g = g_new0 (mychild, 1);
219 g->discount = get_random_double ();
220 g->active = get_random_boolean ();
221 g->version = get_random_int_in_range (1, 10000);
222 g->minor = get_random_int_in_range (100001, 99999999);
223 g->flag = get_random_character ();
224 g->Name = get_random_string ();
225 g->Amount = get_random_qof_numeric ();
231 descend_cb (
QofEntity * ent, gpointer user_data)
233 mygrand *g = (mygrand *) user_data;
235 g_return_if_fail (g || ent);
236 g->descend = g_list_prepend (g->descend, (mychild *) ent);
242 g_return_if_fail (g || coll);
251 grand_getDescend (mygrand * g)
257 g_return_val_if_fail (g, NULL);
259 for (list = g_list_copy (g->descend); list; list = list->next)
266 do_test (0 ==
safe_strcmp (ent->e_type, CHILD_MODULE_NAME),
274 grand_setChild (mygrand * g, myparent * p)
276 g_return_if_fail (g || p);
281 grand_getChild (mygrand * g)
283 g_return_val_if_fail (g, NULL);
288 grand_setFlag (mygrand * g, gchar f)
290 g_return_if_fail (g);
295 grand_getFlag (mygrand * g)
297 g_return_val_if_fail (g,
'n');
302 grand_setMinor (mygrand * g, gint64 h)
304 g_return_if_fail (g != NULL);
309 grand_getMinor (mygrand * g)
311 g_return_val_if_fail ((g != NULL), 0);
316 grand_setVersion (mygrand * g, gint32 h)
318 g_return_if_fail (g != NULL);
323 grand_getVersion (mygrand * g)
331 grand_setActive (mygrand * g, gboolean h)
339 grand_getActive (mygrand * g)
347 grand_setDiscount (mygrand * g,
double h)
355 grand_getDiscount (mygrand * g)
363 grand_setDate (mygrand * g,
QofTime *h)
371 grand_getDate (mygrand * g)
379 grand_setName (mygrand * g, gchar * h)
383 g->Name = strdup (h);
387 grand_getName (mygrand * g)
403 grand_getAmount (mygrand * g)
411 parent_setChild (myparent * p, mychild * c)
413 g_return_if_fail (p || c);
418 parent_getChild (myparent * p)
420 g_return_val_if_fail (p, NULL);
425 parent_setFlag (myparent * p, gchar f)
427 g_return_if_fail (p);
432 parent_getFlag (myparent * p)
434 g_return_val_if_fail (p,
'n');
439 parent_setMinor (myparent * p, gint64 h)
441 g_return_if_fail (p != NULL);
446 parent_getMinor (myparent * p)
448 g_return_val_if_fail ((p != NULL), 0);
453 parent_setVersion (myparent * p, gint32 h)
455 g_return_if_fail (p != NULL);
460 parent_getVersion (myparent * p)
468 parent_setActive (myparent * p, gboolean h)
476 parent_getActive (myparent * p)
484 parent_setDiscount (myparent * p,
double h)
492 parent_getDiscount (myparent * p)
500 parent_setDate (myparent * p,
QofTime *h)
508 parent_getDate (myparent * p)
516 parent_setName (myparent * p, gchar * h)
520 p->Name = strdup (h);
524 parent_getName (myparent * p)
540 parent_getAmount (myparent * p)
548 child_setFlag (mychild * c, gchar f)
550 g_return_if_fail (c);
555 child_getFlag (mychild * c)
557 g_return_val_if_fail (c,
'n');
562 child_setMinor (mychild * c, gint64 h)
564 g_return_if_fail (c != NULL);
569 child_getMinor (mychild * c)
571 g_return_val_if_fail ((c != NULL), 0);
576 child_setVersion (mychild * c, gint32 h)
578 g_return_if_fail (c != NULL);
583 child_getVersion (mychild * c)
591 child_setActive (mychild * c, gboolean h)
599 child_getActive (mychild * c)
607 child_setDiscount (mychild * c,
double h)
615 child_getDiscount (mychild * c)
623 child_setDate (mychild * c,
QofTime *h)
631 child_getDate (mychild * c)
639 child_setName (mychild * c, gchar * h)
643 c->Name = strdup (h);
647 child_getName (mychild * c)
663 child_getAmount (mychild * c)
672 .e_type = GRAND_MODULE_NAME,
673 .type_label = GRAND_MODULE_DESC,
674 .create = (gpointer) grand_create,
681 .version_cmp = (gint (*)(gpointer, gpointer))
686 mygrandRegister (
void)
691 {OBJ_AMOUNT, QOF_TYPE_NUMERIC, (
QofAccessFunc) grand_getAmount,
695 {OBJ_DISCOUNT, QOF_TYPE_DOUBLE, (
QofAccessFunc) grand_getDiscount,
697 {OBJ_ACTIVE, QOF_TYPE_BOOLEAN, (
QofAccessFunc) grand_getActive,
699 {OBJ_VERSION, QOF_TYPE_INT32, (
QofAccessFunc) grand_getVersion,
705 {OBJ_RELATIVE, PARENT_MODULE_NAME, (
QofAccessFunc) grand_getChild,
713 {NULL, NULL, NULL, NULL, NULL},
724 .e_type = PARENT_MODULE_NAME,
725 .type_label = PARENT_MODULE_DESC,
726 .create = (gpointer) parent_create,
733 .version_cmp = (gint (*)(gpointer, gpointer))
738 myparentRegister (
void)
743 {OBJ_AMOUNT, QOF_TYPE_NUMERIC, (
QofAccessFunc) parent_getAmount,
747 {OBJ_DISCOUNT, QOF_TYPE_DOUBLE, (
QofAccessFunc) parent_getDiscount,
749 {OBJ_ACTIVE, QOF_TYPE_BOOLEAN, (
QofAccessFunc) parent_getActive,
751 {OBJ_VERSION, QOF_TYPE_INT32, (
QofAccessFunc) parent_getVersion,
757 {OBJ_RELATIVE, CHILD_MODULE_NAME, (
QofAccessFunc) parent_getChild,
763 {NULL, NULL, NULL, NULL, NULL},
773 .e_type = CHILD_MODULE_NAME,
774 .type_label = CHILD_MODULE_DESC,
775 .create = (gpointer) child_create,
782 .version_cmp = (gint (*)(gpointer, gpointer))
787 mychildRegister (
void)
792 {OBJ_AMOUNT, QOF_TYPE_NUMERIC, (
QofAccessFunc) child_getAmount,
796 {OBJ_DISCOUNT, QOF_TYPE_DOUBLE, (
QofAccessFunc) child_getDiscount,
798 {OBJ_ACTIVE, QOF_TYPE_BOOLEAN, (
QofAccessFunc) child_getActive,
800 {OBJ_VERSION, QOF_TYPE_INT32, (
QofAccessFunc) child_getVersion,
810 {NULL, NULL, NULL, NULL, NULL},
819 create_data (
QofSession * original, guint counter)
827 start = qof_session_get_book (original);
829 do_test ((NULL != &grand1->inst),
"instance init");
834 do_test ((grand1 != NULL),
"empty tree check");
837 "Too many grandparents found - should be 1");
840 "child found, should be empty");
843 "tree not empty: parent found");
851 grand_setChild (grand1, parent1);
852 do_test ((parent1 != NULL),
"single parent check");
853 do_test ((grand_getChild (grand1) == parent1),
854 "set child in grandparent");
857 "Wrong number of grandparents, should be 1");
860 "Should be no child entities this iteration.");
863 "Wrong number of parents found, should be 1");
871 grand_setChild (grand1, parent1);
875 parent1 = grand_getChild (grand1);
876 parent_setChild (parent1, child1);
877 do_test ((child1 != NULL),
"one parent with one related child");
878 do_test ((child1 == parent_getChild (parent1)),
879 "child of single parent");
882 "Wrong number of grandparents. Should be 1");
885 "Wrong number of child entities, should be 1");
888 "Wrong number of parents. Should be 1");
899 grand_setChild (grand1, parent1);
900 parent_setChild (parent1, child1);
901 do_test ((parent1 == grand_getChild (grand1)),
902 "same grandparent, new parent");
903 do_test ((child1 == parent_getChild (parent1)),
904 "new parent, same child");
907 "Wrong number of grandparents. Should be 1, Iteration 3.");
910 "Wrong number of child entities, should be 1. Iteration 3.");
913 "Wrong number of parents. Should be 1. Iteration 3.");
927 parent_setChild (parent1, child1);
928 do_test ((NULL == grand_getChild (grand1)),
929 "new grand, unrelated parent");
930 do_test ((child1 == parent_getChild (parent1)),
931 "child unrelated to grand");
932 coll = grand_getDescend (grand1);
933 do_test ((coll != NULL),
"grandparent not valid");
940 grand_setDescend (grand1, coll);
942 do_test ((g_list_length (grand1->descend) > 0),
945 0),
"empty collection returned");
954 guint nulls, total, collect;
959 check_cb (
QofEntity * ent, gpointer data)
969 c = (
struct tally *) data;
972 testg = (mygrand *) ent;
974 do_test ((testg != NULL),
"grandparent not found");
984 parent = (
QofEntity *) param->param_getfcn (ent, param);
985 testp = grand_getChild ((mygrand *) ent);
992 do_test ((0 ==
safe_strcmp (parent_getName (testp),
993 parent_getName ((myparent *) parent))),
996 child = param->param_getfcn (parent, param);
997 testc = parent_getChild ((myparent *) parent);
1003 do_test ((0 ==
safe_strcmp (child_getName (testc),
1004 child_getName ((mychild *) child))),
1009 test_recursion (
QofSession * original, guint counter)
1021 book = qof_session_get_book (original);
1023 copy = qof_session_new ();
1032 book = qof_session_get_book (copy);
1042 do_test ((d == c.nulls),
"Null parents do not match");
1043 do_test ((e == c.total),
"Total parents do not match");
1044 do_test ((f == c.collect),
1045 "Number of children in descendents does not match");
1046 if (counter == 4 && debug == TRUE)
1063 myparentRegister ();
1065 for (counter = 0; counter < 35; counter++)
1067 original = qof_session_new ();
1072 create_data (original, (counter % 5));
1073 test_recursion (original, (counter % 5));
1076 print_test_results ();
1078 return EXIT_SUCCESS;