2 * Copyright (C) 2005-2006, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: tst_record_conv.c,v 1.6 2006-05-07 14:48:25 adam Exp $
8 #include <yaz/record_conv.h>
10 #include <yaz/wrbuf.h>
19 #include <libxml/parser.h>
20 #include <libxml/tree.h>
22 yaz_record_conv_t conv_configure(const char *xmlstring, WRBUF w)
24 xmlDocPtr doc = xmlParseMemory(xmlstring, strlen(xmlstring));
27 wrbuf_printf(w, "xmlParseMemory");
32 xmlNodePtr ptr = xmlDocGetRootElement(doc);
33 yaz_record_conv_t p = yaz_record_conv_create();
37 const char *srcdir = getenv("srcdir");
39 yaz_record_conv_set_path(p, srcdir);
43 wrbuf_printf(w, "xmlDocGetRootElement");
44 yaz_record_conv_destroy(p);
49 wrbuf_printf(w, "yaz_record_conv_create");
53 int r = yaz_record_conv_configure(p, ptr);
57 wrbuf_puts(w, yaz_record_conv_get_error(p));
58 yaz_record_conv_destroy(p);
67 int conv_configure_test(const char *xmlstring, const char *expect_error,
68 yaz_record_conv_t *pt)
70 WRBUF w = wrbuf_alloc();
73 yaz_record_conv_t p = conv_configure(xmlstring, w);
77 if (expect_error && !strcmp(wrbuf_buf(w), expect_error))
82 printf("%.*s\n", wrbuf_len(w), wrbuf_buf(w));
90 yaz_record_conv_destroy(p);
100 yaz_record_conv_destroy(p);
106 static void tst_configure()
108 YAZ_CHECK(conv_configure_test("<bad", "xmlParseMemory", 0));
109 YAZ_CHECK(conv_configure_test("<bad/>", "Missing 'convert' element", 0));
110 YAZ_CHECK(conv_configure_test("<convert/>", 0, 0));
111 YAZ_CHECK(conv_configure_test("<convert><bad/></convert>",
113 "Expected marc, xslt, ..", 0));
114 YAZ_CHECK(conv_configure_test("<convert>"
115 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
117 " inputcharset=\"marc-8\""
118 " outputcharset=\"marc-8\""
121 "Attribute 'inputformat' required", 0));
122 YAZ_CHECK(conv_configure_test("<convert>"
123 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
125 " inputcharset=\"utf-8\""
126 " outputcharset=\"marc-8\""
127 " inputformat=\"xml\""
128 " outputformat=\"marc\""
134 static int conv_convert_test(yaz_record_conv_t p,
135 const char *input_record,
136 const char *output_expect_record)
145 WRBUF output_record = wrbuf_alloc();
146 int r = yaz_record_conv_record(p, input_record, strlen(input_record),
150 if (output_expect_record)
152 printf("yaz_record_conv error=%s\n",
153 yaz_record_conv_get_error(p));
161 if (!output_expect_record)
165 else if (strlen(output_expect_record) != wrbuf_len(output_record))
167 int expect_len = strlen(output_expect_record);
169 printf("output_record expect-len=%d got-len=%d\n", expect_len,
170 wrbuf_len(output_record));
171 printf("got-output_record = %.*s\n",
172 wrbuf_len(output_record), wrbuf_buf(output_record));
173 printf("output_expect_record = %s\n",
174 output_expect_record);
176 else if (memcmp(output_expect_record, wrbuf_buf(output_record),
177 strlen(output_expect_record)))
180 printf("got-output_record = %.*s\n",
181 wrbuf_len(output_record), wrbuf_buf(output_record));
182 printf("output_expect_record = %s\n",
183 output_expect_record);
190 wrbuf_free(output_record, 1);
195 static void tst_convert()
197 yaz_record_conv_t p = 0;
198 const char *marcxml_rec =
199 "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
200 " <leader>00080nam a22000498a 4500</leader>\n"
201 " <controlfield tag=\"001\"> 11224466 </controlfield>\n"
202 " <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
203 " <subfield code=\"a\"> 11224466 </subfield>\n"
206 const char *iso2709_rec =
207 "\x30\x30\x30\x38\x30\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
208 "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
209 "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x37\x30\x30\x30\x31\x33"
210 "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
211 "\x1F\x61\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x1D";
213 YAZ_CHECK(conv_configure_test("<convert>"
215 " inputcharset=\"utf-8\""
216 " outputcharset=\"marc-8\""
217 " inputformat=\"xml\""
218 " outputformat=\"marc\""
222 YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
223 yaz_record_conv_destroy(p);
225 YAZ_CHECK(conv_configure_test("<convert>"
227 " outputcharset=\"utf-8\""
228 " inputcharset=\"marc-8\""
229 " outputformat=\"marcxml\""
230 " inputformat=\"marc\""
234 YAZ_CHECK(conv_convert_test(p, iso2709_rec, marcxml_rec));
235 yaz_record_conv_destroy(p);
238 YAZ_CHECK(conv_configure_test("<convert>"
239 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
240 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
242 " inputcharset=\"utf-8\""
243 " outputcharset=\"marc-8\""
244 " inputformat=\"xml\""
245 " outputformat=\"marc\""
248 " outputcharset=\"utf-8\""
249 " inputcharset=\"marc-8\""
250 " outputformat=\"marcxml\""
251 " inputformat=\"marc\""
255 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
256 yaz_record_conv_destroy(p);
259 YAZ_CHECK(conv_configure_test("<convert>"
260 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
261 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
263 " outputcharset=\"marc-8\""
264 " inputformat=\"xml\""
265 " outputformat=\"marc\""
268 " inputcharset=\"marc-8\""
269 " outputformat=\"marcxml\""
270 " inputformat=\"marc\""
274 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
275 yaz_record_conv_destroy(p);
280 int main(int argc, char **argv)
282 YAZ_CHECK_INIT(argc, argv);
293 * indent-tabs-mode: nil
295 * vim: shiftwidth=4 tabstop=8 expandtab