1c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/*
2c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Copyright (C) 2016 The Android Open Source Project
3c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
4c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * you may not use this file except in compliance with the License.
6c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * You may obtain a copy of the License at
7c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
8c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
10c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * See the License for the specific language governing permissions and
14c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * limitations under the License.
15c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
16c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
17c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipackage android.support.transition;
18c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
19c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.CoreMatchers.is;
20c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.CoreMatchers.notNullValue;
21c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.MatcherAssert.assertThat;
22c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport static org.hamcrest.Matchers.sameInstance;
234ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Matchers.any;
244ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.mock;
254ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.never;
264ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.timeout;
274ad129858d830ad78de60665fc32d8785e57d541Yuichi Arakiimport static org.mockito.Mockito.verify;
28c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
29c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.test.annotation.UiThreadTest;
30754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest;
31c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.support.transition.test.R;
32c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup;
33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport org.junit.Before;
35c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport org.junit.Test;
36c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
3724797374d6c3370ab857f254e8e58248c41c3dd9Aurimas Liutikas@MediumTest
38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipublic class TransitionManagerTest extends BaseTest {
39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    private Scene[] mScenes = new Scene[2];
41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Before
43c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void prepareScenes() {
44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        TransitionActivity activity = rule.getActivity();
45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        ViewGroup root = activity.getRoot();
46da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki        mScenes[0] = Scene.getSceneForLayout(root, R.layout.support_scene0, activity);
47da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki        mScenes[1] = Scene.getSceneForLayout(root, R.layout.support_scene1, activity);
48c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
49c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
50c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void testSetup() {
52c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(mScenes[0], is(notNullValue()));
53c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(mScenes[1], is(notNullValue()));
54c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
55c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
57c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @UiThreadTest
58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public void testGo_enterAction() {
59c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        CheckCalledRunnable runnable = new CheckCalledRunnable();
60c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mScenes[0].setEnterAction(runnable);
61c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(runnable.wasCalled(), is(false));
62c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        TransitionManager.go(mScenes[0]);
63c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat(runnable.wasCalled(), is(true));
64c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
65c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
66c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
6742e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas    public void testGo_exitAction() throws Throwable {
6841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        final CheckCalledRunnable enter = new CheckCalledRunnable();
6941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        final CheckCalledRunnable exit = new CheckCalledRunnable();
7041a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        mScenes[0].setEnterAction(enter);
7141a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        mScenes[0].setExitAction(exit);
7242e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        rule.runOnUiThread(new Runnable() {
7341a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            @Override
7441a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            public void run() {
7541a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(enter.wasCalled(), is(false));
7641a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(exit.wasCalled(), is(false));
7741a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                TransitionManager.go(mScenes[0]);
7841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(enter.wasCalled(), is(true));
7941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(exit.wasCalled(), is(false));
8041a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            }
8141a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        });
8241a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        // Let the main thread catch up with the scene change
8342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        rule.runOnUiThread(new Runnable() {
8441a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            @Override
8541a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            public void run() {
8641a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                TransitionManager.go(mScenes[1]);
8741a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki                assertThat(exit.wasCalled(), is(true));
8841a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki            }
8941a59e26f1685123d106b851fbfcb2672410c925Yuichi Araki        });
90c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
91c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
92c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
9342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas    public void testGo_transitionListenerStart() throws Throwable {
9442e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        final SyncTransitionListener listener =
9542e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas                new SyncTransitionListener(SyncTransitionListener.EVENT_START);
9642e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        rule.runOnUiThread(new Runnable() {
97c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            @Override
98c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            public void run() {
99c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                Transition transition = new AutoTransition();
100c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                transition.setDuration(0);
101c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                assertThat(transition.addListener(listener), is(sameInstance(transition)));
102c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                TransitionManager.go(mScenes[0], transition);
103c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
104c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        });
105c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat("Timed out waiting for the TransitionListener",
106c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                listener.await(), is(true));
107c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
108c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
109c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Test
11042e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas    public void testGo_transitionListenerEnd() throws Throwable {
11142e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        final SyncTransitionListener listener =
11242e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas                new SyncTransitionListener(SyncTransitionListener.EVENT_END);
11342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas        rule.runOnUiThread(new Runnable() {
114c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            @Override
115c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            public void run() {
116c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                Transition transition = new AutoTransition();
117c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                transition.setDuration(0);
118c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                assertThat(transition.addListener(listener), is(sameInstance(transition)));
119c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                TransitionManager.go(mScenes[0], transition);
120c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            }
121c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        });
122c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        assertThat("Timed out waiting for the TransitionListener",
123c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki                listener.await(), is(true));
124c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
125c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
126da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki    @Test
127da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki    public void testGo_nullParameter() throws Throwable {
128da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki        final ViewGroup root = rule.getActivity().getRoot();
129da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki        rule.runOnUiThread(new Runnable() {
130da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki            @Override
131da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki            public void run() {
132da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki                TransitionManager.go(mScenes[0], null);
133da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki                assertThat(Scene.getCurrentScene(root), is(mScenes[0]));
134da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki                TransitionManager.go(mScenes[1], null);
135da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki                assertThat(Scene.getCurrentScene(root), is(mScenes[1]));
136da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki            }
137da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki        });
138da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki    }
139da7f2526bb3d29c8233418496ae5d740d0665b27Yuichi Araki
1404ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    @Test
1414ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    public void testEndTransitions() throws Throwable {
1424ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        final ViewGroup root = rule.getActivity().getRoot();
1434ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        final Transition transition = new AutoTransition();
1444ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        // This transition is very long, but will be forced to end as soon as it starts
1454ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        transition.setDuration(30000);
1464ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        final Transition.TransitionListener listener = mock(Transition.TransitionListener.class);
1474ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        transition.addListener(listener);
1484ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        rule.runOnUiThread(new Runnable() {
1494ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            @Override
1504ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            public void run() {
1514ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki                TransitionManager.go(mScenes[0], transition);
1524ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            }
1534ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        });
1544ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        verify(listener, timeout(3000)).onTransitionStart(any(Transition.class));
1554ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        rule.runOnUiThread(new Runnable() {
1564ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            @Override
1574ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            public void run() {
1584ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki                TransitionManager.endTransitions(root);
1594ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            }
1604ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        });
1614ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        verify(listener, timeout(3000)).onTransitionEnd(any(Transition.class));
1624ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    }
1634ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki
1644ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    @Test
1654ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    public void testEndTransitionsBeforeStarted() throws Throwable {
1664ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        final ViewGroup root = rule.getActivity().getRoot();
1674ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        final Transition transition = new AutoTransition();
1684ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        transition.setDuration(0);
1694ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        final Transition.TransitionListener listener = mock(Transition.TransitionListener.class);
1704ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        transition.addListener(listener);
1714ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        rule.runOnUiThread(new Runnable() {
1724ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            @Override
1734ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            public void run() {
1744ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki                TransitionManager.go(mScenes[0], transition);
1754ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki                // This terminates the transition before it starts
1764ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki                TransitionManager.endTransitions(root);
1774ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki            }
1784ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        });
1794ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        verify(listener, never()).onTransitionStart(any(Transition.class));
1804ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki        verify(listener, never()).onTransitionEnd(any(Transition.class));
1814ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki    }
1824ad129858d830ad78de60665fc32d8785e57d541Yuichi Araki
183c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki}
184