From 0280fd31b01010b76c85ce7ac0bbff1d9c152933 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 6 Jul 2021 17:59:41 -0400 Subject: 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(-) create mode 100644 tests/test-bidi.c 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 + +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 #include +#include /* 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 (); } -- cgit v1.2.1