8164d80f08df677e5e5f795d4cd30b3730bf4efa
[yaz-moved-to-github.git] / test / tstxmlquery.c
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2009 Index Data
3  * See the file LICENSE for details.
4  */
5
6 #include <stdlib.h>
7 #include <stdio.h>
8
9 #include <yaz/wrbuf.h>
10 #include <yaz/querytowrbuf.h>
11 #include <yaz/xmlquery.h>
12 #include <yaz/pquery.h>
13 #include <yaz/test.h>
14
15 #if YAZ_HAVE_XML2
16 #include <libxml/parser.h>
17 #include <libxml/tree.h>
18 #endif
19
20 enum pqf2xml_status {
21     PQF_FAILED,
22     QUERY2XML_FAILED,
23     XML_NO_MATCH,
24     XML_MATCH,
25     XML_NO_ERROR
26 };
27
28 enum pqf2xml_status pqf2xml_text(const char *pqf, const char *expect_xml,
29                                  const char *expect_pqf)
30 {
31     YAZ_PQF_Parser parser = yaz_pqf_create();
32     ODR odr = odr_createmem(ODR_ENCODE);
33     Z_RPNQuery *rpn;
34     enum pqf2xml_status status = XML_NO_ERROR;
35
36     YAZ_CHECK(parser);
37
38     YAZ_CHECK(odr);
39
40     rpn = yaz_pqf_parse(parser, odr, pqf);
41
42     yaz_pqf_destroy(parser);
43
44     if (!rpn)
45         status = PQF_FAILED;
46     else
47     {
48 #if YAZ_HAVE_XML2
49         xmlDocPtr doc = 0;
50
51         yaz_rpnquery2xml(rpn, &doc);
52         
53         if (!doc)
54             status = QUERY2XML_FAILED;
55         else
56         {
57             char *buf_out;
58             int len_out;
59
60             xmlDocDumpMemory(doc, (xmlChar **) &buf_out, &len_out);
61             
62             if (len_out == strlen(expect_xml)
63                 && memcmp(buf_out, expect_xml, len_out) == 0)
64             {
65                 Z_Query *query2 = 0;
66                 int error_code = 0;
67                 const char *addinfo = 0;
68                 const xmlNode *root_element = xmlDocGetRootElement(doc);
69                 ODR odr2 = odr_createmem(ODR_ENCODE);
70                 
71                 yaz_xml2query(root_element, &query2, odr2,
72                               &error_code, &addinfo);
73                 if (error_code || !query2)
74                     status = XML_NO_MATCH;
75                 else
76                 {
77                     WRBUF w = wrbuf_alloc();
78                     yaz_query_to_wrbuf(w, query2);
79                     if (!expect_pqf || strcmp(expect_pqf, wrbuf_cstr(w)) == 0)
80                         status = XML_MATCH;
81                     else
82                     {
83                         status = XML_NO_MATCH;
84                         printf("Result: %s\n", wrbuf_cstr(w));
85                     }
86                     wrbuf_destroy(w);
87                 }
88                 odr_destroy(odr2);
89             }
90             else
91             {
92                 printf("%.*s\n", len_out, buf_out);
93                 status = XML_NO_MATCH;
94             }
95             xmlFreeDoc(doc);
96             xmlFree(buf_out);
97         }
98 #else
99         status = QUERY2XML_FAILED;
100 #endif
101     }
102     odr_destroy(odr);
103     return status;
104 }
105
106 static void tst(void)
107 {
108     YAZ_CHECK_EQ(pqf2xml_text("@attr 1=4 bad query", "", 0), PQF_FAILED);
109 #if YAZ_HAVE_XML2
110     YAZ_CHECK_EQ(pqf2xml_text(
111                      "@attr 1=4 computer", 
112                      "<?xml version=\"1.0\"?>\n"
113                      "<query><rpn set=\"Bib-1\">"
114                      "<apt><attr type=\"1\" value=\"4\"/>"
115                      "<term type=\"general\">computer</term></apt>"
116                      "</rpn></query>\n",
117                      "RPN @attrset Bib-1 @attr 1=4 computer"
118                      ), XML_MATCH);
119     
120     YAZ_CHECK_EQ(pqf2xml_text(
121                      "@attr 2=1 @attr 1=title computer",
122                      "<?xml version=\"1.0\"?>\n"
123                      "<query><rpn set=\"Bib-1\">"
124                      "<apt><attr type=\"1\" value=\"title\"/>"
125                      "<attr type=\"2\" value=\"1\"/>"
126                      "<term type=\"general\">computer</term></apt>"
127                      "</rpn></query>\n",
128                      "RPN @attrset Bib-1 @attr \"1=title\" @attr 2=1 computer"
129                      ), XML_MATCH);
130
131     YAZ_CHECK_EQ(pqf2xml_text(
132                      "@attr 2=1 @attr exp1 1=1 computer",
133                      "<?xml version=\"1.0\"?>\n"
134                      "<query><rpn set=\"Bib-1\">"
135                      "<apt><attr set=\"Exp-1\" type=\"1\" value=\"1\"/>"
136                      "<attr type=\"2\" value=\"1\"/>"
137                      "<term type=\"general\">computer</term></apt>"
138                      "</rpn></query>\n",
139                      "RPN @attrset Bib-1 @attr Exp-1 1=1 @attr 2=1 computer"
140                      ), XML_MATCH);
141     
142     YAZ_CHECK_EQ(pqf2xml_text(
143                      "@and a b", 
144                      "<?xml version=\"1.0\"?>\n"
145                      "<query><rpn set=\"Bib-1\">"
146                      "<operator type=\"and\">"
147                      "<apt><term type=\"general\">a</term></apt>"
148                      "<apt><term type=\"general\">b</term></apt>"
149                      "</operator></rpn></query>\n",
150                      "RPN @attrset Bib-1 @and a b"
151                      ), XML_MATCH);
152     
153     YAZ_CHECK_EQ(pqf2xml_text(
154                      "@or @and a b c", 
155                      "<?xml version=\"1.0\"?>\n"
156                      "<query><rpn set=\"Bib-1\">"
157                      "<operator type=\"or\">"
158                      "<operator type=\"and\">"
159                      "<apt><term type=\"general\">a</term></apt>"
160                      "<apt><term type=\"general\">b</term></apt></operator>"
161                      "<apt><term type=\"general\">c</term></apt>"
162                      "</operator></rpn></query>\n",
163                      "RPN @attrset Bib-1 @or @and a b c"
164                      ), XML_MATCH);
165
166     YAZ_CHECK_EQ(pqf2xml_text(
167                      "@set abe", 
168                      "<?xml version=\"1.0\"?>\n"
169                      "<query><rpn set=\"Bib-1\">"
170                      "<rset>abe</rset></rpn></query>\n",
171                      "RPN @attrset Bib-1 @set abe"
172                      ), XML_MATCH);
173
174     YAZ_CHECK_EQ(pqf2xml_text(
175                      /* exclusion, distance, ordered, relationtype, 
176                         knownunit, proxunit */
177                      "@prox 0 3 1 2 k 2           a b", 
178                      "<?xml version=\"1.0\"?>\n"
179                      "<query><rpn set=\"Bib-1\">"
180                      "<operator type=\"prox\" exclusion=\"false\" "
181                      "distance=\"3\" "
182                      "ordered=\"true\" "
183                      "relationType=\"2\" "
184                      "knownProximityUnit=\"2\">"
185                      "<apt><term type=\"general\">a</term></apt>"
186                      "<apt><term type=\"general\">b</term></apt>"
187                      "</operator></rpn></query>\n",
188                      "RPN @attrset Bib-1 @prox 0 3 1 2 k 2 a b"
189                      ), XML_MATCH);
190
191     YAZ_CHECK_EQ(pqf2xml_text(
192                      "@term numeric 32", 
193                      "<?xml version=\"1.0\"?>\n"
194                      "<query><rpn set=\"Bib-1\">"
195                      "<apt>"
196                      "<term type=\"numeric\">32</term></apt>"
197                      "</rpn></query>\n",
198                      "RPN @attrset Bib-1 @term numeric 32"
199                      ), XML_MATCH);
200     
201     YAZ_CHECK_EQ(pqf2xml_text(
202                      "@term string computer", 
203                      "<?xml version=\"1.0\"?>\n"
204                      "<query><rpn set=\"Bib-1\">"
205                      "<apt>"
206                      "<term type=\"string\">computer</term></apt>"
207                      "</rpn></query>\n",
208                      "RPN @attrset Bib-1 @term string computer"
209                      ), XML_MATCH);
210     
211     YAZ_CHECK_EQ(pqf2xml_text(
212                      "@term null void", 
213                      "<?xml version=\"1.0\"?>\n"
214                      "<query><rpn set=\"Bib-1\">"
215                      "<apt>"
216                      "<term type=\"null\"/></apt>"
217                      "</rpn></query>\n",
218                      "RPN @attrset Bib-1 @term null x"
219                      ), XML_MATCH);
220
221     YAZ_CHECK_EQ(pqf2xml_text(
222                      "@attrset gils @attr 4=2 x", 
223                      "<?xml version=\"1.0\"?>\n"
224                      "<query><rpn set=\"GILS\">"
225                      "<apt>"
226                      "<attr type=\"4\" value=\"2\"/>"
227                      "<term type=\"general\">x</term></apt>"
228                      "</rpn></query>\n",
229                      "RPN @attrset GILS @attr 4=2 x"
230                      ), XML_MATCH);
231 #endif
232 }
233
234 int main (int argc, char **argv)
235 {
236     YAZ_CHECK_INIT(argc, argv);
237     tst();
238     YAZ_CHECK_TERM;
239 }
240
241 /*
242  * Local variables:
243  * c-basic-offset: 4
244  * c-file-style: "Stroustrup"
245  * indent-tabs-mode: nil
246  * End:
247  * vim: shiftwidth=4 tabstop=8 expandtab
248  */
249