chiark / gitweb /
Commit 2.4.5-5 as unpacked
[inn-innduct.git] / tests / lib / tst-t.c
1 /* $Id: tst-t.c 7262 2005-06-06 04:45:48Z eagle $ */
2 /* Test suite for ternary search tries. */
3
4 #include "config.h"
5 #include "clibrary.h"
6
7 #include "inn/messages.h"
8 #include "inn/tst.h"
9 #include "libinn.h"
10 #include "libtest.h"
11
12 /* Used for strings of unsigned characters. */
13 #define U (const unsigned char *)
14
15 /* An unsigned char version of strlen. */
16 #define ustrlen(s) strlen((const char *) s)
17
18 int
19 main(void)
20 {
21     struct tst *tst;
22     FILE *words;
23     unsigned char buffer[1024];
24     bool reported;
25     void *existing;
26     unsigned char *word;
27
28     char test[] = "test";
29     char t[] = "t";
30     char foo[] = "foo";
31     char testing[] = "testing";
32     char Strange[] = "Strange";
33     char change[] = "çhange";
34
35     puts("38");
36
37     tst = tst_init(2);
38     ok(1, tst != NULL);
39     ok(2, tst_insert(tst, U"test", test, 0, NULL) == TST_OK);
40     ok_string(3, "test", tst_search(tst, U"test"));
41     ok(4, tst_insert(tst, U"test", foo, 0, &existing) == TST_DUPLICATE_KEY);
42     ok_string(5, "test", existing);
43     ok(6, tst_insert(tst, U"test", foo, TST_REPLACE, &existing) == TST_OK);
44     ok_string(7, "test", existing);
45     ok_string(8, "foo", tst_search(tst, U"test"));
46     ok(9, tst_insert(tst, U"testing", testing, 0, NULL) == TST_OK);
47     ok(10, tst_insert(tst, U"t", t, 0, NULL) == TST_OK);
48     ok(11, tst_insert(tst, U"Strange", Strange, 0, NULL) == TST_OK);
49     ok(12, tst_insert(tst, U"çhange", change, 0, NULL) == TST_OK);
50     ok(13, tst_insert(tst, U"", foo, 0, NULL) == TST_NULL_KEY);
51     ok(14, tst_insert(tst, NULL, foo, 0, NULL) == TST_NULL_KEY);
52     ok_string(15, "testing", tst_search(tst, U"testing"));
53     ok_string(16, "t", tst_search(tst, U"t"));
54     ok_string(17, "Strange", tst_search(tst, U"Strange"));
55     ok_string(18, "çhange", tst_search(tst, U"çhange"));
56     ok_string(19, "foo", tst_search(tst, U"test"));
57     ok(20, tst_search(tst, U"") == NULL);
58     ok(21, tst_search(tst, U"Peter") == NULL);
59     ok(22, tst_search(tst, U"foo") == NULL);
60     ok(23, tst_search(tst, U"te") == NULL);
61     ok_string(24, "Strange", tst_delete(tst, U"Strange"));
62     ok(25, tst_search(tst, U"Strange") == NULL);
63     ok_string(26, "t", tst_delete(tst, U"t"));
64     ok(27, tst_search(tst, U"t") == NULL);
65     ok_string(28, "testing", tst_search(tst, U"testing"));
66     ok_string(29, "foo", tst_search(tst, U"test"));
67     ok_string(30, "testing", tst_delete(tst, U"testing"));
68     ok_string(31, "foo", tst_search(tst, U"test"));
69     ok_string(32, "çhange", tst_delete(tst, U"çhange"));
70     ok_string(33, "foo", tst_delete(tst, U"test"));
71     ok(34, tst_search(tst, NULL) == NULL);
72     ok(35, tst_delete(tst, NULL) == NULL);
73     tst_cleanup(tst);
74     ok(36, true);
75
76     words = fopen("/usr/dict/words", "r");
77     if (words == NULL)
78         words = fopen("/usr/share/dict/words", "r");
79     if (words == NULL) {
80         puts("ok 37 # skip\nok 38 # skip");
81         exit(0);
82     }
83
84     tst = tst_init(1000);
85     reported = false;
86     if (tst == NULL)
87         printf("not ");
88     else {
89         while (fgets((char *) buffer, sizeof(buffer), words)) {
90             buffer[ustrlen(buffer) - 1] = '\0';
91             if (buffer[0] == '\0')
92                 continue;
93             word = (unsigned char *) xstrdup((char *) buffer);
94             if (tst_insert(tst, buffer, word, 0, NULL) != TST_OK) {
95                 if (!reported)
96                     printf("not ");
97                 reported = true;
98             }
99         }
100     }
101     puts("ok 37");
102
103     if (fseek(words, 0, SEEK_SET) < 0)
104         sysdie("Unable to rewind words file");
105     reported = false;
106     if (tst == NULL)
107         printf("not ");
108     else {
109         while (fgets((char *) buffer, sizeof(buffer), words)) {
110             buffer[ustrlen(buffer) - 1] = '\0';
111             if (buffer[0] == '\0')
112                 continue;
113             word = tst_search(tst, buffer);
114             if (word == NULL || strcmp((char *) word, buffer) != 0) {
115                 if (!reported)
116                     printf("not ");
117                 reported = true;
118             }
119             word = tst_delete(tst, buffer);
120             if (word == NULL || strcmp((char *) word, buffer) != 0) {
121                 if (!reported)
122                     printf("not ");
123                 reported = true;
124             }
125             free(word);
126         }
127     }
128     tst_cleanup(tst);
129     puts("ok 38");
130
131     return 0;
132 }