/* $Id: tst-t.c 7262 2005-06-06 04:45:48Z eagle $ */ /* Test suite for ternary search tries. */ #include "config.h" #include "clibrary.h" #include "inn/messages.h" #include "inn/tst.h" #include "libinn.h" #include "libtest.h" /* Used for strings of unsigned characters. */ #define U (const unsigned char *) /* An unsigned char version of strlen. */ #define ustrlen(s) strlen((const char *) s) int main(void) { struct tst *tst; FILE *words; unsigned char buffer[1024]; bool reported; void *existing; unsigned char *word; char test[] = "test"; char t[] = "t"; char foo[] = "foo"; char testing[] = "testing"; char Strange[] = "Strange"; char change[] = "çhange"; puts("38"); tst = tst_init(2); ok(1, tst != NULL); ok(2, tst_insert(tst, U"test", test, 0, NULL) == TST_OK); ok_string(3, "test", tst_search(tst, U"test")); ok(4, tst_insert(tst, U"test", foo, 0, &existing) == TST_DUPLICATE_KEY); ok_string(5, "test", existing); ok(6, tst_insert(tst, U"test", foo, TST_REPLACE, &existing) == TST_OK); ok_string(7, "test", existing); ok_string(8, "foo", tst_search(tst, U"test")); ok(9, tst_insert(tst, U"testing", testing, 0, NULL) == TST_OK); ok(10, tst_insert(tst, U"t", t, 0, NULL) == TST_OK); ok(11, tst_insert(tst, U"Strange", Strange, 0, NULL) == TST_OK); ok(12, tst_insert(tst, U"çhange", change, 0, NULL) == TST_OK); ok(13, tst_insert(tst, U"", foo, 0, NULL) == TST_NULL_KEY); ok(14, tst_insert(tst, NULL, foo, 0, NULL) == TST_NULL_KEY); ok_string(15, "testing", tst_search(tst, U"testing")); ok_string(16, "t", tst_search(tst, U"t")); ok_string(17, "Strange", tst_search(tst, U"Strange")); ok_string(18, "çhange", tst_search(tst, U"çhange")); ok_string(19, "foo", tst_search(tst, U"test")); ok(20, tst_search(tst, U"") == NULL); ok(21, tst_search(tst, U"Peter") == NULL); ok(22, tst_search(tst, U"foo") == NULL); ok(23, tst_search(tst, U"te") == NULL); ok_string(24, "Strange", tst_delete(tst, U"Strange")); ok(25, tst_search(tst, U"Strange") == NULL); ok_string(26, "t", tst_delete(tst, U"t")); ok(27, tst_search(tst, U"t") == NULL); ok_string(28, "testing", tst_search(tst, U"testing")); ok_string(29, "foo", tst_search(tst, U"test")); ok_string(30, "testing", tst_delete(tst, U"testing")); ok_string(31, "foo", tst_search(tst, U"test")); ok_string(32, "çhange", tst_delete(tst, U"çhange")); ok_string(33, "foo", tst_delete(tst, U"test")); ok(34, tst_search(tst, NULL) == NULL); ok(35, tst_delete(tst, NULL) == NULL); tst_cleanup(tst); ok(36, true); words = fopen("/usr/dict/words", "r"); if (words == NULL) words = fopen("/usr/share/dict/words", "r"); if (words == NULL) { puts("ok 37 # skip\nok 38 # skip"); exit(0); } tst = tst_init(1000); reported = false; if (tst == NULL) printf("not "); else { while (fgets((char *) buffer, sizeof(buffer), words)) { buffer[ustrlen(buffer) - 1] = '\0'; if (buffer[0] == '\0') continue; word = (unsigned char *) xstrdup((char *) buffer); if (tst_insert(tst, buffer, word, 0, NULL) != TST_OK) { if (!reported) printf("not "); reported = true; } } } puts("ok 37"); if (fseek(words, 0, SEEK_SET) < 0) sysdie("Unable to rewind words file"); reported = false; if (tst == NULL) printf("not "); else { while (fgets((char *) buffer, sizeof(buffer), words)) { buffer[ustrlen(buffer) - 1] = '\0'; if (buffer[0] == '\0') continue; word = tst_search(tst, buffer); if (word == NULL || strcmp((char *) word, buffer) != 0) { if (!reported) printf("not "); reported = true; } word = tst_delete(tst, buffer); if (word == NULL || strcmp((char *) word, buffer) != 0) { if (!reported) printf("not "); reported = true; } free(word); } } tst_cleanup(tst); puts("ok 38"); return 0; }