X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=test%2Ftest_record_conv.c;h=dc9bb0c48345232e5001bb3607d66bc211799c0f;hp=cc7b06b4102a0537dc23c7eb905f65bc7c80a3da;hb=3d95738e1464a966faae513cbaff87e9f9ff2b47;hpb=77c5a4fca8b516fd39b8ba213daed17a465a6b2a diff --git a/test/test_record_conv.c b/test/test_record_conv.c index cc7b06b..dc9bb0c 100644 --- a/test/test_record_conv.c +++ b/test/test_record_conv.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2012 Index Data + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. */ #if HAVE_CONFIG_H @@ -11,12 +11,18 @@ #include #include #include - +#include +#include +#include #if YAZ_HAVE_XML2 #include #include +#if YAZ_HAVE_XSLT +#include +#endif + yaz_record_conv_t conv_configure(const char *xmlstring, WRBUF w) { xmlDocPtr doc = xmlParseMemory(xmlstring, strlen(xmlstring)); @@ -51,7 +57,7 @@ yaz_record_conv_t conv_configure(const char *xmlstring, WRBUF w) int r = yaz_record_conv_configure(p, ptr); - + if (r) { wrbuf_puts(w, yaz_record_conv_get_error(p)); @@ -61,7 +67,7 @@ yaz_record_conv_t conv_configure(const char *xmlstring, WRBUF w) } xmlFreeDoc(doc); return p; - } + } } int conv_configure_test(const char *xmlstring, const char *expect_error, @@ -144,7 +150,7 @@ static void tst_configure(void) "", "xslt unsupported." " YAZ compiled without XSLT support", 0)); -#endif +#endif } static int conv_convert_test(yaz_record_conv_t p, @@ -181,7 +187,7 @@ static int conv_convert_test(yaz_record_conv_t p, else if (strcmp(output_expect_record, wrbuf_cstr(output_record))) { ret = 0; - printf("got-output_record len=%ld: %s\n", + printf("got-output_record len=%ld: %s\n", (long) wrbuf_len(output_record), wrbuf_cstr(output_record)); printf("output_expect_record len=%ld %s\n", @@ -337,6 +343,204 @@ static void tst_convert2(void) yaz_record_conv_destroy(p); } +static void tst_convert3(void) +{ + NMEM nmem = nmem_create(); + int ret; + yaz_record_conv_t p = 0; + + const char *iso2709_rec = + "\x30\x30\x30\x37\x37\x6E\x61\x6D\x20\x61\x32\x32\x30\x30\x30\x34" + "\x39\x38\x61\x20\x34\x35\x30\x30\x30\x30\x31\x30\x30\x31\x33\x30" + "\x30\x30\x30\x30\x30\x31\x30\x30\x30\x31\x34\x30\x30\x30\x31\x33" + "\x1E\x20\x20\x20\x31\x31\x32\x32\x34\x34\x36\x36\x20\x1E\x20\x20" + "\x1F\x61\x6b\xb2\x62\x65\x6e\x68\x61\x76\x6e\x1E\x1D"; + + const char *opacxml_rec = + "\n" + " \n" + "\n" + " 00077nam a22000498a 4500\n" + " 11224466 \n" + " \n" + " k" "\xc3" "\xb8" /* oslash in UTF_8 */ + "benhavn\n" + " \n" + "\n" + " \n" + "\n" + " \n" + " u\n" + " U\n" + " 0\n" + " 000000\n" + " s-FM/GC\n" + " Main or Science/Business Reading Rms - STORED OFFSITE\n" + " MLCM 89/00602 (N)\n" + " FT MEADE\n" + " Copy 1\n" + " \n" + " \n" + " 1\n" + " 2\n" + " 3\n" + " \n" + " \n" + " 1\n" + " 2\n" + " 3\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " 20130129\n" + " 1226176\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n" + "\n"; + + Z_OPACRecord *z_opac = nmem_malloc(nmem, sizeof(*z_opac)); + Z_HoldingsAndCircData *h; + Z_CircRecord *circ; + + z_opac->bibliographicRecord = + z_ext_record_oid_nmem(nmem, yaz_oid_recsyn_usmarc, + iso2709_rec, strlen(iso2709_rec)); + z_opac->num_holdingsData = 1; + z_opac->holdingsData = (Z_HoldingsRecord **) + nmem_malloc(nmem, sizeof(Z_HoldingsRecord *) * 1); + z_opac->holdingsData[0] = (Z_HoldingsRecord *) + nmem_malloc(nmem, sizeof(Z_HoldingsRecord)); + z_opac->holdingsData[0]->which = Z_HoldingsRecord_holdingsAndCirc; + h = z_opac->holdingsData[0]->u.holdingsAndCirc = (Z_HoldingsAndCircData *) + nmem_malloc(nmem, sizeof(*h)); + h->typeOfRecord = nmem_strdup(nmem, "u"); + h->encodingLevel = nmem_strdup(nmem, "U"); + h->format = 0; + h->receiptAcqStatus = nmem_strdup(nmem, "0"); + h->generalRetention = 0; + h->completeness = 0; + h->dateOfReport = nmem_strdup(nmem, "000000"); + h->nucCode = nmem_strdup(nmem, "s-FM/GC"); + h->localLocation = nmem_strdup(nmem, + "Main or Science/Business Reading " + "Rms - STORED OFFSITE"); + h->shelvingLocation = 0; + h->callNumber = nmem_strdup(nmem, "MLCM 89/00602 (N)"); + h->shelvingData = nmem_strdup(nmem, "FT MEADE"); + h->copyNumber = nmem_strdup(nmem, "Copy 1"); + h->publicNote = 0; + h->reproductionNote = 0; + h->termsUseRepro = 0; + h->enumAndChron = 0; + h->num_volumes = 2; + h->volumes = 0; + + h->volumes = (Z_Volume **) + nmem_malloc(nmem, 2 * sizeof(Z_Volume *)); + + h->volumes[0] = (Z_Volume *) + nmem_malloc(nmem, sizeof(Z_Volume)); + h->volumes[1] = h->volumes[0]; + + h->volumes[0]->enumeration = nmem_strdup(nmem, "1"); + h->volumes[0]->chronology = nmem_strdup(nmem, "2"); + h->volumes[0]->enumAndChron = nmem_strdup(nmem, "3"); + + h->num_circulationData = 1; + h->circulationData = (Z_CircRecord **) + nmem_malloc(nmem, 1 * sizeof(Z_CircRecord *)); + circ = h->circulationData[0] = (Z_CircRecord *) + nmem_malloc(nmem, sizeof(Z_CircRecord)); + circ->availableNow = nmem_booldup(nmem, 1); + circ->availablityDate = nmem_strdup(nmem, "20130129"); + circ->availableThru = 0; + circ->restrictions = 0; + circ->itemId = nmem_strdup(nmem, "1226176"); + circ->renewable = nmem_booldup(nmem, 0); + circ->onHold = nmem_booldup(nmem, 0); + circ->enumAndChron = 0; + circ->midspine = 0; + circ->temporaryLocation = 0; + + YAZ_CHECK(conv_configure_test("" + "" + "", + 0, &p)); + + if (p) + { + WRBUF output_record = wrbuf_alloc(); + ret = yaz_record_conv_opac_record(p, z_opac, output_record); + YAZ_CHECK(ret == 0); + if (ret == 0) + { + ret = strcmp(wrbuf_cstr(output_record), opacxml_rec); + YAZ_CHECK(ret == 0); + if (ret) + { + printf("got-output_record len=%ld: %s\n", + (long) wrbuf_len(output_record), + wrbuf_cstr(output_record)); + printf("output_expect_record len=%ld %s\n", + (long) strlen(opacxml_rec), + opacxml_rec); + } + } + yaz_record_conv_destroy(p); + wrbuf_destroy(output_record); + } + { + Z_OPACRecord *opac = 0; + yaz_marc_t mt = yaz_marc_create(); + ret = yaz_xml_to_opac(mt, opacxml_rec, strlen(opacxml_rec), + &opac, 0 /* iconv */, nmem, 0); + YAZ_CHECK(ret); + YAZ_CHECK(opac); + + if (opac) + { + WRBUF output_record = wrbuf_alloc(); + char *p; + + yaz_marc_xml(mt, YAZ_MARC_MARCXML); + yaz_opac_decode_wrbuf(mt, opac, output_record); + + /* change MARC size to 00077 from 00078, due to + encoding of the aring (two bytes in UTF-8) */ + p = strstr(wrbuf_buf(output_record), "00078"); + YAZ_CHECK(p); + if (p) + p[4] = '7'; + + ret = strcmp(wrbuf_cstr(output_record), opacxml_rec); + YAZ_CHECK(ret == 0); + if (ret) + { + printf("got-output_record len=%ld: %s\n", + (long) wrbuf_len(output_record), + wrbuf_cstr(output_record)); + printf("output_expect_record len=%ld %s\n", + (long) strlen(opacxml_rec), + opacxml_rec); + } + wrbuf_destroy(output_record); + } + yaz_marc_destroy(mt); + } + nmem_destroy(nmem); +} + #endif int main(int argc, char **argv) @@ -346,9 +550,14 @@ int main(int argc, char **argv) #if YAZ_HAVE_XML2 tst_configure(); #endif -#if YAZ_HAVE_XSLT +#if YAZ_HAVE_XSLT tst_convert1(); tst_convert2(); + tst_convert3(); + xsltCleanupGlobals(); +#endif +#if YAZ_HAVE_XML2 + xmlCleanupParser(); #endif YAZ_CHECK_TERM; }