[gtk/matthiasc/for-master] Add tests for css value transitions
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master] Add tests for css value transitions
- Date: Wed, 3 Feb 2021 13:58:08 +0000 (UTC)
commit 9cc6f3ee29fa9d3c5a5257d5b89943366e409f3d
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Feb 3 08:56:57 2021 -0500
Add tests for css value transitions
Just a few cases for now, enough to test a recently
fixed regression with shadow transitions.
testsuite/css/meson.build | 14 ++++
testsuite/css/test-css-value.c | 166 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 180 insertions(+)
---
diff --git a/testsuite/css/meson.build b/testsuite/css/meson.build
index 49c3de9367..82b8984276 100644
--- a/testsuite/css/meson.build
+++ b/testsuite/css/meson.build
@@ -44,6 +44,20 @@ test('data', test_data,
suite: 'css',
)
+test_parser = executable('test-css-value', 'test-css-value.c',
+ c_args: common_cflags,
+ dependencies: libgtk_static_dep,
+ install: get_option('install-tests'),
+ install_dir: testexecdir,
+)
+
+test('css value', test_parser,
+ args: [ '--tap', '-k' ],
+ protocol: 'tap',
+ env: csstest_env,
+ suite: 'css'
+)
+
if get_option('install-tests')
conf = configuration_data()
conf.set('libexecdir', gtk_libexecdir)
diff --git a/testsuite/css/test-css-value.c b/testsuite/css/test-css-value.c
new file mode 100644
index 0000000000..acbaf37397
--- /dev/null
+++ b/testsuite/css/test-css-value.c
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2021 Red Hat Inc.
+ *
+ * Author:
+ * Matthias Clasen <mclasen redhat com>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include "gtk/gtkcssvalueprivate.h"
+#include "gtk/gtkcsscolorvalueprivate.h"
+#include "gtk/gtkcssstylepropertyprivate.h"
+
+static gboolean
+color_is_near (const GdkRGBA *color1,
+ const GdkRGBA *color2)
+{
+ if (fabs (color1->red - color2->red) > FLT_EPSILON)
+ return FALSE;
+ if (fabs (color1->green - color2->green) > FLT_EPSILON)
+ return FALSE;
+ if (fabs (color1->blue- color2->blue) > FLT_EPSILON)
+ return FALSE;
+ if (fabs (color1->alpha- color2->alpha) > FLT_EPSILON)
+ return FALSE;
+ return TRUE;
+}
+
+static gboolean
+value_is_near (int prop,
+ GtkCssValue *value1,
+ GtkCssValue *value2)
+{
+ if (_gtk_css_value_equal (value1, value2))
+ return TRUE;
+
+ switch (prop)
+ {
+ case GTK_CSS_PROPERTY_COLOR:
+ {
+ GtkCssValue *v1, *v2;
+ const GdkRGBA *c1, *c2;
+ gboolean res;
+
+ v1 = _gtk_css_value_compute (value1, prop, NULL, NULL, NULL);
+ v2 = _gtk_css_value_compute (value2, prop, NULL, NULL, NULL);
+ c1 = gtk_css_color_value_get_rgba (v1);
+ c2 = gtk_css_color_value_get_rgba (v2);
+
+ res = color_is_near (c1, c2);
+
+ gtk_css_value_unref (v1);
+ gtk_css_value_unref (v2);
+
+ return res;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+typedef struct {
+ int prop;
+ const char *value1;
+ const char *value2;
+ double progress;
+ const char *expected;
+} ValueTransitionTest;
+
+static ValueTransitionTest tests[] = {
+ { GTK_CSS_PROPERTY_COLOR, "transparent", "rgb(255,0,0)", 0.25, "rgba(255,0,0,0.25)" },
+ { GTK_CSS_PROPERTY_BOX_SHADOW, "none", "2px 2px 10px 4px rgb(200,200,200)", 0.5, "1px 1px 5px 2px
rgb(100,100,100)" },
+ { GTK_CSS_PROPERTY_BOX_SHADOW, "2px 2px 10px 4px rgb(200,200,200)", "none", 0.5, "1px 1px 5px 2px
rgb(100,100,100)" },
+};
+
+static void
+test_transition (gconstpointer data)
+{
+ ValueTransitionTest *test = &tests[GPOINTER_TO_INT (data)];
+ GtkStyleProperty *prop;
+ GtkCssValue *value1;
+ GtkCssValue *value2;
+ GtkCssValue *expected;
+ GtkCssValue *result;
+ GtkCssParser *parser;
+ GBytes *bytes;
+
+ prop = (GtkStyleProperty *)_gtk_css_style_property_lookup_by_id (test->prop);
+
+ bytes = g_bytes_new_static (test->value1, strlen (test->value1));
+ parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, NULL, NULL, NULL);
+ value1 = _gtk_style_property_parse_value (prop, parser);
+ gtk_css_parser_unref (parser);
+ g_bytes_unref (bytes);
+
+ bytes = g_bytes_new_static (test->value1, strlen (test->value2));
+ parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, NULL, NULL, NULL);
+ value2 = _gtk_style_property_parse_value (prop, parser);
+ gtk_css_parser_unref (parser);
+ g_bytes_unref (bytes);
+
+ bytes = g_bytes_new_static (test->value1, strlen (test->expected));
+ parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, NULL, NULL, NULL);
+ expected = _gtk_style_property_parse_value (prop, parser);
+ gtk_css_parser_unref (parser);
+ g_bytes_unref (bytes);
+
+ result = _gtk_css_value_transition (value1, value2, test->prop, test->progress);
+ g_assert_true (value_is_near (test->prop, result, expected));
+
+ gtk_css_value_unref (value1);
+ gtk_css_value_unref (value2);
+ gtk_css_value_unref (expected);
+ gtk_css_value_unref (result);
+}
+
+int
+main (int argc, char **argv)
+{
+ GtkStyleProperty *previous;
+ int j;
+
+ gtk_test_init (&argc, &argv);
+
+ previous = NULL;
+ j = 0;
+ for (int i = 0; i < G_N_ELEMENTS (tests); i++)
+ {
+ ValueTransitionTest *test = &tests[i];
+ GtkStyleProperty *prop;
+ char *path;
+
+ prop = (GtkStyleProperty *)_gtk_css_style_property_lookup_by_id (test->prop);
+ if (prop != previous)
+ {
+ previous = prop;
+ j = 0;
+ }
+ else
+ j++;
+
+ path = g_strdup_printf ("/css/value/transition/%s/%d", _gtk_style_property_get_name ((GtkStyleProperty
*)prop), j);
+ g_test_add_data_func (path, GINT_TO_POINTER (i), test_transition);
+ g_free (path);
+ }
+
+ return g_test_run ();
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]