-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, *folded, *expected;
-
- fprintf(stderr, "test_casefold\n");
-
- for(c = 1; c < 256; ++c) {
- input = utf32_to_utf8(&c, 1, 0);
- folded = utf8_casefold_canon(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(folded, "ss"));
- l = 0;
- break;
- }
- if(l) {
- /* Case-folded data is now normalized */
- expected = ucs42utf8(utf32_decompose_canon(&l, 1, 0));
- if(strcmp(folded, expected)) {
- fprintf(stderr, "%s:%d: casefolding %#lx got '%s', expected '%s'\n",
- __FILE__, __LINE__, (unsigned long)c,
- format(folded), format(expected));
- ++errors;
- }
- ++tests;
- }
- }
- check_string(casefold(""), "");
-}
-
-/** @brief Less-than comparison function for integer heap */
-static inline int int_lt(int a, int b) { return a < b; }
-
-/** @struct iheap
- * @brief A heap with @c int elements */
-HEAP_TYPE(iheap, int, int_lt);
-HEAP_DEFINE(iheap, int, int_lt);
-
-/** @brief Tests for @ref heap.h */
-static void test_heap(void) {
- struct iheap h[1];
- int n;
- int last = -1;
-
- fprintf(stderr, "test_heap\n");
-
- iheap_init(h);
- for(n = 0; n < 1000; ++n)
- iheap_insert(h, random() % 100);
- for(n = 0; n < 1000; ++n) {
- const int latest = iheap_remove(h);
- if(last > latest)
- fprintf(stderr, "should have %d <= %d\n", last, latest);
- insist(last <= latest);
- last = latest;
- }
- putchar('\n');
-}
-
-/** @brief Tests for @ref lib/unicode.h */
-static void test_unicode(void) {
- FILE *fp;
- int lineno = 0;
- char *l, *lp;
- uint32_t buffer[1024];
- uint32_t *c[6], *NFD_c[6], *NFKD_c[6]; /* 1-indexed */
- int cn, bn;
-
- fprintf(stderr, "test_unicode\n");
- if(!(fp = fopen("NormalizationTest.txt", "r"))) {
- system("wget http://www.unicode.org/Public/5.0.0/ucd/NormalizationTest.txt");
- chmod("NormalizationTest.txt", 0444);
- if(!(fp = fopen("NormalizationTest.txt", "r"))) {
- perror("NormalizationTest.txt");
- ++tests; /* don't know how many... */
- ++errors;
- return;
- }
- }
- while(!inputline("NormalizationTest.txt", fp, &l, '\n')) {
- ++lineno;
- if(*l == '#' || *l == '@')
- continue;
- bn = 0;
- cn = 1;
- lp = l;
- c[cn++] = &buffer[bn];
- while(*lp && *lp != '#') {
- if(*lp == ' ') {
- ++lp;
- continue;
- }
- if(*lp == ';') {
- buffer[bn++] = 0;
- if(cn == 6)
- break;
- c[cn++] = &buffer[bn];
- ++lp;
- continue;
- }
- buffer[bn++] = strtoul(lp, &lp, 16);
- }
- buffer[bn] = 0;
- assert(cn == 6);
- for(cn = 1; cn <= 5; ++cn) {
- NFD_c[cn] = utf32_decompose_canon(c[cn], utf32_len(c[cn]), 0);
- NFKD_c[cn] = utf32_decompose_compat(c[cn], utf32_len(c[cn]), 0);
- }
-#define unt_check(T, A, B) do { \
- ++tests; \
- if(utf32_cmp(c[A], T##_c[B])) { \
- fprintf(stderr, "L%d: c%d != "#T"(c%d)\n", lineno, A, B); \
- fprintf(stderr, " c%d: %s\n", \
- A, format_utf32(c[A])); \
- fprintf(stderr, "%4s(c%d): %s\n", \
- #T, B, format_utf32(T##_c[B])); \
- ++errors; \
- } \
- } while(0)
- unt_check(NFD, 3, 1);
- unt_check(NFD, 3, 2);
- unt_check(NFD, 3, 3);
- unt_check(NFD, 5, 4);
- unt_check(NFD, 5, 5);
- unt_check(NFKD, 5, 1);
- unt_check(NFKD, 5, 2);
- unt_check(NFKD, 5, 3);
- unt_check(NFKD, 5, 4);
- unt_check(NFKD, 5, 5);
- for(cn = 1; cn <= 5; ++cn) {
- xfree(NFD_c[cn]);
- xfree(NFKD_c[cn]);
- }
- xfree(l);
- }
-}
-
-int main(void) {
- insist('\n' == 0x0A);
- insist('\r' == 0x0D);
- insist(' ' == 0x20);
- insist('0' == 0x30);
- insist('9' == 0x39);
- insist('A' == 0x41);
- insist('Z' == 0x5A);
- insist('a' == 0x61);
- insist('z' == 0x7A);
- /* addr.c */
- /* asprintf.c */
- /* authhash.c */
- /* basen.c */
- /* charset.c */
- /* client.c */
- /* configuration.c */
- /* event.c */
- /* fprintf.c */
- /* heap.c */
- test_heap();
- /* hex.c */
- test_hex();
- /* inputline.c */
- /* kvp.c */
- /* log.c */
- /* mem.c */
- /* mime.c */
- test_mime();
- /* mixer.c */
- /* plugin.c */
- /* printf.c */
- /* queue.c */
- /* sink.c */
- /* snprintf.c */
- /* split.c */
- /* syscalls.c */
- /* table.c */
- /* unicode.c */
- test_unicode();
- /* utf8.c */
- test_utf8();
- /* vector.c */
- /* words.c */
- test_casefold();
- /* XXX words() */
- /* wstat.c */
- fprintf(stderr, "%d errors out of %d tests\n", errors, tests);
- return !!errors;
-}
-