2 * Copyright (C) 2005-2006, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: tst_record_conv.c,v 1.10 2006-08-01 09:28:04 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));
117 YAZ_CHECK(conv_configure_test("<convert>"
118 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
120 " inputcharset=\"marc-8\""
121 " outputcharset=\"marc-8\""
124 "Attribute 'inputformat' required", 0));
125 YAZ_CHECK(conv_configure_test("<convert>"
128 "Missing attribute 'stylesheet'", 0));
129 YAZ_CHECK(conv_configure_test("<convert>"
130 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
132 " inputcharset=\"utf-8\""
133 " outputcharset=\"marc-8\""
134 " inputformat=\"xml\""
135 " outputformat=\"marc\""
140 YAZ_CHECK(conv_configure_test("<convert>"
141 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
144 " YAZ compiled without XSLT support", 0));
148 static int conv_convert_test(yaz_record_conv_t p,
149 const char *input_record,
150 const char *output_expect_record)
159 WRBUF output_record = wrbuf_alloc();
160 int r = yaz_record_conv_record(p, input_record, strlen(input_record),
164 if (output_expect_record)
166 printf("yaz_record_conv error=%s\n",
167 yaz_record_conv_get_error(p));
175 if (!output_expect_record)
179 else if (strlen(output_expect_record) != wrbuf_len(output_record))
181 int expect_len = strlen(output_expect_record);
183 printf("output_record expect-len=%d got-len=%d\n", expect_len,
184 wrbuf_len(output_record));
185 printf("got-output_record = %.*s\n",
186 wrbuf_len(output_record), wrbuf_buf(output_record));
187 printf("output_expect_record = %s\n",
188 output_expect_record);
190 else if (memcmp(output_expect_record, wrbuf_buf(output_record),
191 strlen(output_expect_record)))
194 printf("got-output_record = %.*s\n",
195 wrbuf_len(output_record), wrbuf_buf(output_record));
196 printf("output_expect_record = %s\n",
197 output_expect_record);
204 wrbuf_free(output_record, 1);
209 static void tst_convert1()
211 yaz_record_conv_t p = 0;
212 const char *marcxml_rec =
213 "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
214 " <leader>00080nam a22000498a 4500</leader>\n"
215 " <controlfield tag=\"001\"> 11224466 </controlfield>\n"
216 " <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
217 " <subfield code=\"a\"> 11224466 </subfield>\n"
220 const char *iso2709_rec =
221 "\x30\x30\x30\x38\x30\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
222 "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
223 "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x37\x30\x30\x30\x31\x33"
224 "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
225 "\x1F\x61\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x1D";
227 YAZ_CHECK(conv_configure_test("<convert>"
229 " inputcharset=\"utf-8\""
230 " outputcharset=\"marc-8\""
231 " inputformat=\"xml\""
232 " outputformat=\"marc\""
236 YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
237 yaz_record_conv_destroy(p);
239 YAZ_CHECK(conv_configure_test("<convert>"
241 " outputcharset=\"utf-8\""
242 " inputcharset=\"marc-8\""
243 " outputformat=\"marcxml\""
244 " inputformat=\"marc\""
248 YAZ_CHECK(conv_convert_test(p, iso2709_rec, marcxml_rec));
249 yaz_record_conv_destroy(p);
252 YAZ_CHECK(conv_configure_test("<convert>"
253 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
254 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
256 " inputcharset=\"utf-8\""
257 " outputcharset=\"marc-8\""
258 " inputformat=\"xml\""
259 " outputformat=\"marc\""
262 " outputcharset=\"utf-8\""
263 " inputcharset=\"marc-8\""
264 " outputformat=\"marcxml\""
265 " inputformat=\"marc\""
269 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
270 yaz_record_conv_destroy(p);
273 YAZ_CHECK(conv_configure_test("<convert>"
274 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
275 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
277 " outputcharset=\"marc-8\""
278 " inputformat=\"xml\""
279 " outputformat=\"marc\""
282 " inputcharset=\"marc-8\""
283 " outputformat=\"marcxml\""
284 " inputformat=\"marc\""
288 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
289 yaz_record_conv_destroy(p);
292 static void tst_convert2()
294 yaz_record_conv_t p = 0;
295 const char *marcxml_rec =
296 "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
297 " <leader>00080nam a22000498a 4500</leader>\n"
298 " <controlfield tag=\"001\"> 11224466 </controlfield>\n"
299 " <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
300 " <subfield code=\"a\">københavn</subfield>\n"
303 const char *iso2709_rec =
304 "\x30\x30\x30\x37\x37\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
305 "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
306 "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x34\x30\x30\x30\x31\x33"
307 "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
308 "\x1F\x61\x6b\xb2\x62\x65\x6e\x68\x61\x76\x6e\x1E\x1D";
310 YAZ_CHECK(conv_configure_test("<convert>"
312 " inputcharset=\"utf-8\""
313 " outputcharset=\"marc-8\""
314 " inputformat=\"xml\""
315 " outputformat=\"marc\""
319 YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
320 yaz_record_conv_destroy(p);
325 int main(int argc, char **argv)
327 YAZ_CHECK_INIT(argc, argv);
328 libxml2_error_to_yazlog(0 /* disable log */, 0);
342 * indent-tabs-mode: nil
344 * vim: shiftwidth=4 tabstop=8 expandtab