Towards normalization
[profile/ivi/org.tizen.video-player.git] / test / test-unicode.c
index cc95a9f..dd57984 100644 (file)
@@ -56,7 +56,7 @@ static void free_up (void *p)
   data_t *data = (data_t *) p;
 
   g_assert (data->value == MAGIC0 || data->value == MAGIC1);
-  g_assert (data->freed == FALSE);
+  g_assert (!data->freed);
   data->freed = TRUE;
 }
 
@@ -68,8 +68,8 @@ simple_get_script (hb_unicode_funcs_t *ufuncs,
   data_t *data = (data_t *) user_data;
 
   g_assert (hb_unicode_funcs_get_parent (ufuncs) != NULL);
-  g_assert (data->value == MAGIC0);
-  g_assert (data->freed == FALSE);
+  g_assert_cmphex (data->value, ==, MAGIC0);
+  g_assert (!data->freed);
 
   if ('a' <= codepoint && codepoint <= 'z')
     return HB_SCRIPT_LATIN;
@@ -85,15 +85,15 @@ a_is_for_arabic_get_script (hb_unicode_funcs_t *ufuncs,
   data_t *data = (data_t *) user_data;
 
   g_assert (hb_unicode_funcs_get_parent (ufuncs) != NULL);
-  g_assert (data->value == MAGIC1);
-  g_assert (data->freed == FALSE);
+  g_assert_cmphex (data->value, ==, MAGIC1);
+  g_assert (!data->freed);
 
   if (codepoint == 'a') {
     return HB_SCRIPT_ARABIC;
   } else {
     hb_unicode_funcs_t *parent = hb_unicode_funcs_get_parent (ufuncs);
 
-    return hb_unicode_get_script (parent, codepoint);
+    return hb_unicode_script (parent, codepoint);
   }
 }
 
@@ -457,7 +457,7 @@ typedef struct {
   { \
     #name, \
     (func_setter_func_t) hb_unicode_funcs_set_##name##_func, \
-    (getter_func_t) hb_unicode_get_##name, \
+    (getter_func_t) hb_unicode_##name, \
     name##_tests, \
     G_N_ELEMENTS (name##_tests), \
     name##_tests_more, \
@@ -470,7 +470,7 @@ static const property_t properties[] =
   PROPERTY (eastasian_width, 1),
   PROPERTY (general_category, (unsigned int) HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER),
   PROPERTY (mirroring, RETURNS_UNICODE_ITSELF),
-  PROPERTY (script, (unsigned int) HB_SCRIPT_UNKNOWN),
+  PROPERTY (script, (unsigned int) HB_SCRIPT_UNKNOWN)
 };
 #undef PROPERTY
 
@@ -482,6 +482,7 @@ test_unicode_properties (gconstpointer user_data)
   gboolean failed = TRUE;
 
   g_assert (hb_unicode_funcs_is_immutable (uf));
+  g_assert (hb_unicode_funcs_get_parent (uf));
 
   for (i = 0; i < G_N_ELEMENTS (properties); i++) {
     const property_t *p = &properties[i];
@@ -510,9 +511,9 @@ test_unicode_properties (gconstpointer user_data)
 }
 
 static hb_codepoint_t
-default_value (hb_codepoint_t default_value, hb_codepoint_t unicode)
+default_value (hb_codepoint_t _default_value, hb_codepoint_t unicode)
 {
-  return default_value == RETURNS_UNICODE_ITSELF ?  unicode : default_value;
+  return _default_value == RETURNS_UNICODE_ITSELF ?  unicode : _default_value;
 }
 
 static void
@@ -549,6 +550,16 @@ test_unicode_properties_nil (void)
   hb_unicode_funcs_destroy (uf);
 }
 
+static void
+test_unicode_properties_empty (void)
+{
+  hb_unicode_funcs_t *uf = hb_unicode_funcs_get_empty ();
+
+  g_assert (uf);
+  g_assert (hb_unicode_funcs_is_immutable (uf));
+  _test_unicode_properties_nil (uf);
+}
+
 
 static void
 test_unicode_chainup (void)
@@ -609,6 +620,9 @@ test_unicode_setters (void)
     g_assert_cmphex (p->getter (uf, 'a'), ==, HB_SCRIPT_LATIN);
     g_assert_cmphex (p->getter (uf, '0'), ==, HB_SCRIPT_UNKNOWN);
 
+    p->func_setter (uf, (get_func_t) NULL, NULL, NULL);
+    g_assert (data[0].freed && !data[1].freed);
+
     g_assert (!hb_unicode_funcs_is_immutable (uf));
     hb_unicode_funcs_make_immutable (uf);
     g_assert (hb_unicode_funcs_is_immutable (uf));
@@ -616,11 +630,9 @@ test_unicode_setters (void)
     /* Since uf is immutable now, the following setter should do nothing. */
     p->func_setter (uf, (get_func_t) a_is_for_arabic_get_script, &data[1], free_up);
 
-    g_assert (!data[0].freed && !data[1].freed);
-    hb_unicode_funcs_destroy (uf);
     g_assert (data[0].freed && !data[1].freed);
-
     hb_unicode_funcs_destroy (uf);
+    g_assert (data[0].freed && !data[1].freed);
   }
 }
 
