1 /*
2  * Copyright 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.wm.shell.common.transition
18 
19 import android.testing.AndroidTestingRunner
20 import androidx.test.filters.SmallTest
21 import com.android.wm.shell.TestShellExecutor
22 import com.android.wm.shell.recents.RecentsTransitionHandler
23 import com.android.wm.shell.recents.RecentsTransitionStateListener
24 import com.android.wm.shell.recents.RecentsTransitionStateListener.TRANSITION_STATE_ANIMATING
25 import com.android.wm.shell.recents.RecentsTransitionStateListener.TRANSITION_STATE_NOT_RUNNING
26 import com.android.wm.shell.recents.RecentsTransitionStateListener.TRANSITION_STATE_REQUESTED
27 import com.android.wm.shell.sysui.ShellInit
28 import kotlin.test.assertNotNull
29 import org.junit.Assert.assertFalse
30 import org.junit.Assert.assertTrue
31 import org.junit.Before
32 import org.junit.Test
33 import org.junit.runner.RunWith
34 import org.mockito.ArgumentCaptor
35 import org.mockito.Mockito.mock
36 import org.mockito.Mockito.verify
37 import org.mockito.kotlin.any
38 import org.mockito.kotlin.never
39 
40 /**
41  * Test class for {@link TransitionStateHolder}
42  *
43  * Usage: atest WMShellUnitTests:TransitionStateHolderTest
44  */
45 @SmallTest
46 @RunWith(AndroidTestingRunner::class)
47 class TransitionStateHolderTest {
48 
49     lateinit var recentTransitionHandler: RecentsTransitionHandler
50     lateinit var shellInit: ShellInit
51 
52     @Before
beforenull53     fun before() {
54         recentTransitionHandler = mock(RecentsTransitionHandler::class.java)
55         shellInit = ShellInit(TestShellExecutor())
56     }
57 
58     @Test
No TransitionStateHolder listeners before initializationnull59     fun `No TransitionStateHolder listeners before initialization`() {
60         TransitionStateHolder(shellInit, recentTransitionHandler)
61         verify(recentTransitionHandler, never()).addTransitionStateListener(any())
62     }
63 
64     @Test
When TransitionStateHolder initialized a listener has been registerednull65     fun `When TransitionStateHolder initialized a listener has been registered `() {
66         TransitionStateHolder(shellInit, recentTransitionHandler)
67         shellInit.init()
68         assertNotNull(recentsTransitionStateListener)
69     }
70 
71     @Test
When TransitionStateHolder is created  no recent animation runningnull72     fun `When TransitionStateHolder is created  no recent animation running`() {
73         val holder = TransitionStateHolder(shellInit, recentTransitionHandler)
74         shellInit.init()
75         assertFalse(holder.isRecentsTransitionRunning())
76     }
77 
78     @Test
Recent animation running updates after callback valuenull79     fun `Recent animation running updates after callback value`() {
80         val holder = TransitionStateHolder(shellInit, recentTransitionHandler)
81         shellInit.init()
82 
83         assertFalse(holder.isRecentsTransitionRunning())
84 
85         recentsTransitionStateListener.onTransitionStateChanged(TRANSITION_STATE_NOT_RUNNING)
86         assertFalse(holder.isRecentsTransitionRunning())
87 
88         recentsTransitionStateListener.onTransitionStateChanged(TRANSITION_STATE_REQUESTED)
89         assertTrue(holder.isRecentsTransitionRunning())
90 
91         recentsTransitionStateListener.onTransitionStateChanged(TRANSITION_STATE_ANIMATING)
92         assertTrue(holder.isRecentsTransitionRunning())
93     }
94 
95     private val recentsTransitionStateListener: RecentsTransitionStateListener
<lambda>null96         get() = ArgumentCaptor.forClass(RecentsTransitionStateListener::class.java).run {
97             verify(recentTransitionHandler).addTransitionStateListener(capture())
98             value
99         }
100 }
101