Complete test of uc_width results.
authorBruno Haible <bruno@clisp.org>
Sun, 24 Aug 2008 10:27:42 +0000 (12:27 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 24 Aug 2008 10:27:42 +0000 (12:27 +0200)
ChangeLog
modules/uniwidth/width-tests
tests/uniwidth/test-uc_width2.c [new file with mode: 0644]
tests/uniwidth/test-uc_width2.sh [new file with mode: 0755]

index 259a4d0..bd90f4b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-08-24  Bruno Haible  <bruno@clisp.org>
 
+       * tests/uniwidth/test-uc_width2.c: New file.
+       * tests/uniwidth/test-uc_width2.sh: New file.
+       * modules/uniwidth/width-tests (Files): Add the new files.
+       (TESTS): Add uniwidth/test-uc_width2.sh.
+       (TESTS_ENVIRONMENT): New variable.
+       (check_PROGRAMS): Add test-uc_width2.
+       (test_uc_width2_SOURCES): New variable.
+
        Fix uc_width(0x00AB) bug, introduced on 2007-07-08.
        * lib/uniwidth/width.c (nonspacing_table_data): Set bit for 0x00AD,
        not 0x00AB.
index f871b7d..05753a1 100644 (file)
@@ -1,12 +1,16 @@
 Files:
 tests/uniwidth/test-uc_width.c
+tests/uniwidth/test-uc_width2.c
+tests/uniwidth/test-uc_width2.sh
 
 Depends-on:
 
 configure.ac:
 
 Makefile.am:
-TESTS += test-uc_width
-check_PROGRAMS += test-uc_width
+TESTS += test-uc_width uniwidth/test-uc_width2.sh
+TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@'
+check_PROGRAMS += test-uc_width test-uc_width2
 test_uc_width_SOURCES = uniwidth/test-uc_width.c
+test_uc_width2_SOURCES = uniwidth/test-uc_width2.c
 
diff --git a/tests/uniwidth/test-uc_width2.c b/tests/uniwidth/test-uc_width2.c
new file mode 100644 (file)
index 0000000..784ec85
--- /dev/null
@@ -0,0 +1,96 @@
+/* Test of uc_width() function.
+   Copyright (C) 2007-2008 Free Software Foundation, Inc.
+
+   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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008.  */
+
+#include <config.h>
+
+#include "uniwidth.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define ASSERT(expr) \
+  do                                                                        \
+    {                                                                       \
+      if (!(expr))                                                          \
+        {                                                                   \
+          fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
+          fflush (stderr);                                                  \
+          abort ();                                                         \
+        }                                                                   \
+    }                                                                       \
+  while (0)
+
+/* One of 0, '0', '1', 'A', '2'.  */
+static char current_width;
+/* The interval for which the current_width holds.  */
+static ucs4_t current_start;
+static ucs4_t current_end;
+
+static void
+finish_interval (void)
+{
+  if (current_width != 0)
+    {
+      if (current_start == current_end)
+       printf ("%04X\t\t%c\n", current_start, current_width);
+      else
+       printf ("%04X..%04X\t%c\n", current_start, current_end, current_width);
+      current_width = 0;
+    }
+}
+
+static void
+add_to_interval (ucs4_t uc, char width)
+{
+  if (current_width == width && uc == current_end + 1)
+    current_end = uc;
+  else
+    {
+      finish_interval ();
+      current_width = width;
+      current_start = current_end = uc;
+    }
+}
+
+int
+main ()
+{
+  ucs4_t uc;
+
+  for (uc = 0; uc < 0x110000; uc++)
+    {
+      int w1 = uc_width (uc, "UTF-8");
+      int w2 = uc_width (uc, "GBK");
+      char width =
+       (w1 == 0 && w2 == 0 ? '0' :
+        w1 == 1 && w2 == 1 ? '1' :
+        w1 == 1 && w2 == 2 ? 'A' :
+        w1 == 2 && w2 == 2 ? '2' :
+        0);
+      if (width == 0)
+       {
+         /* uc must be a control character.  */
+         ASSERT (w1 < 0 && w2 < 0);
+       }
+      else
+       add_to_interval (uc, width);
+    }
+  finish_interval ();
+
+  return 0;
+}
diff --git a/tests/uniwidth/test-uc_width2.sh b/tests/uniwidth/test-uc_width2.sh
new file mode 100755 (executable)
index 0000000..7d23d2e
--- /dev/null
@@ -0,0 +1,330 @@
+#!/bin/sh
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles uc_width.out"
+./test-uc_width2${EXEEXT} > uc_width.out
+
+tmpfiles="$tmpfiles uc_width.ok"
+cat > uc_width.ok <<\EOF
+0000           0
+0020..007E     1
+00A0           1
+00A1..00AC     A
+00AD           0
+00AE..02FF     A
+0300..036F     0
+0370..0482     A
+0483..0486     0
+0487           A
+0488..0489     0
+048A..0590     A
+0591..05BD     0
+05BE           A
+05BF           0
+05C0           A
+05C1..05C2     0
+05C3           A
+05C4..05C5     0
+05C6           A
+05C7           0
+05C8..05FF     A
+0600..0603     0
+0604..060F     A
+0610..0615     0
+0616..064A     A
+064B..065E     0
+065F..066F     A
+0670           0
+0671..06D5     A
+06D6..06E4     0
+06E5..06E6     A
+06E7..06E8     0
+06E9           A
+06EA..06ED     0
+06EE..070E     A
+070F           0
+0710           A
+0711           0
+0712..072F     A
+0730..074A     0
+074B..07A5     A
+07A6..07B0     0
+07B1..07EA     A
+07EB..07F3     0
+07F4..0900     A
+0901..0902     0
+0903..093B     A
+093C           0
+093D..0940     A
+0941..0948     0
+0949..094C     A
+094D           0
+094E..0950     A
+0951..0954     0
+0955..0961     A
+0962..0963     0
+0964..0980     A
+0981           0
+0982..09BB     A
+09BC           0
+09BD..09C0     A
+09C1..09C4     0
+09C5..09CC     A
+09CD           0
+09CE..09E1     A
+09E2..09E3     0
+09E4..0A00     A
+0A01..0A02     0
+0A03..0A3B     A
+0A3C           0
+0A3D..0A40     A
+0A41..0A42     0
+0A43..0A46     A
+0A47..0A48     0
+0A49..0A4A     A
+0A4B..0A4D     0
+0A4E..0A6F     A
+0A70..0A71     0
+0A72..0A80     A
+0A81..0A82     0
+0A83..0ABB     A
+0ABC           0
+0ABD..0AC0     A
+0AC1..0AC5     0
+0AC6           A
+0AC7..0AC8     0
+0AC9..0ACC     A
+0ACD           0
+0ACE..0AE1     A
+0AE2..0AE3     0
+0AE4..0B00     A
+0B01           0
+0B02..0B3B     A
+0B3C           0
+0B3D..0B3E     A
+0B3F           0
+0B40           A
+0B41..0B43     0
+0B44..0B4C     A
+0B4D           0
+0B4E..0B55     A
+0B56           0
+0B57..0B81     A
+0B82           0
+0B83..0BBF     A
+0BC0           0
+0BC1..0BCC     A
+0BCD           0
+0BCE..0C3D     A
+0C3E..0C40     0
+0C41..0C45     A
+0C46..0C48     0
+0C49           A
+0C4A..0C4D     0
+0C4E..0C54     A
+0C55..0C56     0
+0C57..0CBB     A
+0CBC           0
+0CBD..0CCB     A
+0CCC..0CCD     0
+0CCE..0CE1     A
+0CE2..0CE3     0
+0CE4..0D40     A
+0D41..0D43     0
+0D44..0D4C     A
+0D4D           0
+0D4E..0DC9     A
+0DCA           0
+0DCB..0DD1     A
+0DD2..0DD4     0
+0DD5           A
+0DD6           0
+0DD7..0E30     A
+0E31           0
+0E32..0E33     A
+0E34..0E3A     0
+0E3B..0E46     A
+0E47..0E4E     0
+0E4F..0EB0     A
+0EB1           0
+0EB2..0EB3     A
+0EB4..0EB9     0
+0EBA           A
+0EBB..0EBC     0
+0EBD..0EC7     A
+0EC8..0ECD     0
+0ECE..0F17     A
+0F18..0F19     0
+0F1A..0F34     A
+0F35           0
+0F36           A
+0F37           0
+0F38           A
+0F39           0
+0F3A..0F70     A
+0F71..0F7E     0
+0F7F           A
+0F80..0F84     0
+0F85           A
+0F86..0F87     0
+0F88..0F8F     A
+0F90..0F97     0
+0F98           A
+0F99..0FBC     0
+0FBD..0FC5     A
+0FC6           0
+0FC7..102C     A
+102D..1030     0
+1031           A
+1032           0
+1033..1035     A
+1036..1037     0
+1038           A
+1039           0
+103A..1057     A
+1058..1059     0
+105A..10FF     A
+1100..115F     2
+1160..135E     A
+135F           0
+1360..1711     A
+1712..1714     0
+1715..1731     A
+1732..1734     0
+1735..1751     A
+1752..1753     0
+1754..1771     A
+1772..1773     0
+1774..17B3     A
+17B4..17B5     0
+17B6           A
+17B7..17BD     0
+17BE..17C5     A
+17C6           0
+17C7..17C8     A
+17C9..17D3     0
+17D4..17DC     A
+17DD           0
+17DE..180A     A
+180B..180D     0
+180E..18A8     A
+18A9           0
+18AA..191F     A
+1920..1922     0
+1923..1926     A
+1927..192B     0
+192C..1931     A
+1932           0
+1933..1938     A
+1939..193B     0
+193C..1A16     A
+1A17..1A18     0
+1A19..1AFF     A
+1B00..1B03     0
+1B04..1B33     A
+1B34           0
+1B35           A
+1B36..1B3A     0
+1B3B           A
+1B3C           0
+1B3D..1B41     A
+1B42           0
+1B43..1B6A     A
+1B6B..1B73     0
+1B74..1DBF     A
+1DC0..1DCA     0
+1DCB..1DFD     A
+1DFE..1DFF     0
+1E00..200A     A
+200B..200F     0
+2010..2029     A
+202A..202E     0
+202F..205F     A
+2060..2063     0
+2064..2069     A
+206A..206F     0
+2070..20A8     A
+20A9           1
+20AA..20CF     A
+20D0..20EF     0
+20F0..2328     A
+2329..232A     2
+232B..2E7F     A
+2E80..3029     2
+302A..302F     0
+3030..303E     2
+303F           A
+3040..3098     2
+3099..309A     0
+309B..4DBF     2
+4DC0..4DFF     A
+4E00..A4CF     2
+A4D0..A801     A
+A802           0
+A803..A805     A
+A806           0
+A807..A80A     A
+A80B           0
+A80C..A824     A
+A825..A826     0
+A827..ABFF     A
+AC00..D7A3     2
+D7A4..F8FF     A
+F900..FAFF     2
+FB00..FB1D     A
+FB1E           0
+FB1F..FDFF     A
+FE00..FE0F     0
+FE10..FE1F     2
+FE20..FE23     0
+FE24..FE2F     A
+FE30..FE6F     2
+FE70..FEFE     A
+FEFF           0
+FF00..FF60     2
+FF61..FFDF     1
+FFE0..FFE6     2
+FFE7..FFF8     1
+FFF9..FFFB     0
+FFFC..10A00    1
+10A01..10A03   0
+10A04          1
+10A05..10A06   0
+10A07..10A0B   1
+10A0C..10A0F   0
+10A10..10A37   1
+10A38..10A3A   0
+10A3B..10A3E   1
+10A3F          0
+10A40..1D166   1
+1D167..1D169   0
+1D16A..1D17A   1
+1D17B..1D182   0
+1D183..1D184   1
+1D185..1D18B   0
+1D18C..1D1A9   1
+1D1AA..1D1AD   0
+1D1AE..1D241   1
+1D242..1D244   0
+1D245..1FFFF   1
+20000..2A6D6   2
+2A6D7..2F7FF   1
+2F800..2FA1D   2
+2FA1E..E0000   1
+E0001          0
+E0002..E001F   1
+E0020..E007F   0
+E0080..E00FF   1
+E0100..E01EF   0
+E01F0..10FFFF  1
+EOF
+
+: ${DIFF=diff}
+${DIFF} uc_width.ok uc_width.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result