00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <glib.h>
00030 #include "qof.h"
00031 #include "qofsql-p.h"
00032 #include "test-stuff.h"
00033
00035 #define TEST_MODULE_NAME "object_test"
00036 #define TEST_MODULE_DESC "Test Object"
00037 #define OBJ_AMOUNT "anamount"
00038 #define OBJ_KVP "kvp"
00039
00040
00041 typedef struct d_obj
00042 {
00043 QofInstance inst;
00044 gchar *Name;
00045 gchar flag;
00046 QofNumeric Amount;
00047 QofTime *date;
00048 gdouble discount;
00049 gboolean active;
00050 gint32 version;
00051 gint64 minor;
00052 } dyn_obj;
00053
00054 static dyn_obj *
00055 dyn_create (QofBook * book)
00056 {
00057 dyn_obj * d;
00058
00059 g_return_val_if_fail (book, NULL);
00060 d = g_new0 (dyn_obj, 1);
00061 qof_instance_init (&d->inst, TEST_MODULE_NAME, book);
00062 return d;
00063 }
00064
00065 static void
00066 dyn_setAmount (dyn_obj * e, QofNumeric h)
00067 {
00068 if (!e)
00069 return;
00070 e->Amount = h;
00071 }
00072
00073 static QofNumeric
00074 dyn_getAmount (dyn_obj * e)
00075 {
00076 if (!e)
00077 return qof_numeric_zero ();
00078 return e->Amount;
00079 }
00080
00081 static G_GNUC_UNUSED const gchar *
00082 test_dyn_printable (gpointer obj)
00083 {
00084 return "test";
00085 }
00086
00087 static QofObject bus_obj = {
00088 .interface_version = QOF_OBJECT_VERSION,
00089 .e_type = TEST_MODULE_NAME,
00090 .type_label = TEST_MODULE_DESC,
00091 .create = (gpointer)dyn_create,
00092 .book_begin = NULL,
00093 .book_end = NULL,
00094 .is_dirty = qof_collection_is_dirty,
00095 .mark_clean = qof_collection_mark_clean,
00096 .foreach = qof_collection_foreach,
00097 .printable = test_dyn_printable,
00098 .version_cmp = (gint (*)(gpointer, gpointer)) qof_instance_version_cmp,
00099 };
00100
00101 static gboolean
00102 dyn_objRegister (void)
00103 {
00104 static QofParam params[] = {
00105 {OBJ_AMOUNT, QOF_TYPE_NUMERIC, (QofAccessFunc) dyn_getAmount,
00106 (QofSetterFunc) dyn_setAmount, NULL},
00107 {OBJ_KVP, QOF_TYPE_KVP, (QofAccessFunc) qof_instance_get_slots,
00108 NULL, NULL},
00109 {QOF_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc) qof_instance_get_book,
00110 NULL, NULL},
00111 {QOF_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc) qof_instance_get_guid,
00112 NULL, NULL},
00113 {NULL, NULL, NULL, NULL, NULL},
00114 };
00115
00116 qof_class_register (TEST_MODULE_NAME, NULL, params);
00117
00118 return qof_object_register (&bus_obj);
00119 }
00120
00121 static void
00122 dyn_foreach (QofParam * param, gpointer user_data)
00123 {
00124 do_test (param != NULL, "Fail");
00125 }
00126
00127 static void
00128 dyn_foreach2 (QofEntity * ent, gpointer user_data)
00129 {
00130 do_test (ent != NULL, "Fail");
00131 }
00132
00133 static void
00134 test_sql (QofBook * book)
00135 {
00136 KvpFrame * slots;
00137 const QofParam * param;
00138 QofEntity * ent;
00139 QofInstance * inst;
00140 gdouble rand_dbl;
00141 QofNumeric rand_num;
00142 QofCollection * col;
00143 gchar * sql_str, * gstr, * test, * err, *rand_str;
00144 gchar * num_str;
00145 gulong kvp_id;
00146
00147 sql_str = NULL;
00148 inst = qof_object_new_instance (TEST_MODULE_NAME, book);
00149 do_test (inst != NULL, "object new instance");
00150 g_return_if_fail (inst);
00151
00152 rand_str = g_strescape (get_random_string (), NULL);
00153 slots = qof_instance_get_slots (inst);
00154 do_test (slots != NULL, "creating some slots");
00155 kvp_frame_set_string (qof_instance_get_slots (inst), "debug/test/string", rand_str);
00156 test = g_strdup(kvp_frame_get_string (qof_instance_get_slots (inst), "debug/test/string"));
00157 err = g_strdup_printf ("compare slots: %s", test);
00158 do_test (0 == safe_strcasecmp (test, rand_str), err);
00159 g_free (test);
00160 g_free (err);
00161 ent = (QofEntity*)inst;
00162 do_test (ent != NULL, "convert to entity");
00163 qof_class_param_foreach (ent->e_type, dyn_foreach, NULL);
00164 col = qof_book_get_collection (book, ent->e_type);
00165 qof_collection_foreach (col, dyn_foreach2, NULL);
00166
00167 rand_dbl = get_random_double ();
00168 rand_num = qof_numeric_from_double (rand_dbl, QOF_DENOM_AUTO, QOF_HOW_RND_ROUND);
00169 num_str = qof_numeric_to_string (rand_num);
00170 sql_str = qof_sql_entity_create_table (ent);
00171 test = g_strdup ("CREATE TABLE object_test ( guid char(32) primary key not null, "
00172 "anamount text, dbversion int ); CREATE TABLE sql_kvp (kvp_id int "
00173 "primary key not null, guid char(32), path mediumtext, type mediumtext, "
00174 "value text, dbversion int );");
00175 do_test (0 == safe_strcasecmp (sql_str, test),
00176 g_strdup_printf ("Create table SQL statement:%s:%s", sql_str, test));
00177 g_free (test);
00178 g_free (sql_str);
00179 qof_sql_entity_set_kvp_exists (TRUE);
00180
00181 kvp_id = qof_sql_entity_get_kvp_id ();
00182 sql_str = qof_sql_entity_insert (ent);
00183 gstr = g_strnfill (GUID_ENCODING_LENGTH + 1, ' ');
00184 guid_to_string_buff (qof_instance_get_guid (inst), gstr);
00185 test = g_strdup_printf ("INSERT into object_test (guid , anamount) VALUES "
00186 "('%s' , '%s'); INSERT into sql_kvp (kvp_id, guid, type, path, value) "
00187 "VALUES ('%ld', '%s', 'string', '/debug/test/string', '%s');",
00188 gstr, num_str, kvp_id, gstr, rand_str);
00189 err = g_strdup_printf ("Insert entity SQL statement:%s:%s", sql_str, test);
00190 do_test (0 == safe_strcasecmp (sql_str, test),err);
00191 g_free (test);
00192 g_free (err);
00193 g_free (sql_str);
00194
00195 param = qof_class_get_parameter (TEST_MODULE_NAME, OBJ_AMOUNT);
00196
00197 inst->param = param;
00198 do_test (param != NULL, "no OBJ_AMOUNT parameter");
00199 sql_str = qof_sql_entity_update (ent);
00200 do_test (sql_str != NULL, "failed to mark instance as dirty");
00201 test = g_strdup_printf ("UPDATE object_test SET anamount = '%s' WHERE "
00202 "guid='%s';", num_str, gstr);
00203 err = g_strdup_printf ("Update entity SQL statement: %s", sql_str);
00204 do_test (0 == safe_strcasecmp (sql_str, test), err);
00205 g_free (test);
00206 g_free (err);
00207 g_free (sql_str);
00208
00209 sql_str = qof_sql_entity_update_kvp (ent);
00210 test = g_strdup_printf ("UPDATE sql_kvp SET type='string', value='%s' "
00211 "WHERE path='/debug/test/string' and guid='%s';", rand_str, gstr);
00212 err = g_strdup_printf ("Update entity SQL statement: %s", sql_str);
00213 do_test (0 == safe_strcasecmp (sql_str, test), err);
00214 g_free (test);
00215 g_free (err);
00216 g_free (sql_str);
00217
00219
00220 sql_str = qof_sql_entity_delete (ent);
00221 test = g_strconcat ("DELETE from object_test WHERE guid='", gstr, "';",
00222 "DELETE from sql_kvp WHERE kvp_id ='", gstr, "';", NULL);
00223 err = g_strdup_printf ("DELETE entity SQL statement: %s", sql_str);
00224 do_test (0 == safe_strcasecmp (sql_str, test), err);
00225 g_free (test);
00226 g_free (err);
00227 g_free (sql_str);
00228 sql_str = qof_sql_entity_drop_table (ent);
00229
00230 err = g_strdup_printf ("DROP TABLE SQL statement: %s", sql_str);
00231 do_test (0 == safe_strcasecmp (sql_str, "DROP TABLE object_test;"), err);
00232 g_free (err);
00233 g_free (sql_str);
00234 qof_sql_entity_set_kvp_exists (FALSE);
00235 }
00236
00237 int
00238 main (void)
00239 {
00240 QofBook *book;
00241 gint c;
00242 qof_init ();
00243 book = qof_book_new ();
00244 do_test ((NULL != book), "book null");
00245 do_test (dyn_objRegister() == TRUE, "register test object");
00246 do_test (qof_object_lookup (TEST_MODULE_NAME) == &bus_obj,
00247 "lookup our installed object");
00248 do_test (qof_class_is_registered(TEST_MODULE_NAME) == TRUE, "class registration");
00249 for (c=0;c<10;c++)
00250 {
00251 test_sql (book);
00252 }
00253 print_test_results ();
00254 qof_close ();
00255 return get_rv ();
00256 }