[pango/more-test-coverage2: 15/15] tests: Move bidi tests to their own file




commit 0280fd31b01010b76c85ce7ac0bbff1d9c152933
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Jul 6 17:59:41 2021 -0400

    tests: Move bidi tests to their own file
    
    Also add some tests for bidi embedding levels.

 tests/meson.build |   3 +-
 tests/test-bidi.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/testmisc.c  |  69 ++++-------------------
 3 files changed, 180 insertions(+), 58 deletions(-)
---
diff --git a/tests/meson.build b/tests/meson.build
index 3e9d8075..baf5ad6b 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -18,6 +18,7 @@ test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
 test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
 
 tests = [
+  [ 'test-bidi' ],
   [ 'test-coverage' ],
   [ 'testboundaries' ],
   [ 'testboundaries_ucd' ],
@@ -47,7 +48,7 @@ if cairo_dep.found()
     [ 'test-shape', [ 'test-shape.c', 'test-common.c' ], [ libpangocairo_dep ] ],
     [ 'test-font', [ 'test-font.c' ], [ libpangocairo_dep ] ],
     [ 'testattributes', [ 'testattributes.c', 'test-common.c' ], [ libpangocairo_dep ] ],
-    [ 'testmisc', [ 'testmisc.c' ], [ libpangocairo_dep, glib_dep, harfbuzz_dep ] ],
+    [ 'testmisc', [ 'testmisc.c' ], [ libpangocairo_dep, libpangoft2_dep, glib_dep, harfbuzz_dep ] ],
     [ 'cxx-test', [ 'cxx-test.cpp' ], [ libpangocairo_dep, gobject_dep, harfbuzz_dep ] ],
     [ 'test-harfbuzz', [ 'test-harfbuzz.c' ], [ libpangocairo_dep, gobject_dep, harfbuzz_dep ] ],
     [ 'test-break', [ 'test-break.c', 'test-common.c' ], [libpangocairo_dep, glib_dep, harfbuzz_dep ] ]
diff --git a/tests/test-bidi.c b/tests/test-bidi.c
new file mode 100644
index 00000000..48d2a81f
--- /dev/null
+++ b/tests/test-bidi.c
@@ -0,0 +1,166 @@
+/* Pango
+ * test-bidi.c: Test bidi apis
+ *
+ * Copyright (C) 2021 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <pango/pango.h>
+
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+
+static void
+test_mirror_char (void)
+{
+  /* just some samples */
+  struct {
+    gunichar a;
+    gunichar b;
+  } tests[] = {
+    { '(', ')' },
+    { '<', '>' },
+    { '[', ']' },
+    { '{', '}' },
+    { 0x00ab, 0x00bb },
+    { 0x2045, 0x2046 },
+    { 0x226e, 0x226f },
+  };
+
+  for (int i = 0; i < G_N_ELEMENTS (tests); i++)
+    {
+      gboolean ret;
+      gunichar ch;
+
+      ret = pango_get_mirror_char (tests[i].a, &ch);
+      g_assert_true (ret);
+      g_assert_true (ch == tests[i].b);
+      ret = pango_get_mirror_char (tests[i].b, &ch);
+      g_assert_true (ret);
+      g_assert_true (ch == tests[i].a);
+    }
+}
+
+static void
+test_bidi_type_for_unichar (void)
+{
+  /* one representative from each class we support */
+  g_assert_true (pango_bidi_type_for_unichar ('a') == PANGO_BIDI_TYPE_L);
+  g_assert_true (pango_bidi_type_for_unichar (0x202a) == PANGO_BIDI_TYPE_LRE);
+  g_assert_true (pango_bidi_type_for_unichar (0x202d) == PANGO_BIDI_TYPE_LRO);
+  g_assert_true (pango_bidi_type_for_unichar (0x05d0) == PANGO_BIDI_TYPE_R);
+  g_assert_true (pango_bidi_type_for_unichar (0x0627) == PANGO_BIDI_TYPE_AL);
+  g_assert_true (pango_bidi_type_for_unichar (0x202b) == PANGO_BIDI_TYPE_RLE);
+  g_assert_true (pango_bidi_type_for_unichar (0x202e) == PANGO_BIDI_TYPE_RLO);
+  g_assert_true (pango_bidi_type_for_unichar (0x202c) == PANGO_BIDI_TYPE_PDF);
+  g_assert_true (pango_bidi_type_for_unichar ('0') == PANGO_BIDI_TYPE_EN);
+  g_assert_true (pango_bidi_type_for_unichar ('+') == PANGO_BIDI_TYPE_ES);
+  g_assert_true (pango_bidi_type_for_unichar ('#') == PANGO_BIDI_TYPE_ET);
+  g_assert_true (pango_bidi_type_for_unichar (0x601) == PANGO_BIDI_TYPE_AN);
+  g_assert_true (pango_bidi_type_for_unichar (',') == PANGO_BIDI_TYPE_CS);
+  g_assert_true (pango_bidi_type_for_unichar (0x0301) == PANGO_BIDI_TYPE_NSM);
+  g_assert_true (pango_bidi_type_for_unichar (0x200d) == PANGO_BIDI_TYPE_BN);
+  g_assert_true (pango_bidi_type_for_unichar (0x2029) == PANGO_BIDI_TYPE_B);
+  g_assert_true (pango_bidi_type_for_unichar (0x000b) == PANGO_BIDI_TYPE_S);
+  g_assert_true (pango_bidi_type_for_unichar (' ') == PANGO_BIDI_TYPE_WS);
+  g_assert_true (pango_bidi_type_for_unichar ('!') == PANGO_BIDI_TYPE_ON);
+  /* these are new */
+  g_assert_true (pango_bidi_type_for_unichar (0x2066) == PANGO_BIDI_TYPE_LRI);
+  g_assert_true (pango_bidi_type_for_unichar (0x2067) == PANGO_BIDI_TYPE_RLI);
+  g_assert_true (pango_bidi_type_for_unichar (0x2068) == PANGO_BIDI_TYPE_FSI);
+  g_assert_true (pango_bidi_type_for_unichar (0x2069) == PANGO_BIDI_TYPE_PDI);
+}
+
+static void
+test_unichar_direction (void)
+{
+  struct {
+    gunichar ch;
+    PangoDirection dir;
+  } tests[] = {
+    { 'a', PANGO_DIRECTION_LTR },
+    { '0', PANGO_DIRECTION_NEUTRAL },
+    { '.', PANGO_DIRECTION_NEUTRAL },
+    { '(', PANGO_DIRECTION_NEUTRAL },
+    { 0x05d0, PANGO_DIRECTION_RTL },
+  };
+
+  for (int i = 0; i < G_N_ELEMENTS (tests); i++)
+    {
+      g_assert_true (pango_unichar_direction (tests[i].ch) == tests[i].dir);
+    }
+}
+
+G_GNUC_END_IGNORE_DEPRECATIONS
+
+static void
+test_bidi_embedding_levels (void)
+{
+  /* Examples taken from https://www.w3.org/International/articles/inline-bidi-markup/uba-basics */
+  struct {
+    const char *text;
+    PangoDirection dir;
+    const char *levels;
+    PangoDirection out_dir;
+  } tests[] = {
+    { "bahrain مصر kuwait", PANGO_DIRECTION_LTR, "\0\0\0\0\0\0\0\0\1\1\1\0\0\0\0\0\0\0", PANGO_DIRECTION_LTR 
},
+    { "bahrain مصر kuwait", PANGO_DIRECTION_WEAK_LTR, "\0\0\0\0\0\0\0\0\1\1\1\0\0\0\0\0\0\0", 
PANGO_DIRECTION_LTR },
+    { "bahrain مصر kuwait", PANGO_DIRECTION_RTL, "\2\2\2\2\2\2\2\1\1\1\1\1\2\2\2\2\2\2", PANGO_DIRECTION_RTL 
},
+    { "bahrain مصر kuwait", PANGO_DIRECTION_WEAK_RTL, "\0\0\0\0\0\0\0\0\1\1\1\0\0\0\0\0\0\0", 
PANGO_DIRECTION_LTR },
+    { "The title is مفتاح معايير الويب in Arabic.", PANGO_DIRECTION_LTR, 
"\0\0\0\0\0\0\0\0\0\0\0\0\0\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\0\0\0\0\0\0\0\0\0\0", PANGO_DIRECTION_LTR },
+    { "The title is مفتاح معايير الويب, in Arabic.", PANGO_DIRECTION_LTR, 
"\0\0\0\0\0\0\0\0\0\0\0\0\0\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\0\0\0\0\0\0\0\0\0\0\0", PANGO_DIRECTION_LTR 
},
+    { "The title is مفتاح معايير الويب⁧!⁩ in Arabic.", PANGO_DIRECTION_LTR, 
"\0\0\0\0\0\0\0\0\0\0\0\0\0\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\1\0\0\0\0\0\0\0\0\0\0\0", 
PANGO_DIRECTION_LTR }, // FIXME 
+    { "one two ثلاثة 1234 خمسة", PANGO_DIRECTION_LTR, "\0\0\0\0\0\0\0\0\1\1\1\1\1\1\2\2\2\2\1\1\1\1\1", 
PANGO_DIRECTION_LTR },
+    { "one two ثلاثة ١٢٣٤ خمسة", PANGO_DIRECTION_LTR, "\0\0\0\0\0\0\0\0\1\1\1\1\1\1\2\2\2\2\1\1\1\1\1", 
PANGO_DIRECTION_LTR },
+
+  };
+
+  for (int i = 0; i < G_N_ELEMENTS (tests); i++)
+    {
+      const char *text = tests[i].text;
+      PangoDirection dir = tests[i].dir;
+      guint8 *levels;
+      gsize len;
+
+      levels = pango_log2vis_get_embedding_levels (text, -1, &dir);
+
+      len = g_utf8_strlen (text, -1);
+
+      if (memcmp (levels, tests[i].levels, sizeof (guint8) * len) != 0)
+        {
+        for (int j = 0; j < len; j++)
+          g_print ("\\%d", levels[j]);
+        g_print ("\n");
+        }
+      g_assert_true (memcmp (levels, tests[i].levels, sizeof (guint8) * len) == 0);
+      g_assert_true (dir == tests[i].out_dir);
+
+      g_free (levels);
+    }
+}
+
+int
+main (int argc, char *argv[])
+{
+  g_test_init (&argc, &argv, NULL);
+
+  g_test_add_func ("/bidi/mirror-char", test_mirror_char);
+  g_test_add_func ("/bidi/type-for-unichar", test_bidi_type_for_unichar);
+  g_test_add_func ("/bidi/unichar-direction", test_unichar_direction);
+  g_test_add_func ("/bidi/embedding-levels", test_bidi_embedding_levels);
+
+  return g_test_run ();
+}
diff --git a/tests/testmisc.c b/tests/testmisc.c
index 1c7d62ce..c0f8c426 100644
--- a/tests/testmisc.c
+++ b/tests/testmisc.c
@@ -22,6 +22,7 @@
 #include "config.h"
 #include <glib.h>
 #include <pango/pangocairo.h>
