conform/actor: Add unit for the Container signals
authorEmmanuele Bassi <ebassi@linux.intel.com>
Thu, 9 Feb 2012 16:44:28 +0000 (16:44 +0000)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Thu, 9 Feb 2012 16:48:08 +0000 (16:48 +0000)
ClutterActor should be emitting signals defined on the ClutterContainer
interface, as well as ensuring that manipulating the scene graph is
still possible from within them.

The new unit checks that we're emitting signals, by implementing
something similar to the Bin class available in toolkits like gtk, st,
and mx — i.e. a container that can only hold one child at any given
point.

tests/conform/test-actor-graph.c
tests/conform/test-conform-main.c

index af2343b..6f2db61 100644 (file)
@@ -374,3 +374,77 @@ actor_remove_all (TestConformSimpleFixture *fixture,
   clutter_actor_destroy (actor);
   g_object_unref (actor);
 }
+
+static void
+actor_added (ClutterContainer *container,
+             ClutterActor     *child,
+             gpointer          data)
+{
+  ClutterActor *actor = CLUTTER_ACTOR (container);
+  int *counter = data;
+  ClutterActor *old_child;
+
+  if (g_test_verbose ())
+    g_print ("Adding actor '%s'\n", clutter_actor_get_name (child));
+
+  old_child = clutter_actor_get_child_at_index (actor, 0);
+  if (old_child != child)
+    clutter_actor_remove_child (actor, old_child);
+
+  *counter += 1;
+}
+
+static void
+actor_removed (ClutterContainer *container,
+               ClutterActor     *child,
+               gpointer          data)
+{
+  int *counter = data;
+
+  if (g_test_verbose ())
+    g_print ("Removing actor '%s'\n", clutter_actor_get_name (child));
+
+  *counter += 1;
+}
+
+void
+actor_container_signals (TestConformSimpleFixture *fixture G_GNUC_UNUSED,
+                         gconstpointer data G_GNUC_UNUSED)
+{
+  ClutterActor *actor = clutter_actor_new ();
+  int add_count, remove_count;
+
+  g_object_ref_sink (actor);
+
+  add_count = remove_count = 0;
+  g_signal_connect (actor,
+                    "actor-added", G_CALLBACK (actor_added),
+                    &add_count);
+  g_signal_connect (actor,
+                    "actor-removed", G_CALLBACK (actor_removed),
+                    &remove_count);
+
+  clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
+                                                "name", "foo",
+                                                NULL));
+
+  g_assert_cmpint (add_count, ==, 1);
+  g_assert_cmpint (remove_count, ==, 0);
+  g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 1);
+
+  clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
+                                                "name", "bar",
+                                                NULL));
+
+  g_assert_cmpint (add_count, ==, 2);
+  g_assert_cmpint (remove_count, ==, 1);
+  g_assert_cmpint (clutter_actor_get_n_children (actor), ==, 1);
+
+  g_signal_handlers_disconnect_by_func (actor, G_CALLBACK (actor_added),
+                                        &add_count);
+  g_signal_handlers_disconnect_by_func (actor, G_CALLBACK (actor_removed),
+                                        &remove_count);
+
+  clutter_actor_destroy (actor);
+  g_object_unref (actor);
+}
index 1a6f608..c2aba65 100644 (file)
@@ -135,6 +135,7 @@ main (int argc, char **argv)
   TEST_CONFORM_SIMPLE ("/actor", actor_replace_child);
   TEST_CONFORM_SIMPLE ("/actor", actor_remove_child);
   TEST_CONFORM_SIMPLE ("/actor", actor_remove_all);
+  TEST_CONFORM_SIMPLE ("/actor", actor_container_signals);
   TEST_CONFORM_SIMPLE ("/actor", actor_destruction);
   TEST_CONFORM_SIMPLE ("/actor", actor_anchors);
   TEST_CONFORM_SIMPLE ("/actor", actor_picking);