]> mj.ucw.cz Git - libucw.git/blob - ucw/table-test.c
c3522cc89dcc8db80b4cb0132eddca59a7686053
[libucw.git] / ucw / table-test.c
1 /*
2  *      Unit tests of table printer
3  *
4  *      (c) 2014 Robert Kessl <robert.kessl@economia.cz>
5  */
6
7 #include <ucw/lib.h>
8 #include <ucw/table.h>
9 #include <ucw/opt.h>
10 #include <stdio.h>
11
12 enum test_table_cols {
13   test_col0_str, test_col1_int, test_col2_uint, test_col3_bool, test_col4_double
14 };
15
16 static uint test_column_order[] = { test_col3_bool, test_col4_double, test_col2_uint,test_col1_int, test_col0_str };
17
18 static struct table test_tbl = {
19   TBL_COLUMNS {
20     [test_col0_str] = TBL_COL_STR("col0_str", 20),
21     [test_col1_int] = TBL_COL_INT("col1_int", 8),
22     [test_col2_uint] = TBL_COL_UINT("col2_uint", 9),
23     [test_col3_bool] = TBL_COL_BOOL("col3_bool", 9),
24     [test_col4_double] = TBL_COL_DOUBLE("col4_double", 11, 2),
25     TBL_COL_END
26   },
27   TBL_COL_ORDER(test_column_order),
28   TBL_OUTPUT_HUMAN_READABLE,
29   TBL_COL_DELIMITER("\t"),
30 };
31
32 enum test_default_order_cols {
33   test_default_order_col0_int, test_default_order_col1_int, test_default_order_col2_int
34 };
35
36 static struct table test_default_order_tbl = {
37   TBL_COLUMNS {
38     [test_default_order_col0_int] = TBL_COL_INT("col0_int", 8),
39     [test_default_order_col1_int] = TBL_COL_INT("col1_int", 9),
40     [test_default_order_col2_int] = TBL_COL_INT("col2_int", 9),
41     TBL_COL_END
42   },
43   TBL_OUTPUT_HUMAN_READABLE,
44   TBL_COL_DELIMITER("\t"),
45 };
46
47 static void do_default_order_test(struct fastbuf *out)
48 {
49   table_init(&test_default_order_tbl);
50   test_default_order_tbl.out = out;
51
52   table_start(&test_default_order_tbl);
53
54   table_set_int(&test_default_order_tbl, test_default_order_col0_int, 0);
55   table_set_int(&test_default_order_tbl, test_default_order_col1_int, 1);
56   table_set_int(&test_default_order_tbl, test_default_order_col2_int, 2);
57   table_end_row(&test_default_order_tbl);
58
59   table_set_int(&test_default_order_tbl, test_default_order_col0_int, 10);
60   table_set_int(&test_default_order_tbl, test_default_order_col1_int, 11);
61   table_set_int(&test_default_order_tbl, test_default_order_col2_int, 12);
62   table_end_row(&test_default_order_tbl);
63
64   table_end(&test_default_order_tbl);
65   table_cleanup(&test_default_order_tbl);
66 }
67
68 /**
69  * tests: table_set_nt, table_set_uint, table_set_bool, table_set_double, table_set_printf
70  **/
71 static void do_print1(struct table *test_tbl)
72 {
73   table_set_str(test_tbl, test_col0_str, "sdsdf");
74   table_append_str(test_tbl, "aaaaa");
75   table_set_int(test_tbl, test_col1_int, -10);
76   table_set_int(test_tbl, test_col1_int, 10000);
77   table_set_uint(test_tbl, test_col2_uint, 10);
78   table_set_printf(test_tbl, test_col2_uint, "XXX-%u", 22222);
79   table_set_bool(test_tbl, test_col3_bool, 1);
80   table_set_double(test_tbl, test_col4_double, 1.5);
81   table_end_row(test_tbl);
82
83   table_set_str(test_tbl, test_col0_str, "test");
84   table_append_str(test_tbl, "bbbbb");
85   table_set_int(test_tbl, test_col1_int, -100);
86   table_set_uint(test_tbl, test_col2_uint, 100);
87   table_set_bool(test_tbl, test_col3_bool, 0);
88   table_set_double(test_tbl, test_col4_double, 1.5);
89   table_end_row(test_tbl);
90 }
91
92 static char **cli_table_opts;
93 static int test_default_column_order;
94 static int test_invalid_option;
95 static int test_invalid_order;
96
97 static struct opt_section table_printer_opts = {
98   OPT_ITEMS {
99     OPT_HELP("Options:"),
100     OPT_STRING_MULTIPLE('T', "table", cli_table_opts, OPT_REQUIRED_VALUE, "\tSets options for the table."),
101     OPT_BOOL('d', 0, test_default_column_order, 0, "\tRun the test that uses the default column order."),
102     OPT_BOOL('i', 0, test_invalid_option, 0, "\tTest the output for invalid option."),
103     OPT_BOOL('n', 0, test_invalid_order, 0, "\tTest the output for invalid names of columns for the 'cols' option."),
104     OPT_END
105   }
106 };
107
108 static void process_command_line_opts(char *argv[], struct table *tbl)
109 {
110   GARY_INIT(cli_table_opts, 0);
111
112   opt_parse(&table_printer_opts, argv+1);
113
114   for(uint i = 0; i < GARY_SIZE(cli_table_opts); i++) {
115     const char *rv = table_set_option(tbl, cli_table_opts[i]);
116     ASSERT_MSG(rv == NULL, "Tableprinter option parser returned error: '%s'.", rv);
117   }
118
119   GARY_FREE(cli_table_opts);
120 }
121
122 static bool user_defined_option(struct table *tbl UNUSED, const char *key, const char *value, const char **err UNUSED)
123 {
124   if(value == NULL && strcmp(key, "novaluekey") == 0) {
125     printf("setting key: %s; value: (null)\n", key);
126     return 1;
127   }
128   if(value != NULL && strcmp(value, "value") == 0 &&
129      key != NULL && strcmp(key, "valuekey") == 0) {
130     printf("setting key: %s; value: %s\n", key, value);
131     return 1;
132   }
133   return 0;
134 }
135
136 static void test_option_parser(struct table *tbl)
137 {
138   tbl->formatter->process_option = user_defined_option;
139   const char *rv = table_set_option(tbl, "invalid:option");
140   if(rv) printf("Tableprinter option parser returned error: \"%s\".\n", rv);
141
142   rv = table_set_option(tbl, "invalid");
143   if(rv) printf("Tableprinter option parser returned error: \"%s\".\n", rv);
144
145   rv = table_set_option(tbl, "novaluekey");
146   if(rv) printf("Tableprinter option parser returned error: \"%s\".\n", rv);
147
148   rv = table_set_option(tbl, "valuekey:value");
149   if(rv) printf("Tableprinter option parser returned error: \"%s\".\n", rv);
150 }
151
152 int main(int argc UNUSED, char **argv)
153 {
154   struct fastbuf *out;
155   out = bfdopen_shared(1, 4096);
156
157   table_init(&test_tbl);
158   test_tbl.out = out;
159
160   process_command_line_opts(argv, &test_tbl);
161
162   if(test_invalid_order == 1) {
163     const char *rv = table_set_option(&test_tbl, "cols:test_col0_str,test_col1_int,xxx");
164     if(rv) printf("Tableprinter option parser returned: '%s'.\n", rv);
165     return 0;
166   } else if(test_default_column_order == 1) {
167     do_default_order_test(out);
168     bclose(out);
169     return 0;
170   } else if(test_invalid_option == 1) {
171     test_option_parser(&test_tbl);
172     bclose(out);
173     return 0;
174   }
175
176   table_start(&test_tbl);
177   do_print1(&test_tbl);
178   table_end(&test_tbl);
179   table_cleanup(&test_tbl);
180
181   bclose(out);
182
183   return 0;
184 }