1 /* tst_idna.c Libstringprep self tests for idna_to_ascii().
2 * Copyright (C) 2002 Simon Josefsson
4 * This file is part of Libstringprep.
6 * Libstringprep 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 * Libstringprep 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 Libstringprep; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 static int error_count
= 0;
26 static int break_on_error
= 0;
29 fail (const char *format
, ...)
33 va_start (arg_ptr
, format
);
34 vfprintf (stderr
, format
, arg_ptr
);
42 ucs4print (unsigned long *str
, ssize_t len
)
47 for (i
= 0; len
>= 0 ? i
< len
: str
[i
]; i
++)
49 printf ("U+%04x ", str
[i
]);
52 if ((i
+ 1) % 8 == 0 && i
+ 1 < len
)
62 unsigned long in
[100];
65 int usestd3asciirules
;
70 { "(A) Arabic (Egyptian)", 17,
71 { 0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643,
72 0x0644, 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A,
74 IDNA_ACE_PREFIX
"egbpdaj6bu4bxfgehfvwxn", 0, 0, IDNA_SUCCESS
}
77 "(B) Chinese (simplified)", 9,
79 0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587}
80 , IDNA_ACE_PREFIX
"ihqwcrb4cv8a8dqg056pqjye", 0, 0, IDNA_SUCCESS
}
83 "(C) Chinese (traditional)", 9,
85 0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587}
86 , IDNA_ACE_PREFIX
"ihqwctvzc91f659drss3x8bo0yb", 0, 0, IDNA_SUCCESS
}
89 "(D) Czech: Pro<ccaron>prost<ecaron>nemluv<iacute><ccaron>esky", 22,
91 0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073,
92 0x0074, 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076,
93 0x00ED, 0x010D, 0x0065, 0x0073, 0x006B, 0x0079}
94 , IDNA_ACE_PREFIX
"Proprostnemluvesky-uyb24dma41a", 0, 0, IDNA_SUCCESS
}
99 0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5,
100 0x05D8, 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9,
101 0x05DD, 0x05E2, 0x05D1, 0x05E8, 0x05D9, 0x05EA}
102 , IDNA_ACE_PREFIX
"4dbcagdahymbxekheh6e0a7fei0b", 0, 0, IDNA_SUCCESS
}
105 "(F) Hindi (Devanagari):", 30,
107 0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928,
108 0x094D, 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902,
109 0x0928, 0x0939, 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938,
110 0x0915, 0x0924, 0x0947, 0x0939, 0x0948, 0x0902}
111 , IDNA_ACE_PREFIX
"i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", 0, 0,
115 "(G) Japanese (kanji and hiragana):", 18,
117 0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E,
118 0x3092, 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044,
120 , IDNA_ACE_PREFIX
"n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", 0, 0,
124 "(H) Korean (Hangul syllables):", 24,
126 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4,
127 0xC774, 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C,
128 0xB2E4, 0xBA74, 0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C}
130 "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c",
131 0, 0, IDNA_PUNYCODE_ERROR
} /* too long output */
134 "(I) Russian (Cyrillic):", 28,
136 0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435,
137 0x043E, 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432,
138 0x043E, 0x0440, 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443,
139 0x0441, 0x0441, 0x043A, 0x0438}
140 , IDNA_ACE_PREFIX
"b1abfaaepdrnnbgefbadotcwatmq2g4l", 0, 0, IDNA_SUCCESS
}
143 "(J) Spanish: Porqu<eacute>nopuedensimplementehablarenEspa<ntilde>ol", 40,
145 0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F,
146 0x0070, 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069,
147 0x006D, 0x0070, 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074,
148 0x0065, 0x0068, 0x0061, 0x0062, 0x006C, 0x0061, 0x0072, 0x0065,
149 0x006E, 0x0045, 0x0073, 0x0070, 0x0061, 0x00F1, 0x006F, 0x006C}
150 , IDNA_ACE_PREFIX
"PorqunopuedensimplementehablarenEspaol-fmd56a", 0, 0,
154 "(K) Vietnamese:", 31,
156 0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD,
157 0x006B, 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3,
158 0x0063, 0x0068, 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069,
159 0x1EBF, 0x006E, 0x0067, 0x0056, 0x0069, 0x1EC7, 0x0074}
160 , IDNA_ACE_PREFIX
"TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", 0, 0,
164 "(L) 3<nen>B<gumi><kinpachi><sensei>", 8,
166 0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F}
167 , IDNA_ACE_PREFIX
"3B-ww4c5e180e575a65lsy2b", 0, 0, IDNA_SUCCESS
}
170 "(M) <amuro><namie>-with-SUPER-MONKEYS", 24,
172 0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069,
173 0x0074, 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052,
174 0x002D, 0x004D, 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053}
175 , IDNA_ACE_PREFIX
"-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", 0, 0,
179 "(N) Hello-Another-Way-<sorezore><no><basho>", 25,
181 0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E,
182 0x006F, 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061,
183 0x0079, 0x002D, 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834,
185 , IDNA_ACE_PREFIX
"Hello-Another-Way--fc4qua05auwb3674vfr0b", 0, 0,
189 "(O) <hitotsu><yane><no><shita>2", 8,
191 0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032}
192 , IDNA_ACE_PREFIX
"2-u9tlzr9756bt3uc0v", 0, 0, IDNA_SUCCESS
}
195 "(P) Maji<de>Koi<suru>5<byou><mae>", 13,
197 0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069,
198 0x3059, 0x308B, 0x0035, 0x79D2, 0x524D}
199 , IDNA_ACE_PREFIX
"MajiKoi5-783gue6qz075azm5e", 0, 0, IDNA_SUCCESS
}
202 "(Q) <pafii>de<runba>", 9,
204 0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0}
205 , IDNA_ACE_PREFIX
"de-jg4avhby1noc0d", 0, 0, IDNA_SUCCESS
}
208 "(R) <sono><supiido><de>", 7,
210 0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067}
211 , IDNA_ACE_PREFIX
"d9juau41awczczp", 0, 0, IDNA_SUCCESS
}
215 "(S) -> $1.00 <-", 11,
217 0x002D, 0x003E, 0x0020, 0x0024, 0x0031, 0x002E, 0x0030, 0x0030,
218 0x0020, 0x003C, 0x002D}
219 , IDNA_ACE_PREFIX
"-> $1.00 <--", 0, 0, IDNA_SUCCESS
}
224 main (int argc
, char *argv
[])
230 if (strcmp (argv
[argc
- 1], "-v") == 0 ||
231 strcmp (argv
[argc
- 1], "--verbose") == 0)
233 else if (strcmp (argv
[argc
- 1], "-b") == 0 ||
234 strcmp (argv
[argc
- 1], "--break-on-error") == 0)
236 else if (strcmp (argv
[argc
- 1], "-h") == 0 ||
237 strcmp (argv
[argc
- 1], "-?") == 0 ||
238 strcmp (argv
[argc
- 1], "--help") == 0)
240 printf ("Usage: %s [-vbh?] [--verbose] [--break-on-error] [--help]\n",
246 for (i
= 0; i
< sizeof (idna
) / sizeof (idna
[0]); i
++)
249 printf ("IDNA entry %d: %s\n", i
, idna
[i
].name
);
254 ucs4print(idna
[i
].in
, idna
[i
].inlen
);
257 rc
= idna_to_ascii (idna
[i
].in
, idna
[i
].inlen
, label
,
258 idna
[i
].allowunassigned
, idna
[i
].usestd3asciirules
);
259 if (rc
!= idna
[i
].rc
)
261 fail ("IDNA entry %d failed: %d\n", i
, rc
);
267 if (debug
&& rc
== IDNA_SUCCESS
)
269 printf ("computed out: %s\n", label
);
270 printf ("expected out: %s\n", idna
[i
].out
);
273 printf ("returned %d expected %d\n", rc
, idna
[i
].rc
);
275 if (rc
== IDNA_SUCCESS
)
277 if (strlen (idna
[i
].out
) != strlen (label
) ||
278 strcasecmp (idna
[i
].out
, label
) != 0)
280 fail ("IDNA entry %d failed\n", i
);
292 printf ("IDNA self tests done with %d errors\n", error_count
);
294 return error_count
? 1 : 0;