X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ftest_icu_I18N.c;h=992922a2b15f2d9e8081a5ad1438758dd1716e6e;hb=f9911850631f4d134eb78b203cdad20f9713554d;hp=31c9e03b372036726e00a9205262a58a7b5a25a8;hpb=aa2759da3fb99484cca8893cff814773d36cd5d2;p=pazpar2-moved-to-github.git diff --git a/src/test_icu_I18N.c b/src/test_icu_I18N.c index 31c9e03..992922a 100644 --- a/src/test_icu_I18N.c +++ b/src/test_icu_I18N.c @@ -1,23 +1,26 @@ -/* $Id: test_icu_I18N.c,v 1.1 2007-04-27 14:31:15 marc Exp $ +/* $Id: test_icu_I18N.c,v 1.11 2007-05-09 14:01:21 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 + #if HAVE_CONFIG_H #include "cconfig.h" @@ -33,17 +36,354 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifdef HAVE_ICU +#include "icu_I18N.h" + +#include +#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 +}; + + + +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; + + int cmp = 0; + + cmp = strcmp((const char *)itmp1->sort_key, + (const char *)itmp2->sort_key); + return cmp; +}; + + + + +int test_icu_casemap(const char * locale, char action, + const char * src8cstr, const char * chk8cstr) +{ + int success = 0; + UErrorCode status = U_ZERO_ERROR; + + 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); + + + int src8cstr_len = strlen(src8cstr); + int chk8cstr_len = strlen(chk8cstr); + + // converting to UTF16 + icu_utf16_from_utf8_cstr(src16, src8cstr, &status); + + // perform case mapping + icu_utf16_casemap(dest16, src16, locale, action, &status); + + // converting to UTF8 + icu_utf16_to_utf8(dest8, dest16, &status); + + + + // 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) +{ + + // Locale 'en' + + // sucessful tests + YAZ_CHECK(test_icu_casemap("en", 'l', + "A ReD fOx hunTS sQUirriLs", + "a red fox hunts squirrils")); + + YAZ_CHECK(test_icu_casemap("en", 'u', + "A ReD fOx hunTS sQUirriLs", + "A RED FOX HUNTS SQUIRRILS")); + + YAZ_CHECK(test_icu_casemap("en", 'f', + "A ReD fOx hunTS sQUirriLs", + "a red fox hunts squirrils")); + + YAZ_CHECK(test_icu_casemap("en", 't', + "A ReD fOx hunTS sQUirriLs", + "A Red Fox Hunts Squirrils")); + + + // Locale 'da' + + // sucess expected + YAZ_CHECK(test_icu_casemap("da", 'l', + "åh ÆbLE, øs fLØde i Åen efter bLåBærGRødeN", + "åh æble, øs fløde i åen efter blåbærgrøden")); + + YAZ_CHECK(test_icu_casemap("da", 'u', + "åh ÆbLE, øs fLØde i Åen efter bLåBærGRødeN", + "ÅH ÆBLE, ØS FLØDE I ÅEN EFTER BLÅBÆRGRØDEN")); + + YAZ_CHECK(test_icu_casemap("da", 'f', + "åh ÆbLE, øs fLØde i Åen efter bLåBærGRødeN", + "åh æble, øs fløde i åen efter blåbærgrøden")); + + YAZ_CHECK(test_icu_casemap("da", 't', + "åh ÆbLE, øs fLØde i Åen efter bLåBærGRødeN", + "Åh Æble, Øs Fløde I Åen Efter Blåbærgrøden")); + + // Locale 'de' + + // 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")); + + 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")); + + 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")); + + 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")); + +} + + +// DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 + +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_FAILURE(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); -void test_icu_I18N(int argc, char **argv) + // checking correct sorting + for (i = 0; i < src_list_len; i++){ + if (0 != strcmp(list[i]->disp_term, chk_list[i])){ + success = 0; + } + } + + 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); + + icu_buf_utf8_destroy(buf8); + icu_buf_utf16_destroy(buf16); + + + + return success; +} + + +// DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 + +void test_icu_I18N_sortmap(int argc, char **argv) +{ + + // sucessful tests + size_t en_1_len = 6; + const char * en_1_src[6] = {"z", "K", "a", "A", "Z", "k"}; + const char * en_1_cck[6] = {"a", "A", "k", "K", "z", "Z"}; + YAZ_CHECK(test_icu_sortmap("en", en_1_len, en_1_src, en_1_cck)); + YAZ_CHECK(test_icu_sortmap("en_AU", en_1_len, en_1_src, en_1_cck)); + YAZ_CHECK(test_icu_sortmap("en_CA", en_1_len, en_1_src, en_1_cck)); + YAZ_CHECK(test_icu_sortmap("en_GB", en_1_len, en_1_src, en_1_cck)); + YAZ_CHECK(test_icu_sortmap("en_US", en_1_len, en_1_src, en_1_cck)); + + // sucessful tests + size_t da_1_len = 6; + const char * da_1_src[6] = {"z", "å", "o", "æ", "a", "ø"}; + const char * da_1_cck[6] = {"a", "o", "z", "æ", "ø", "å"}; + YAZ_CHECK(test_icu_sortmap("da", da_1_len, da_1_src, da_1_cck)); + YAZ_CHECK(test_icu_sortmap("da_DK", da_1_len, da_1_src, da_1_cck)); + + // sucessful tests + size_t de_1_len = 9; + const char * de_1_src[9] = {"u", "ä", "o", "t", "s", "ß", "ü", "ö", "a"}; + const char * de_1_cck[9] = {"a","ä", "o", "ö", "s", "ß", "t", "u", "ü"}; + YAZ_CHECK(test_icu_sortmap("de", de_1_len, de_1_src, de_1_cck)); + YAZ_CHECK(test_icu_sortmap("de_AT", de_1_len, de_1_src, de_1_cck)); + YAZ_CHECK(test_icu_sortmap("de_DE", de_1_len, de_1_src, de_1_cck)); + +} + + +// DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 + +void test_icu_I18N_normmap(int argc, char **argv) { - YAZ_CHECK(0 == 0); - //YAZ_CHECK_EQ(0, 1); + +} + + +// DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 + +void test_icu_I18N_tokenizer(int argc, char **argv) +{ + + const char * src8cstr + = "Though I am not naturally honest, I am so sometimes by chance."; + + UErrorCode status = U_ZERO_ERROR; + struct icu_buf_utf16 * src16 = icu_buf_utf16_create(0); + struct icu_buf_utf16 * tkn16 = icu_buf_utf16_create(0); + struct icu_buf_utf8 * tkn8 = icu_buf_utf8_create(0); + + printf("Input: '%s'\n", src8cstr); + + // transforming to UTF16 + icu_utf16_from_utf8_cstr(src16, src8cstr, &status); + icu_check_status(status); + + // set up tokenizer + struct icu_tokenizer * tokenizer + = icu_tokenizer_create("en", 's', &status); + icu_check_status(status); + YAZ_CHECK(tokenizer); + + // attach text buffer to tokenizer + icu_tokenizer_attach(tokenizer, src16, &status); + icu_check_status(status); + YAZ_CHECK(tokenizer->bi); + + // perform work on tokens + printf("Tokens: "); + while(icu_tokenizer_next_token(tokenizer, tkn16, &status)){ + icu_check_status(status); + + // converting to UTF8 + icu_utf16_to_utf8(tkn8, tkn16, &status); + + printf("'%s' ", tkn8->utf8); + + //printf("token %d %d %d %d '%s'\n", + // icu_tokenizer_token_id(tokenizer), + // icu_tokenizer_token_start(tokenizer), + // icu_tokenizer_token_end(tokenizer), + // icu_tokenizer_token_length(tokenizer), + // tkn8->utf8); + } + printf(" (%d)(%d)\n", icu_tokenizer_token_id(tokenizer), + icu_tokenizer_token_count(tokenizer)); + + icu_tokenizer_destroy(tokenizer); + icu_buf_utf16_destroy(src16); + icu_buf_utf16_destroy(tkn16); + icu_buf_utf8_destroy(tkn8); } -#endif + + + + +#endif // HAVE_ICU + +// DO NOT EDIT THIS FILE IF YOUR EDITOR DOES NOT SUPPORT UTF-8 int main(int argc, char **argv) { @@ -53,18 +393,87 @@ int main(int argc, char **argv) #ifdef HAVE_ICU - test_icu_I18N(argc, argv); - -#else + //test_icu_I18N_casemap_failures(argc, argv); + test_icu_I18N_casemap(argc, argv); + test_icu_I18N_sortmap(argc, argv); + test_icu_I18N_normmap(argc, argv); + test_icu_I18N_tokenizer(argc, argv); + +#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; } +// 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 + /*