New fucntions strconcat and xstrconcat.
[gnupg.git] / jnlib / t-stringhelp.c
1 /* t-stringhelp.c - Regression tests for stringhelp.c
2  * Copyright (C) 2007 Free Software Foundation, Inc.
3  *
4  * This file is part of JNLIB.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 3 of
9  * the License, or (at your option) any later version.
10  *
11  * JNLIB is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <errno.h>
25
26 #include "stringhelp.h"
27
28 #include "t-support.h"
29
30
31
32 static void
33 test_percent_escape (void)
34 {
35   char *result;
36   static struct {
37     const char *extra; 
38     const char *value; 
39     const char *expected;
40   } tests[] = 
41     {
42       { NULL, "", "" },
43       { NULL, "%", "%25" },
44       { NULL, "%%", "%25%25" },
45       { NULL, " %", " %25" },
46       { NULL, ":", "%3a" },
47       { NULL, " :", " %3a" },
48       { NULL, ": ", "%3a " },
49       { NULL, " : ", " %3a " },
50       { NULL, "::", "%3a%3a" },
51       { NULL, ": :", "%3a %3a" },
52       { NULL, "%:", "%25%3a" },
53       { NULL, ":%", "%3a%25" },
54       { "\\\n:", ":%", "%3a%25" },
55       { "\\\n:", "\\:%", "%5c%3a%25" },
56       { "\\\n:", "\n:%", "%0a%3a%25" },
57       { "\\\n:", "\xff:%", "\xff%3a%25" },
58       { "\\\n:", "\xfe:%", "\xfe%3a%25" },
59       { "\\\n:", "\x01:%", "\x01%3a%25" },
60       { "\x01",  "\x01:%", "%01%3a%25" },
61       { "\xfe",  "\xfe:%", "%fe%3a%25" },
62       { "\xfe",  "\xff:%", "\xff%3a%25" },
63
64       { NULL, NULL, NULL }
65     };
66   int testno;
67
68   result = percent_escape (NULL, NULL);
69   if (result)
70     fail (0);
71   for (testno=0; tests[testno].value; testno++)
72     {
73       result = percent_escape (tests[testno].value, tests[testno].extra);
74       if (!result)
75         fail (testno);
76       if (strcmp (result, tests[testno].expected))
77         fail (testno);
78       xfree (result);
79     }
80
81 }
82
83
84 static void
85 test_compare_filenames (void)
86 {
87   struct {
88     const char *a;
89     const char *b;
90     int result;
91   } tests[] = {
92     { "", "", 0 },
93     { "", "a", -1 },
94     { "a", "", 1 },
95     { "a", "a", 0 },
96     { "a", "aa", -1 },
97     { "aa", "a", 1 },
98     { "a",  "b", -1  },
99
100 #ifdef HAVE_W32_SYSTEM
101     { "a", "A", 0 },
102     { "A", "a", 0 },
103     { "foo/bar", "foo\\bar", 0 },
104     { "foo\\bar", "foo/bar", 0 },
105     { "foo\\", "foo/", 0 },
106     { "foo/", "foo\\", 0 },
107 #endif /*HAVE_W32_SYSTEM*/
108     { NULL, NULL, 0}
109   };
110   int testno, result;
111
112   for (testno=0; tests[testno].a; testno++)
113     {
114       result = compare_filenames (tests[testno].a, tests[testno].b);
115       result = result < 0? -1 : result > 0? 1 : 0;
116       if (result != tests[testno].result)
117         fail (testno);
118     }
119 }
120
121
122 static void
123 test_strconcat (void)
124 {
125   char *out;
126
127   out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
128                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
129                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
130                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
131                    "1", "2", "3", "4", "5", "6", "7", NULL);
132   if (!out)
133     fail (0);
134   else
135     xfree (out);
136   out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
137                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
138                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
139                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
140                    "1", "2", "3", "4", "5", "6", "7", "8", NULL);
141   if (out)
142     fail (0);
143   else if (errno != EINVAL)
144     fail (0);
145
146   out = strconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
147                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
148                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
149                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
150                    "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL);
151   if (out)
152     fail (0);
153   else if (errno != EINVAL)
154     fail (0);
155   
156 #if __GNUC__ < 4 /* gcc 4.0 has a sentinel attribute.  */
157   out = strconcat (NULL);
158   if (!out || *out)
159     fail (1);
160 #endif
161   out = strconcat (NULL, NULL);
162   if (!out || *out)
163     fail (1);
164   out = strconcat ("", NULL);
165   if (!out || *out)
166     fail (1);
167   xfree (out);
168
169   out = strconcat ("", "", NULL);
170   if (!out || *out)
171     fail (2);
172   xfree (out);
173
174   out = strconcat ("a", "b", NULL);
175   if (!out || strcmp (out, "ab"))
176     fail (3);
177   xfree (out);
178   out = strconcat ("a", "b", "c", NULL);
179   if (!out || strcmp (out, "abc"))
180     fail (3);
181   xfree (out);
182
183   out = strconcat ("a", "b", "cc", NULL);
184   if (!out || strcmp (out, "abcc"))
185     fail (4);
186   xfree (out);
187   out = strconcat ("a1", "b1", "c1", NULL);
188   if (!out || strcmp (out, "a1b1c1"))
189     fail (4);
190   xfree (out);
191
192   out = strconcat ("", " long b ", "", "--even-longer--", NULL);
193   if (!out || strcmp (out, " long b --even-longer--"))
194     fail (5);
195   xfree (out);
196
197   out = strconcat ("", " long b ", "", "--even-longer--", NULL);
198   if (!out || strcmp (out, " long b --even-longer--"))
199     fail (5);
200   xfree (out);
201 }
202
203 static void
204 test_xstrconcat (void)
205 {
206   char *out;
207
208   out = xstrconcat ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
209                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
210                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
211                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
212                    "1", "2", "3", "4", "5", "6", "7", NULL);
213   if (!out)
214     fail (0);
215
216 #if __GNUC__ < 4 /* gcc 4.0 has a sentinel attribute.  */
217   out = xstrconcat (NULL);
218   if (!out)
219     fail (1);
220 #endif
221   out = xstrconcat (NULL, NULL);
222   if (!out)
223     fail (1);
224   out = xstrconcat ("", NULL);
225   if (!out || *out)
226     fail (1);
227   xfree (out);
228
229   out = xstrconcat ("", "", NULL);
230   if (!out || *out)
231     fail (2);
232   xfree (out);
233
234   out = xstrconcat ("a", "b", NULL);
235   if (!out || strcmp (out, "ab"))
236     fail (3);
237   xfree (out);
238   out = xstrconcat ("a", "b", "c", NULL);
239   if (!out || strcmp (out, "abc"))
240     fail (3);
241   xfree (out);
242
243   out = xstrconcat ("a", "b", "cc", NULL);
244   if (!out || strcmp (out, "abcc"))
245     fail (4);
246   xfree (out);
247   out = xstrconcat ("a1", "b1", "c1", NULL);
248   if (!out || strcmp (out, "a1b1c1"))
249     fail (4);
250   xfree (out);
251
252   out = xstrconcat ("", " long b ", "", "--even-longer--", NULL);
253   if (!out || strcmp (out, " long b --even-longer--"))
254     fail (5);
255   xfree (out);
256
257   out = xstrconcat ("", " long b ", "", "--even-longer--", NULL);
258   if (!out || strcmp (out, " long b --even-longer--"))
259     fail (5);
260   xfree (out);
261 }
262
263
264 int
265 main (int argc, char **argv)
266 {
267   (void)argc;
268   (void)argv;
269
270   test_percent_escape ();
271   test_compare_filenames ();
272   test_strconcat ();
273   test_xstrconcat ();
274
275   return 0;
276 }
277