1 #include <r_util.h>
2 #include "minunit.h"
3 #define BUF_LENGTH 100
4
5 //TODO test r_str_chop_path
6
test_r_table(void)7 bool test_r_table(void) {
8 RTable *t = r_table_new ("test1");
9
10 // r_table_fromcsv (t, csv);
11 RTableColumnType *typeString = r_table_type ("string");
12 RTableColumnType *typeNumber = r_table_type ("number");
13
14 r_table_add_column (t, typeString, "name", 0);
15 r_table_add_column (t, typeNumber, "address", 0);
16
17 r_table_add_row (t, "hello", "100", NULL);
18 r_table_add_row (t, "namings", "20000", NULL);
19
20 // r_table_filter (t, 1, '>', "200");
21 // r_table_filter (t, 1, '=', "100");
22 // r_table_query (t, "[1]/q/100");
23 r_table_sort (t, 1, true);
24 {
25 char *j = r_table_tojson (t);
26 const char *jOK = "[{\"name\":\"namings\",\"address\":20000},{\"name\":\"hello\",\"address\":100}]";
27 mu_assert_streq (j, jOK, "r_table_get_sections");
28 free (j);
29 }
30 r_table_free (t);
31 mu_end;
32 }
33
__table_test_data1()34 RTable *__table_test_data1() {
35 RTable *t = r_table_new ("test2");
36
37 r_table_add_column (t, r_table_type ("string"), "ascii", 0);
38 r_table_add_column (t, r_table_type ("number"), "code", 0);
39
40 r_table_add_row (t, "a", "97", NULL);
41 r_table_add_row (t, "b", "98", NULL);
42 r_table_add_row (t, "c", "99", NULL);
43
44 return t;
45 }
46
test_r_table_column_type(void)47 bool test_r_table_column_type(void) {
48 RTable *t = __table_test_data1 ();
49 RTableColumn *c = r_list_get_n (t->cols, 1);
50 c->type = r_table_type ("NUMBER");
51 r_table_sort (t, 1, true);
52 char *s = r_table_tostring (t);
53 mu_assert_streq (s,
54 "ascii code\n"
55 "----------\n"
56 "a 97\n"
57 "b 98\n"
58 "c 99\n", "not sorted by second column due to undefined type");
59 free (s);
60 r_table_free (t);
61 mu_end;
62 }
63
test_r_table_tostring(void)64 bool test_r_table_tostring(void) {
65 RTable *t = __table_test_data1 ();
66 char buf[BUF_LENGTH];
67
68 int i;
69 for (i = 0; i < 4; i++) {
70 char *s = r_table_tostring (t);
71 snprintf (buf, BUF_LENGTH, "%d-th call to r_table_tostring", i);
72 mu_assert_streq (s,
73 "ascii code\n"
74 "----------\n"
75 "a 97\n"
76 "b 98\n"
77 "c 99\n", buf);
78 free (s);
79 }
80 r_table_free (t);
81 mu_end;
82 }
83
test_r_table_sort1(void)84 bool test_r_table_sort1(void) {
85 RTable *t = __table_test_data1 ();
86
87 r_table_sort (t, 1, true);
88 char *strd = r_table_tostring (t);
89 mu_assert_streq (strd,
90 "ascii code\n"
91 "----------\n"
92 "c 99\n"
93 "b 98\n"
94 "a 97\n", "sort decreasing second column using number type");
95 free (strd);
96
97 r_table_sort (t, 1, false);
98 char *stri = r_table_tostring (t);
99 mu_assert_streq (stri,
100 "ascii code\n"
101 "----------\n"
102 "a 97\n"
103 "b 98\n"
104 "c 99\n", "sort increasing second column using number type");
105 free (stri);
106 r_table_free (t);
107 mu_end;
108 }
109
test_r_table_uniq(void)110 bool test_r_table_uniq(void) {
111 RTable *t = __table_test_data1 ();
112
113 r_table_uniq (t);
114 char *strd = r_table_tostring (t);
115 mu_assert_streq (strd,
116 "ascii code\n"
117 "----------\n"
118 "a 97\n"
119 "b 98\n"
120 "c 99\n",
121 "uniq delete nothing");
122 free (strd);
123
124 r_table_add_row (t, "a", "97", NULL);
125 r_table_add_row (t, "a", "97", NULL);
126 r_table_add_row (t, "a", "97", NULL);
127 r_table_add_row (t, "b", "98", NULL);
128 r_table_add_row (t, "c", "99", NULL);
129 r_table_add_row (t, "b", "98", NULL);
130 r_table_add_row (t, "c", "99", NULL);
131 r_table_add_row (t, "d", "99", NULL);
132 r_table_add_row (t, "b", "98", NULL);
133 r_table_add_row (t, "d", "99", NULL);
134 r_table_add_row (t, "c", "99", NULL);
135 r_table_add_row (t, "c", "100", NULL);
136
137 r_table_uniq (t);
138 char *stri = r_table_tostring (t);
139 mu_assert_streq (stri,
140 "ascii code\n"
141 "----------\n"
142 "a 97\n"
143 "b 98\n"
144 "c 99\n"
145 "d 99\n"
146 "c 100\n",
147 "uniq delete some rows");
148 free (stri);
149 r_table_free (t);
150 mu_end;
151 }
152
simple_merge(RTableRow * acc,RTableRow * new_row,int nth)153 static void simple_merge(RTableRow *acc, RTableRow *new_row, int nth) {
154 RList *lhs = acc->items;
155 RList *rhs = new_row->items;
156 RListIter *iter_lhs;
157 RListIter *iter_rhs;
158
159 char *item_lhs;
160
161 int i = 0;
162
163 for (iter_lhs = lhs->head, iter_rhs = rhs->head;
164 iter_lhs && iter_rhs;
165 iter_lhs = iter_lhs->n, iter_rhs = iter_rhs->n) {
166
167 item_lhs = iter_lhs->data;
168
169 if (i != nth) {
170 if (!strcmp (item_lhs, "a")) {
171 free (iter_lhs->data);
172 iter_lhs->data = r_str_new ("a | e");
173 } else if (!strcmp (item_lhs, "b")) {
174 free (iter_lhs->data);
175 iter_lhs->data = r_str_new ("b | f");
176 } else if (!strcmp (item_lhs, "c")) {
177 free (iter_lhs->data);
178 iter_lhs->data = r_str_new ("c | h");
179 } else if (!strcmp (item_lhs, "d")) {
180 free (iter_lhs->data);
181 iter_lhs->data = r_str_new ("d | g");
182 }
183 }
184
185 ++i;
186 }
187 }
188
test_r_table_group(void)189 bool test_r_table_group (void) {
190 RTable *t = __table_test_data1 ();
191
192 r_table_group (t, -1, NULL);
193 char *str = r_table_tostring (t);
194 mu_assert_streq (str,
195 "ascii code\n"
196 "----------\n"
197 "a 97\n"
198 "b 98\n"
199 "c 99\n",
200 "group delete nothing");
201 free (str);
202
203 r_table_add_row (t, "a", "97", NULL);
204 r_table_add_row (t, "a", "97", NULL);
205 r_table_add_row (t, "a", "97", NULL);
206 r_table_add_row (t, "b", "98", NULL);
207 r_table_add_row (t, "c", "99", NULL);
208 r_table_add_row (t, "b", "98", NULL);
209 r_table_add_row (t, "c", "99", NULL);
210 r_table_add_row (t, "d", "1", NULL);
211 r_table_add_row (t, "b", "98", NULL);
212 r_table_add_row (t, "d", "99", NULL);
213 r_table_add_row (t, "c", "99", NULL);
214 r_table_add_row (t, "c", "100", NULL);
215
216 r_table_group (t, 0, NULL);
217 str = r_table_tostring (t);
218 mu_assert_streq (str,
219 "ascii code\n"
220 "----------\n"
221 "a 97\n"
222 "b 98\n"
223 "c 99\n"
224 "d 1\n",
225 "group delete some rows");
226 free (str);
227
228 r_table_add_row (t, "e", "97", NULL);
229 r_table_add_row (t, "f", "98", NULL);
230 r_table_add_row (t, "g", "99", NULL);
231 r_table_add_row (t, "h", "1", NULL);
232
233 r_table_group (t, 1, simple_merge);
234 str = r_table_tostring (t);
235 mu_assert_streq (str,
236 "ascii code\n"
237 "----------\n"
238 "a | e 97\n"
239 "b | f 98\n"
240 "c | h 99\n"
241 "d | g 1\n",
242 "group delete some rows");
243 free (str);
244
245 r_table_free (t);
246 mu_end;
247 }
248
test_r_table_columns()249 bool test_r_table_columns () {
250 RTable *t = NULL;
251 #define CREATE_TABLE \
252 r_table_free (t); \
253 t = r_table_new ("test"); \
254 r_table_add_column (t, r_table_type ("number"), "name", 0); \
255 r_table_add_column (t, r_table_type ("number"), "address", 0); \
256 r_table_add_row (t, "hello", "100", NULL); \
257 r_table_add_row (t, "namings", "20000", NULL);
258
259 CREATE_TABLE
260 char *s = r_table_tocsv (t);
261 mu_assert_streq (s,
262 "name,address\n"
263 "hello,100\n"
264 "namings,20000\n", "original");
265 free (s);
266
267 RList *newcols = r_list_new ();
268 r_table_columns (t, newcols);
269 s = r_table_tocsv (t);
270 mu_assert_streq (s,
271 "\n"
272 "\n"
273 "\n", "no cols");
274 free (s);
275
276 CREATE_TABLE
277 r_list_push (newcols, "address");
278 r_table_columns (t, newcols);
279 s = r_table_tocsv (t);
280 mu_assert_streq (s,
281 "address\n"
282 "100\n"
283 "20000\n", "select");
284 free (s);
285
286 CREATE_TABLE
287 r_list_push (newcols, "name");
288 r_table_columns (t, newcols);
289 s = r_table_tocsv (t);
290 mu_assert_streq (s,
291 "address,name\n"
292 "100,hello\n"
293 "20000,namings\n", "reorder");
294 free (s);
295
296 CREATE_TABLE
297 r_list_push (newcols, "name");
298 r_list_push (newcols, "address");
299 r_table_columns (t, newcols);
300 s = r_table_tocsv (t);
301 mu_assert_streq (s,
302 "address,name,name,address\n"
303 "100,hello,hello,100\n"
304 "20000,namings,namings,20000\n", "replicate");
305 free (s);
306
307 r_list_free (newcols);
308 r_table_free (t);
309 mu_end;
310 #undef CREATE_TABLE
311 }
312
all_tests()313 bool all_tests() {
314 mu_run_test(test_r_table);
315 mu_run_test(test_r_table_column_type);
316 mu_run_test(test_r_table_tostring);
317 mu_run_test(test_r_table_sort1);
318 mu_run_test(test_r_table_uniq);
319 mu_run_test(test_r_table_group);
320 mu_run_test (test_r_table_columns);
321 return tests_passed != tests_run;
322 }
323
main(int argc,char ** argv)324 int main(int argc, char **argv) {
325 return all_tests();
326 }
327