[test-pick] Improve to include a covering actor
authorNeil Roberts <neil@linux.intel.com>
Fri, 27 Mar 2009 21:55:40 +0000 (21:55 +0000)
committerNeil Roberts <neil@linux.intel.com>
Tue, 21 Apr 2009 12:15:34 +0000 (13:15 +0100)
Three tests are now performed on the picked squares. First there is no
covering actor which is the same as the original test. Then there is a
hidden covering actor which should not affect the results. Finally
there is a covering actor with a clip set on it so that only actors
at the borders of the stage should be pickable.

tests/conform/test-pick.c

index 3095729..0001abe 100644 (file)
@@ -21,41 +21,94 @@ struct _State
 static gboolean
 on_timeout (State *state)
 {
+  int test_num = 0;
   int y, x;
-
-  for (y = 0; y < ACTORS_Y; y++)
-    for (x = 0; x < ACTORS_X; x++)
-      {
-       gboolean pass = FALSE;
-       guint32 gid;
-       ClutterActor *actor
-         = clutter_stage_get_actor_at_pos (CLUTTER_STAGE (state->stage),
-                                           x * state->actor_width
-                                           + state->actor_width / 2,
-                                           y * state->actor_height
-                                           + state->actor_height / 2);
-
-        if (g_test_verbose ())
-          g_print ("actor %u -> ", state->gids[y * ACTORS_X + x]);
-       
-       if (actor == NULL)
+  ClutterActor *over_actor = NULL;
+
+  for (test_num = 0; test_num < 3; test_num++)
+    {
+      if (test_num == 0)
+        {
+          if (g_test_verbose ())
+            g_print ("No covering actor:\n");
+        }
+      if (test_num == 1)
+        {
+          static const ClutterColor red = { 0xff, 0x00, 0x00, 0xff };
+          /* Create an actor that covers the whole stage but that
+             isn't visible so it shouldn't affect the picking */
+          over_actor = clutter_rectangle_new_with_color (&red);
+          clutter_actor_set_size (over_actor, STAGE_WIDTH, STAGE_HEIGHT);
+          clutter_container_add (CLUTTER_CONTAINER (state->stage),
+                                 over_actor, NULL);
+          clutter_actor_hide (over_actor);
+
+          if (g_test_verbose ())
+            g_print ("Invisible covering actor:\n");
+        }
+      else if (test_num == 2)
+        {
+          /* Make the actor visible but set a clip so that only some
+             of the actors are accessible */
+          clutter_actor_show (over_actor);
+          clutter_actor_set_clip (over_actor,
+                                  state->actor_width * 2,
+                                  state->actor_height * 2,
+                                  state->actor_width * (ACTORS_X - 4),
+                                  state->actor_height * (ACTORS_Y - 4));
+
+          if (g_test_verbose ())
+            g_print ("Clipped covering actor:\n");
+        }
+
+      for (y = 0; y < ACTORS_Y; y++)
+        for (x = 0; x < ACTORS_X; x++)
           {
-            if (g_test_verbose ())
-              g_print ("NULL:     FAIL\n");
-          }
-       else
-         {
-           gid = clutter_actor_get_gid (actor);
-           if (gid == state->gids[y * ACTORS_X + x])
-             pass = TRUE;
+            gboolean pass = FALSE;
+            guint32 gid;
+            ClutterActor *actor
+              = clutter_stage_get_actor_at_pos (CLUTTER_STAGE (state->stage),
+                                                x * state->actor_width
+                                                + state->actor_width / 2,
+                                                y * state->actor_height
+                                                + state->actor_height / 2);
 
             if (g_test_verbose ())
-              g_print ("% 8i: %s\n", gid, pass ? "pass" : "FAIL");
-         }
-
-       if (!pass)
-         state->pass = FALSE;
-      }
+              g_print ("% 3i,% 3i / % 4i -> ",
+                       x, y, (int) state->gids[y * ACTORS_X + x]);
+
+            if (actor == NULL)
+              {
+                if (g_test_verbose ())
+                  g_print ("NULL:       FAIL\n");
+              }
+            else if (actor == over_actor)
+              {
+                if (test_num == 2
+                    && x >= 2 && x < ACTORS_X - 2
+                    && y >= 2 && y < ACTORS_Y - 2)
+                  pass = TRUE;
+
+                if (g_test_verbose ())
+                  g_print ("over_actor: %s\n", pass ? "pass" : "FAIL");
+              }
+            else
+              {
+                gid = clutter_actor_get_gid (actor);
+                if (gid == state->gids[y * ACTORS_X + x]
+                    && (test_num != 2
+                        || x < 2 || x >= ACTORS_X - 2
+                        || y < 2 || y >= ACTORS_Y - 2))
+                  pass = TRUE;
+
+                if (g_test_verbose ())
+                  g_print ("% 10i: %s\n", gid, pass ? "pass" : "FAIL");
+              }
+
+            if (!pass)
+              state->pass = FALSE;
+          }
+    }
 
   clutter_main_quit ();