1 #include "ejdb_test.h"
2 #include <CUnit/Basic.h>
3
4 #include <ejdb2/iowow/iwuuid.h>
5
init_suite(void)6 int init_suite(void) {
7 iwrc rc = ejdb_init();
8 return rc;
9 }
10
clean_suite()11 int clean_suite() {
12 return 0;
13 }
14
free_iwpool(void * ptr,void * op)15 static void free_iwpool(void *ptr, void *op) {
16 iwpool_destroy((IWPOOL*) op);
17 }
18
set_apply_int(JQL q,int idx,const char * key,int64_t id)19 static void set_apply_int(JQL q, int idx, const char *key, int64_t id) {
20 JBL_NODE n;
21 IWPOOL *pool = iwpool_create(64);
22 iwrc rc = jbn_from_json("{}", &n, pool);
23 CU_ASSERT_EQUAL_FATAL(rc, 0);
24 rc = jbn_add_item_i64(n, key, id, 0, pool);
25 CU_ASSERT_EQUAL_FATAL(rc, 0);
26 rc = jql_set_json2(q, 0, idx, n, free_iwpool, pool);
27 CU_ASSERT_EQUAL_FATAL(rc, 0);
28 }
29
ejdb_test4_1(void)30 static void ejdb_test4_1(void) {
31 EJDB_OPTS opts = {
32 .kv = {
33 .path = "ejdb_test4_1.db",
34 .oflags = IWKV_TRUNC
35 },
36 .no_wal = true
37 };
38
39 EJDB db;
40 JQL q;
41 int64_t id = 0;
42 EJDB_LIST list = 0;
43 IWXSTR *xstr = iwxstr_new();
44
45 iwrc rc = ejdb_open(&opts, &db);
46 CU_ASSERT_EQUAL_FATAL(rc, 0);
47
48 rc = put_json2(db, "artists", "{'name':'Leonardo Da Vinci', 'years':[1452,1519]}", &id);
49 CU_ASSERT_EQUAL_FATAL(rc, 0);
50
51 rc = put_json(db, "paintings", "{'name':'Mona Lisa', 'year':1490, 'origin':'Italy'}");
52 CU_ASSERT_EQUAL_FATAL(rc, 0);
53 rc = jql_create(&q, "paintings", "/[name=:?] | apply :?");
54 CU_ASSERT_EQUAL_FATAL(rc, 0);
55 rc = jql_set_str(q, 0, 0, "Mona Lisa");
56 CU_ASSERT_EQUAL_FATAL(rc, 0);
57 set_apply_int(q, 1, "artist_ref", id);
58 rc = ejdb_update(db, q);
59 CU_ASSERT_EQUAL_FATAL(rc, 0);
60 jql_destroy(&q);
61
62 rc = put_json(db, "paintings", "{'name':'Madonna Litta - Madonna And The Child', 'year':1490, 'origin':'Italy'}");
63 CU_ASSERT_EQUAL_FATAL(rc, 0);
64 rc = jql_create(&q, "paintings", "/[name=:?] | apply :?");
65 CU_ASSERT_EQUAL_FATAL(rc, 0);
66 rc = jql_set_str(q, 0, 0, "Madonna Litta - Madonna And The Child");
67 CU_ASSERT_EQUAL_FATAL(rc, 0);
68 set_apply_int(q, 1, "artist_ref", id);
69 rc = ejdb_update(db, q);
70 CU_ASSERT_EQUAL_FATAL(rc, 0);
71 jql_destroy(&q);
72 id = 0;
73
74 rc = jql_create(&q, "paintings", "/* | /artist_ref<artists");
75 CU_ASSERT_EQUAL_FATAL(rc, 0);
76 rc = ejdb_list4(db, q, 0, 0, &list);
77 CU_ASSERT_EQUAL_FATAL(rc, 0);
78
79 for (EJDB_DOC doc = list->first; doc; doc = doc->next) {
80 JBL_NODE n;
81 iwxstr_clear(xstr);
82 rc = jbn_as_json(doc->node, jbl_xstr_json_printer, xstr, 0);
83 CU_ASSERT_EQUAL_FATAL(rc, 0);
84 //fprintf(stderr, "%s\n", iwxstr_ptr(xstr));
85 rc = jbn_at(doc->node, "/artist_ref/name", &n);
86 CU_ASSERT_EQUAL_FATAL(rc, 0);
87 CU_ASSERT_EQUAL(n->type, JBV_STR);
88 CU_ASSERT_NSTRING_EQUAL(n->vptr, "Leonardo Da Vinci", n->vsize);
89
90 rc = jbn_at(doc->node, "/year", &n);
91 CU_ASSERT_EQUAL_FATAL(rc, 0);
92 CU_ASSERT_EQUAL(n->type, JBV_I64);
93 CU_ASSERT_EQUAL(n->vi64, 1490);
94 }
95 jql_destroy(&q);
96 ejdb_list_destroy(&list);
97
98
99 // Next mode
100 rc = jql_create(&q, "paintings", "/* | /{name, artist_ref<artists} - /artist_ref/years/0");
101 CU_ASSERT_EQUAL_FATAL(rc, 0);
102 rc = ejdb_list4(db, q, 0, 0, &list);
103 CU_ASSERT_EQUAL_FATAL(rc, 0);
104
105 for (EJDB_DOC doc = list->first; doc; doc = doc->next) {
106 JBL_NODE n;
107 iwxstr_clear(xstr);
108 rc = jbn_as_json(doc->node, jbl_xstr_json_printer, xstr, 0);
109 CU_ASSERT_EQUAL_FATAL(rc, 0);
110 //fprintf(stderr, "%s\n", iwxstr_ptr(xstr));
111
112 rc = jbn_at(doc->node, "/name", &n);
113 CU_ASSERT_EQUAL_FATAL(rc, 0);
114 CU_ASSERT_EQUAL(n->type, JBV_STR);
115
116 rc = jbn_at(doc->node, "/artist_ref/name", &n);
117 CU_ASSERT_EQUAL_FATAL(rc, 0);
118 CU_ASSERT_EQUAL(n->type, JBV_STR);
119 CU_ASSERT_NSTRING_EQUAL(n->vptr, "Leonardo Da Vinci", n->vsize);
120
121 rc = jbn_at(doc->node, "/artist_ref/years/1", &n); // todo: review
122 CU_ASSERT_EQUAL_FATAL(rc, 0);
123 CU_ASSERT_EQUAL(n->type, JBV_I64);
124 CU_ASSERT_EQUAL(n->vi64, 1519);
125 }
126 jql_destroy(&q);
127 ejdb_list_destroy(&list);
128
129 rc = ejdb_close(&db);
130 CU_ASSERT_EQUAL_FATAL(rc, 0);
131 iwxstr_destroy(xstr);
132 }
133
ejdb_test4_2(void)134 static void ejdb_test4_2(void) {
135 EJDB_OPTS opts = {
136 .kv = {
137 .path = "ejdb_test4_2.db",
138 .oflags = IWKV_TRUNC
139 },
140 .no_wal = true
141 };
142
143 EJDB db;
144 JQL q;
145 JBL_NODE n, n2;
146 int i = 0;
147 EJDB_LIST list = 0;
148 IWPOOL *pool = iwpool_create_empty();
149
150 char uuid[IW_UUID_STR_LEN + 1] = { 0 };
151 iwu_uuid4_fill(uuid);
152
153 iwrc rc = ejdb_open(&opts, &db);
154 CU_ASSERT_EQUAL_FATAL(rc, 0);
155
156 rc = ejdb_ensure_index(db, "users", "/uuid", EJDB_IDX_STR | EJDB_IDX_UNIQUE);
157 CU_ASSERT_EQUAL_FATAL(rc, 0);
158
159 rc = jql_create(&q, "users", "/[uuid = :?] | upsert :?");
160 CU_ASSERT_EQUAL_FATAL(rc, 0);
161
162 rc = jql_set_str(q, 0, 0, uuid);
163 CU_ASSERT_EQUAL_FATAL(rc, 0);
164
165 rc = jbn_from_json("{}", &n, pool);
166 CU_ASSERT_EQUAL_FATAL(rc, 0);
167
168 rc = jbn_add_item_str(n, "uuid", uuid, -1, 0, pool);
169 CU_ASSERT_EQUAL_FATAL(rc, 0);
170
171 rc = jbn_add_item_str(n, "name", "a", -1, 0, pool);
172 CU_ASSERT_EQUAL_FATAL(rc, 0);
173
174 rc = jql_set_json(q, 0, 1, n);
175 CU_ASSERT_EQUAL_FATAL(rc, 0);
176
177 rc = ejdb_update(db, q);
178 CU_ASSERT_EQUAL_FATAL(rc, 0);
179
180 rc = jbn_at(n, "/name", &n2);
181 CU_ASSERT_EQUAL_FATAL(rc, 0);
182
183 n2->vptr = "b";
184 rc = jql_set_json(q, 0, 1, n);
185 CU_ASSERT_EQUAL_FATAL(rc, 0);
186
187 rc = ejdb_update(db, q);
188 CU_ASSERT_EQUAL_FATAL(rc, 0);
189
190 jql_destroy(&q);
191 rc = jql_create(&q, "users", "/* | /name");
192 CU_ASSERT_EQUAL_FATAL(rc, 0);
193
194 rc = ejdb_list4(db, q, 0, 0, &list);
195 CU_ASSERT_EQUAL_FATAL(rc, 0);
196
197 for (EJDB_DOC doc = list->first; doc; doc = doc->next, ++i) {
198 CU_ASSERT_PTR_NOT_NULL_FATAL(doc->node);
199 rc = jbn_at(doc->node, "/name", &n2);
200 CU_ASSERT_EQUAL_FATAL(rc, 0);
201 CU_ASSERT_STRING_EQUAL(n2->vptr, "b");
202 }
203 CU_ASSERT_EQUAL(i, 1);
204
205 jql_destroy(&q);
206 ejdb_list_destroy(&list);
207 iwpool_destroy(pool);
208 rc = ejdb_close(&db);
209 CU_ASSERT_EQUAL_FATAL(rc, 0);
210 }
211
main()212 int main() {
213 CU_pSuite pSuite = NULL;
214 if (CUE_SUCCESS != CU_initialize_registry()) {
215 return CU_get_error();
216 }
217 pSuite = CU_add_suite("ejdb_test4", init_suite, clean_suite);
218 if (NULL == pSuite) {
219 CU_cleanup_registry();
220 return CU_get_error();
221 }
222 if ( (NULL == CU_add_test(pSuite, "ejdb_test4_1", ejdb_test4_1))
223 || (NULL == CU_add_test(pSuite, "ejdb_test4_2", ejdb_test4_2))) {
224 CU_cleanup_registry();
225 return CU_get_error();
226 }
227 CU_basic_set_mode(CU_BRM_VERBOSE);
228 CU_basic_run_tests();
229 int ret = CU_get_error() || CU_get_number_of_failures();
230 CU_cleanup_registry();
231 return ret;
232 }
233