1 /*
2  * Copyright (C) 2022 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.systemui.statusbar.pipeline.airplane.ui.viewmodel
18 
19 import androidx.test.filters.SmallTest
20 import com.android.systemui.SysuiTestCase
21 import com.android.systemui.log.table.TableLogBuffer
22 import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
23 import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
24 import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository
25 import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
26 import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
27 import com.google.common.truth.Truth.assertThat
28 import kotlinx.coroutines.CoroutineScope
29 import kotlinx.coroutines.Dispatchers
30 import kotlinx.coroutines.ExperimentalCoroutinesApi
31 import kotlinx.coroutines.flow.launchIn
32 import kotlinx.coroutines.flow.onEach
33 import kotlinx.coroutines.runBlocking
34 import org.junit.Before
35 import org.junit.Test
36 import org.mockito.Mock
37 import org.mockito.MockitoAnnotations
38 
39 @SmallTest
40 @OptIn(ExperimentalCoroutinesApi::class)
41 @Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
42 class AirplaneModeViewModelImplTest : SysuiTestCase() {
43 
44     private lateinit var underTest: AirplaneModeViewModelImpl
45 
46     @Mock private lateinit var logger: TableLogBuffer
47     private lateinit var airplaneModeRepository: FakeAirplaneModeRepository
48     private lateinit var connectivityRepository: FakeConnectivityRepository
49     private lateinit var interactor: AirplaneModeInteractor
50     private lateinit var scope: CoroutineScope
51 
52     @Before
setUpnull53     fun setUp() {
54         MockitoAnnotations.initMocks(this)
55         airplaneModeRepository = FakeAirplaneModeRepository()
56         connectivityRepository = FakeConnectivityRepository()
57         interactor =
58             AirplaneModeInteractor(
59                 airplaneModeRepository,
60                 connectivityRepository,
61                 FakeMobileConnectionsRepository(),
62             )
63         scope = CoroutineScope(IMMEDIATE)
64 
65         underTest =
66             AirplaneModeViewModelImpl(
67                 interactor,
68                 logger,
69                 scope,
70             )
71     }
72 
73     @Test
isAirplaneModeIconVisible_notAirplaneMode_outputsFalsenull74     fun isAirplaneModeIconVisible_notAirplaneMode_outputsFalse() =
75         runBlocking(IMMEDIATE) {
76             connectivityRepository.setForceHiddenIcons(setOf())
77             airplaneModeRepository.setIsAirplaneMode(false)
78 
79             var latest: Boolean? = null
80             val job = underTest.isAirplaneModeIconVisible.onEach { latest = it }.launchIn(this)
81 
82             assertThat(latest).isFalse()
83 
84             job.cancel()
85         }
86 
87     @Test
isAirplaneModeIconVisible_forceHidden_outputsFalsenull88     fun isAirplaneModeIconVisible_forceHidden_outputsFalse() =
89         runBlocking(IMMEDIATE) {
90             connectivityRepository.setForceHiddenIcons(setOf(ConnectivitySlot.AIRPLANE))
91             airplaneModeRepository.setIsAirplaneMode(true)
92 
93             var latest: Boolean? = null
94             val job = underTest.isAirplaneModeIconVisible.onEach { latest = it }.launchIn(this)
95 
96             assertThat(latest).isFalse()
97 
98             job.cancel()
99         }
100 
101     @Test
isAirplaneModeIconVisible_isAirplaneModeAndNotForceHidden_outputsTruenull102     fun isAirplaneModeIconVisible_isAirplaneModeAndNotForceHidden_outputsTrue() =
103         runBlocking(IMMEDIATE) {
104             connectivityRepository.setForceHiddenIcons(setOf())
105             airplaneModeRepository.setIsAirplaneMode(true)
106 
107             var latest: Boolean? = null
108             val job = underTest.isAirplaneModeIconVisible.onEach { latest = it }.launchIn(this)
109 
110             assertThat(latest).isTrue()
111 
112             job.cancel()
113         }
114 }
115 
116 private val IMMEDIATE = Dispatchers.Main.immediate
117