charset_test.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:9k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2001 Edmund Grimley Evans <edmundo@rano.org>
  3.  * 
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License as published by
  6.  * the Free Software Foundation; either version 2 of the License, or
  7.  * (at your option) any later version.
  8.  * 
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  * 
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  */
  18. #include <assert.h>
  19. #include <string.h>
  20. #include "charset.h"
  21. void test_any(struct charset *charset)
  22. {
  23.   int wc;
  24.   char s[2];
  25.   assert(charset);
  26.   /* Decoder */
  27.   assert(charset_mbtowc(charset, 0, 0, 0) == 0);
  28.   assert(charset_mbtowc(charset, 0, 0, 1) == 0);
  29.   assert(charset_mbtowc(charset, 0, (char *)(-1), 0) == 0);
  30.   assert(charset_mbtowc(charset, 0, "a", 0) == 0);
  31.   assert(charset_mbtowc(charset, 0, "", 1) == 0);
  32.   assert(charset_mbtowc(charset, 0, "b", 1) == 1);
  33.   assert(charset_mbtowc(charset, 0, "", 2) == 0);
  34.   assert(charset_mbtowc(charset, 0, "c", 2) == 1);
  35.   wc = 'x';
  36.   assert(charset_mbtowc(charset, &wc, "a", 0) == 0 && wc == 'x');
  37.   assert(charset_mbtowc(charset, &wc, "", 1) == 0 && wc == 0);
  38.   assert(charset_mbtowc(charset, &wc, "b", 1) == 1 && wc == 'b');
  39.   assert(charset_mbtowc(charset, &wc, "", 2) == 0 && wc == 0);
  40.   assert(charset_mbtowc(charset, &wc, "c", 2) == 1 && wc == 'c');
  41.   /* Encoder */
  42.   assert(charset_wctomb(charset, 0, 0) == 0);
  43.   s[0] = s[1] = '.';
  44.   assert(charset_wctomb(charset, s, 0) == 1 &&
  45.  s[0] == '' && s[1] == '.');
  46.   assert(charset_wctomb(charset, s, 'x') == 1 &&
  47.  s[0] == 'x' && s[1] == '.');
  48. }
  49. void test_utf8()
  50. {
  51.   struct charset *charset;
  52.   int wc;
  53.   char s[8];
  54.   charset = charset_find("UTF-8");
  55.   test_any(charset);
  56.   /* Decoder */
  57.   wc = 0;
  58.   assert(charset_mbtowc(charset, &wc, "177", 1) == 1 && wc == 127);
  59.   assert(charset_mbtowc(charset, &wc, "200", 2) == -1);
  60.   assert(charset_mbtowc(charset, &wc, "301277", 9) == -1);
  61.   assert(charset_mbtowc(charset, &wc, "302200", 1) == -1);
  62.   assert(charset_mbtowc(charset, &wc, "302200", 2) == 2 && wc == 128);
  63.   assert(charset_mbtowc(charset, &wc, "302200", 3) == 2 && wc == 128);
  64.   assert(charset_mbtowc(charset, &wc, "340237200", 9) == -1);
  65.   assert(charset_mbtowc(charset, &wc, "340240200", 9) == 3 &&
  66.  wc == 1 << 11);
  67.   assert(charset_mbtowc(charset, &wc, "360217277277", 9) == -1);
  68.   assert(charset_mbtowc(charset, &wc, "360220200200", 9) == 4 &&
  69.  wc == 1 << 16);
  70.   assert(charset_mbtowc(charset, &wc, "370207277277277", 9) == -1);
  71.   assert(charset_mbtowc(charset, &wc, "370210200200200", 9) == 5 &&
  72.  wc == 1 << 21);
  73.   assert(charset_mbtowc(charset, &wc, "374203277277277277", 9) == -1);
  74.   assert(charset_mbtowc(charset, &wc, "374204200200200200", 9) == 6 &&
  75.  wc == 1 << 26);
  76.   assert(charset_mbtowc(charset, &wc, "375277277277277277", 9) == 6 &&
  77.  wc == 0x7fffffff);
  78.   assert(charset_mbtowc(charset, &wc, "30200", 2) == -1);
  79.   assert(charset_mbtowc(charset, &wc, "302300", 2) == -1);
  80.   assert(charset_mbtowc(charset, &wc, "34040200", 9) == -1);
  81.   assert(charset_mbtowc(charset, &wc, "340340200", 9) == -1);
  82.   assert(charset_mbtowc(charset, &wc, "34024000", 9) == -1);
  83.   assert(charset_mbtowc(charset, &wc, "340240300", 9) == -1);
  84.   assert(charset_mbtowc(charset, &wc, "36020200200", 9) == -1);
  85.   assert(charset_mbtowc(charset, &wc, "360320200200", 9) == -1);
  86.   assert(charset_mbtowc(charset, &wc, "36022000200", 9) == -1);
  87.   assert(charset_mbtowc(charset, &wc, "360220300200", 9) == -1);
  88.   assert(charset_mbtowc(charset, &wc, "36022020000", 9) == -1);
  89.   assert(charset_mbtowc(charset, &wc, "360220200300", 9) == -1);
  90.   assert(charset_mbtowc(charset, &wc, "37577277277277277", 9) == -1);
  91.   assert(charset_mbtowc(charset, &wc, "375377277277277277", 9) == -1);
  92.   assert(charset_mbtowc(charset, &wc, "37527777277277277", 9) == -1);
  93.   assert(charset_mbtowc(charset, &wc, "375277377277277277", 9) == -1);
  94.   assert(charset_mbtowc(charset, &wc, "37527727727777277", 9) == -1);
  95.   assert(charset_mbtowc(charset, &wc, "375277277277377277", 9) == -1);
  96.   assert(charset_mbtowc(charset, &wc, "37527727727727777", 9) == -1);
  97.   assert(charset_mbtowc(charset, &wc, "375277277277277377", 9) == -1);
  98.   assert(charset_mbtowc(charset, &wc, "376277277277277277", 9) == -1);
  99.   assert(charset_mbtowc(charset, &wc, "377277277277277277", 9) == -1);
  100.   /* Encoder */
  101.   strcpy(s, ".......");
  102.   assert(charset_wctomb(charset, s, 1 << 31) == -1 &&
  103.  !strcmp(s, "......."));
  104.   assert(charset_wctomb(charset, s, 127) == 1 &&
  105.  !strcmp(s, "177......"));
  106.   assert(charset_wctomb(charset, s, 128) == 2 &&
  107.  !strcmp(s, "302200....."));
  108.   assert(charset_wctomb(charset, s, 0x7ff) == 2 &&
  109.  !strcmp(s, "337277....."));
  110.   assert(charset_wctomb(charset, s, 0x800) == 3 &&
  111.  !strcmp(s, "340240200...."));
  112.   assert(charset_wctomb(charset, s, 0xffff) == 3 &&
  113.  !strcmp(s, "357277277...."));
  114.   assert(charset_wctomb(charset, s, 0x10000) == 4 &&
  115.  !strcmp(s, "360220200200..."));
  116.   assert(charset_wctomb(charset, s, 0x1fffff) == 4 &&
  117.  !strcmp(s, "367277277277..."));
  118.   assert(charset_wctomb(charset, s, 0x200000) == 5 &&
  119.  !strcmp(s, "370210200200200.."));
  120.   assert(charset_wctomb(charset, s, 0x3ffffff) == 5 &&
  121.  !strcmp(s, "373277277277277.."));
  122.   assert(charset_wctomb(charset, s, 0x4000000) == 6 &&
  123.  !strcmp(s, "374204200200200200."));
  124.   assert(charset_wctomb(charset, s, 0x7fffffff) == 6 &&
  125.  !strcmp(s, "375277277277277277."));
  126. }
  127. void test_ascii()
  128. {
  129.   struct charset *charset;
  130.   int wc;
  131.   char s[3];
  132.   charset = charset_find("us-ascii");
  133.   test_any(charset);
  134.   /* Decoder */
  135.   wc = 0;
  136.   assert(charset_mbtowc(charset, &wc, "177", 2) == 1 && wc == 127);
  137.   assert(charset_mbtowc(charset, &wc, "200", 2) == -1);
  138.   /* Encoder */
  139.   strcpy(s, "..");
  140.   assert(charset_wctomb(charset, s, 256) == -1 && !strcmp(s, ".."));
  141.   assert(charset_wctomb(charset, s, 255) == -1);
  142.   assert(charset_wctomb(charset, s, 128) == -1);
  143.   assert(charset_wctomb(charset, s, 127) == 1 && !strcmp(s, "177."));
  144. }
  145. void test_iso1()
  146. {
  147.   struct charset *charset;
  148.   int wc;
  149.   char s[3];
  150.   charset = charset_find("iso-8859-1");
  151.   test_any(charset);
  152.   /* Decoder */
  153.   wc = 0;
  154.   assert(charset_mbtowc(charset, &wc, "302200", 9) == 1 && wc == 0xc2);
  155.   /* Encoder */
  156.   strcpy(s, "..");
  157.   assert(charset_wctomb(charset, s, 256) == -1 && !strcmp(s, ".."));
  158.   assert(charset_wctomb(charset, s, 255) == 1 && !strcmp(s, "377."));
  159.   assert(charset_wctomb(charset, s, 128) == 1 && !strcmp(s, "200."));
  160. }
  161. void test_iso2()
  162. {
  163.   struct charset *charset;
  164.   int wc;
  165.   char s[3];
  166.   charset = charset_find("iso-8859-2");
  167.   test_any(charset);
  168.   /* Decoder */
  169.   wc = 0;
  170.   assert(charset_mbtowc(charset, &wc, "302200", 9) == 1 && wc == 0xc2);
  171.   assert(charset_mbtowc(charset, &wc, "377", 2) == 1 && wc == 0x2d9);
  172.   /* Encoder */
  173.   strcpy(s, "..");
  174.   assert(charset_wctomb(charset, s, 256) == -1 && !strcmp(s, ".."));
  175.   assert(charset_wctomb(charset, s, 255) == -1 && !strcmp(s, ".."));
  176.   assert(charset_wctomb(charset, s, 258) == 1 && !strcmp(s, "303."));
  177.   assert(charset_wctomb(charset, s, 128) == 1 && !strcmp(s, "200."));
  178. }
  179. void test_convert()
  180. {
  181.   const char *p;
  182.   char *q, *r;
  183.   char s[256];
  184.   size_t n, n2;
  185.   int i;
  186.   p = "00x302200375277277277277277";
  187.   assert(charset_convert("UTF-8", "UTF-8", p, 10, &q, &n) == 0 &&
  188.  n == 10 && !strcmp(p, q));
  189.   assert(charset_convert("UTF-8", "UTF-8", "x301277y", 4, &q, &n) == 2 &&
  190.  n == 4 && !strcmp(q, "x##y"));
  191.   assert(charset_convert("UTF-8", "UTF-8", "x301277y", 4, 0, &n) == 2 &&
  192.  n == 4);
  193.   assert(charset_convert("UTF-8", "UTF-8", "x301277y", 4, &q, 0) == 2 &&
  194.  !strcmp(q, "x##y"));
  195.   assert(charset_convert("UTF-8", "iso-8859-1",
  196.  "302200304200x", 5, &q, &n) == 1 &&
  197.  n == 3 && !strcmp(q, "200?x"));
  198.   assert(charset_convert("iso-8859-1", "UTF-8", 
  199.  "00200377", 3, &q, &n) == 0 &&
  200.  n == 5 && !memcmp(q, "00302200303277", 5));
  201.   assert(charset_convert("iso-8859-1", "iso-8859-1",
  202.  "00200377", 3, &q, &n) == 0 &&
  203.  n == 3 && !memcmp(q, "00200377", 3));
  204.   assert(charset_convert("iso-8859-2", "utf-8", "300", 1, &q, &n) == 0 &&
  205.  n == 2 && !strcmp(q, "305224"));
  206.   assert(charset_convert("utf-8", "iso-8859-2", "305224", 2, &q, &n) == 0 &&
  207.  n == 1 && !strcmp(q, "300"));
  208.   for (i = 0; i < 256; i++)
  209.     s[i] = i;
  210.   assert(charset_convert("iso-8859-2", "utf-8", s, 256, &q, &n) == 0);
  211.   assert(charset_convert("utf-8", "iso-8859-2", q, n, &r, &n2) == 0);
  212.   assert(n2 == 256 && !memcmp(r, s, n2));
  213. }
  214. int main()
  215. {
  216.   test_utf8();
  217.   test_ascii();
  218.   test_iso1();
  219.   test_iso2();
  220.   test_convert();
  221.   return 0;
  222. }