*** empty log message ***
[libidn.git] / tests / tst_punycode.c
blobac4ee6cd45b5edf0e30d227a171b856ee3869e2d
1 /* tst_punycode.c --- Self tests for punycode.
2 * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Simon Josefsson
4 * This file is part of GNU Libidn.
6 * GNU Libidn is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * GNU Libidn is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GNU Libidn; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 #ifdef HAVE_CONFIG_H
23 # include "config.h"
24 #endif
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <stdarg.h>
29 #include <string.h>
31 #include <punycode.h>
33 #include "utils.h"
35 struct punycode
37 const char *name;
38 size_t inlen;
39 uint32_t in[100];
40 const char *out;
41 int rc;
44 const struct punycode punycode[] = {
46 "(A) Arabic (Egyptian)", 17,
48 0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643,
49 0x0644, 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A,
50 0x061F}, "egbpdaj6bu4bxfgehfvwxn", PUNYCODE_SUCCESS},
52 "(B) Chinese (simplified)", 9,
54 0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D,
55 0x6587}, "ihqwcrb4cv8a8dqg056pqjye", PUNYCODE_SUCCESS},
57 "(C) Chinese (traditional)", 9,
59 0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D,
60 0x6587}, "ihqwctvzc91f659drss3x8bo0yb", PUNYCODE_SUCCESS},
62 "(D) Czech: Pro<ccaron>prost<ecaron>nemluv<iacute><ccaron>esky", 22,
64 0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073,
65 0x0074, 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076,
66 0x00ED, 0x010D, 0x0065, 0x0073, 0x006B, 0x0079},
67 "Proprostnemluvesky-uyb24dma41a", PUNYCODE_SUCCESS},
69 "(E) Hebrew:", 22,
71 0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5,
72 0x05D8, 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9,
73 0x05DD, 0x05E2, 0x05D1, 0x05E8, 0x05D9, 0x05EA},
74 "4dbcagdahymbxekheh6e0a7fei0b", PUNYCODE_SUCCESS},
76 "(F) Hindi (Devanagari):", 30,
78 0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928,
79 0x094D, 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902,
80 0x0928, 0x0939, 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938,
81 0x0915, 0x0924, 0x0947, 0x0939, 0x0948, 0x0902},
82 "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", PUNYCODE_SUCCESS},
84 "(G) Japanese (kanji and hiragana):", 18,
86 0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E,
87 0x3092, 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044,
88 0x306E, 0x304B},
89 "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", PUNYCODE_SUCCESS},
91 "(H) Korean (Hangul syllables):", 24,
93 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4,
94 0xC774, 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C,
95 0xB2E4, 0xBA74, 0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C},
96 "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c",
97 PUNYCODE_SUCCESS},
99 "(I) Russian (Cyrillic):", 28,
101 0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435,
102 0x043E, 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432,
103 0x043E, 0x0440, 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443,
104 0x0441, 0x0441, 0x043A, 0x0438},
105 "b1abfaaepdrnnbgefbadotcwatmq2g4l", PUNYCODE_SUCCESS},
107 "(J) Spanish: Porqu<eacute>nopuedensimplementehablarenEspa<ntilde>ol", 40,
109 0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F,
110 0x0070, 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069,
111 0x006D, 0x0070, 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074,
112 0x0065, 0x0068, 0x0061, 0x0062, 0x006C, 0x0061, 0x0072, 0x0065,
113 0x006E, 0x0045, 0x0073, 0x0070, 0x0061, 0x00F1, 0x006F, 0x006C},
114 "PorqunopuedensimplementehablarenEspaol-fmd56a", PUNYCODE_SUCCESS},
116 "(K) Vietnamese:", 31,
118 0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD,
119 0x006B, 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3,
120 0x0063, 0x0068, 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069,
121 0x1EBF, 0x006E, 0x0067, 0x0056, 0x0069, 0x1EC7, 0x0074},
122 "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", PUNYCODE_SUCCESS},
124 "(L) 3<nen>B<gumi><kinpachi><sensei>", 8,
126 0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F},
127 "3B-ww4c5e180e575a65lsy2b", PUNYCODE_SUCCESS},
129 "(M) <amuro><namie>-with-SUPER-MONKEYS", 24,
131 0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069,
132 0x0074, 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052,
133 0x002D, 0x004D, 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053},
134 "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", PUNYCODE_SUCCESS},
136 "(N) Hello-Another-Way-<sorezore><no><basho>", 25,
138 0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E,
139 0x006F, 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061,
140 0x0079, 0x002D, 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834,
141 0x6240},
142 "Hello-Another-Way--fc4qua05auwb3674vfr0b", PUNYCODE_SUCCESS},
144 "(O) <hitotsu><yane><no><shita>2", 8,
146 0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032},
147 "2-u9tlzr9756bt3uc0v", PUNYCODE_SUCCESS},
149 "(P) Maji<de>Koi<suru>5<byou><mae>", 13,
151 0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069,
152 0x3059, 0x308B, 0x0035, 0x79D2, 0x524D},
153 "MajiKoi5-783gue6qz075azm5e", PUNYCODE_SUCCESS},
155 "(Q) <pafii>de<runba>", 9,
157 0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0},
158 "de-jg4avhby1noc0d", PUNYCODE_SUCCESS},
160 "(R) <sono><supiido><de>", 7,
162 0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067},
163 "d9juau41awczczp", PUNYCODE_SUCCESS},
165 "(S) -> $1.00 <-", 11,
167 0x002D, 0x003E, 0x0020, 0x0024, 0x0031, 0x002E, 0x0030, 0x0030,
168 0x0020, 0x003C, 0x002D}, "-> $1.00 <--", PUNYCODE_SUCCESS}
171 void
172 doit (void)
174 char *p;
175 uint32_t *q;
176 int rc;
177 size_t i, outlen;
179 p = malloc (sizeof (*p) * BUFSIZ);
180 if (p == NULL)
181 fail ("malloc() returned NULL\n");
183 q = malloc (sizeof (*q) * BUFSIZ);
184 if (q == NULL)
185 fail ("malloc() returned NULL\n");
187 for (i = 0; i < sizeof (punycode) / sizeof (punycode[0]); i++)
189 if (debug)
190 printf ("PUNYCODE entry %d: %s\n", i, punycode[i].name);
192 if (debug)
194 printf ("in:\n");
195 ucs4print (punycode[i].in, punycode[i].inlen);
198 outlen = BUFSIZ;
199 rc = punycode_encode (punycode[i].inlen, punycode[i].in,
200 NULL, &outlen, p);
201 if (rc != punycode[i].rc)
203 fail ("punycode_encode() entry %d failed: %d\n", i, rc);
204 if (debug)
205 printf ("FATAL\n");
206 continue;
209 if (rc == PUNYCODE_SUCCESS)
210 p[outlen] = '\0';
212 if (debug && rc == PUNYCODE_SUCCESS)
214 printf ("computed out: %s\n", p);
215 printf ("expected out: %s\n", punycode[i].out);
217 else if (debug)
218 printf ("returned %d expected %d\n", rc, punycode[i].rc);
220 if (rc == PUNYCODE_SUCCESS)
222 if (strlen (punycode[i].out) != strlen (p) ||
223 memcmp (punycode[i].out, p, strlen (p)) != 0)
225 fail ("punycode() entry %d failed\n", i);
226 if (debug)
227 printf ("ERROR\n");
229 else if (debug)
230 printf ("OK\n\n");
232 else if (debug)
233 printf ("OK\n\n");
235 if (debug)
237 printf ("in: %s\n", punycode[i].out);
240 outlen = BUFSIZ;
241 rc = punycode_decode (strlen (punycode[i].out), punycode[i].out,
242 &outlen, q, NULL);
243 if (rc != punycode[i].rc)
245 fail ("punycode() entry %d failed: %d\n", i, rc);
246 if (debug)
247 printf ("FATAL\n");
248 continue;
251 if (debug && rc == PUNYCODE_SUCCESS)
253 printf ("computed out:\n");
254 ucs4print (q, outlen);
255 printf ("expected out:\n");
256 ucs4print (punycode[i].in, punycode[i].inlen);
258 else if (debug)
259 printf ("returned %d expected %d\n", rc, punycode[i].rc);
261 if (rc == PUNYCODE_SUCCESS)
263 if (punycode[i].inlen != outlen ||
264 memcmp (punycode[i].in, q, outlen) != 0)
266 fail ("punycode_decode() entry %d failed\n", i);
267 if (debug)
268 printf ("ERROR\n");
270 else if (debug)
271 printf ("OK\n\n");
273 else if (debug)
274 printf ("OK\n\n");
277 free (q);
278 free (p);