Avoid mixed/stmt var declare
[yaz-moved-to-github.git] / test / tstxmlquery.c
1 /*
2  * Copyright (C) 1995-2005, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: tstxmlquery.c,v 1.7 2006-01-31 11:01:26 adam Exp $
6  */
7
8 #include <stdlib.h>
9 #include <stdio.h>
10
11 #include <yaz/wrbuf.h>
12 #include <yaz/xmlquery.h>
13 #include <yaz/pquery.h>
14 #include <yaz/test.h>
15
16 #if HAVE_XML2
17 #include <libxml/parser.h>
18 #include <libxml/tree.h>
19 #endif
20
21 enum pqf2xml_status {
22     PQF_FAILED,
23     QUERY2XML_FAILED,
24     XML_NO_MATCH,
25     XML_MATCH,
26     XML_NO_ERROR
27 };
28
29 enum pqf2xml_status pqf2xml_text(const char *pqf, const char *expect_xml)
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 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                 status = XML_MATCH;
66             }
67             else
68             {
69                 printf("%.*s\n", len_out, buf_out);
70                 status = XML_NO_MATCH;
71             }
72             xmlFreeDoc(doc);
73         }
74 #else
75         status = QUERY2XML_FAILED;
76 #endif
77     }
78     odr_destroy(odr);
79     return status;
80 }
81
82 void tst()
83 {
84     YAZ_CHECK_EQ(pqf2xml_text("@attr 1=4 bad query", ""), PQF_FAILED);
85 #if HAVE_XML2
86     YAZ_CHECK_EQ(pqf2xml_text(
87                      "@attr 1=4 computer", 
88                      "<?xml version=\"1.0\"?>\n"
89                      "<query set=\"Bib-1\" type=\"rpn\">"
90                      "<apt><attr type=\"1\" value=\"4\"/>"
91                      "<term>computer</term></apt>"
92                      "</query>\n"), XML_MATCH);
93     
94     YAZ_CHECK_EQ(pqf2xml_text(
95                      "@attr 2=1 @attr 1=title computer",
96                      "<?xml version=\"1.0\"?>\n"
97                      "<query set=\"Bib-1\" type=\"rpn\">"
98                      "<apt><attr type=\"1\" value=\"title\"/>"
99                      "<attr type=\"2\" value=\"1\"/>"
100                      "<term>computer</term></apt>"
101                      "</query>\n"), XML_MATCH);
102
103     YAZ_CHECK_EQ(pqf2xml_text(
104                      "@attr 2=1 @attr exp1 1=1 computer",
105                      "<?xml version=\"1.0\"?>\n"
106                      "<query set=\"Bib-1\" type=\"rpn\">"
107                      "<apt><attr set=\"Exp-1\" type=\"1\" value=\"1\"/>"
108                      "<attr type=\"2\" value=\"1\"/>"
109                      "<term>computer</term></apt>"
110                      "</query>\n"), XML_MATCH);
111     
112     YAZ_CHECK_EQ(pqf2xml_text(
113                      "@and a b", 
114                      "<?xml version=\"1.0\"?>\n"
115                      "<query set=\"Bib-1\" type=\"rpn\">"
116                      "<binary type=\"and\">"
117                      "<apt><term>a</term></apt><apt><term>b</term></apt>"
118                      "</binary></query>\n"), XML_MATCH);
119     
120     YAZ_CHECK_EQ(pqf2xml_text(
121                      "@or @and a b c", 
122                      "<?xml version=\"1.0\"?>\n"
123                      "<query set=\"Bib-1\" type=\"rpn\">"
124                      "<binary type=\"or\">"
125                      "<binary type=\"and\"><apt><term>a</term></apt>"
126                      "<apt><term>b</term></apt></binary>"
127                      "<apt><term>c</term></apt>"
128                      "</binary></query>\n"), XML_MATCH);
129
130     YAZ_CHECK_EQ(pqf2xml_text(
131                      "@set abe", 
132                      "<?xml version=\"1.0\"?>\n"
133                      "<query set=\"Bib-1\" type=\"rpn\">"
134                      "<rset>abe</rset></query>\n"), XML_MATCH);
135
136     YAZ_CHECK_EQ(pqf2xml_text(
137                      /* exclusion, distance, ordered, relationtype, 
138                         knownunit, proxunit */
139                      "@prox 0 3 1 2 k 2           a b", 
140                      "<?xml version=\"1.0\"?>\n"
141                      "<query set=\"Bib-1\" type=\"rpn\">"
142                      "<binary type=\"prox\" exclusion=\"false\" "
143                      "distance=\"3\" "
144                      "ordered=\"true\" "
145                      "relationType=\"2\" "
146                      "knownProximityUnit=\"2\">"
147                      "<apt><term>a</term></apt><apt><term>b</term></apt>"
148                      "</binary></query>\n"), XML_MATCH);
149
150 #endif
151 }
152
153 int main (int argc, char **argv)
154 {
155     YAZ_CHECK_INIT(argc, argv);
156     tst();
157     YAZ_CHECK_TERM;
158 }
159
160 /*
161  * Local variables:
162  * c-basic-offset: 4
163  * indent-tabs-mode: nil
164  * End:
165  * vim: shiftwidth=4 tabstop=8 expandtab
166  */
167