/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* GMime * Copyright (C) 2000-2007 Jeffrey Stedfast * * This program 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 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "testsuite.h" #ifndef G_OS_WIN32 #define ENABLE_ZENTIMER #include "zentimer.h" #endif #ifdef TEST_CACHE static char *charsets[] = { "iso-8859-1", "iso-8859-2", "iso-8859-4", "iso-8859-5", "iso-8859-7", "iso-8859-8", "iso-8859-9", "iso-8859-13", "iso-8859-15", "koi8-r", "koi8-u", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "euc-kr", "euc-jp", "iso-2022-kr", "iso-2022-jp", "utf-8", }; static void test_cache (void) { GSList *node, *next, *open_cds = NULL; iconv_t cd; int i; srand (time (NULL)); for (i = 0; i < 5000; i++) { const char *from, *to; int which; which = rand () % G_N_ELEMENTS (charsets); from = charsets[which]; which = rand () % G_N_ELEMENTS (charsets); to = charsets[which]; cd = g_mime_iconv_open (from, to); if (cd == (iconv_t) -1) { g_warning ("%d: failed to open converter for %s to %s", i, from, to); continue; } which = rand () % 3; if (!which) { g_mime_iconv_close (cd); } else { open_cds = g_slist_prepend (open_cds, cd); } } node = open_cds; while (node) { next = node->next; cd = node->data; g_mime_iconv_close (cd); g_slist_free_1 (node); node = next; } } #endif /* TEST_CACHE */ struct { const char *text; const char *charset; } tests[] = { { "Ətraflı", "utf-8" }, /* az */ { " ", "windows-cp1251" }, /* bg */ { "Cnjuge", "iso-8859-1" }, /* ca */ { "Avanceret sgning", "iso-8859-1" }, /* da */ { "Lschen", "iso-8859-1" }, /* de */ { "some text", "iso-8859-1" }, /* en */ { "piv", "iso-8859-15" }, /* fi */ { "Modifi", "iso-8859-1" }, /* fr */ { "Tidal", "iso-8859-1" }, /* ga */ { "Fbrica", "iso-8859-1" }, /* gl */ { "Szem-Blyhv-A ", "iso-8859-2" }, /* hu */ { "Non c' corrispondenza", "iso-8859-1" }, /* it */ { "$(B>e5i8!:w(B", "euc-jp" }, /* ja */ { "$(C0m1^(B $(C0K;v(B", "euc-kr" }, /* ko */ { "Isami paieka", "iso-8859-13" }, /* lt */ { "Paplaint Meklana", "iso-8859-13" }, /* lv */ { "Kopiren", "iso-8859-15" }, /* nl */ { "ydelagd Sk", "iso-8859-1" }, /* nn */ { "Avansert sk", "iso-8859-1" }, /* no */ { "-Brda-A ksi-Bki-A adresowej", "iso-8859-2" }, /* pl */ { "C-Butare-A avansat-B-A ", "iso-8859-2" }, /* ro */ { "-L-A -L-A ", "koi8-r" }, /* ru */ { "Pokročilé hľadanie", "utf-8" }, /* sk */ { "Ga želite", "utf-8" }, /* sl */ { "den nd?", "iso-8859-1" }, /* sv */ { "Geli-Mmi-A Arama", "iso-8859-9" }, /* tr */ { " ", "koi8-u" }, /* uk */ #if 0 /* this is expected to fail */ { "ɚ尋(I>(B", "utf-8" }, /* zh_TW */ #endif }; static void test_utils (void) { char *utf8, *native; iconv_t cd; int i; testsuite_start ("charset conversion utils"); for (i = 0; i < G_N_ELEMENTS (tests); i++) { testsuite_check ("test #%d: %s to UTF-8", i, tests[i].charset); try { utf8 = native = NULL; if ((cd = g_mime_iconv_open ("UTF-8", tests[i].charset)) == (iconv_t) -1) { throw (exception_new ("could not open conversion for %s to UTF-8", tests[i].charset)); } utf8 = g_mime_iconv_strdup (cd, tests[i].text); g_mime_iconv_close (cd); if (utf8 == NULL) { throw (exception_new ("could not convert \"%s\" from %s to UTF-8", tests[i].text, tests[i].charset)); } if ((cd = g_mime_iconv_open (tests[i].charset, "UTF-8")) == (iconv_t) -1) { g_free (utf8); throw (exception_new ("could not open conversion for UTF-8 back to %s", tests[i].charset)); } native = g_mime_iconv_strdup (cd, utf8); g_mime_iconv_close (cd); g_free (utf8); if (native == NULL) { throw (exception_new ("could not convert \"%s\" from UTF-8 back to %s", tests[i].text, tests[i].charset)); } else if (strcmp (tests[i].text, native) != 0) { g_free (native); throw (exception_new ("strings did not match after conversion")); } testsuite_check_passed (); g_free (native); } catch (ex) { testsuite_check_failed ("test #%d failed: %s", i, ex->message); } finally; } testsuite_end (); } int main (int argc, char **argv) { g_mime_iconv_init (); testsuite_init (argc, argv); #ifdef TEST_CACHE ZenTimerStart (NULL); test_cache (); ZenTimerStop (NULL); ZenTimerReport (NULL, "test_cache()"); #endif test_utils (); g_mime_iconv_shutdown (); return testsuite_exit (); }