1 /*
2  * Copyright (C) 2021 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.settings.notification;
18 
19 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
20 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
21 
22 import static com.google.common.truth.Truth.assertThat;
23 
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.verify;
26 import static org.mockito.Mockito.when;
27 
28 import android.content.Context;
29 import android.media.AudioManager;
30 import android.media.Spatializer;
31 
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.junit.runner.RunWith;
35 import org.mockito.Answers;
36 import org.mockito.Mock;
37 import org.mockito.MockitoAnnotations;
38 import org.robolectric.RobolectricTestRunner;
39 import org.robolectric.RuntimeEnvironment;
40 
41 @RunWith(RobolectricTestRunner.class)
42 public class SpatialAudioPreferenceControllerTest {
43 
44     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
45     private Context mContext;
46     @Mock
47     private AudioManager mAudioManager;
48     @Mock
49     private Spatializer mSpatializer;
50 
51     private SpatialAudioPreferenceController mController;
52 
53     @Before
setUp()54     public void setUp() {
55         MockitoAnnotations.initMocks(this);
56         mContext = spy(RuntimeEnvironment.application);
57         when(mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager);
58         when(mAudioManager.getSpatializer()).thenReturn(mSpatializer);
59         mController = new SpatialAudioPreferenceController(mContext, "unused");
60     }
61 
62     @Test
getAvailabilityStatus_unavailable_shouldReturnUnavailable()63     public void getAvailabilityStatus_unavailable_shouldReturnUnavailable() {
64         when(mSpatializer.isAvailableForDevice(mController.mSpeaker)).thenReturn(false);
65 
66         assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
67     }
68 
69     @Test
getAvailabilityStatus_available_shouldReturnAvailable()70     public void getAvailabilityStatus_available_shouldReturnAvailable() {
71         when(mSpatializer.isAvailableForDevice(mController.mSpeaker)).thenReturn(true);
72 
73         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
74     }
75 
76     @Test
setChecked_withTrue_enablesDeviceSpatializer()77     public void setChecked_withTrue_enablesDeviceSpatializer() {
78         mController.setChecked(true);
79 
80         verify(mSpatializer).addCompatibleAudioDevice(mController.mSpeaker);
81     }
82 
83     @Test
setChecked_withFalse_disablesDeviceSpatializer()84     public void setChecked_withFalse_disablesDeviceSpatializer() {
85         mController.setChecked(false);
86 
87         verify(mSpatializer).removeCompatibleAudioDevice(mController.mSpeaker);
88     }
89 }
90