2 * Copyright (C) 2005-2006, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: tst_record_conv.c,v 1.7 2006-05-07 17:45:41 adam Exp $
8 #include <yaz/record_conv.h>
10 #include <yaz/wrbuf.h>
13 #include <yaz/libxml2_error.h>
21 #include <libxml/parser.h>
22 #include <libxml/tree.h>
24 yaz_record_conv_t conv_configure(const char *xmlstring, WRBUF w)
26 xmlDocPtr doc = xmlParseMemory(xmlstring, strlen(xmlstring));
29 wrbuf_printf(w, "xmlParseMemory");
34 xmlNodePtr ptr = xmlDocGetRootElement(doc);
35 yaz_record_conv_t p = yaz_record_conv_create();
39 const char *srcdir = getenv("srcdir");
41 yaz_record_conv_set_path(p, srcdir);
45 wrbuf_printf(w, "xmlDocGetRootElement");
46 yaz_record_conv_destroy(p);
51 wrbuf_printf(w, "yaz_record_conv_create");
55 int r = yaz_record_conv_configure(p, ptr);
59 wrbuf_puts(w, yaz_record_conv_get_error(p));
60 yaz_record_conv_destroy(p);
69 int conv_configure_test(const char *xmlstring, const char *expect_error,
70 yaz_record_conv_t *pt)
72 WRBUF w = wrbuf_alloc();
75 yaz_record_conv_t p = conv_configure(xmlstring, w);
79 if (expect_error && !strcmp(wrbuf_buf(w), expect_error))
84 printf("%.*s\n", wrbuf_len(w), wrbuf_buf(w));
92 yaz_record_conv_destroy(p);
102 yaz_record_conv_destroy(p);
108 static void tst_configure()
110 YAZ_CHECK(conv_configure_test("<bad", "xmlParseMemory", 0));
111 YAZ_CHECK(conv_configure_test("<bad/>", "Missing 'convert' element", 0));
112 YAZ_CHECK(conv_configure_test("<convert/>", 0, 0));
113 YAZ_CHECK(conv_configure_test("<convert><bad/></convert>",
115 "Expected marc, xslt, ..", 0));
116 YAZ_CHECK(conv_configure_test("<convert>"
117 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
119 " inputcharset=\"marc-8\""
120 " outputcharset=\"marc-8\""
123 "Attribute 'inputformat' required", 0));
124 YAZ_CHECK(conv_configure_test("<convert>"
127 "Missing attribute 'stylesheet'", 0));
128 YAZ_CHECK(conv_configure_test("<convert>"
129 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
131 " inputcharset=\"utf-8\""
132 " outputcharset=\"marc-8\""
133 " inputformat=\"xml\""
134 " outputformat=\"marc\""
140 static int conv_convert_test(yaz_record_conv_t p,
141 const char *input_record,
142 const char *output_expect_record)
151 WRBUF output_record = wrbuf_alloc();
152 int r = yaz_record_conv_record(p, input_record, strlen(input_record),
156 if (output_expect_record)
158 printf("yaz_record_conv error=%s\n",
159 yaz_record_conv_get_error(p));
167 if (!output_expect_record)
171 else if (strlen(output_expect_record) != wrbuf_len(output_record))
173 int expect_len = strlen(output_expect_record);
175 printf("output_record expect-len=%d got-len=%d\n", expect_len,
176 wrbuf_len(output_record));
177 printf("got-output_record = %.*s\n",
178 wrbuf_len(output_record), wrbuf_buf(output_record));
179 printf("output_expect_record = %s\n",
180 output_expect_record);
182 else if (memcmp(output_expect_record, wrbuf_buf(output_record),
183 strlen(output_expect_record)))
186 printf("got-output_record = %.*s\n",
187 wrbuf_len(output_record), wrbuf_buf(output_record));
188 printf("output_expect_record = %s\n",
189 output_expect_record);
196 wrbuf_free(output_record, 1);
201 static void tst_convert()
203 yaz_record_conv_t p = 0;
204 const char *marcxml_rec =
205 "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
206 " <leader>00080nam a22000498a 4500</leader>\n"
207 " <controlfield tag=\"001\"> 11224466 </controlfield>\n"
208 " <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
209 " <subfield code=\"a\"> 11224466 </subfield>\n"
212 const char *iso2709_rec =
213 "\x30\x30\x30\x38\x30\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
214 "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
215 "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x37\x30\x30\x30\x31\x33"
216 "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
217 "\x1F\x61\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x1D";
219 YAZ_CHECK(conv_configure_test("<convert>"
221 " inputcharset=\"utf-8\""
222 " outputcharset=\"marc-8\""
223 " inputformat=\"xml\""
224 " outputformat=\"marc\""
228 YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
229 yaz_record_conv_destroy(p);
231 YAZ_CHECK(conv_configure_test("<convert>"
233 " outputcharset=\"utf-8\""
234 " inputcharset=\"marc-8\""
235 " outputformat=\"marcxml\""
236 " inputformat=\"marc\""
240 YAZ_CHECK(conv_convert_test(p, iso2709_rec, marcxml_rec));
241 yaz_record_conv_destroy(p);
244 YAZ_CHECK(conv_configure_test("<convert>"
245 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
246 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
248 " inputcharset=\"utf-8\""
249 " outputcharset=\"marc-8\""
250 " inputformat=\"xml\""
251 " outputformat=\"marc\""
254 " outputcharset=\"utf-8\""
255 " inputcharset=\"marc-8\""
256 " outputformat=\"marcxml\""
257 " inputformat=\"marc\""
261 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
262 yaz_record_conv_destroy(p);
265 YAZ_CHECK(conv_configure_test("<convert>"
266 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
267 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
269 " outputcharset=\"marc-8\""
270 " inputformat=\"xml\""
271 " outputformat=\"marc\""
274 " inputcharset=\"marc-8\""
275 " outputformat=\"marcxml\""
276 " inputformat=\"marc\""
280 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
281 yaz_record_conv_destroy(p);
286 int main(int argc, char **argv)
288 YAZ_CHECK_INIT(argc, argv);
289 libxml2_error_to_yazlog(0 /* disable log */, 0);
300 * indent-tabs-mode: nil
302 * vim: shiftwidth=4 tabstop=8 expandtab