timer: handle time going backwards.
[ccan] / ccan / opt / test / run-add_desc.c
1 #include <ccan/tap/tap.h>
2 #include <ccan/opt/opt.c>
3 #include <ccan/opt/usage.c>
4 #include <ccan/opt/helpers.c>
5 #include <ccan/opt/parse.c>
6
7 static void show_10(char buf[OPT_SHOW_LEN], const void *arg UNNEEDED)
8 {
9         memset(buf, 'X', 10);
10         buf[10] = '\0';
11 }
12
13 static void show_max(char buf[OPT_SHOW_LEN], const void *arg UNNEEDED)
14 {
15         memset(buf, 'X', OPT_SHOW_LEN);
16 }
17
18 /* Test add_desc helper. */
19 int main(void)
20 {
21         struct opt_table opt;
22         char *ret;
23         size_t len, max;
24
25         plan_tests(30);
26
27         opt.show = NULL;
28         opt.names = "01234";
29         opt.desc = "0123456789 0";
30         opt.type = OPT_NOARG;
31         len = max = 0;
32
33         /* Fits easily. */
34         ret = add_desc(NULL, &len, &max, 10, 30, &opt);
35         ok1(len < max);
36         ret[len] = '\0';
37         ok1(strcmp(ret, "01234     0123456789 0\n") == 0);
38         free(ret); len = max = 0;
39
40         /* Name just fits. */
41         ret = add_desc(NULL, &len, &max, 7, 30, &opt);
42         ok1(len < max);
43         ret[len] = '\0';
44         ok1(strcmp(ret, "01234  0123456789 0\n") == 0);
45         free(ret); len = max = 0;
46
47         /* Name doesn't fit. */
48         ret = add_desc(NULL, &len, &max, 6, 30, &opt);
49         ok1(len < max);
50         ret[len] = '\0';
51         ok1(strcmp(ret,
52                    "01234\n"
53                    "      0123456789 0\n") == 0);
54         free(ret); len = max = 0;
55
56         /* Description just fits. */
57         ret = add_desc(NULL, &len, &max, 7, 19, &opt);
58         ok1(len < max);
59         ret[len] = '\0';
60         ok1(strcmp(ret, "01234  0123456789 0\n") == 0);
61         free(ret); len = max = 0;
62
63         /* Description doesn't quite fit. */
64         ret = add_desc(NULL, &len, &max, 7, 18, &opt);
65         ok1(len < max);
66         ret[len] = '\0';
67         ok1(strcmp(ret,
68                    "01234  0123456789\n"
69                    "       0\n") == 0);
70         free(ret); len = max = 0;
71
72         /* Neither quite fits. */
73         ret = add_desc(NULL, &len, &max, 6, 17, &opt);
74         ok1(len < max);
75         ret[len] = '\0';
76         ok1(strcmp(ret, 
77                    "01234\n"
78                    "      0123456789\n"
79                    "      0\n") == 0);
80         free(ret); len = max = 0;
81
82         /* With show function, fits just. */
83         opt.show = show_10;
84         ret = add_desc(NULL, &len, &max, 7, 41, &opt);
85         ok1(len < max);
86         ret[len] = '\0';
87         ok1(strcmp(ret, "01234  0123456789 0 (default: XXXXXXXXXX)\n") == 0);
88         free(ret); len = max = 0;
89
90         /* With show function, just too long. */
91         ret = add_desc(NULL, &len, &max, 7, 40, &opt);
92         ok1(len < max);
93         ret[len] = '\0';
94         ok1(strcmp(ret,
95                    "01234  0123456789 0\n"
96                    "        (default: XXXXXXXXXX)\n") == 0);
97         free(ret); len = max = 0;
98
99         /* With maximal show function, fits just (we assume OPT_SHOW_LEN = 80. */
100         opt.show = show_max;
101         ret = add_desc(NULL, &len, &max, 7, 114, &opt);
102         ok1(len < max);
103         ret[len] = '\0';
104         ok1(strcmp(ret, "01234  0123456789 0 (default: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...)\n") == 0);
105         free(ret); len = max = 0;
106
107         /* With maximal show function, just too long. */
108         ret = add_desc(NULL, &len, &max, 7, 113, &opt);
109         ok1(len < max);
110         ret[len] = '\0';
111         ok1(strcmp(ret,
112                    "01234  0123456789 0\n"
113                    "        (default: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...)\n") == 0);
114         free(ret); len = max = 0;
115
116         /* With added " <arg>".  Fits, just. */
117         opt.show = NULL;
118         opt.type = OPT_HASARG;
119         ret = add_desc(NULL, &len, &max, 13, 25, &opt);
120         ok1(len < max);
121         ret[len] = '\0';
122         ok1(strcmp(ret, "01234 <arg>  0123456789 0\n") == 0);
123         free(ret); len = max = 0;
124
125         /* With added " <arg>".  Name doesn't quite fit. */
126         ret = add_desc(NULL, &len, &max, 12, 25, &opt);
127         ok1(len < max);
128         ret[len] = '\0';
129         ok1(strcmp(ret,
130                    "01234 <arg>\n"
131                    "            0123456789 0\n") == 0);
132         free(ret); len = max = 0;
133
134         /* With added " <arg>".  Desc doesn't quite fit. */
135         ret = add_desc(NULL, &len, &max, 13, 24, &opt);
136         ok1(len < max);
137         ret[len] = '\0';
138         ok1(strcmp(ret,
139                    "01234 <arg>  0123456789\n"
140                    "             0\n") == 0);
141         free(ret); len = max = 0;
142
143         /* Empty description, with <arg> and default.  Just fits. */
144         opt.show = show_10;
145         opt.desc = "";
146         ret = add_desc(NULL, &len, &max, 13, 35, &opt);
147         ok1(len < max);
148         ret[len] = '\0';
149         ok1(strcmp(ret, "01234 <arg>   (default: XXXXXXXXXX)\n") == 0);
150         free(ret); len = max = 0;
151
152         /* Empty description, with <arg> and default.  Doesn't quite fit. */
153         opt.show = show_10;
154         opt.desc = "";
155         ret = add_desc(NULL, &len, &max, 13, 34, &opt);
156         ok1(len < max);
157         ret[len] = '\0';
158         ok1(strcmp(ret,
159                    "01234 <arg>  \n"
160                    "              (default: XXXXXXXXXX)\n") == 0);
161         free(ret); len = max = 0;
162
163         return exit_status();
164 }