+#include <pango/pango-ot.h>
 
 /* test that we don't crash in shape_tab when the layout
  * is such that we don't have effective attributes
@@ -236,64 +237,19 @@ test_gravity_for_script (void)
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
 
 static void
-test_bidi_type_for_unichar (void)
+test_language_to_tag (void)
 {
-  /* one representative from each class we support */
-  g_assert_true (pango_bidi_type_for_unichar ('a') == PANGO_BIDI_TYPE_L);
-  g_assert_true (pango_bidi_type_for_unichar (0x202a) == PANGO_BIDI_TYPE_LRE);
-  g_assert_true (pango_bidi_type_for_unichar (0x202d) == PANGO_BIDI_TYPE_LRO);
-  g_assert_true (pango_bidi_type_for_unichar (0x05d0) == PANGO_BIDI_TYPE_R);
-  g_assert_true (pango_bidi_type_for_unichar (0x0627) == PANGO_BIDI_TYPE_AL);
-  g_assert_true (pango_bidi_type_for_unichar (0x202b) == PANGO_BIDI_TYPE_RLE);
-  g_assert_true (pango_bidi_type_for_unichar (0x202e) == PANGO_BIDI_TYPE_RLO);
-  g_assert_true (pango_bidi_type_for_unichar (0x202c) == PANGO_BIDI_TYPE_PDF);
-  g_assert_true (pango_bidi_type_for_unichar ('0') == PANGO_BIDI_TYPE_EN);
-  g_assert_true (pango_bidi_type_for_unichar ('+') == PANGO_BIDI_TYPE_ES);
-  g_assert_true (pango_bidi_type_for_unichar ('#') == PANGO_BIDI_TYPE_ET);
-  g_assert_true (pango_bidi_type_for_unichar (0x601) == PANGO_BIDI_TYPE_AN);
-  g_assert_true (pango_bidi_type_for_unichar (',') == PANGO_BIDI_TYPE_CS);
-  g_assert_true (pango_bidi_type_for_unichar (0x0301) == PANGO_BIDI_TYPE_NSM);
-  g_assert_true (pango_bidi_type_for_unichar (0x200d) == PANGO_BIDI_TYPE_BN);
-  g_assert_true (pango_bidi_type_for_unichar (0x2029) == PANGO_BIDI_TYPE_B);
-  g_assert_true (pango_bidi_type_for_unichar (0x000b) == PANGO_BIDI_TYPE_S);
-  g_assert_true (pango_bidi_type_for_unichar (' ') == PANGO_BIDI_TYPE_WS);
-  g_assert_true (pango_bidi_type_for_unichar ('!') == PANGO_BIDI_TYPE_ON);
-  /* these are new */
-  g_assert_true (pango_bidi_type_for_unichar (0x2066) == PANGO_BIDI_TYPE_LRI);
-  g_assert_true (pango_bidi_type_for_unichar (0x2067) == PANGO_BIDI_TYPE_RLI);
-  g_assert_true (pango_bidi_type_for_unichar (0x2068) == PANGO_BIDI_TYPE_FSI);
-  g_assert_true (pango_bidi_type_for_unichar (0x2069) == PANGO_BIDI_TYPE_PDI);
-}
+  PangoLanguage *lang;
+  PangoOTTag tag;
+  PangoLanguage *lang2;
 