@@ -655,8 +667,8 @@ test_unicode_subclassing_nil (data_fixture_t *f, gconstpointer user_data)
   hb_unicode_funcs_set_script_func (aa, a_is_for_arabic_get_script,
                                     &f->data[1], free_up);
 
-  g_assert_cmphex (hb_unicode_get_script (aa, 'a'), ==, HB_SCRIPT_ARABIC);
-  g_assert_cmphex (hb_unicode_get_script (aa, 'b'), ==, HB_SCRIPT_UNKNOWN);
+  g_assert_cmphex (hb_unicode_script (aa, 'a'), ==, HB_SCRIPT_ARABIC);
+  g_assert_cmphex (hb_unicode_script (aa, 'b'), ==, HB_SCRIPT_UNKNOWN);
 
   g_assert (!f->data[0].freed && !f->data[1].freed);
   hb_unicode_funcs_destroy (aa);
@@ -674,8 +686,8 @@ test_unicode_subclassing_default (data_fixture_t *f, gconstpointer user_data)
   hb_unicode_funcs_set_script_func (aa, a_is_for_arabic_get_script,
                                     &f->data[1], free_up);
 
-  g_assert_cmphex (hb_unicode_get_script (aa, 'a'), ==, HB_SCRIPT_ARABIC);
-  g_assert_cmphex (hb_unicode_get_script (aa, 'b'), ==, HB_SCRIPT_LATIN);
+  g_assert_cmphex (hb_unicode_script (aa, 'a'), ==, HB_SCRIPT_ARABIC);
+  g_assert_cmphex (hb_unicode_script (aa, 'b'), ==, HB_SCRIPT_LATIN);
 
   g_assert (!f->data[0].freed && !f->data[1].freed);
   hb_unicode_funcs_destroy (aa);
@@ -702,9 +714,9 @@ test_unicode_subclassing_deep (data_fixture_t *f, gconstpointer user_data)
   hb_unicode_funcs_set_script_func (aa, a_is_for_arabic_get_script,
                                     &f->data[1], free_up);
 
-  g_assert_cmphex (hb_unicode_get_script (aa, 'a'), ==, HB_SCRIPT_ARABIC);
-  g_assert_cmphex (hb_unicode_get_script (aa, 'b'), ==, HB_SCRIPT_LATIN);
-  g_assert_cmphex (hb_unicode_get_script (aa, '0'), ==, HB_SCRIPT_UNKNOWN);
+  g_assert_cmphex (hb_unicode_script (aa, 'a'), ==, HB_SCRIPT_ARABIC);
+  g_assert_cmphex (hb_unicode_script (aa, 'b'), ==, HB_SCRIPT_LATIN);
+  g_assert_cmphex (hb_unicode_script (aa, '0'), ==, HB_SCRIPT_UNKNOWN);
 
   g_assert (!f->data[0].freed && !f->data[1].freed);
   hb_unicode_funcs_destroy (aa);
@@ -767,21 +779,92 @@ test_unicode_script_roundtrip (gconstpointer user_data)
 }
 
 
