diff tests/uniwbrk/test-uc-wordbreaks.c @ 17870:04ed097a2048

uniwbrk/u32-wordbreaks-tests: add conformance test * modules/uniwbrk/u32-wordbreaks-tests (Files): Add tests/uniwbrk/test-uc-wordbreaks.c, tests/uniwbrk/test-uc-wordbreaks.sh, and tests/uniwbrk/WordBreakTest.txt. (Makefile.am): Add uniwbrk/test-uc-wordbreaks.sh to $(TESTS), add test-uc-wordbreaks to $(check_PROGRAMS), and define test_uc_wordbreaks_SOURCES and test_uc_wordbreaks_LDADD. * tests/uniwbrk/test-uc-wordbreaks.sh: New file. * tests/uniwbrk/test-uc-wordbreaks.c: New file.
author Daiki Ueno <ueno@gnu.org>
date Thu, 15 Jan 2015 12:06:30 +0900
parents
children ab67a6ee6dc8
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/tests/uniwbrk/test-uc-wordbreaks.c
@@ -0,0 +1,177 @@
+/* Word break function test, using test data from UCD.
+   Copyright (C) 2010-2014 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Daiki Ueno <ueno@gnu.org>, 2014.
+
+   Largely based on unigbrk/test-uc-is-grapheme-break.c,
+   written by Ben Pfaff <blp@cs.stanford.edu>, 2010.  */
+
+#include <config.h>
+
+/* Specification. */
+#include <uniwbrk.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+const char *
+wordbreakproperty_to_string (int wbp)
+{
+  switch (wbp)
+    {
+#define CASE(VALUE) case WBP_##VALUE: return #VALUE;
+      CASE(OTHER)
+      CASE(CR)
+      CASE(LF)
+      CASE(NEWLINE)
+      CASE(EXTEND)
+      CASE(FORMAT)
+      CASE(KATAKANA)
+      CASE(ALETTER)
+      CASE(MIDNUMLET)
+      CASE(MIDLETTER)
+      CASE(MIDNUM)
+      CASE(NUMERIC)
+      CASE(EXTENDNUMLET)
+    }
+  abort ();
+}
+
+int
+main (int argc, char *argv[])
+{
+  const char *filename;
+  char line[4096];
+  int exit_code;
+  FILE *stream;
+  int lineno;
+
+  if (argc != 2)
+    {
+      fprintf (stderr, "usage: %s FILENAME\n"
+               "where FILENAME is the location of the WordBreakTest.txt\n"
+               "test file.\n", argv[0]);
+      exit (1);
+    }
+
+  filename = argv[1];
+  stream = fopen (filename, "r");
+  if (stream == NULL)
+    {
+      fprintf (stderr, "error during fopen of '%s'\n", filename);
+      exit (1);
+    }
+
+  exit_code = 0;
+  lineno = 0;
+  while (fgets (line, sizeof line, stream))
+    {
+      char *comment;
+      const char *p;
+      uint32_t input[100];
+      char breaks[101];
+      char breaks_expected[101];
+      int i;
+
+      lineno++;
+
+      memset (breaks, 0, sizeof (breaks));
+      memset (breaks_expected, 0, sizeof (breaks_expected));
+
+      comment = strchr (line, '#');
+      if (comment != NULL)
+        *comment = '\0';
+      if (line[strspn (line, " \t\r\n")] == '\0')
+        continue;
+
+      i = 0;
+      p = line;
+      do
+        {
+          p += strspn (p, " \t\r\n");
+          if (!strncmp (p, "\303\267" /* ÷ */, 2))
+            {
+	      breaks_expected[i] = 1;
+              p += 2;
+            }
+          else if (!strncmp (p, "\303\227" /* × */, 2))
+            {
+	      breaks_expected[i] = 0;
+              p += 2;
+            }
+          else
+            {
+              fprintf (stderr, "%s:%d.%d: syntax error expecting '÷' or '×'\n",
+                       filename, lineno, (int) (p - line + 1));
+              exit (1);
+            }
+
+          p += strspn (p, " \t\r\n");
+          if (*p != '\0')
+            {
+              unsigned int next_int;
+              int n;
+
+              if (sscanf (p, "%x%n", &next_int, &n) != 1)
+                {
+                  fprintf (stderr, "%s:%d.%d: syntax error at '%s' "
+                           "expecting hexadecimal Unicode code point number\n",
+                           filename, lineno, (int) (p - line + 1), p);
+                  exit (1);
+                }
+              p += n;
+
+	      input[i] = next_int;
+	    }
+
+          p += strspn (p, " \t\r\n");
+	  i++;
+        }
+      while (*p != '\0');
+
+      u32_wordbreaks (input, i - 1, breaks);
+
+      /* u32_wordbreaks always set BREAKS[0] to 0.  */
+      breaks[0] = breaks_expected[0] = 1;
+      if (memcmp (breaks, breaks_expected, i - 1) != 0)
+	{
+	  int j;
+
+	  fprintf (stderr, "%s:%d: expected: ", filename, lineno);
+	  for (j = 0; j < i - 1; j++)
+	    {
+	      int input_wbp = uc_wordbreak_property (input[j]);
+	      fprintf (stderr, "%s U+%04X (%s) ",
+		       breaks_expected[j] == 1 ? "\303\267" : "\303\227",
+		       input[j], wordbreakproperty_to_string (input_wbp));
+	    }
+	  fprintf (stderr, "\n");
+	  fprintf (stderr, "%s:%d: actual: ", filename, lineno);
+	  for (j = 0; j < i - 1; j++)
+	    {
+	      int input_wbp = uc_wordbreak_property (input[j]);
+	      fprintf (stderr, "%s U+%04X (%s) ",
+		       breaks[j] == 1 ? "\303\267" : "\303\227",
+		       input[j], wordbreakproperty_to_string (input_wbp));
+	    }
+	  fprintf (stderr, "\n");
+	  exit_code = 1;
+	}
+    }
+
+  return exit_code;
+}