-static void
-test_bidi_mirror_char (void)
-{
-  /* just some samples */
-  struct {
-    gunichar a;
-    gunichar b;
-  } tests[] = {
-    { '(', ')' },
-    { '<', '>' },
-    { '[', ']' },
-    { '{', '}' },
-    { 0x00ab, 0x00bb },
-    { 0x2045, 0x2046 },
-    { 0x226e, 0x226f },
-  };
+  lang = pango_language_from_string ("de");
 
-  for (int i = 0; i < G_N_ELEMENTS (tests); i++)
-    {
-      gboolean ret;
-      gunichar ch;
-
-      ret = pango_get_mirror_char (tests[i].a, &ch);
-      g_assert_true (ret);
-      g_assert_true (ch == tests[i].b);
-      ret = pango_get_mirror_char (tests[i].b, &ch);
-      g_assert_true (ret);
-      g_assert_true (ch == tests[i].a);
-    }
+  tag = pango_ot_tag_from_language (lang);
+
+  lang2 = pango_ot_tag_to_language (tag);
+
+  g_assert_true (lang2 == lang);
 }
 
 G_GNUC_END_IGNORE_DEPRECATIONS
@@ -351,9 +307,8 @@ main (int argc, char *argv[])
   g_test_add_func ("/gravity/to-rotation", test_gravity_to_rotation);
   g_test_add_func ("/gravity/from-matrix", test_gravity_from_matrix);
   g_test_add_func ("/gravity/for-script", test_gravity_for_script);
-  g_test_add_func ("/bidi/type-for-unichar", test_bidi_type_for_unichar);
-  g_test_add_func ("/bidi/mirror-char", test_bidi_mirror_char);
   g_test_add_func ("/layout/fallback-shape", test_fallback_shape);
+  g_test_add_func ("/language/to-tag", test_language_to_tag);
 
   return g_test_run ();
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]