+/* TODO test compose() and decompose() */
+static void
+test_unicode_normalization (gconstpointer user_data)
+{
+  hb_unicode_funcs_t *uf = (hb_unicode_funcs_t *) user_data;
+  gunichar a, b, ab;
+
+
+  /* Test compose() */
+
+  /* Not composable */
+  g_assert (!hb_unicode_compose (uf, 0x0041, 0x0042, &ab) && ab == 0);
+  g_assert (!hb_unicode_compose (uf, 0x0041, 0, &ab) && ab == 0);
+  g_assert (!hb_unicode_compose (uf, 0x0066, 0x0069, &ab) && ab == 0);
+
+  /* Singletons should not compose */
+  g_assert (!hb_unicode_compose (uf, 0x212B, 0, &ab) && ab == 0);
+  g_assert (!hb_unicode_compose (uf, 0x00C5, 0, &ab) && ab == 0);
+  g_assert (!hb_unicode_compose (uf, 0x2126, 0, &ab) && ab == 0);
+  g_assert (!hb_unicode_compose (uf, 0x03A9, 0, &ab) && ab == 0);
+
+  /* Pairs */
+  g_assert (hb_unicode_compose (uf, 0x0041, 0x030A, &ab) && ab == 0x00C5);
+  g_assert (hb_unicode_compose (uf, 0x006F, 0x0302, &ab) && ab == 0x00F4);
+  g_assert (hb_unicode_compose (uf, 0x1E63, 0x0307, &ab) && ab == 0x1E69);
+  g_assert (hb_unicode_compose (uf, 0x0073, 0x0323, &ab) && ab == 0x1E63);
+  g_assert (hb_unicode_compose (uf, 0x0064, 0x0307, &ab) && ab == 0x1E0B);
+  g_assert (hb_unicode_compose (uf, 0x0064, 0x0323, &ab) && ab == 0x1E0D);
+
+  /* Hangul */
+  g_assert (hb_unicode_compose (uf, 0xD4CC, 0x11B6, &ab) && ab == 0xD4DB);
+  g_assert (hb_unicode_compose (uf, 0x1111, 0x1171, &ab) && ab == 0xD4CC);
+  g_assert (hb_unicode_compose (uf, 0xCE20, 0x11B8, &ab) && ab == 0xCE31);
+  g_assert (hb_unicode_compose (uf, 0x110E, 0x1173, &ab) && ab == 0xCE20);
+
+
+  /* Test decompose() */
+
+  /* Not decomposable */
+  g_assert (!hb_unicode_decompose (uf, 0x0041, &a, &b) && a == 0x0041 && b == 0);
+  g_assert (!hb_unicode_decompose (uf, 0xFB01, &a, &b) && a == 0xFB01 && b == 0);
+
+  /* Singletons */
+  g_assert (hb_unicode_decompose (uf, 0x212B, &a, &b));
+  g_assert_cmphex (a, ==, 0x00C5);
+  g_assert_cmphex (b, ==, 0);
+  g_assert (hb_unicode_decompose (uf, 0x212B, &a, &b) && a == 0x00C5 && b == 0);
+  g_assert (hb_unicode_decompose (uf, 0x2126, &a, &b) && a == 0x03A9 && b == 0);
+
+  /* Pairs */
+  g_assert (hb_unicode_decompose (uf, 0x00C5, &a, &b) && a == 0x0041 && b == 0x030A);
+  g_assert (hb_unicode_decompose (uf, 0x00F4, &a, &b) && a == 0x006F && b == 0x0302);
+  g_assert (hb_unicode_decompose (uf, 0x1E69, &a, &b) && a == 0x1E63 && b == 0x0307);
+  g_assert (hb_unicode_decompose (uf, 0x1E63, &a, &b) && a == 0x0073 && b == 0x0323);
+  g_assert (hb_unicode_decompose (uf, 0x1E0B, &a, &b) && a == 0x0064 && b == 0x0307);
+  g_assert (hb_unicode_decompose (uf, 0x1E0D, &a, &b) && a == 0x0064 && b == 0x0323);
+
+  /* Hangul */
+  g_assert (hb_unicode_decompose (uf, 0xD4DB, &a, &b) && a == 0xD4CC && b == 0x11B6);
+  g_assert (hb_unicode_decompose (uf, 0xD4CC, &a, &b) && a == 0x1111 && b == 0x1171);
+  g_assert (hb_unicode_decompose (uf, 0xCE31, &a, &b) && a == 0xCE20 && b == 0x11B8);
+  g_assert (hb_unicode_decompose (uf, 0xCE20, &a, &b) && a == 0x110E && b == 0x1173);
+
+}
+
+
+
 int
 main (int argc, char **argv)
 {
   hb_test_init (&argc, &argv);
 
   hb_test_add (test_unicode_properties_nil);
+  hb_test_add (test_unicode_properties_empty);
 
   hb_test_add_data_flavor (hb_unicode_funcs_get_default (),          "default", test_unicode_properties);
+  hb_test_add_data_flavor (hb_unicode_funcs_get_default (),          "default", test_unicode_normalization);
   hb_test_add_data_flavor ((gconstpointer) script_roundtrip_default, "default", test_unicode_script_roundtrip);
 #ifdef HAVE_GLIB
   hb_test_add_data_flavor (hb_glib_get_unicode_funcs (),             "glib",    test_unicode_properties);
+  hb_test_add_data_flavor (hb_glib_get_unicode_funcs (),             "glib",    test_unicode_normalization);
   hb_test_add_data_flavor ((gconstpointer) script_roundtrip_glib,    "glib",    test_unicode_script_roundtrip);
 #endif
 #ifdef HAVE_ICU
   hb_test_add_data_flavor (hb_icu_get_unicode_funcs (),              "icu",     test_unicode_properties);
+  hb_test_add_data_flavor (hb_icu_get_unicode_funcs (),              "icu",     test_unicode_normalization);
   hb_test_add_data_flavor ((gconstpointer) script_roundtrip_icu,     "icu",     test_unicode_script_roundtrip);
 #endif