QOF 0.8.4
|
00001 /*************************************************************************** 00002 * test-object.c 00003 * 00004 * Copyright 2004 Linas Vepstas <linas@linas.org> 00005 * Copyright 2008 Neil Williams <linux@codehelp.co.uk> 00006 ****************************************************************************/ 00007 /* 00008 * This program is free software; you can redistribute it and/or modify 00009 * it under the terms of the GNU General Public License as published by 00010 * the Free Software Foundation; either version 2 of the License, or 00011 * (at your option) any later version. 00012 * 00013 * This program is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU General Public License 00019 * along with this program; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA 00021 */ 00022 00023 /* 00024 * test the QofObject infrastructure with static and dynamic objects. 00025 */ 00026 #include <glib.h> 00027 #include "qof.h" 00028 #include "test-stuff.h" 00029 00030 #define TEST_MODULE_NAME "object-test" 00031 #define TEST_MODULE_DESC "Test Object" 00032 #define DYNAMIC_MOD_NAME "dynamic_test" 00033 #define DYNAMIC_MOD_DESC "Full test of adding arbitrary objects" 00034 00035 static void obj_foreach (QofCollection *, QofEntityForeachCB, gpointer); 00036 static const gchar *printable (gpointer obj); 00037 static void test_printable (const gchar *name, gpointer obj); 00038 static void test_foreach (QofBook *, const gchar *); 00039 00040 static QofObject bus_obj = { 00041 .interface_version = QOF_OBJECT_VERSION, 00042 .e_type = TEST_MODULE_NAME, 00043 .type_label = TEST_MODULE_DESC, 00044 .create = NULL, 00045 .book_begin = NULL, 00046 .book_end = NULL, 00047 .is_dirty = NULL, 00048 .mark_clean = NULL, 00049 .foreach = obj_foreach, 00050 .printable = printable, 00051 .version_cmp = NULL, 00052 }; 00053 00054 static G_GNUC_UNUSED const gchar * 00055 test_dyn_printable (gpointer obj) 00056 { 00057 /* actual dynamic objects can call any function here */ 00058 return "test"; 00059 } 00060 00061 static QofObject * 00062 dyn_create (QofBook * book) 00063 { 00064 QofInstance * inst; 00065 QofCollection *coll; 00066 GList *all; 00067 00068 g_return_val_if_fail (book, NULL); 00069 inst = g_new0 (QofInstance, 1); 00070 qof_instance_init (inst, "dynamic_test", book); 00071 coll = qof_book_get_collection (book, "dynamic_test"); 00072 all = qof_collection_get_data (coll); 00073 all = g_list_prepend (all, inst); 00074 qof_collection_set_data (coll, all); 00075 return (QofObject*)inst; 00076 } 00077 00078 /* pointer to an array of dynamically allocated parameters */ 00079 static QofParam * p_list; 00080 00081 static gchar * 00082 dynamic_get_string (QofEntity * ent) 00083 { 00084 /* actual dynamic objects can call any function here */ 00085 do_test (!safe_strcmp (DYNAMIC_MOD_NAME, ent->e_type), "e_type check for string"); 00086 return "test_string"; 00087 } 00088 00089 static gint 00090 dynamic_get_int (QofEntity * ent) 00091 { 00092 /* actual dynamic objects can call any function here */ 00093 do_test (!safe_strcmp (DYNAMIC_MOD_NAME, ent->e_type), "e_type check for int"); 00094 return 1; 00095 } 00096 00097 static gboolean 00098 dynamic_get_boolean (QofEntity * ent) 00099 { 00100 /* actual dynamic objects can call any function here */ 00101 do_test (!safe_strcmp (DYNAMIC_MOD_NAME, ent->e_type), "e_type check for int"); 00102 return TRUE; 00103 } 00104 00105 static QofParam * 00106 add_boolean_param (void) 00107 { 00108 QofParam * p; 00109 00110 p = g_new0 (QofParam, 1); 00111 p->param_name = "test_boolean"; 00112 p->param_type = QOF_TYPE_BOOLEAN; 00113 p->param_getfcn = (QofAccessFunc)dynamic_get_boolean; 00114 return p; 00115 } 00116 00117 static gboolean 00118 test_boolean_param (QofEntity * ent, const QofParam * p) 00119 { 00120 gboolean b, (*boolean_getter) (QofEntity *, QofParam *); 00121 /* actual dynamic objects can call any function here */ 00122 do_test (!safe_strcmp (DYNAMIC_MOD_NAME, ent->e_type), "e_type check for bool"); 00123 boolean_getter = (gboolean (*)(QofEntity *, QofParam *)) p->param_getfcn; 00124 b = boolean_getter (ent, (QofParam*)p); 00125 return b; 00126 } 00127 00128 static const QofParam * 00129 test_class_register (void) 00130 { 00131 QofParam * p; 00132 /* the parameter list needs to be of constant storage size 00133 and big enough for all dynamic objects. Registration stops 00134 at the first NULL parameter. */ 00135 static QofParam list[30]; 00136 00137 p = g_new0 (QofParam, 1); 00138 p->param_name = "test_string"; 00139 p->param_type = QOF_TYPE_STRING; 00140 p->param_getfcn = (QofAccessFunc)dynamic_get_string; 00141 list[0] = *p; 00142 p = g_new0 (QofParam, 1); 00143 p->param_name = "test_int"; 00144 p->param_type = QOF_TYPE_INT32; 00145 p->param_getfcn = (QofAccessFunc)dynamic_get_int; 00146 list[1] = *p; 00147 list[2] = *add_boolean_param (); 00148 /* create the terminating NULL */ 00149 p = g_new0 (QofParam, 1); 00150 list[3] = *p; 00151 p_list = list; 00152 return p_list; 00153 } 00154 00155 static void 00156 test_dynamic_object (void) 00157 { 00158 QofObject * dynamic; 00159 QofInstance * d_ent; 00160 const QofObject * check; 00161 const gchar * message; 00162 gchar * s; 00163 gint t, (*int32_getter) (QofEntity *, QofParam *); 00164 const QofParam * p; 00165 QofBook *book = qof_book_new (); 00166 00167 do_test ((NULL != book), "book null"); 00168 dynamic = g_new0(QofObject,1); 00169 dynamic->interface_version = QOF_OBJECT_VERSION, 00170 dynamic->e_type = DYNAMIC_MOD_NAME; 00171 dynamic->type_label = DYNAMIC_MOD_DESC; 00172 dynamic->foreach = obj_foreach; 00173 dynamic->create = (gpointer) dyn_create; 00174 dynamic->printable = test_dyn_printable; 00175 do_test (qof_object_register (dynamic), "dynamic object registration"); 00176 check = qof_object_lookup (DYNAMIC_MOD_NAME); 00177 do_test (check != NULL, "dynamic object lookup"); 00178 message = qof_object_get_type_label (DYNAMIC_MOD_NAME); 00179 do_test (!safe_strcmp(message, "Full test of adding arbitrary objects"), 00180 "dynamic object type_label"); 00181 d_ent = qof_object_new_instance (DYNAMIC_MOD_NAME, book); 00182 do_test (check->printable != NULL, "dynamic printable support"); 00183 message = qof_object_printable (DYNAMIC_MOD_NAME, dynamic); 00184 do_test (message != NULL, "dynamic object printable"); 00185 message = dynamic->printable(d_ent); 00186 do_test (message != NULL, "dynamic direct printable"); 00187 qof_class_register(DYNAMIC_MOD_NAME, NULL, test_class_register()); 00188 do_test (qof_class_is_registered (DYNAMIC_MOD_NAME), "class register"); 00189 s = NULL; 00190 p = qof_class_get_parameter (DYNAMIC_MOD_NAME, "test_string"); 00191 s = p->param_getfcn (d_ent, p); 00192 do_test (!safe_strcmp(s, "test_string"), "get string from dynamic object"); 00193 t = 0; 00194 p = qof_class_get_parameter (DYNAMIC_MOD_NAME, "test_int"); 00195 int32_getter = (gint32 (*)(QofEntity *, QofParam *)) p->param_getfcn; 00196 t = int32_getter ((QofEntity*)d_ent, (QofParam*)p); 00197 do_test (t == 1, "get int from dynamic object"); 00198 p = qof_class_get_parameter (DYNAMIC_MOD_NAME, "test_boolean"); 00199 do_test (test_boolean_param((QofEntity*)d_ent, p), 00200 "get boolean from dynamic object"); 00201 } 00202 00203 static void 00204 test_object (void) 00205 { 00206 QofBook *book = qof_book_new (); 00207 00208 do_test ((NULL != book), "book null"); 00209 00210 /* Test the global registration and lookup functions */ 00211 { 00212 do_test (!qof_object_register (NULL), "register NULL"); 00213 do_test (qof_object_register (&bus_obj), "register test object"); 00214 do_test (!qof_object_register (&bus_obj), 00215 "register test object again"); 00216 do_test (qof_object_lookup (TEST_MODULE_NAME) == &bus_obj, 00217 "lookup our installed object"); 00218 do_test (qof_object_lookup ("snm98sn snml say dyikh9y9ha") == NULL, 00219 "lookup non-existant object object"); 00220 00221 do_test (!safe_strcmp (qof_object_get_type_label (TEST_MODULE_NAME), 00222 (TEST_MODULE_DESC)), 00223 "test description return"); 00224 } 00225 00226 test_foreach (book, TEST_MODULE_NAME); 00227 test_printable (TEST_MODULE_NAME, (gpointer) 1); 00228 } 00229 00230 static void 00231 obj_foreach (QofCollection * col, 00232 QofEntityForeachCB cb __attribute__ ((unused)), gpointer u_d) 00233 { 00234 int *foo = u_d; 00235 00236 do_test (col != NULL, "foreach: NULL collection"); 00237 success ("called foreach callback"); 00238 00239 *foo = 1; 00240 } 00241 00242 static void 00243 foreachCB (QofEntity * ent __attribute__ ((unused)), 00244 gpointer u_d __attribute__ ((unused))) 00245 { 00246 do_test (FALSE, "FAIL"); 00247 } 00248 00249 static const char * 00250 printable (gpointer obj) 00251 { 00252 do_test (obj != NULL, "printable: object is NULL"); 00253 success ("called printable callback"); 00254 return ((const char *) obj); 00255 } 00256 00257 static void 00258 test_foreach (QofBook * book, const char *name) 00259 { 00260 int res = 0; 00261 00262 qof_object_foreach (NULL, NULL, NULL, &res); 00263 do_test (res == 0, "object: Foreach: NULL, NULL, NULL"); 00264 qof_object_foreach (NULL, NULL, foreachCB, &res); 00265 do_test (res == 0, "object: Foreach: NULL, NULL, foreachCB"); 00266 00267 qof_object_foreach (NULL, book, NULL, &res); 00268 do_test (res == 0, "object: Foreach: NULL, book, NULL"); 00269 qof_object_foreach (NULL, book, foreachCB, &res); 00270 do_test (res == 0, "object: Foreach: NULL, book, foreachCB"); 00271 00272 qof_object_foreach (name, NULL, NULL, &res); 00273 do_test (res == 0, "object: Foreach: name, NULL, NULL"); 00274 qof_object_foreach (name, NULL, foreachCB, &res); 00275 do_test (res == 0, "object: Foreach: name, NULL, foreachCB"); 00276 00277 qof_object_foreach (name, book, NULL, &res); 00278 do_test (res != 0, "object: Foreach: name, book, NULL"); 00279 00280 res = 0; 00281 qof_object_foreach (name, book, foreachCB, &res); 00282 do_test (res != 0, "object: Foreach: name, book, foreachCB"); 00283 } 00284 00285 static void 00286 test_printable (const char *name, gpointer obj) 00287 { 00288 const char *res; 00289 00290 do_test (qof_object_printable (NULL, NULL) == NULL, 00291 "object: Printable: NULL, NULL"); 00292 do_test (qof_object_printable (NULL, obj) == NULL, 00293 "object: Printable: NULL, object"); 00294 do_test (qof_object_printable (name, NULL) == NULL, 00295 "object: Printable: mod_name, NULL"); 00296 res = qof_object_printable (name, obj); 00297 do_test (res != NULL, "object: Printable: mod_name, object"); 00298 } 00299 00300 int 00301 main (void) 00302 { 00303 qof_init (); 00304 test_object (); 00305 test_dynamic_object (); 00306 print_test_results (); 00307 qof_close (); 00308 return get_rv (); 00309 }