summaryrefslogtreecommitdiff
path: root/ccan/opt/test/run-add_desc.c
blob: ded3f88061deddcaa5d1a8378a659631f9af614f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <ccan/tap/tap.h>
#include <ccan/opt/opt.c>
#include <ccan/opt/usage.c>
#include <ccan/opt/helpers.c>
#include <ccan/opt/parse.c>

static void show_10(char buf[OPT_SHOW_LEN], const void *arg)
{
	memset(buf, 'X', 10);
	buf[10] = '\0';
}

static void show_max(char buf[OPT_SHOW_LEN], const void *arg)
{
	memset(buf, 'X', OPT_SHOW_LEN);
}

/* Test add_desc helper. */
int main(int argc, char *argv[])
{
	struct opt_table opt;
	char *ret;
	size_t len, max;

	plan_tests(30);

	opt.show = NULL;
	opt.names = "01234";
	opt.desc = "0123456789 0";
	opt.type = OPT_NOARG;
	len = max = 0;

	/* Fits easily. */
	ret = add_desc(NULL, &len, &max, 10, 30, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, "01234     0123456789 0\n") == 0);
	free(ret); len = max = 0;

	/* Name just fits. */
	ret = add_desc(NULL, &len, &max, 7, 30, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, "01234  0123456789 0\n") == 0);
	free(ret); len = max = 0;

	/* Name doesn't fit. */
	ret = add_desc(NULL, &len, &max, 6, 30, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret,
		   "01234\n"
		   "      0123456789 0\n") == 0);
	free(ret); len = max = 0;

	/* Description just fits. */
	ret = add_desc(NULL, &len, &max, 7, 19, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, "01234  0123456789 0\n") == 0);
	free(ret); len = max = 0;

	/* Description doesn't quite fit. */
	ret = add_desc(NULL, &len, &max, 7, 18, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret,
		   "01234  0123456789\n"
		   "       0\n") == 0);
	free(ret); len = max = 0;

	/* Neither quite fits. */
	ret = add_desc(NULL, &len, &max, 6, 17, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, 
		   "01234\n"
		   "      0123456789\n"
		   "      0\n") == 0);
	free(ret); len = max = 0;

	/* With show function, fits just. */
	opt.show = show_10;
	ret = add_desc(NULL, &len, &max, 7, 41, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, "01234  0123456789 0 (default: XXXXXXXXXX)\n") == 0);
	free(ret); len = max = 0;

	/* With show function, just too long. */
	ret = add_desc(NULL, &len, &max, 7, 40, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret,
		   "01234  0123456789 0\n"
		   "        (default: XXXXXXXXXX)\n") == 0);
	free(ret); len = max = 0;

	/* With maximal show function, fits just (we assume OPT_SHOW_LEN = 80. */
	opt.show = show_max;
	ret = add_desc(NULL, &len, &max, 7, 114, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, "01234  0123456789 0 (default: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...)\n") == 0);
	free(ret); len = max = 0;

	/* With maximal show function, just too long. */
	ret = add_desc(NULL, &len, &max, 7, 113, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret,
		   "01234  0123456789 0\n"
		   "        (default: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...)\n") == 0);
	free(ret); len = max = 0;

	/* With added " <arg>".  Fits, just. */
	opt.show = NULL;
	opt.type = OPT_HASARG;
	ret = add_desc(NULL, &len, &max, 13, 25, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, "01234 <arg>  0123456789 0\n") == 0);
	free(ret); len = max = 0;

	/* With added " <arg>".  Name doesn't quite fit. */
	ret = add_desc(NULL, &len, &max, 12, 25, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret,
		   "01234 <arg>\n"
		   "            0123456789 0\n") == 0);
	free(ret); len = max = 0;

	/* With added " <arg>".  Desc doesn't quite fit. */
	ret = add_desc(NULL, &len, &max, 13, 24, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret,
		   "01234 <arg>  0123456789\n"
		   "             0\n") == 0);
	free(ret); len = max = 0;

	/* Empty description, with <arg> and default.  Just fits. */
	opt.show = show_10;
	opt.desc = "";
	ret = add_desc(NULL, &len, &max, 13, 35, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret, "01234 <arg>   (default: XXXXXXXXXX)\n") == 0);
	free(ret); len = max = 0;

	/* Empty description, with <arg> and default.  Doesn't quite fit. */
	opt.show = show_10;
	opt.desc = "";
	ret = add_desc(NULL, &len, &max, 13, 34, &opt);
	ok1(len < max);
	ret[len] = '\0';
	ok1(strcmp(ret,
		   "01234 <arg>  \n"
		   "              (default: XXXXXXXXXX)\n") == 0);
	free(ret); len = max = 0;

	return exit_status();
}