diff --git a/tests/conform/test-pick.c b/tests/conform/test-pick.c index 3095729c1..0001abeba 100644 --- a/tests/conform/test-pick.c +++ b/tests/conform/test-pick.c @@ -21,41 +21,94 @@ struct _State static gboolean on_timeout (State *state) { + int test_num = 0; int y, x; + ClutterActor *over_actor = NULL; - 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); + 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 ("actor %u -> ", state->gids[y * ACTORS_X + x]); - - if (actor == NULL) + 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++) { + 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 ("NULL: FAIL\n"); + 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; } - else - { - gid = clutter_actor_get_gid (actor); - if (gid == state->gids[y * ACTORS_X + x]) - pass = TRUE; - - if (g_test_verbose ()) - g_print ("% 8i: %s\n", gid, pass ? "pass" : "FAIL"); - } - - if (!pass) - state->pass = FALSE; - } + } clutter_main_quit ();