package org.robolectric.shadows;
import android.media.AudioManager;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.TestRunners;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(TestRunners.MultiApiSelfTest.class)
public class ShadowAudioManagerTest {
private final AudioManager audioManager = new AudioManager(RuntimeEnvironment.application);
private final ShadowAudioManager shadowAudioManager = Shadows.shadowOf(audioManager);
private final AudioManager.OnAudioFocusChangeListener listener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
}
};
@Test
public void requestAudioFocus_shouldRecordArgumentsOfMostRecentCall() {
assertThat(shadowAudioManager.getLastAudioFocusRequest()).isNull();
audioManager.requestAudioFocus(listener, 999, 888);
assertThat(shadowAudioManager.getLastAudioFocusRequest().listener).isSameAs(listener);
assertThat(shadowAudioManager.getLastAudioFocusRequest().streamType).isEqualTo(999);
assertThat(shadowAudioManager.getLastAudioFocusRequest().durationHint).isEqualTo(888);
}
@Test
public void requestAudioFocus_shouldReturnTheSpecifiedValue() {
int value = audioManager.requestAudioFocus(listener, 999, 888);
assertThat(AudioManager.AUDIOFOCUS_REQUEST_GRANTED).isEqualTo(value);
shadowAudioManager.setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_FAILED);
value = audioManager.requestAudioFocus(listener, 999, 888);
assertThat(AudioManager.AUDIOFOCUS_REQUEST_FAILED).isEqualTo(value);
}
@Test
public void abandonAudioFocus_shouldRecordTheListenerOfTheMostRecentCall() {
audioManager.abandonAudioFocus(null);
assertThat(shadowAudioManager.getLastAbandonedAudioFocusListener()).isNull();
audioManager.abandonAudioFocus(listener);
assertThat(shadowAudioManager.getLastAbandonedAudioFocusListener()).isSameAs(listener);
}
@Test
public void getStreamMaxVolume_shouldReturnMaxVolume() throws Exception {
for (int stream : ShadowAudioManager.ALL_STREAMS) {
switch(stream) {
case AudioManager.STREAM_MUSIC:
case AudioManager.STREAM_DTMF:
assertThat(shadowAudioManager.getStreamMaxVolume(stream)).isEqualTo(ShadowAudioManager.MAX_VOLUME_MUSIC_DTMF);
break;
case AudioManager.STREAM_ALARM:
case AudioManager.STREAM_NOTIFICATION:
case AudioManager.STREAM_RING:
case AudioManager.STREAM_SYSTEM:
case AudioManager.STREAM_VOICE_CALL:
assertThat(shadowAudioManager.getStreamMaxVolume(stream)).isEqualTo(ShadowAudioManager.DEFAULT_MAX_VOLUME);
break;
default:
throw new Exception("Unexpected audio stream requested.");
}
}
}
@Test
public void setStreamVolume_shouldSetVolume() {
int vol = 1;
for (int stream : ShadowAudioManager.ALL_STREAMS) {
shadowAudioManager.setStreamVolume(stream, vol, 0);
vol++;
if (vol > ShadowAudioManager.DEFAULT_MAX_VOLUME) {
vol = 1;
}
}
vol = 1;
for (int stream : ShadowAudioManager.ALL_STREAMS) {
assertThat(shadowAudioManager.getStreamVolume(stream)).isEqualTo(vol);
vol++;
if (vol > ShadowAudioManager.DEFAULT_MAX_VOLUME) {
vol = 1;
}
}
}
@Test
public void setStreamMaxVolume_shouldSetMaxVolumeForAllStreams() {
final int newMaxVol = 31;
shadowAudioManager.setStreamMaxVolume(newMaxVol);
for (int stream : ShadowAudioManager.ALL_STREAMS) {
assertThat(shadowAudioManager.getStreamMaxVolume(stream)).isEqualTo(newMaxVol);
}
}
@Test
public void setStreamVolume_shouldSetVolumeForAllStreams() {
final int newVol = 3;
shadowAudioManager.setStreamVolume(newVol);
for (int stream : ShadowAudioManager.ALL_STREAMS) {
assertThat(shadowAudioManager.getStreamVolume(stream)).isEqualTo(newVol);
}
}
@Test
public void setStreamVolume_shouldNotAllowNegativeValues() {
final int newVol = -3;
shadowAudioManager.setStreamVolume(newVol);
for (int stream : ShadowAudioManager.ALL_STREAMS) {
assertThat(shadowAudioManager.getStreamVolume(stream)).isZero();
}
}
@Test
public void setStreamVolume_shouldNotExceedMaxVolume() throws Exception {
final int newVol = 31;
shadowAudioManager.setStreamVolume(newVol);
for (int stream : ShadowAudioManager.ALL_STREAMS) {
switch(stream) {
case AudioManager.STREAM_MUSIC:
case AudioManager.STREAM_DTMF:
assertThat(shadowAudioManager.getStreamMaxVolume(stream)).isEqualTo(ShadowAudioManager.MAX_VOLUME_MUSIC_DTMF);
break;
case AudioManager.STREAM_ALARM:
case AudioManager.STREAM_NOTIFICATION:
case AudioManager.STREAM_RING:
case AudioManager.STREAM_SYSTEM:
case AudioManager.STREAM_VOICE_CALL:
assertThat(shadowAudioManager.getStreamMaxVolume(stream)).isEqualTo(ShadowAudioManager.DEFAULT_MAX_VOLUME);
break;
default:
throw new Exception("Unexpected audio stream requested.");
}
}
}
@Test
public void getRingerMode_default() {
int ringerMode = audioManager.getRingerMode();
assertThat(ringerMode).isEqualTo(AudioManager.RINGER_MODE_NORMAL);
}
@Test
public void setRingerMode_shouldSetMode() {
for (int rm = AudioManager.RINGER_MODE_SILENT; rm <= AudioManager.RINGER_MODE_NORMAL; rm++) {
audioManager.setRingerMode(rm);
assertThat(audioManager.getRingerMode()).isEqualTo(rm);
}
}
@Test
public void setRingerMode_shouldNotChangeOnInvalidValue() {
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
assertThat(audioManager.getRingerMode()).isEqualTo(AudioManager.RINGER_MODE_VIBRATE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL + 1);
assertThat(audioManager.getRingerMode()).isEqualTo(AudioManager.RINGER_MODE_VIBRATE);
}
@Test
public void getMode_default() {
assertThat(audioManager.getMode()).isEqualTo(AudioManager.MODE_NORMAL);
}
@Test
public void setMode_shouldSetAudioMode() {
audioManager.setMode(AudioManager.MODE_RINGTONE);
assertThat(audioManager.getMode()).isEqualTo(AudioManager.MODE_RINGTONE);
}
@Test
public void isSpeakerphoneOn_shouldReturnSpeakerphoneState() {
assertThat(audioManager.isSpeakerphoneOn()).isFalse();
audioManager.setSpeakerphoneOn(true);
assertThat(audioManager.isSpeakerphoneOn()).isTrue();
}
@Test
public void microphoneShouldMute() {
//Should not be muted by default
assertThat(audioManager.isMicrophoneMute()).isFalse();
audioManager.setMicrophoneMute(true);
assertThat(audioManager.isMicrophoneMute()).isTrue();
}
}