2 * Copyright (C) 2005-2006, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: tst_record_conv.c,v 1.2 2006-05-03 13:04:46 adam Exp $
8 #include <yaz/record_conv.h>
10 #include <yaz/wrbuf.h>
15 #include <libxml/parser.h>
16 #include <libxml/tree.h>
18 yaz_record_conv_t conv_configure(const char *xmlstring, WRBUF w)
20 xmlDocPtr doc = xmlParseMemory(xmlstring, strlen(xmlstring));
23 wrbuf_printf(w, "xmlParseMemory");
28 xmlNodePtr ptr = xmlDocGetRootElement(doc);
29 yaz_record_conv_t p = yaz_record_conv_create();
33 const char *srcdir = getenv("srcdir");
35 yaz_record_conv_set_path(p, srcdir);
39 wrbuf_printf(w, "xmlDocGetRootElement");
40 yaz_record_conv_destroy(p);
45 wrbuf_printf(w, "yaz_record_conv_create");
49 int r = yaz_record_conv_configure(p, ptr);
53 wrbuf_puts(w, yaz_record_conv_get_error(p));
54 yaz_record_conv_destroy(p);
63 int conv_configure_test(const char *xmlstring, const char *expect_error,
64 yaz_record_conv_t *pt)
66 WRBUF w = wrbuf_alloc();
69 yaz_record_conv_t p = conv_configure(xmlstring, w);
73 if (expect_error && !strcmp(wrbuf_buf(w), expect_error))
78 printf("%.*s\n", wrbuf_len(w), wrbuf_buf(w));
86 yaz_record_conv_destroy(p);
93 yaz_record_conv_destroy(p);
101 static void tst_configure()
103 YAZ_CHECK(conv_configure_test("<bad", "xmlParseMemory", 0));
104 YAZ_CHECK(conv_configure_test("<bad/>", "Missing 'convert' element", 0));
105 YAZ_CHECK(conv_configure_test("<convert/>", 0, 0));
106 YAZ_CHECK(conv_configure_test("<convert><bad/></convert>",
108 "Expected marc, xslt, ..", 0));
109 YAZ_CHECK(conv_configure_test("<convert>"
110 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
112 " inputcharset=\"marc-8\""
113 " outputcharset=\"marc-8\""
116 "Attribute 'inputformat' required", 0));
117 YAZ_CHECK(conv_configure_test("<convert>"
118 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
120 " inputcharset=\"utf-8\""
121 " outputcharset=\"marc-8\""
122 " inputformat=\"xml\""
123 " outputformat=\"marc\""
129 static int conv_convert_test(yaz_record_conv_t p,
130 const char *input_record,
131 const char *output_expect_record)
140 WRBUF output_record = wrbuf_alloc();
141 int r = yaz_record_conv_record(p, input_record, output_record);
144 if (output_expect_record)
146 printf("yaz_record_conv error=%s\n",
147 yaz_record_conv_get_error(p));
155 if (!output_expect_record)
159 else if (strlen(output_expect_record) != wrbuf_len(output_record))
161 int expect_len = strlen(output_expect_record);
163 printf("output_record expect-len=%d got-len=%d\n", expect_len,
164 wrbuf_len(output_record));
165 printf("got-output_record = %.*s\n",
166 wrbuf_len(output_record), wrbuf_buf(output_record));
167 printf("output_expect_record = %s\n",
168 output_expect_record);
170 else if (memcmp(output_expect_record, wrbuf_buf(output_record),
171 strlen(output_expect_record)))
174 printf("got-output_record = %.*s\n",
175 wrbuf_len(output_record), wrbuf_buf(output_record));
176 printf("output_expect_record = %s\n",
177 output_expect_record);
184 wrbuf_free(output_record, 1);
189 static void tst_convert()
191 yaz_record_conv_t p = 0;
192 const char *marcxml_rec =
193 "<record xmlns=\"http://www.loc.gov/MARC21/slim\">\n"
194 " <leader>00080nam a22000498a 4500</leader>\n"
195 " <controlfield tag=\"001\"> 11224466 </controlfield>\n"
196 " <datafield tag=\"010\" ind1=\" \" ind2=\" \">\n"
197 " <subfield code=\"a\"> 11224466 </subfield>\n"
200 const char *iso2709_rec =
201 "\x30\x30\x30\x38\x30\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34"
202 "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30"
203 "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x37\x30\x30\x30\x31\x33"
204 "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20"
205 "\x1F\x61\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x1D";
207 YAZ_CHECK(conv_configure_test("<convert>"
209 " inputcharset=\"utf-8\""
210 " outputcharset=\"marc-8\""
211 " inputformat=\"xml\""
212 " outputformat=\"marc\""
216 YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec));
218 YAZ_CHECK(conv_configure_test("<convert>"
220 " outputcharset=\"utf-8\""
221 " inputcharset=\"marc-8\""
222 " outputformat=\"marcxml\""
223 " inputformat=\"marc\""
227 YAZ_CHECK(conv_convert_test(p, iso2709_rec, marcxml_rec));
230 YAZ_CHECK(conv_configure_test("<convert>"
231 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
232 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
234 " inputcharset=\"utf-8\""
235 " outputcharset=\"marc-8\""
236 " inputformat=\"xml\""
237 " outputformat=\"marc\""
240 " outputcharset=\"utf-8\""
241 " inputcharset=\"marc-8\""
242 " outputformat=\"marcxml\""
243 " inputformat=\"marc\""
247 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
251 YAZ_CHECK(conv_configure_test("<convert>"
252 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
253 "<xslt stylesheet=\"tst_record_conv.xsl\"/>"
255 " outputcharset=\"marc-8\""
256 " inputformat=\"xml\""
257 " outputformat=\"marc\""
260 " inputcharset=\"marc-8\""
261 " outputformat=\"marcxml\""
262 " inputformat=\"marc\""
266 YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec));
272 int main(int argc, char **argv)
274 YAZ_CHECK_INIT(argc, argv);
285 * indent-tabs-mode: nil
287 * vim: shiftwidth=4 tabstop=8 expandtab