summaryrefslogtreecommitdiff
path: root/tests/test-layout.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-11-22 23:01:25 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-11-24 19:57:58 -0500
commit9a63774e6f6bdc262da09088aa9075330798f18a (patch)
tree757ac7d55526ce8ebaff02145feae8a5d8c52e57 /tests/test-layout.c
parent3f6f2887f02ee6cf98d115085b0dcff681696e0e (diff)
downloadpango-9a63774e6f6bdc262da09088aa9075330798f18a.tar.gz
Update test-layout
Use the new output serialization in test-layout to store both the input and output in the same file.
Diffstat (limited to 'tests/test-layout.c')
-rw-r--r--tests/test-layout.c286
1 files changed, 32 insertions, 254 deletions
diff --git a/tests/test-layout.c b/tests/test-layout.c
index f4b36c77..b664af5d 100644
--- a/tests/test-layout.c
+++ b/tests/test-layout.c
@@ -36,194 +36,9 @@ static PangoContext *context;
static gboolean opt_show_font;
-static const gchar *
-enum_value_nick (GType type, gint value)
+static GBytes *
+test_bytes (GBytes *orig)
{
- GEnumClass *eclass;
- GEnumValue *ev;
-
- eclass = g_type_class_ref (type);
- ev = g_enum_get_value (eclass, value);
- g_type_class_unref (eclass);
-
- if (ev)
- return ev->value_nick;
- else
- return "?";
-}
-
-static const gchar *
-direction_name (PangoDirection dir)
-{
- return enum_value_nick (PANGO_TYPE_DIRECTION, dir);
-}
-
-static const gchar *
-gravity_name (PangoGravity gravity)
-{
- return enum_value_nick (PANGO_TYPE_GRAVITY, gravity);
-}
-
-static const gchar *
-script_name (PangoScript script)
-{
- return enum_value_nick (PANGO_TYPE_SCRIPT, script);
-}
-
-static gchar *
-font_name (PangoFont *font)
-{
- PangoFontDescription *desc;
- gchar *name;
-
- desc = pango_font_describe (font);
- name = pango_font_description_to_string (desc);
- pango_font_description_free (desc);
-
- return name;
-}
-
-static void
-dump_lines (PangoLayout *layout, GString *string)
-{
- PangoLayoutIter *iter;
- const gchar *text;
- gint index, index2;
- gboolean has_more;
- gchar *char_str;
- gint i;
- PangoLayoutLine *line;
-
- text = pango_layout_get_text (layout);
- iter = pango_layout_get_iter (layout);
-
- has_more = TRUE;
- index = pango_layout_iter_get_index (iter);
- index2 = 0;
- i = 0;
- while (has_more)
- {
- line = pango_layout_iter_get_line (iter);
- has_more = pango_layout_iter_next_line (iter);
- i++;
-
- if (has_more)
- {
- index2 = pango_layout_iter_get_index (iter);
- char_str = g_strndup (text + index, index2 - index);
- }
- else
- {
- char_str = g_strdup (text + index);
- }
-
- g_string_append_printf (string, "i=%d, index=%d, paragraph-start=%d, dir=%s '%s'\n",
- i, index, line->is_paragraph_start, direction_name (line->resolved_dir),
- char_str);
- g_free (char_str);
-
- index = index2;
- }
- pango_layout_iter_free (iter);
-}
-
-#define ANALYSIS_FLAGS (PANGO_ANALYSIS_FLAG_CENTERED_BASELINE | \
- PANGO_ANALYSIS_FLAG_IS_ELLIPSIS | \
- PANGO_ANALYSIS_FLAG_NEED_HYPHEN)
-
-static void
-dump_runs (PangoLayout *layout, GString *string)
-{
- PangoLayoutIter *iter;
- PangoLayoutRun *run;
- PangoItem *item;
- const gchar *text;
- gint index;
- gboolean has_more;
- gchar *char_str;
- gint i;
- gchar *font = 0;
-
- text = pango_layout_get_text (layout);
- iter = pango_layout_get_iter (layout);
-
- has_more = TRUE;
- i = 0;
- while (has_more)
- {
- run = pango_layout_iter_get_run (iter);
- index = pango_layout_iter_get_index (iter);
- has_more = pango_layout_iter_next_run (iter);
- i++;
-
- if (run)
- {
- item = ((PangoGlyphItem*)run)->item;
- char_str = g_strndup (text + item->offset, item->length);
- font = font_name (item->analysis.font);
- g_string_append_printf (string, "i=%d, index=%d, chars=%d, level=%d, gravity=%s, flags=%d, font=%s, script=%s, language=%s, '%s'\n",
- i, index, item->num_chars, item->analysis.level,
- gravity_name (item->analysis.gravity),
- item->analysis.flags & ANALYSIS_FLAGS,
- opt_show_font ? font : "OMITTED", /* for some reason, this fails on build.gnome.org, so leave it out */
- script_name (item->analysis.script),
- pango_language_to_string (item->analysis.language),
- char_str);
- print_attributes (item->analysis.extra_attrs, string);
- g_free (font);
- g_free (char_str);
- }
- else
- {
- g_string_append_printf (string, "i=%d, index=%d, no run, line end\n",
- i, index);
- }
- }
- pango_layout_iter_free (iter);
-}
-
-static void
-dump_directions (PangoLayout *layout, GString *string)
-{
- const char *text, *p;
-
- text = pango_layout_get_text (layout);
- for (p = text; *p; p = g_utf8_next_char (p))
- {
- g_string_append_printf (string, "%d ", pango_layout_get_direction (layout, p - text));
- }
- g_string_append (string, "\n");
-}
-
-static void
-dump_cursor_positions (PangoLayout *layout, GString *string)
-{
- const char *text;
- int index, trailing;
-
- text = pango_layout_get_text (layout);
-
- index = 0;
- trailing = 0;
-
- while (index < G_MAXINT)
- {
- g_string_append_printf (string, "%d(%d) ", index, trailing);
-
- while (trailing--)
- index = g_utf8_next_char (text + index) - text;
-
- pango_layout_move_cursor_visually (layout, TRUE, index, 0, 1, &index, &trailing);
- }
-
- g_string_append (string, "\n");
-}
-
-static void
-test_file (const char *filename, GString *string)
-{
- char *contents;
- gsize length;
GBytes *bytes;
GError *error = NULL;
PangoLayout *layout;
@@ -231,76 +46,29 @@ test_file (const char *filename, GString *string)
if (context == NULL)
context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
- g_file_get_contents (filename, &contents, &length, &error);
- g_assert_no_error (error);
-
- bytes = g_bytes_new_take (contents, length);
-
- layout = pango_layout_deserialize (context, bytes, PANGO_LAYOUT_DESERIALIZE_DEFAULT, &error);
+ layout = pango_layout_deserialize (context, orig, PANGO_LAYOUT_DESERIALIZE_CONTEXT, &error);
g_assert_no_error (error);
- g_bytes_unref (bytes);
-
- /* generate the dumps */
- g_string_append (string, pango_layout_get_text (layout));
-
- g_string_append (string, "\n--- parameters\n\n");
-
- g_string_append_printf (string, "wrapped: %d\n", pango_layout_is_wrapped (layout));
- g_string_append_printf (string, "ellipsized: %d\n", pango_layout_is_ellipsized (layout));
- g_string_append_printf (string, "lines: %d\n", pango_layout_get_line_count (layout));
- if (pango_layout_get_width (layout) > 0)
- g_string_append_printf (string, "width: %d\n", pango_layout_get_width (layout));
- if (pango_layout_get_height (layout) > 0)
- g_string_append_printf (string, "height: %d\n", pango_layout_get_height (layout));
- if (pango_layout_get_indent (layout) != 0)
- g_string_append_printf (string, "indent: %d\n", pango_layout_get_indent (layout));
-
- g_string_append (string, "\n--- attributes\n\n");
- print_attr_list (pango_layout_get_attributes (layout), string);
-
- g_string_append (string, "\n--- directions\n\n");
- dump_directions (layout, string);
-
- g_string_append (string, "\n--- cursor positions\n\n");
- dump_cursor_positions (layout, string);
-
- g_string_append (string, "\n--- lines\n\n");
- dump_lines (layout, string);
-
- g_string_append (string, "\n--- runs\n\n");
- dump_runs (layout, string);
+ bytes = pango_layout_serialize (layout, PANGO_LAYOUT_SERIALIZE_CONTEXT | PANGO_LAYOUT_SERIALIZE_OUTPUT);
g_object_unref (layout);
-}
-
-static gchar *
-get_expected_filename (const char *filename)
-{
- char *f, *p, *expected;
- f = g_strdup (filename);
- p = strstr (f, ".layout");
- if (p)
- *p = 0;
- expected = g_strconcat (f, ".expected", NULL);
-
- g_free (f);
-
- return expected;
+ return bytes;
}
static void
test_layout (gconstpointer d)
{
const char *filename = d;
- char *expected_file;
GError *error = NULL;
- GString *dump;
char *diff;
PangoFontFamily **families;
int n_families;
gboolean found_cantarell;
+ GBytes *bytes;
+ char *contents;
+ gsize length;
+ GBytes *orig;
char *old_locale = g_strdup (setlocale (LC_ALL, NULL));
setlocale (LC_ALL, "en_US.UTF-8");
@@ -330,22 +98,25 @@ test_layout (gconstpointer d)
if (!found_cantarell)
{
- char *msg = g_strdup_printf ("Cantarell font not available, skipping itemization %s", filename);
+ char *msg = g_strdup_printf ("Cantarell font not available, skipping layout %s", filename);
g_test_skip (msg);
g_free (msg);
g_free (old_locale);
return;
}
- expected_file = get_expected_filename (filename);
-
- dump = g_string_sized_new (0);
+ g_file_get_contents (filename, &contents, &length, &error);
+ g_assert_no_error (error);
+ orig = g_bytes_new_take (contents, length);
- test_file (filename, dump);
+ bytes = test_bytes (orig);
- diff = diff_with_file (expected_file, dump->str, dump->len, &error);
+ diff = diff_bytes (bytes, orig, &error);
g_assert_no_error (error);
+ g_bytes_unref (bytes);
+ g_bytes_unref (orig);
+
setlocale (LC_ALL, old_locale);
g_free (old_locale);
@@ -365,8 +136,6 @@ test_layout (gconstpointer d)
}
g_free (diff);
- g_string_free (dump, TRUE);
- g_free (expected_file);
}
int
@@ -400,12 +169,21 @@ main (int argc, char *argv[])
/* allow to easily generate expected output for new test cases */
if (argc > 1 && argv[1][0] != '-')
{
- GString *string;
+ char *contents;
+ gsize length;
+ GError *error = NULL;
+ GBytes *orig;
+ GBytes *bytes;
+
+ g_file_get_contents (argv[1], &contents, &length, &error);
+ g_assert_no_error (error);
+ orig = g_bytes_new_take (contents, length);
+ bytes = test_bytes (orig);
+
+ g_print ("%s", (const char *)g_bytes_get_data (bytes, NULL));
- string = g_string_sized_new (0);
- test_file (argv[1], string);
- g_print ("%s", string->str);
- g_string_free (string, TRUE);
+ g_bytes_unref (bytes);
+ g_bytes_unref (orig);
return 0;
}