From 419a6a38f20781439669339c7a970d653523c5e7 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Sun, 18 Dec 2011 20:59:07 +0000 Subject: [PATCH] conform: Add a suite for the Actor scene graph API Verify that insertion and removal maintain a stable graph, with pointers to the various children. This should help out tracking regressions in the scene graph API. --- tests/conform/Makefile.am | 1 + tests/conform/test-actor-graph.c | 147 ++++++++++++++++++++++++++++++ tests/conform/test-conform-main.c | 7 +- 3 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 tests/conform/test-actor-graph.c diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am index b34df28a1..ccc07aca0 100644 --- a/tests/conform/Makefile.am +++ b/tests/conform/Makefile.am @@ -59,6 +59,7 @@ units_sources += \ # actors tests units_sources += \ + test-actor-graph.c \ test-actor-destroy.c \ test-actor-invariants.c \ test-actor-layout.c \ diff --git a/tests/conform/test-actor-graph.c b/tests/conform/test-actor-graph.c new file mode 100644 index 000000000..1d34fa792 --- /dev/null +++ b/tests/conform/test-actor-graph.c @@ -0,0 +1,147 @@ +#include +#include "test-conform-common.h" + +void +actor_add_child (TestConformSimpleFixture *fixture, + gconstpointer dummy) +{ + ClutterActor *actor = clutter_actor_new (); + ClutterActor *iter; + + g_object_ref_sink (actor); + + clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR, + "name", "foo", + NULL)); + clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR, + "name", "bar", + NULL)); + clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR, + "name", "baz", + NULL)); + + g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 3); + + iter = clutter_actor_get_first_child (actor); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "foo"); + + iter = clutter_actor_get_next_sibling (iter); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "bar"); + + iter = clutter_actor_get_next_sibling (iter); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "baz"); + g_assert (iter == clutter_actor_get_last_child (actor)); + g_assert (clutter_actor_get_next_sibling (iter) == NULL); + + iter = clutter_actor_get_last_child (actor); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "baz"); + + iter = clutter_actor_get_previous_sibling (iter); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "bar"); + + iter = clutter_actor_get_previous_sibling (iter); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "foo"); + g_assert (iter == clutter_actor_get_first_child (actor)); + g_assert (clutter_actor_get_previous_sibling (iter) == NULL); + + clutter_actor_destroy (actor); + g_object_unref (actor); +} + +void +actor_insert_child (TestConformSimpleFixture *fixture, + gconstpointer data) +{ + ClutterActor *actor = clutter_actor_new (); + ClutterActor *iter; + + g_object_ref_sink (actor); + + clutter_actor_insert_child_at_index (actor, + g_object_new (CLUTTER_TYPE_ACTOR, + "name", "foo", + NULL), + 0); + + iter = clutter_actor_get_first_child (actor); + g_assert (iter != NULL); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "foo"); + g_assert (iter == clutter_actor_get_child_at_index (actor, 0)); + + clutter_actor_insert_child_below (actor, + g_object_new (CLUTTER_TYPE_ACTOR, + "name", "bar", + NULL), + iter); + + g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 2); + + iter = clutter_actor_get_first_child (actor); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "bar"); + iter = clutter_actor_get_next_sibling (iter); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "foo"); + g_assert (iter == clutter_actor_get_child_at_index (actor, 1)); + + iter = clutter_actor_get_first_child (actor); + clutter_actor_insert_child_above (actor, + g_object_new (CLUTTER_TYPE_ACTOR, + "name", "baz", + NULL), + iter); + + iter = clutter_actor_get_last_child (actor); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "foo"); + + iter = clutter_actor_get_previous_sibling (iter); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "baz"); + + iter = clutter_actor_get_previous_sibling (iter); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "bar"); + + clutter_actor_destroy (actor); + g_object_unref (actor); +} + +void +actor_remove_child (TestConformSimpleFixture *fixture, + gconstpointer data) +{ + ClutterActor *actor = clutter_actor_new (); + ClutterActor *iter; + + g_object_ref_sink (actor); + + clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR, + "name", "foo", + NULL)); + clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR, + "name", "bar", + NULL)); + + g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 2); + + g_assert (clutter_actor_get_first_child (actor) != clutter_actor_get_last_child (actor)); + + iter = clutter_actor_get_first_child (actor); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "foo"); + + iter = clutter_actor_get_last_child (actor); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "bar"); + + clutter_actor_remove_child (actor, clutter_actor_get_first_child (actor)); + + g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 1); + + iter = clutter_actor_get_first_child (actor); + g_assert_cmpstr (clutter_actor_get_name (iter), ==, "bar"); + g_assert (clutter_actor_get_first_child (actor) == clutter_actor_get_last_child (actor)); + + clutter_actor_remove_child (actor, clutter_actor_get_first_child (actor)); + + g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 0); + g_assert (clutter_actor_get_first_child (actor) == NULL); + g_assert (clutter_actor_get_last_child (actor) == NULL); + + clutter_actor_destroy (actor); + g_object_unref (actor); +} diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c index c9903471a..fbd4acd11 100644 --- a/tests/conform/test-conform-main.c +++ b/tests/conform/test-conform-main.c @@ -128,15 +128,18 @@ main (int argc, char **argv) /* sanity check for the test suite itself */ TEST_CONFORM_TODO ("/suite", verify_failure); + TEST_CONFORM_SIMPLE ("/actor", actor_add_child); + TEST_CONFORM_SIMPLE ("/actor", actor_insert_child); + TEST_CONFORM_SIMPLE ("/actor", actor_remove_child); TEST_CONFORM_SIMPLE ("/actor", actor_destruction); TEST_CONFORM_SIMPLE ("/actor", actor_anchors); TEST_CONFORM_SIMPLE ("/actor", actor_picking); TEST_CONFORM_SIMPLE ("/actor", actor_fixed_size); TEST_CONFORM_SIMPLE ("/actor", actor_preferred_size); - TEST_CONFORM_SIMPLE ("/actor", test_offscreen_redirect); - TEST_CONFORM_SIMPLE ("/actor", test_shader_effect); TEST_CONFORM_SIMPLE ("/actor", basic_layout); TEST_CONFORM_SIMPLE ("/actor", margin_layout); + TEST_CONFORM_SIMPLE ("/actor", test_offscreen_redirect); + TEST_CONFORM_SIMPLE ("/actor", test_shader_effect); TEST_CONFORM_SIMPLE ("/invariants", test_initial_state); TEST_CONFORM_SIMPLE ("/invariants", test_shown_not_parented);