[mutter] tests/stage-view: Test that timelime adapts to actor moving across views
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] tests/stage-view: Test that timelime adapts to actor moving across views
- Date: Thu, 2 Jul 2020 20:55:11 +0000 (UTC)
commit e12ce70385ea2d75f2785097b82cfaef71789e3f
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Tue Jun 2 14:56:22 2020 +0200
tests/stage-view: Test that timelime adapts to actor moving across views
The timeline should switch frame clock, and automatically continue on
the new frame clock.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1285
src/tests/stage-view-tests.c | 146 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 146 insertions(+)
---
diff --git a/src/tests/stage-view-tests.c b/src/tests/stage-view-tests.c
index 0533d0afa7..f0691be591 100644
--- a/src/tests/stage-view-tests.c
+++ b/src/tests/stage-view-tests.c
@@ -666,6 +666,150 @@ meta_test_actor_stage_views_frame_clock (void)
clutter_actor_destroy (actor_3);
}
+typedef struct _TimelineTest
+{
+ GMainLoop *main_loop;
+ ClutterFrameClock *frame_clock_1;
+ ClutterFrameClock *frame_clock_2;
+ int phase;
+
+ int frame_counter[2];
+} TimelineTest;
+
+static void
+on_transition_stopped (ClutterTransition *transition,
+ gboolean is_finished,
+ TimelineTest *test)
+{
+ g_assert_true (is_finished);
+
+ g_assert_cmpint (test->phase, ==, 2);
+
+ test->phase = 3;
+
+ g_main_loop_quit (test->main_loop);
+}
+
+static void
+on_transition_new_frame (ClutterTransition *transition,
+ int elapsed_time_ms,
+ TimelineTest *test)
+{
+ ClutterTimeline *timeline = CLUTTER_TIMELINE (transition);
+
+ if (test->phase == 1)
+ {
+ g_assert (clutter_timeline_get_frame_clock (timeline) ==
+ test->frame_clock_1);
+ test->frame_counter[0]++;
+ }
+ else if (test->phase == 2)
+ {
+ g_assert (clutter_timeline_get_frame_clock (timeline) ==
+ test->frame_clock_2);
+ test->frame_counter[1]++;
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
+}
+
+static void
+on_transition_frame_clock_changed (ClutterTimeline *timeline,
+ GParamSpec *pspec,
+ TimelineTest *test)
+{
+ ClutterFrameClock *frame_clock;
+
+ frame_clock = clutter_timeline_get_frame_clock (timeline);
+ g_assert (frame_clock == test->frame_clock_2);
+ g_assert_cmpint (test->phase, ==, 1);
+
+ test->phase = 2;
+}
+
+static void
+meta_test_actor_stage_views_timeline (void)
+{
+ TimelineTest test = { 0 };
+ MetaBackend *backend = meta_get_backend ();
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+ MetaMonitorManagerTest *monitor_manager_test =
+ META_MONITOR_MANAGER_TEST (monitor_manager);
+ ClutterActor *stage = meta_backend_get_stage (backend);
+ MonitorTestCaseSetup frame_clock_test_setup;
+ ClutterActor *actor;
+ GList *stage_views;
+ ClutterStageView *stage_view_1;
+ ClutterStageView *stage_view_2;
+ MetaMonitorTestSetup *test_setup;
+ ClutterTransition *transition;
+
+ frame_clock_test_setup = initial_test_case_setup;
+ frame_clock_test_setup.modes[1].width = 1024;
+ frame_clock_test_setup.modes[1].height = 768;
+ frame_clock_test_setup.modes[1].refresh_rate = 30.0;
+ frame_clock_test_setup.n_modes = 2;
+ frame_clock_test_setup.outputs[1].modes[0] = 1;
+ frame_clock_test_setup.outputs[1].preferred_mode = 1;
+ test_setup = create_monitor_test_setup (&frame_clock_test_setup,
+ MONITOR_TEST_FLAG_NO_STORED);
+ meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup);
+
+ stage_views = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage));
+ stage_view_1 = stage_views->data;
+ stage_view_2 = stage_views->next->data;
+ g_assert_nonnull (stage_view_1);
+ g_assert_nonnull (stage_view_2);
+ test.frame_clock_1 = clutter_stage_view_get_frame_clock (stage_view_1);
+ test.frame_clock_2 = clutter_stage_view_get_frame_clock (stage_view_2);
+ g_assert_nonnull (test.frame_clock_1);
+ g_assert_nonnull (test.frame_clock_2);
+
+ actor = clutter_actor_new ();
+ clutter_actor_set_size (actor, 100, 100);
+ clutter_actor_set_position (actor, 100, 100);
+ clutter_actor_add_child (stage, actor);
+
+ clutter_actor_show (stage);
+
+ wait_for_paint (stage);
+
+ is_on_stage_views (actor, 1, stage_views->data);
+
+ clutter_actor_set_easing_duration (actor, 1000);
+ clutter_actor_set_position (actor, 1200, 300);
+
+ transition = clutter_actor_get_transition (actor, "position");
+ g_assert_nonnull (transition);
+ g_assert (clutter_timeline_get_frame_clock (CLUTTER_TIMELINE (transition)) ==
+ test.frame_clock_1);
+
+ test.main_loop = g_main_loop_new (NULL, FALSE);
+ g_signal_connect (transition, "stopped",
+ G_CALLBACK (on_transition_stopped),
+ &test);
+ g_signal_connect (transition, "new-frame",
+ G_CALLBACK (on_transition_new_frame),
+ &test);
+ g_signal_connect (transition, "notify::frame-clock",
+ G_CALLBACK (on_transition_frame_clock_changed),
+ &test);
+
+ test.phase = 1;
+
+ g_main_loop_run (test.main_loop);
+
+ g_assert_cmpint (test.phase, ==, 3);
+ g_assert_cmpint (test.frame_counter[0], >, 0);
+ g_assert_cmpint (test.frame_counter[1], >, 0);
+
+ clutter_actor_destroy (actor);
+ g_main_loop_unref (test.main_loop);
+}
+
static void
init_tests (int argc, char **argv)
{
@@ -685,6 +829,8 @@ init_tests (int argc, char **argv)
meta_test_actor_stage_views_hot_plug);
g_test_add_func ("/stage-views/actor-stage-views-frame-clock",
meta_test_actor_stage_views_frame_clock);
+ g_test_add_func ("/stage-views/actor-stage-views-timeline",
+ meta_test_actor_stage_views_timeline);
}
int
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]