-static void test_mime(void) {
- char *t, *n, *v;
-
- fprintf(stderr, "test_mime\n");
-
- t = n = v = 0;
- insist(!mime_content_type("text/plain", &t, &n, &v));
- insist(!strcmp(t, "text/plain"));
- insist(n == 0);
- insist(v == 0);
-
- t = n = v = 0;
- insist(!mime_content_type("TEXT ((nested) comment) /plain", &t, &n, &v));
- insist(!strcmp(t, "text/plain"));
- insist(n == 0);
- insist(v == 0);
-
- t = n = v = 0;
- insist(!mime_content_type(" text/plain ; Charset=utf-8", &t, &n, &v));
- insist(!strcmp(t, "text/plain"));
- insist(!strcmp(n, "charset"));
- insist(!strcmp(v, "utf-8"));
-
- t = n = v = 0;
- insist(!mime_content_type("text/plain;charset = ISO-8859-1 ", &t, &n, &v));
- insist(!strcmp(t, "text/plain"));
- insist(!strcmp(n, "charset"));
- insist(!strcmp(v, "ISO-8859-1"));
-
- /* XXX mime_parse */
- /* XXX mime_multipart */
- /* XXX mime_rfc2388_content_disposition */
-
- check_string(mime_qp(""), "");
- check_string(mime_qp("foobar"), "foobar");
- check_string(mime_qp("foo=20bar"), "foo bar");
- check_string(mime_qp("x \r\ny"), "x\r\ny");
- check_string(mime_qp("x=\r\ny"), "xy");
- check_string(mime_qp("x= \r\ny"), "xy");
- check_string(mime_qp("x =\r\ny"), "x y");
- check_string(mime_qp("x = \r\ny"), "x y");
-
- /* from RFC2045 */
- check_string(mime_qp("Now's the time =\r\n"
-"for all folk to come=\r\n"
-" to the aid of their country."),
- "Now's the time for all folk to come to the aid of their country.");
-
- check_string(mime_base64(""), "");
- check_string(mime_base64("BBBB"), "\x04\x10\x41");
- check_string(mime_base64("////"), "\xFF\xFF\xFF");
- check_string(mime_base64("//BB"), "\xFF\xF0\x41");
- check_string(mime_base64("BBBB//BB////"),
- "\x04\x10\x41" "\xFF\xF0\x41" "\xFF\xFF\xFF");
- check_string(mime_base64("B B B B / / B B / / / /"),
- "\x04\x10\x41" "\xFF\xF0\x41" "\xFF\xFF\xFF");
- check_string(mime_base64("B\r\nBBB.// B-B//~//"),
- "\x04\x10\x41" "\xFF\xF0\x41" "\xFF\xFF\xFF");
- check_string(mime_base64("BBBB="),
- "\x04\x10\x41");
- check_string(mime_base64("BBBBx="), /* not actually valid base64 */
- "\x04\x10\x41");
- check_string(mime_base64("BBBB BB=="),
- "\x04\x10\x41" "\x04");
- check_string(mime_base64("BBBB BBB="),
- "\x04\x10\x41" "\x04\x10");
-}
-
-static void test_hex(void) {
- unsigned n;
- static const unsigned char h[] = { 0x00, 0xFF, 0x80, 0x7F };
- uint8_t *u;
- size_t ul;
-
- fprintf(stderr, "test_hex\n");
-
- for(n = 0; n <= UCHAR_MAX; ++n) {
- if(!isxdigit(n))
- insist(unhexdigitq(n) == -1);
- }
- insist(unhexdigitq('0') == 0);
- insist(unhexdigitq('1') == 1);
- insist(unhexdigitq('2') == 2);
- insist(unhexdigitq('3') == 3);
- insist(unhexdigitq('4') == 4);
- insist(unhexdigitq('5') == 5);
- insist(unhexdigitq('6') == 6);
- insist(unhexdigitq('7') == 7);
- insist(unhexdigitq('8') == 8);
- insist(unhexdigitq('9') == 9);
- insist(unhexdigitq('a') == 10);
- insist(unhexdigitq('b') == 11);
- insist(unhexdigitq('c') == 12);
- insist(unhexdigitq('d') == 13);
- insist(unhexdigitq('e') == 14);
- insist(unhexdigitq('f') == 15);
- insist(unhexdigitq('A') == 10);
- insist(unhexdigitq('B') == 11);
- insist(unhexdigitq('C') == 12);
- insist(unhexdigitq('D') == 13);
- insist(unhexdigitq('E') == 14);
- insist(unhexdigitq('F') == 15);
- check_string(hex(h, sizeof h), "00ff807f");
- check_string(hex(0, 0), "");
- u = unhex("00ff807f", &ul);
- insist(ul == 4);
- insist(memcmp(u, h, 4) == 0);
- u = unhex("00FF807F", &ul);
- insist(ul == 4);
- insist(memcmp(u, h, 4) == 0);
- u = unhex("", &ul);
- insist(ul == 0);
- fprintf(stderr, "2 ERROR reports expected {\n");
- insist(unhex("F", 0) == 0);
- insist(unhex("az", 0) == 0);
- fprintf(stderr, "}\n");
-}
-
-static void test_casefold(void) {
- uint32_t c, l;
- const char *input, *canon_folded, *compat_folded, *canon_expected, *compat_expected;
-
- fprintf(stderr, "test_casefold\n");
-
- /* This isn't a very exhaustive test. Unlike for normalization, there don't
- * seem to be any public test vectors for these algorithms. */
-
- for(c = 1; c < 256; ++c) {
- input = utf32_to_utf8(&c, 1, 0);
- canon_folded = utf8_casefold_canon(input, strlen(input), 0);
- compat_folded = utf8_casefold_compat(input, strlen(input), 0);
- switch(c) {
- default:
- if((c >= 'A' && c <= 'Z')
- || (c >= 0xC0 && c <= 0xDE && c != 0xD7))
- l = c ^ 0x20;
- else
- l = c;
- break;
- case 0xB5: /* MICRO SIGN */
- l = 0x3BC; /* GREEK SMALL LETTER MU */
- break;
- case 0xDF: /* LATIN SMALL LETTER SHARP S */
- insist(!strcmp(canon_folded, "ss"));
- insist(!strcmp(compat_folded, "ss"));
- l = 0;
- break;
- }
- if(l) {
- uint32_t *d;
- /* Case-folded data is now normalized */
- d = utf32_decompose_canon(&l, 1, 0);
- canon_expected = utf32_to_utf8(d, utf32_len(d), 0);
- if(strcmp(canon_folded, canon_expected)) {
- fprintf(stderr, "%s:%d: canon-casefolding %#lx got '%s', expected '%s'\n",
- __FILE__, __LINE__, (unsigned long)c,
- format(canon_folded), format(canon_expected));
- count_error();
- }
- ++tests;
- d = utf32_decompose_compat(&l, 1, 0);
- compat_expected = utf32_to_utf8(d, utf32_len(d), 0);
- if(strcmp(compat_folded, compat_expected)) {
- fprintf(stderr, "%s:%d: compat-casefolding %#lx got '%s', expected '%s'\n",
- __FILE__, __LINE__, (unsigned long)c,
- format(compat_folded), format(compat_expected));
- count_error();
- }
- ++tests;
- }
- }
- check_string(utf8_casefold_canon("", 0, 0), "");
-}
-
-struct {
- const char *in;
- const char *expect[10];
-} wtest[] = {
- /* Empty string */
- { "", { 0 } },
- /* Only whitespace and punctuation */
- { " ", { 0 } },
- { " ' ", { 0 } },
- { " ! ", { 0 } },
- { " \"\" ", { 0 } },
- { " @ ", { 0 } },
- /* Basics */
- { "wibble", { "wibble", 0 } },
- { " wibble", { "wibble", 0 } },
- { " wibble ", { "wibble", 0 } },
- { "wibble ", { "wibble", 0 } },
- { "wibble spong", { "wibble", "spong", 0 } },
- { " wibble spong", { "wibble", "spong", 0 } },
- { " wibble spong ", { "wibble", "spong", 0 } },
- { "wibble spong ", { "wibble", "spong", 0 } },
- { "wibble spong splat foo zot ", { "wibble", "spong", "splat", "foo", "zot", 0 } },
- /* Apostrophes */
- { "wibble 'spong", { "wibble", "spong", 0 } },
- { " wibble's", { "wibble's", 0 } },
- { " wibblespong' ", { "wibblespong", 0 } },
- { "wibble sp''ong ", { "wibble", "sp", "ong", 0 } },