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