X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ftest_icu_I18N.c;h=c9d3e395b7dfa9c9d1a1c8409e7d7f104cdfdb2c;hb=6bd7fce99de886558fa6d3770ec9d866b5e37ef8;hp=065a8f0f26056da50bd6fc5634b85a8d948fe9ef;hpb=d22d19e9cecc3a50dfca023434580b38e53a9ef7;p=pazpar2-moved-to-github.git diff --git a/src/test_icu_I18N.c b/src/test_icu_I18N.c index 065a8f0..c9d3e39 100644 --- a/src/test_icu_I18N.c +++ b/src/test_icu_I18N.c @@ -1,23 +1,23 @@ -/* $Id: test_icu_I18N.c,v 1.8 2007-05-07 09:31:36 marc Exp $ +/* $Id: test_icu_I18N.c,v 1.10 2007-05-07 12:52:04 marc Exp $ Copyright (c) 2006-2007, Index Data. -This file is part of Pazpar2. + This file is part of Pazpar2. -Pazpar2 is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. + Pazpar2 is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. -Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. + Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. -You should have received a copy of the GNU General Public License -along with Pazpar2; see the file LICENSE. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. - */ + You should have received a copy of the GNU General Public License + along with Pazpar2; see the file LICENSE. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ // DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 @@ -37,78 +37,93 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifdef HAVE_ICU #include "icu_I18N.h" + #include #include -#include - - -#include /* some more string fcns*/ -#include /* char names */ -//#include -//#include /* Basic ICU data types */ -#include - +//#include // DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 #define MAX_KEY_SIZE 256 - struct icu_termmap { - uint8_t sort_key[MAX_KEY_SIZE]; // standard C string '\0' terminated - char disp_term[MAX_KEY_SIZE]; // standard C utf-8 string + uint8_t sort_key[MAX_KEY_SIZE]; // standard C string '\0' terminated + char disp_term[MAX_KEY_SIZE]; // standard C utf-8 string }; int icu_termmap_cmp(const void *vp1, const void *vp2) { - struct icu_termmap *itmp1 = *(struct icu_termmap **) vp1; - struct icu_termmap *itmp2 = *(struct icu_termmap **) vp2; + struct icu_termmap *itmp1 = *(struct icu_termmap **) vp1; + struct icu_termmap *itmp2 = *(struct icu_termmap **) vp2; - int cmp = 0; + int cmp = 0; - cmp = strcmp((const char *)itmp1->sort_key, - (const char *)itmp2->sort_key); - return cmp; -} + cmp = strcmp((const char *)itmp1->sort_key, + (const char *)itmp2->sort_key); + return cmp; +}; -#if 0 int test_icu_casemap(const char * locale, char action, - const char * src8, const char * check8) + const char * src8cstr, const char * chk8cstr) { - NMEM nmem = nmem_create(); - size_t buf_cap = 128; - char buf[buf_cap]; - const char * dest8 = 0; - size_t dest8_len = 0; - //size_t src8_len = strlen(src8); - int sucess = 0; - - //printf("original string: '%s' (%d)\n", src8, (int) src8_len); + int success = 0; + UErrorCode status = U_ZERO_ERROR; - //these shall succeed - dest8 = icu_casemap(nmem, buf, buf_cap, &dest8_len, - src8, locale, action); + struct icu_buf_utf8 * src8 = icu_buf_utf8_create(0); + struct icu_buf_utf8 * dest8 = icu_buf_utf8_create(0); + struct icu_buf_utf16 * src16 = icu_buf_utf16_create(0); + struct icu_buf_utf16 * dest16 = icu_buf_utf16_create(0); - //printf("icu_casemap '%s:%c' '%s' (%d)\n", - // locale, action, dest8, (int) dest8_len); + int src8cstr_len = strlen(src8cstr); + int chk8cstr_len = strlen(chk8cstr); - if (dest8 - && (dest8_len == strlen(check8)) - && !strcmp(check8, dest8)) - sucess = dest8_len; + // converting to UTF16 + icu_utf16_from_utf8_cstr(src16, src8cstr, &status); - nmem_destroy(nmem); + // perform case mapping + icu_utf16_casemap(dest16, src16, locale, action, &status); + + // converting to UTF8 + icu_utf16_to_utf8(dest8, dest16, &status); + - return sucess; + + // determine success + if (dest8->utf8 + && (dest8->utf8_len == strlen(chk8cstr)) + && !strcmp(chk8cstr, (const char *) dest8->utf8)) + success = 1; + else + success = 0; + + // report failures + if (!success){ + printf("\nERROR\n"); + printf("original string: '%s' (%d)\n", src8cstr, src8cstr_len); + printf("icu_casemap '%s:%c' '%s' (%d)\n", + locale, action, dest8->utf8, dest8->utf8_len); + printf("expected string: '%s' (%d)\n", chk8cstr, chk8cstr_len); + } + + // clean the buffers + icu_buf_utf8_destroy(src8); + icu_buf_utf8_destroy(dest8); + icu_buf_utf16_destroy(src16); + icu_buf_utf16_destroy(dest16); + + + return success; } + + // DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 void test_icu_I18N_casemap(int argc, char **argv) @@ -129,11 +144,10 @@ void test_icu_I18N_casemap(int argc, char **argv) "A ReD fOx hunTS sQUirriLs", "a red fox hunts squirrils")); - // this one fails and needs more investigation .. - YAZ_CHECK(0 == test_icu_casemap("en", 't', + YAZ_CHECK(test_icu_casemap("en", 't', "A ReD fOx hunTS sQUirriLs", "A Red Fox Hunts Squirrils")); - + // Locale 'da' @@ -158,228 +172,106 @@ void test_icu_I18N_casemap(int argc, char **argv) // sucess expected YAZ_CHECK(test_icu_casemap("de", 'l', - "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", - "zwölf ärgerliche würste rollen über die straße")); + "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", + "zwölf ärgerliche würste rollen über die straße")); YAZ_CHECK(test_icu_casemap("de", 'u', - "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", - "ZWÖLF ÄRGERLICHE WÜRSTE ROLLEN ÜBER DIE STRASSE")); + "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", + "ZWÖLF ÄRGERLICHE WÜRSTE ROLLEN ÜBER DIE STRASSE")); YAZ_CHECK(test_icu_casemap("de", 'f', - "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", - "zwölf ärgerliche würste rollen über die strasse")); + "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", + "zwölf ärgerliche würste rollen über die strasse")); YAZ_CHECK(test_icu_casemap("de", 't', - "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", - "Zwölf Ärgerliche Würste Rollen Über Die Straße")); + "zWÖlf ärgerliche Würste rollen ÜBer die StRAße", + "Zwölf Ärgerliche Würste Rollen Über Die Straße")); } // DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 -void test_icu_I18N_casemap_failures(int argc, char **argv) +int test_icu_sortmap(const char * locale, int src_list_len, + const char ** src_list, const char ** chk_list) { + int success = 1; - size_t buf_cap = 128; - char buf[buf_cap]; - size_t dest8_len = 0; - NMEM nmem = nmem_create(); - char * dest8 = 0; - - const char * src8 = "A ReD fOx hunTS sQUirriLs"; - //size_t src8_len = strlen(src8); - - //printf("original string: '%s' (%d)\n", src8, (int) src8_len); - - // some calling error needs investigation - dest8 = icu_casemap(nmem, buf, buf_cap, &dest8_len, - src8, "en", 't'); - YAZ_CHECK(0 == dest8_len); - //printf("icu_casemap 'en:t' '%s' (%d)\n", dest8, (int) dest8_len); - + UErrorCode status = U_ZERO_ERROR; - // attention: does not fail even if no locale 'xy_zz' defined - // it seems to default to english locale - dest8 = icu_casemap(nmem, buf, buf_cap, &dest8_len, - src8, "zz_abc", 'l'); - YAZ_CHECK(dest8_len); - //printf("icu_casemap 'zz:l' '%s' (%d)\n", dest8, (int) dest8_len); + struct icu_buf_utf8 * buf8 = icu_buf_utf8_create(0); + struct icu_buf_utf16 * buf16 = icu_buf_utf16_create(0); + int i; - // shall fail - no buf buffer defined - dest8 = icu_casemap(nmem, 0, buf_cap, &dest8_len, - src8, "en", 'l'); - YAZ_CHECK(0 == dest8_len); - //printf("icu_casemap 'en:l' '%s' (%d)\n", dest8, (int) dest8_len); + struct icu_termmap * list[src_list_len]; - // shall fail - no buf_cap defined - dest8 = icu_casemap(nmem, buf, 0, &dest8_len, - src8, "en", 'l'); - YAZ_CHECK(0 == dest8_len); - //printf("icu_casemap 'en:l' '%s' (%d)\n", dest8, (int) dest8_len); + UCollator *coll = ucol_open(locale, &status); + icu_check_status(status); - // shall fail - no action 'x' defined - dest8 = icu_casemap(nmem, buf, buf_cap, &dest8_len, - src8, "en", 'x'); - YAZ_CHECK(0 == dest8_len); - //printf("icu_casemap 'en:x' '%s' (%d)\n", dest8, (int) dest8_len); + if(!U_SUCCESS(status)) + return 0; - nmem_destroy(nmem); -} + // assigning display terms and sort keys using buf 8 and buf16 + for( i = 0; i < src_list_len; i++) + { -#endif - -// DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 - -#if 0 -int test_icu_sortmap(const char * locale, size_t list_len, - const char ** src8_list, const char ** check8_list) -{ - int sucess = 1; + list[i] = (struct icu_termmap *) malloc(sizeof(struct icu_termmap)); - size_t i = 0; + // copy display term + strcpy(list[i]->disp_term, src_list[i]); + // transforming to UTF16 + icu_utf16_from_utf8_cstr(buf16, list[i]->disp_term, &status); + icu_check_status(status); - NMEM nmem = nmem_create(); - size_t buf_cap = 128; - char buf[buf_cap]; - struct icu_termmap ** dest8_list - = nmem_malloc(nmem, sizeof(struct icu_termmap *) * list_len); - //size_t dest8_len = 0; - //size_t src8_len = strlen(src8); + // computing sortkeys + icu_sortkey8_from_utf16(coll, buf8, buf16, &status); + icu_check_status(status); + + // assigning sortkeys + memcpy(list[i]->sort_key, buf8->utf8, buf8->utf8_len); + //strncpy(list[i]->sort_key, buf8->utf8, buf8->utf8_len); + //strcpy((char *) list[i]->sort_key, (const char *) buf8->utf8); + } - // initializing icu_termmap - for (i = 0; i < list_len; i++){ - dest8_list[i] = icu_termmap_create(nmem); - dest8_list[i]->norm_term = nmem_strdup(nmem, src8_list[i]); - dest8_list[i]->disp_term = nmem_strdup(nmem, src8_list[i]); - //dest8_list[i]->sort_key = nmem_strdup(nmem, src8_list[i]); - //dest8_list[i]->sort_len = strlen(src8_list[i]); - dest8_list[i]->sort_key - = icu_sortmap(nmem, buf, buf_cap, 0, src8_list[i], locale); - // = icu_sortmap(nmem, buf, buf_cap, &(dest8_list[i]->sort_len), - // src8_list[i], locale); - } // do the sorting - qsort(dest8_list, list_len, + qsort(list, src_list_len, sizeof(struct icu_termmap *), icu_termmap_cmp); // checking correct sorting - for (i = 0; i < list_len; i++){ - if (0 != strcmp(dest8_list[i]->disp_term, check8_list[i])){ - sucess = 0; + for (i = 0; i < src_list_len; i++){ + if (0 != strcmp(list[i]->disp_term, chk_list[i])){ + success = 0; } } - if (1 || !sucess){ - printf("\n"); - printf("Input '%s':", locale); - for (i = 0; i < list_len; i++) - printf(" '%s'", src8_list[i]); - printf("\n"); - printf("ICU sort '%s':", locale); - for (i = 0; i < list_len; i++) - printf(" '%s'", dest8_list[i]->disp_term); - if (sucess) - printf(" OK"); - else - printf(" ERROR ??"); + if(!success){ + printf("\nERROR\n"); + printf("Input str: '%s' : ", locale); + for (i = 0; i < src_list_len; i++) { + printf(" '%s'", list[i]->disp_term); + } printf("\n"); - printf("Expected '%s':", locale); - for (i = 0; i < list_len; i++) - printf(" '%s'", check8_list[i]); - printf("\n"); - } - - nmem_destroy(nmem); - - return sucess; -} - -#else - -int test_icu_sortmap(const char * locale, int src_list_len, - const char ** src_list, const char ** chk_list) -{ - int success = 1; - - UErrorCode status = U_ZERO_ERROR; - - struct icu_buf_utf8 * buf8 = icu_buf_utf8_create(0); - struct icu_buf_utf16 * buf16 = icu_buf_utf16_create(0); - - int i; - - struct icu_termmap * list[src_list_len]; - - UCollator *coll = ucol_open(locale, &status); - icu_check_status(status); - - if(!U_SUCCESS(status)) - return 0; - - // assigning display terms and sort keys using buf 8 and buf16 - for( i = 0; i < src_list_len; i++) - { - - list[i] = (struct icu_termmap *) malloc(sizeof(struct icu_termmap)); - - // copy display term - strcpy(list[i]->disp_term, src_list[i]); - - // transforming to UTF16 - icu_utf16_from_utf8_cstr(buf16, list[i]->disp_term, &status); - icu_check_status(status); - - // computing sortkeys - icu_sortkey8_from_utf16(coll, buf8, buf16, &status); - icu_check_status(status); - - // assigning sortkeys - memcpy(list[i]->sort_key, buf8->utf8, buf8->utf8_len); - //strncpy(list[i]->sort_key, buf8->utf8, buf8->utf8_len); - //strcpy((char *) list[i]->sort_key, (const char *) buf8->utf8); - } - - - // do the sorting - qsort(list, src_list_len, - sizeof(struct icu_termmap *), icu_termmap_cmp); - - // checking correct sorting - for (i = 0; i < src_list_len; i++){ - if (0 != strcmp(list[i]->disp_term, chk_list[i])){ - success = 0; + printf("ICU sort: '%s' : ", locale); + for (i = 0; i < src_list_len; i++) { + printf(" '%s'", list[i]->disp_term); + //printf("(%d|%d)", list[i]->sort_key[0],list[i]->sort_key[1]); + } + printf("\n"); + printf("Expected: '%s' : ", locale); + for (i = 0; i < src_list_len; i++) { + printf(" '%s'", chk_list[i]); + } + printf("\n"); } - } - - if(!success){ - printf("\nERROR\n"); - printf("Input str: '%s' : ", locale); - for (i = 0; i < src_list_len; i++) { - printf(" '%s'", list[i]->disp_term); - } - printf("\n"); - printf("ICU sort: '%s' : ", locale); - for (i = 0; i < src_list_len; i++) { - printf(" '%s'", list[i]->disp_term); - //printf("(%d|%d)", list[i]->sort_key[0],list[i]->sort_key[1]); - } - printf("\n"); - printf("Expected: '%s' : ", locale); - for (i = 0; i < src_list_len; i++) { - printf(" '%s'", chk_list[i]); - } - printf("\n"); - } - ucol_close(coll); + ucol_close(coll); - icu_buf_utf8_destroy(buf8); - icu_buf_utf16_destroy(buf16); + icu_buf_utf8_destroy(buf8); + icu_buf_utf16_destroy(buf16); @@ -387,9 +279,6 @@ int test_icu_sortmap(const char * locale, int src_list_len, } -#endif - - // DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 void test_icu_I18N_sortmap(int argc, char **argv) @@ -423,7 +312,7 @@ void test_icu_I18N_sortmap(int argc, char **argv) } -#endif +#endif // HAVE_ICU // DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 @@ -436,16 +325,16 @@ int main(int argc, char **argv) #ifdef HAVE_ICU //test_icu_I18N_casemap_failures(argc, argv); - //test_icu_I18N_casemap(argc, argv); + test_icu_I18N_casemap(argc, argv); test_icu_I18N_sortmap(argc, argv); -#else +#else // HAVE_ICU printf("ICU unit tests omitted.\n" "Please install libicu36-dev and icu-doc or similar\n"); YAZ_CHECK(0 == 0); -#endif +#endif // HAVE_ICU YAZ_CHECK_TERM; } @@ -453,6 +342,69 @@ int main(int argc, char **argv) // DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 + + +// CRAP to follow +#if 0 + +// DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 + +void test_icu_I18N_casemap_failures(int argc, char **argv) +{ + + size_t buf_cap = 128; + char buf[buf_cap]; + size_t dest8_len = 0; + NMEM nmem = nmem_create(); + char * dest8 = 0; + + const char * src8 = "A ReD fOx hunTS sQUirriLs"; + //size_t src8_len = strlen(src8); + + //printf("original string: '%s' (%d)\n", src8, (int) src8_len); + + // some calling error needs investigation + dest8 = icu_casemap(nmem, buf, buf_cap, &dest8_len, + src8, "en", 't'); + YAZ_CHECK(0 == dest8_len); + //printf("icu_casemap 'en:t' '%s' (%d)\n", dest8, (int) dest8_len); + + + // attention: does not fail even if no locale 'xy_zz' defined + // it seems to default to english locale + dest8 = icu_casemap(nmem, buf, buf_cap, &dest8_len, + src8, "zz_abc", 'l'); + YAZ_CHECK(dest8_len); + //printf("icu_casemap 'zz:l' '%s' (%d)\n", dest8, (int) dest8_len); + + + // shall fail - no buf buffer defined + dest8 = icu_casemap(nmem, 0, buf_cap, &dest8_len, + src8, "en", 'l'); + YAZ_CHECK(0 == dest8_len); + //printf("icu_casemap 'en:l' '%s' (%d)\n", dest8, (int) dest8_len); + + // shall fail - no buf_cap defined + dest8 = icu_casemap(nmem, buf, 0, &dest8_len, + src8, "en", 'l'); + YAZ_CHECK(0 == dest8_len); + //printf("icu_casemap 'en:l' '%s' (%d)\n", dest8, (int) dest8_len); + + // shall fail - no action 'x' defined + dest8 = icu_casemap(nmem, buf, buf_cap, &dest8_len, + src8, "en", 'x'); + YAZ_CHECK(0 == dest8_len); + //printf("icu_casemap 'en:x' '%s' (%d)\n", dest8, (int) dest8_len); + + nmem_destroy(nmem); +} + + + +#endif + + + /* * Local variables: * c-basic-offset: 4