Functional multi-value sort + tests
[idzebra-moved-to-github.git] / test / api / test_sortidx.c
1 /* This file is part of the Zebra server.
2    Copyright (C) 1995-2008 Index Data
3
4 Zebra is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20 #include <idzebra/bfile.h>
21 #include <sortidx.h>
22 #include "testlib.h"
23
24 static void sort_add_cstr(zebra_sort_index_t si, const char *str)
25 {
26     WRBUF w = wrbuf_alloc();
27     wrbuf_puts(w, str);
28     wrbuf_putc(w, '\0');
29     zebra_sort_add(si, w);
30     wrbuf_destroy(w);
31 }
32
33 static void tst1(zebra_sort_index_t si)
34 {
35     zint sysno = 12; /* just some sysno */
36     int my_type = 2; /* just some type ID */
37     WRBUF w = wrbuf_alloc();
38
39     zebra_sort_type(si, my_type);
40
41     zebra_sort_sysno(si, sysno);
42     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
43
44     sort_add_cstr(si, "abcde1");
45
46     zebra_sort_sysno(si, sysno);
47     YAZ_CHECK_EQ(zebra_sort_read(si, w), 1);
48     YAZ_CHECK(!strcmp(wrbuf_cstr(w), "abcde1"));
49
50     zebra_sort_sysno(si, sysno+1);
51     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
52
53     zebra_sort_sysno(si, sysno-1);
54     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
55
56     zebra_sort_sysno(si, sysno);
57     zebra_sort_delete(si);
58     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
59
60     zebra_sort_type(si, my_type);
61
62     zebra_sort_sysno(si, sysno);
63     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
64
65     wrbuf_rewind(w);
66     sort_add_cstr(si, "abcde1");
67
68     zebra_sort_sysno(si, sysno);
69     YAZ_CHECK_EQ(zebra_sort_read(si, w), 1);
70     YAZ_CHECK(!strcmp(wrbuf_cstr(w), "abcde1"));
71
72     zebra_sort_sysno(si, sysno);
73     zebra_sort_delete(si);
74
75     wrbuf_destroy(w);
76 }
77
78 static void tst2(zebra_sort_index_t si)
79 {
80     zint sysno = 15; /* just some sysno */
81     int my_type = 2; /* just some type ID */
82     int i;
83
84     zebra_sort_type(si, my_type);
85
86     for (sysno = 1; sysno < 50; sysno++)
87     {
88         WRBUF w1 = wrbuf_alloc();
89         WRBUF w2 = wrbuf_alloc();
90         zebra_sort_sysno(si, sysno);
91         YAZ_CHECK_EQ(zebra_sort_read(si, w2), 0);
92         
93         for (i = 0; i < 600; i++) /* 600 * 6 < max size =4K */
94             wrbuf_write(w1, "12345", 6);
95         
96         zebra_sort_add(si, w1);
97         
98         zebra_sort_sysno(si, sysno);
99         
100         YAZ_CHECK_EQ(zebra_sort_read(si, w2), 1);
101         
102         YAZ_CHECK_EQ(wrbuf_len(w1), wrbuf_len(w2));
103         YAZ_CHECK(!memcmp(wrbuf_buf(w1), wrbuf_buf(w2), wrbuf_len(w2)));
104         wrbuf_destroy(w1);
105         wrbuf_destroy(w2);
106     }
107 }
108
109 static void tst(int argc, char **argv)
110 {
111     BFiles bfs = bfs_create(".:50M", 0);
112     zebra_sort_index_t si;
113
114     YAZ_CHECK(bfs);
115     if (bfs)
116     {
117         bf_reset(bfs);
118         si = zebra_sort_open(bfs, 1, ZEBRA_SORT_TYPE_FLAT);
119         YAZ_CHECK(si);
120         if (si)
121         {
122             tst1(si);
123             zebra_sort_close(si);
124         }
125     }
126     if (bfs)
127     {
128         bf_reset(bfs);
129         si = zebra_sort_open(bfs, 1, ZEBRA_SORT_TYPE_ISAMB);
130         YAZ_CHECK(si);
131         if (si)
132         {
133             tst1(si);
134             zebra_sort_close(si);
135         }
136     }
137     if (bfs)
138     {
139         bf_reset(bfs);
140         si = zebra_sort_open(bfs, 1, ZEBRA_SORT_TYPE_MULTI);
141         YAZ_CHECK(si);
142         if (si)
143         {
144             tst1(si);
145             tst2(si);
146             zebra_sort_close(si);
147         }
148     }
149     if (bfs)
150         bfs_destroy(bfs);
151 }
152
153 TL_MAIN
154 /*
155  * Local variables:
156  * c-basic-offset: 4
157  * indent-tabs-mode: nil
158  * End:
159  * vim: shiftwidth=4 tabstop=8 expandtab
160  */
161