1cfb3d242306311ce27ec51bf511764377c173a7cKiran Ryali + Christian Williamspackage org.robolectric.shadows; 25480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey 3851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.assertj.core.api.Assertions.assertThat; 4851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.Shadows.shadowOf; 5851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.END; 6851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.ERROR; 7851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.IDLE; 8851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.INITIALIZED; 9851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.PAUSED; 10851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.PLAYBACK_COMPLETED; 11851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.PREPARED; 12851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.PREPARING; 13851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.STARTED; 14851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.State.STOPPED; 15851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.ShadowMediaPlayer.addException; 16851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.shadows.util.DataSource.toDataSource; 17851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williams 18851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport android.media.AudioManager; 19851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport android.media.MediaPlayer; 20851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport android.net.Uri; 2168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Kriegimport java.io.File; 22488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Kriegimport java.io.FileDescriptor; 2368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Kriegimport java.io.FileInputStream; 24488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Kriegimport java.io.IOException; 2531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Kriegimport java.lang.reflect.InvocationTargetException; 2631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Kriegimport java.lang.reflect.Method; 27488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Kriegimport java.util.EnumSet; 2831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Kriegimport java.util.HashMap; 29488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Kriegimport java.util.Map; 30488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Kriegimport org.assertj.core.api.Assertions; 315480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreyimport org.junit.Before; 325480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreyimport org.junit.Test; 335480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreyimport org.junit.runner.RunWith; 34e22e89fe9cd23ff8df8dd1b11e1201035b025a18sashasimport org.mockito.Mockito; 3558f450f918d97e86aa04d351fe2aee416a0da8a4Erich Douglassimport org.robolectric.Robolectric; 36ceb8863e0cd0706c72351f063bc7af3c7d76d120Jonathan Gerrishimport org.robolectric.RobolectricTestRunner; 37084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieuximport org.robolectric.RuntimeEnvironment; 38a09e6f7e24d708115c39c16b5ee4ff806e29bca5Christian Williamsimport org.robolectric.shadow.api.Shadow; 3968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Kriegimport org.robolectric.shadows.ShadowMediaPlayer.InvalidStateBehavior; 4001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Kriegimport org.robolectric.shadows.ShadowMediaPlayer.MediaEvent; 4131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Kriegimport org.robolectric.shadows.ShadowMediaPlayer.MediaInfo; 42488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Kriegimport org.robolectric.shadows.ShadowMediaPlayer.State; 433c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Kriegimport org.robolectric.shadows.util.DataSource; 443c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Kriegimport org.robolectric.util.ReflectionHelpers; 45488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Kriegimport org.robolectric.util.Scheduler; 465480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey 47ceb8863e0cd0706c72351f063bc7af3c7d76d120Jonathan Gerrish@RunWith(RobolectricTestRunner.class) 4872cf654d6d3a933e426506345ded34cf39a669a2Erich Douglasspublic class ShadowMediaPlayerTest { 495480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey 50c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg private static final String DUMMY_SOURCE = "dummy-source"; 51c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg 5229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams private MediaPlayer mediaPlayer; 5329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams private ShadowMediaPlayer shadowMediaPlayer; 54488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg private MediaPlayer.OnCompletionListener completionListener; 55488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg private MediaPlayer.OnErrorListener errorListener; 5668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg private MediaPlayer.OnInfoListener infoListener; 57488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg private MediaPlayer.OnPreparedListener preparedListener; 58488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg private MediaPlayer.OnSeekCompleteListener seekListener; 59488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg private Scheduler scheduler; 6001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg private MediaInfo info; 6101511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg private DataSource defaultSource; 6201511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg 6329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams @Before 643c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg public void setUp() { 651f7901d153aed7f8f66c487a4f8fa2001ed1440eErich Douglass mediaPlayer = Shadow.newInstanceOf(MediaPlayer.class); 6601511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer = shadowOf(mediaPlayer); 67488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 68488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg completionListener = Mockito.mock(MediaPlayer.OnCompletionListener.class); 69488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnCompletionListener(completionListener); 70488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 71488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg preparedListener = Mockito.mock(MediaPlayer.OnPreparedListener.class); 72488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnPreparedListener(preparedListener); 73488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 74488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg errorListener = Mockito.mock(MediaPlayer.OnErrorListener.class); 75488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnErrorListener(errorListener); 76488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 7768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg infoListener = Mockito.mock(MediaPlayer.OnInfoListener.class); 7868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg mediaPlayer.setOnInfoListener(infoListener); 7968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 80488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg seekListener = Mockito.mock(MediaPlayer.OnSeekCompleteListener.class); 81488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnSeekCompleteListener(seekListener); 82488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 83488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // Scheduler is used in many of the tests to simulate 84488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // moving forward in time. 8558f450f918d97e86aa04d351fe2aee416a0da8a4Erich Douglass scheduler = Robolectric.getForegroundThreadScheduler(); 8668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.pause(); 8758f450f918d97e86aa04d351fe2aee416a0da8a4Erich Douglass 88c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg defaultSource = toDataSource(DUMMY_SOURCE); 8901511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info = new MediaInfo(); 9001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg ShadowMediaPlayer.addMediaInfo(defaultSource, info); 9101511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.doSetDataSource(defaultSource); 92488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 93488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 94488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 95488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testInitialState() { 96488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(IDLE); 97488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 98488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 99488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 10031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void testCreateListener() { 10168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg ShadowMediaPlayer.CreateListener createListener = Mockito 10268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg .mock(ShadowMediaPlayer.CreateListener.class); 10331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg ShadowMediaPlayer.setCreateListener(createListener); 10431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 10531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg MediaPlayer newPlayer = new MediaPlayer(); 10601511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg ShadowMediaPlayer shadow = shadowOf(newPlayer); 10768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 10831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Mockito.verify(createListener).onCreate(newPlayer, shadow); 10931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 11068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 11131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg @Test 112437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg public void testResetResetsPosition() { 113437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg shadowMediaPlayer.setCurrentPosition(300); 114437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg mediaPlayer.reset(); 115437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()) 116437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg .isEqualTo(0); 117437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg } 118437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg 119437c2a70080d9eee451e16b68ca0d16b0ef5d4a4Fr Jeremy Krieg @Test 120488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPrepare() throws IOException { 121488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg int[] testDelays = { 0, 10, 100, 1500 }; 122488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 123488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg for (int delay : testDelays) { 124488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg final long startTime = scheduler.getCurrentTime(); 12501511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.setPreparationDelay(delay); 126488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(INITIALIZED); 127488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.prepare(); 128488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 129488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PREPARED); 130488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.getCurrentTime()).isEqualTo(startTime + delay); 131488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 132488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 133488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 134488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 13568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testSetDataSourceString() throws IOException { 1363c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg DataSource ds = toDataSource("dummy"); 137c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg ShadowMediaPlayer.addMediaInfo(ds, info); 138c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg mediaPlayer.setDataSource("dummy"); 1393c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(shadowMediaPlayer.getDataSource()).as("dataSource").isEqualTo(ds); 14068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 14168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 14268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 14368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testSetDataSourceUri() throws IOException { 14477ae4054c6fd36bd2efa66068c63c7a4635a1593Erich Douglass Map<String, String> headers = new HashMap<>(); 14568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Uri uri = Uri.parse("file:/test"); 146c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg DataSource ds = toDataSource(RuntimeEnvironment.application, uri, headers); 147c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg ShadowMediaPlayer.addMediaInfo(ds, info); 148c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg 1493c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg mediaPlayer.setDataSource(RuntimeEnvironment.application, uri, headers); 15068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 15168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getSourceUri()).as("sourceUri").isSameAs(uri); 1523c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(shadowMediaPlayer.getDataSource()).as("dataSource").isEqualTo(ds); 15368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 15468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 15568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 15668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testSetDataSourceFD() throws IOException { 15768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg File tmpFile = File.createTempFile("MediaPlayerTest", null); 15868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg try { 15968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg tmpFile.deleteOnExit(); 16068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg FileInputStream is = new FileInputStream(tmpFile); 16168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg try { 16268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg FileDescriptor fd = is.getFD(); 1633c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg DataSource ds = toDataSource(fd, 23, 524); 164c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg ShadowMediaPlayer.addMediaInfo(ds, info); 165c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg mediaPlayer.setDataSource(fd, 23, 524); 16668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getSourceUri()).as("sourceUri").isNull(); 1673c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(shadowMediaPlayer.getDataSource()).as("dataSource") 1683c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .isEqualTo(ds); 16968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } finally { 17068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg is.close(); 17168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 17268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } finally { 17368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg tmpFile.delete(); 17468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 17568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 17668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 17731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg @Test 178488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPrepareAsyncAutoCallback() { 179488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnPreparedListener(preparedListener); 180488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg int[] testDelays = { 0, 10, 100, 1500 }; 181488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 182488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg for (int delay : testDelays) { 18301511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.setPreparationDelay(delay); 184488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(INITIALIZED); 185488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg final long startTime = scheduler.getCurrentTime(); 186488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.prepareAsync(); 187488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 188488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PREPARING); 189488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(preparedListener); 190488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceToLastPostedRunnable(); 191488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.getCurrentTime()).as("currentTime").isEqualTo( 192488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg startTime + delay); 193488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PREPARED); 194488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(preparedListener).onPrepared(mediaPlayer); 195488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyNoMoreInteractions(preparedListener); 196488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.reset(preparedListener); 197488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 198488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 199488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 200488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 201488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPrepareAsyncManualCallback() { 202488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnPreparedListener(preparedListener); 20301511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.setPreparationDelay(-1); 20401511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg 205488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(INITIALIZED); 206488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg final long startTime = scheduler.getCurrentTime(); 207488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.prepareAsync(); 208488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 209488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.getCurrentTime()).as("currentTime").isEqualTo( 210488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg startTime); 211488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isSameAs(PREPARING); 212488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(preparedListener); 213488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokePreparedListener(); 214488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isSameAs(PREPARED); 215488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(preparedListener).onPrepared(mediaPlayer); 216488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyNoMoreInteractions(preparedListener); 217488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 218488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 219488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 220488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testDefaultPreparationDelay() { 22101511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg assertThat(info.getPreparationDelay()) 22268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg .as("preparationDelay").isEqualTo(0); 223488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 224488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 225488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 226488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testIsPlaying() { 22768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg EnumSet<State> nonPlayingStates = EnumSet.of(IDLE, INITIALIZED, PREPARED, 22868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg PAUSED, STOPPED, PLAYBACK_COMPLETED); 22931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg for (State state : nonPlayingStates) { 230488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(state); 23168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(mediaPlayer.isPlaying()).overridingErrorMessage( 23268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg "In state <%s>, expected isPlaying() to be false", state).isFalse(); 233488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 23431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg shadowMediaPlayer.setState(STARTED); 23568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(mediaPlayer.isPlaying()).overridingErrorMessage( 23668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg "In state <STARTED>, expected isPlaying() to be true").isTrue(); 237488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 238488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 239488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 240488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testIsPrepared() { 241488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg EnumSet<State> prepStates = EnumSet.of(PREPARED, STARTED, PAUSED, 242488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg PLAYBACK_COMPLETED); 243488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 244488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg for (State state : State.values()) { 245488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(state); 246488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg if (prepStates.contains(state)) { 247488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.isPrepared()).overridingErrorMessage( 248488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg "In state <%s>, expected isPrepared() to be true", state).isTrue(); 249488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } else { 250488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.isPrepared()).overridingErrorMessage( 251488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg "In state <%s>, expected isPrepared() to be false", state) 252488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .isFalse(); 253488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 254488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 25529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 25640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 25729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams @Test 258488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPlaybackProgress() { 259488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 260488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // This time offset is just to make sure that it doesn't work by 261488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // accident because the offsets are calculated relative to 0. 262488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(100); 263488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 2649006c0ce414a1fb9d7b1947d1826b287cc84714fChristopher Amavisca and Ryan Spore mediaPlayer.start(); 265488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPosition()).isEqualTo(0); 266488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(STARTED); 267488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 268488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(500); 269488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPosition()).isEqualTo(500); 270488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(STARTED); 271488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 272488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(499); 273488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPosition()).isEqualTo(999); 274488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(STARTED); 275488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 276488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 277488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 278488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPosition()).isEqualTo(1000); 279488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PLAYBACK_COMPLETED); 280488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 281488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyNoMoreInteractions(completionListener); 282488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 283488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 284488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPosition()).isEqualTo(1000); 285488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PLAYBACK_COMPLETED); 286488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 2879006c0ce414a1fb9d7b1947d1826b287cc84714fChristopher Amavisca and Ryan Spore } 2889006c0ce414a1fb9d7b1947d1826b287cc84714fChristopher Amavisca and Ryan Spore 2899006c0ce414a1fb9d7b1947d1826b287cc84714fChristopher Amavisca and Ryan Spore @Test 290488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testStop() { 291488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 292488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 293488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(300); 294488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 295488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.stop(); 296488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(300); 29740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 298488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(400); 299488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(300); 300488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 301488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 302488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 303488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPauseReschedulesCompletionCallback() { 304488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 305488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 306488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 307488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.pause(); 308488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(800); 30931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 310488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 311488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 312488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 313488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(799); 314488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 315488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 316488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 317488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 318488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyNoMoreInteractions(completionListener); 319488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 320488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isFalse(); 321488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 322488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 323488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 324488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 325488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPauseUpdatesPosition() { 326488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 327488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 328488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 329488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 330488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.pause(); 331488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 332488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 333488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PAUSED); 334488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPosition()).isEqualTo(200); 335488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 336488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 337488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 338488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 339488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(STARTED); 340488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPosition()).isEqualTo(400); 341488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 342488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 343488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 344488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekDuringPlaybackReschedulesCompletionCallback() { 345488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 346488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 347488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 348488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(300); 349488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(400); 350488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(599); 351488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 352488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 353488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 354488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyNoMoreInteractions(completionListener); 355488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PLAYBACK_COMPLETED); 356488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 357488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isFalse(); 358488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 359488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 360488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 361488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 362488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekDuringPlaybackUpdatesPosition() { 363488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 364488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 365488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // This time offset is just to make sure that it doesn't work by 366488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // accident because the offsets are calculated relative to 0. 367488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(100); 368488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 369488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 370488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 371488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(400); 372488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(400); 373488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 374488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(600); 375488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(0); 376488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(600); 377488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 378488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(300); 379488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(900); 380488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 381488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(100); 382488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(0); 383488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(100); 384488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 385488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(900); 386488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(1000); 387488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PLAYBACK_COMPLETED); 388488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 389488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(100); 390488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(1000); 391488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 392488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 393488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 39468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testPendingEventsRemovedOnError() { 395488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.when(errorListener.onError(mediaPlayer, 2, 3)).thenReturn(true); 396488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 397488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 398488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 399488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 400488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // We should have a pending completion callback. 4017900d4b225891bf5e98601d7060b72f9fc5667f8Erich Douglass assertThat(scheduler.size()).isEqualTo(1); 402488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 403488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeErrorListener(2, 3); 404488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isFalse(); 405488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 406488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 407488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 408488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 409488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testAttachAuxEffectStates() { 41068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates(new MethodSpec("attachAuxEffect", 37), EnumSet.of(IDLE, ERROR), 41168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg onErrorTester, null); 412488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 413488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 414488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg private static final EnumSet<State> emptyStateSet = EnumSet 415488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .noneOf(State.class); 416488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 417488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 418488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testGetAudioSessionIdStates() { 41931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates("getAudioSessionId", emptyStateSet, onErrorTester, null); 420488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 421488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 422488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 423488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testGetCurrentPositionStates() { 42468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates("getCurrentPosition", EnumSet.of(IDLE, ERROR), onErrorTester, 42568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg null); 426488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 427488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 428488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 429488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testGetDurationStates() { 43068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates("getDuration", EnumSet.of(IDLE, INITIALIZED, ERROR), 43168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg onErrorTester, null); 43231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 43331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 43431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg @Test 43531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void testGetVideoHeightAndWidthStates() { 43631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates("getVideoHeight", EnumSet.of(IDLE, ERROR), logTester, null); 43731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates("getVideoWidth", EnumSet.of(IDLE, ERROR), logTester, null); 43831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 43931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 44031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg @Test 44131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void testIsLoopingStates() { 44231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // isLooping is quite unique as it throws ISE when in END state, 44331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // even though every other state is legal. 44431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates("isLooping", EnumSet.of(END), iseTester, null); 445488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 446488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 447488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 44831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void testIsPlayingStates() { 44931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates("isPlaying", EnumSet.of(ERROR), onErrorTester, null); 450488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 451488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 452488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 453488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPauseStates() { 454488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg testStates("pause", 45568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg EnumSet.of(IDLE, INITIALIZED, PREPARED, STOPPED, ERROR), onErrorTester, 45631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg PAUSED); 457488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 458488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 459488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 460488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPrepareStates() { 461488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg testStates("prepare", 462488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg EnumSet.of(IDLE, PREPARED, STARTED, PAUSED, PLAYBACK_COMPLETED, ERROR), 463488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg PREPARED); 464488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 465488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 466488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 467488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPrepareAsyncStates() { 468488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg testStates("prepareAsync", 469488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg EnumSet.of(IDLE, PREPARED, STARTED, PAUSED, PLAYBACK_COMPLETED, ERROR), 470488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg PREPARING); 471488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 472488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 473488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 474488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testReleaseStates() { 475488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg testStates("release", emptyStateSet, END); 476488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 477488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 478488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 479488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testResetStates() { 48031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates("reset", EnumSet.of(END), IDLE); 481488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 482488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 483488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 484488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekToStates() { 48531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates(new MethodSpec("seekTo", 38), 48668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg EnumSet.of(IDLE, INITIALIZED, STOPPED, ERROR), onErrorTester, null); 487488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 488488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 489488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 490488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSetAudioSessionIdStates() { 49168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates(new MethodSpec("setAudioSessionId", 40), EnumSet.of(INITIALIZED, 49268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg PREPARED, STARTED, PAUSED, STOPPED, PLAYBACK_COMPLETED, ERROR), 49368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg onErrorTester, null); 49431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 49531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 49631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // NOTE: This test diverges from the spec in the MediaPlayer 49731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // doc, which says that setAudioStreamType() is valid to call 49831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // from any state other than ERROR. It mentions that 49931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // unless you call it before prepare it won't be effective. 50031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // However, by inspection I found that it actually calls onError 50131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // and moves into the ERROR state unless invoked from IDLE state, 50231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // so that is what I have emulated. 50331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg @Test 50431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void testSetAudioStreamTypeStates() { 50568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates(new MethodSpec("setAudioStreamType", AudioManager.STREAM_MUSIC), 50631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg EnumSet.of(PREPARED, STARTED, PAUSED, PLAYBACK_COMPLETED, ERROR), 50768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg onErrorTester, null); 508488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 509488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 510488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 511488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSetLoopingStates() { 51268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates(new MethodSpec("setLooping", true), EnumSet.of(ERROR), 51368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg onErrorTester, null); 51431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 51531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 51631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg @Test 51731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void testSetVolumeStates() { 51868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates(new MethodSpec("setVolume", new Class<?>[] { float.class, 51968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg float.class }, new Object[] { 1.0f, 1.0f }), EnumSet.of(ERROR), 52068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg onErrorTester, null); 521488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 522488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 523488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 524488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSetDataSourceStates() { 52568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg final EnumSet<State> invalidStates = EnumSet.of(INITIALIZED, PREPARED, 52668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg STARTED, PAUSED, PLAYBACK_COMPLETED, STOPPED, ERROR); 5273c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 528c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg testStates(new MethodSpec("setDataSource", DUMMY_SOURCE), invalidStates, iseTester, INITIALIZED); 529488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 530488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 531488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 532488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testStartStates() { 533488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg testStates("start", 53431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg EnumSet.of(IDLE, INITIALIZED, PREPARING, STOPPED, ERROR), 53568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg onErrorTester, STARTED); 536488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 537488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 538488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 539488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testStopStates() { 54068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testStates("stop", EnumSet.of(IDLE, INITIALIZED, ERROR), onErrorTester, 54168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg STOPPED); 542488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 543488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 544488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 545488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testCurrentPosition() { 546488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg int[] positions = { 0, 1, 2, 1024 }; 54729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams for (int position : positions) { 54829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams shadowMediaPlayer.setCurrentPosition(position); 54929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(position); 5505480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey } 55129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 55235e7d84cecbfbead4447a35ee05fe9eb6b651b09Phil Goodwin 55329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams @Test 554488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testInitialAudioSessionIdIsNotZero() { 555488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getAudioSessionId()).as("initial audioSessionId") 556488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .isNotEqualTo(0); 557488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 558488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 55931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private Tester onErrorTester = new OnErrorTester(-38, 0); 56031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private Tester iseTester = new ExceptionTester(IllegalStateException.class); 56131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private Tester logTester = new LogTester(null); 56231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private Tester assertTester = new ExceptionTester(AssertionError.class); 56368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 56431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private void testStates(String methodName, EnumSet<State> invalidStates, 56531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg State nextState) { 56631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates(new MethodSpec(methodName), invalidStates, iseTester, nextState); 567488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 568488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 56931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public class MethodSpec { 57031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public Method method; 57168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg // public String method; 57231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public Class<?>[] argTypes; 57331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public Object[] args; 57468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 57531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public MethodSpec(String method) { 57668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg this(method, (Class<?>[]) null, (Object[]) null); 57731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 57868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 57931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public MethodSpec(String method, Class<?>[] argTypes, Object[] args) { 58031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg try { 58131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg this.method = MediaPlayer.class.getDeclaredMethod(method, argTypes); 58231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg this.args = args; 58331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } catch (NoSuchMethodException e) { 58431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg throw new AssertionError("Method lookup failed: " + method, e); 58531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 58631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 58768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 58831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public MethodSpec(String method, int arg) { 58968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg this(method, new Class<?>[] { int.class }, new Object[] { arg }); 59031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 59168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 59231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public MethodSpec(String method, boolean arg) { 59368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg this(method, new Class<?>[] { boolean.class }, new Object[] { arg }); 59431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 59568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 59631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public MethodSpec(String method, Class<?> c) { 59768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg this(method, new Class<?>[] { c }, new Object[] { null }); 59831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 59968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 60031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public MethodSpec(String method, Object o) { 60168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg this(method, new Class<?>[] { o.getClass() }, new Object[] { o }); 60231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 60368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 60431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public <T> MethodSpec(String method, T o, Class<T> c) { 60568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg this(method, new Class<?>[] { c }, new Object[] { o }); 60631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 607488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 60831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void invoke() throws InvocationTargetException { 60931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg try { 61031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg method.invoke(mediaPlayer, args); 61131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } catch (IllegalAccessException e) { 61231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg throw new AssertionError(e); 61331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 61431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 61568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 61607e61e04ff795fb67174de36821945e7501c2ff6Christian Williams @Override public String toString() { 61731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg return method.toString(); 61831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 619488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 620488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 62168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg private void testStates(String method, EnumSet<State> invalidStates, 62268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Tester tester, State next) { 62331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testStates(new MethodSpec(method), invalidStates, tester, next); 62468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 62568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 62668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg private void testStates(MethodSpec method, EnumSet<State> invalidStates, 62768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Tester tester, State next) { 628488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg final EnumSet<State> invalid = EnumSet.copyOf(invalidStates); 629488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 630488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // The documentation specifies that the behavior of calling any 631488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // function while in the PREPARING state is undefined. I tried 632488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // to play it safe but reasonable, by looking at whether the PREPARED or 633488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // INITIALIZED are allowed (ie, the two states that PREPARING 634488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // sites between). Only if both these states are allowed is 635488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // PREPARING allowed too, if either PREPARED or INITALIZED is 636488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // disallowed then so is PREPARING. 637488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg if (invalid.contains(PREPARED) || invalid.contains(INITIALIZED)) { 638488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg invalid.add(PREPARING); 639488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 64068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.setInvalidStateBehavior(InvalidStateBehavior.SILENT); 64168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg for (State state : State.values()) { 64268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.setState(state); 64368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg testMethodSuccess(method, next); 64468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 64568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 64668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.setInvalidStateBehavior(InvalidStateBehavior.EMULATE); 64731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg for (State state : invalid) { 648488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(state); 64931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg tester.test(method); 65031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 65131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg for (State state : EnumSet.complementOf(invalid)) { 65231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg if (state == END) { 65331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg continue; 654488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 65531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg shadowMediaPlayer.setState(state); 65631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testMethodSuccess(method, next); 657488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 65831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 65931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // END state: by inspection we determined that if a method 66031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // doesn't raise any kind of error in any other state then neither 66131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // will it raise one in the END state; however if it raises errors 66231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // in other states of any kind then it will throw 66331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg // IllegalArgumentException when in END. 66431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg shadowMediaPlayer.setState(END); 66531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg if (invalid.isEmpty()) { 66631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testMethodSuccess(method, END); 66731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } else { 66831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg iseTester.test(method); 66931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 67068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 67168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.setInvalidStateBehavior(InvalidStateBehavior.ASSERT); 67231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg for (State state : invalid) { 67331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg shadowMediaPlayer.setState(state); 67431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg assertTester.test(method); 67531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 67631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg for (State state : EnumSet.complementOf(invalid)) { 67731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg if (state == END) { 67831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg continue; 67931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 68031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg shadowMediaPlayer.setState(state); 68131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testMethodSuccess(method, next); 68231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 68331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg shadowMediaPlayer.setState(END); 68431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg if (invalid.isEmpty()) { 68531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testMethodSuccess(method, END); 68631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } else { 68731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg assertTester.test(method); 68868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 68931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 69031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg 69131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private interface Tester { 69207e61e04ff795fb67174de36821945e7501c2ff6Christian Williams void test(MethodSpec method); 693488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 694488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 69531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private class OnErrorTester implements Tester { 69631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private int what; 69731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private int extra; 69868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 69931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public OnErrorTester(int what, int extra) { 70031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg this.what = what; 70131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg this.extra = extra; 70231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 70368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 70407e61e04ff795fb67174de36821945e7501c2ff6Christian Williams @Override 70531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void test(MethodSpec method) { 70631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg final State state = shadowMediaPlayer.getState(); 70731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg final boolean wasPaused = scheduler.isPaused(); 70831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg scheduler.pause(); 70931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg try { 71031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg method.invoke(); 71131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } catch (InvocationTargetException e) { 71268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Assertions.fail("Expected <" + method 71368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg + "> to call onError rather than throw <" + e.getTargetException() 71468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg + "> when called from <" + state + ">", e); 71531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 71631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Mockito.verifyZeroInteractions(errorListener); 71731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg final State finalState = shadowMediaPlayer.getState(); 71831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg assertThat(finalState) 71968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg .overridingErrorMessage( 72068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg "Expected state to change to ERROR when <%s> called from state <%s>, was <%s>", 72168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg method, state, finalState).isSameAs(ERROR); 72231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg scheduler.unPause(); 72331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Mockito.verify(errorListener).onError(mediaPlayer, what, extra); 72431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Mockito.reset(errorListener); 72531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg if (wasPaused) { 72631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg scheduler.pause(); 72731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 72831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 72931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 73068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 73131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private class ExceptionTester implements Tester { 73231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private Class<? extends Throwable> eClass; 73368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 73431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public ExceptionTester(Class<? extends Throwable> eClass) { 73531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg this.eClass = eClass; 73631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 73768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 73807e61e04ff795fb67174de36821945e7501c2ff6Christian Williams @Override 739084d588b645d53c1110ff24b82433b5a331cc6d3James Lemieux @SuppressWarnings("MissingFail") 74031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void test(MethodSpec method) { 74131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg final State state = shadowMediaPlayer.getState(); 74231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg boolean success = false; 74331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg try { 74431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg method.invoke(); 74531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg success = true; 74631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } catch (InvocationTargetException e) { 74731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Throwable cause = e.getTargetException(); 74831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg assertThat(cause) 74968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg .overridingErrorMessage( 75068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg "Unexpected exception <%s> thrown when <%s> called from state <%s>, expecting <%s>", 75168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg cause, method, state, eClass).isInstanceOf(eClass); 75231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg final State finalState = shadowMediaPlayer.getState(); 75368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(finalState) 75468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg .overridingErrorMessage( 75568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg "Expected player to remain in <%s> state when <%s> called, was <%s>", 75668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg state, method, finalState).isSameAs(state); 75731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 75831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg assertThat(success) 75968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg .overridingErrorMessage( 76068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg "No exception thrown, expected <%s> when <%s> called from state <%s>", 76168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg eClass, method, state).isFalse(); 76231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 76331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 76468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 76531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private class LogTester implements Tester { 76631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private State next; 76768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 76831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public LogTester(State next) { 76931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg this.next = next; 77031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 77168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 77207e61e04ff795fb67174de36821945e7501c2ff6Christian Williams @Override 77331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg public void test(MethodSpec method) { 77431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg testMethodSuccess(method, next); 77531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 77631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 77768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 77831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg private void testMethodSuccess(MethodSpec method, State next) { 77931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg final State state = shadowMediaPlayer.getState(); 78031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg try { 78131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg method.invoke(); 78231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg final State finalState = shadowMediaPlayer.getState(); 78331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg if (next == null) { 78431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg assertThat(finalState) 78531e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg .overridingErrorMessage( 78631e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg "Expected state <%s> to remain unchanged when <%s> called, was <%s>", 78731e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg state, method, finalState).isEqualTo(state); 78831e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } else { 78931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg assertThat(finalState).overridingErrorMessage( 79031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg "Expected <%s> to change state from <%s> to <%s>, was <%s>", 79131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg method, state, next, finalState).isEqualTo(next); 79231e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 79331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } catch (InvocationTargetException e) { 79431e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Throwable cause = e.getTargetException(); 79568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Assertions 7963c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .fail("<" + method + "> should not throw exception when in state <" 79768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg + state + ">", cause); 79868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 79931e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } 80068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 801488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg private static final State[] seekableStates = { PREPARED, PAUSED, 802488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg PLAYBACK_COMPLETED, STARTED }; 803488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 804488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // It is not 100% clear from the docs if seeking to < 0 should 805488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // invoke an error. I have assumed from the documentation 806488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // which says "Successful invoke of this method in a valid 807488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // state does not change the state" that it doesn't invoke an 808488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // error. Rounding the seek up to 0 seems to be the sensible 809488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // alternative behavior. 810488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 811488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekBeforeStart() { 812488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setSeekDelay(-1); 813488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg for (State state : seekableStates) { 814488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(state); 815488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setCurrentPosition(500); 816488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 817488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(-1); 818488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeSeekCompleteListener(); 819488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 820488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).as( 821488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg "Current postion while " + state).isEqualTo(0); 822488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).as("Final state " + state) 823488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .isEqualTo(state); 824488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 825488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 826488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 827488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // Similar comments apply to this test as to 828488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // testSeekBeforeStart(). 829488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 830488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekPastEnd() { 831488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setSeekDelay(-1); 832488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg for (State state : seekableStates) { 833488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(state); 834488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setCurrentPosition(500); 835488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(1001); 836488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeSeekCompleteListener(); 837488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 838488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).as( 839488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg "Current postion while " + state).isEqualTo(1000); 840488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).as("Final state " + state) 841488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .isEqualTo(state); 842488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 843488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 844488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 845488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 846488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testCompletionListener() { 847488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeCompletionListener(); 848488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 849488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 850488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 851488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 852488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 853488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testCompletionWithoutListenerDoesNotThrowException() { 854488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnCompletionListener(null); 855488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeCompletionListener(); 856488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 857488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PLAYBACK_COMPLETED); 858488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 859488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 860488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 861488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 862488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekListener() { 863488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeSeekCompleteListener(); 864488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 865488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(seekListener).onSeekComplete(mediaPlayer); 866488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 867488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 868488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 869488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekWithoutListenerDoesNotThrowException() { 870488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnSeekCompleteListener(null); 871488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeSeekCompleteListener(); 872488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 873488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(seekListener); 874488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 875488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 876488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 877488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekDuringPlaybackDelayedCallback() { 878488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 879488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setSeekDelay(100); 880488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 881488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getSeekDelay()).isEqualTo(100); 882488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 883488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 884488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 885488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(200); 886488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(450); 887488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 888488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(200); 889488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 890488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(99); 891488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 892488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(200); 893488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(seekListener); 894488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 895488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 896488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 897488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(450); 898488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(seekListener).onSeekComplete(mediaPlayer); 899488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 900488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isTrue(); 901488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyNoMoreInteractions(seekListener); 902488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 903488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 904488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 905488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekWhilePausedDelayedCallback() { 906488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PAUSED); 907488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setSeekDelay(100); 908488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 909488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 910488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(450); 911488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(99); 912488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 913488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(0); 914488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(seekListener); 915488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 916488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 917488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 918488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(450); 919488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(seekListener).onSeekComplete(mediaPlayer); 920488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // Check that no completion callback or alternative 921488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // seek callbacks have been scheduled. 922488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isFalse(); 923488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 924488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 925488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 926488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekWhileSeekingWhilePaused() { 927488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PAUSED); 928488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setSeekDelay(100); 929488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 930488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 931488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(450); 932488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(50); 933488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(600); 934488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(99); 935488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 936488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(0); 937488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(seekListener); 938488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 939488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 940488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 941488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(600); 942488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(seekListener).onSeekComplete(mediaPlayer); 943488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // Check that no completion callback or alternative 944488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // seek callbacks have been scheduled. 945488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isFalse(); 946488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 947488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 948488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 949488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekWhileSeekingWhilePlaying() { 950488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 951488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setSeekDelay(100); 952488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 953f9ca6710b1c355ac802f3d39b97d6a0c6ea540edFr Jeremy Krieg final long startTime = scheduler.getCurrentTime(); 954488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 955488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 956488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(450); 957488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(50); 958488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(600); 959488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(99); 960488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 96168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg // Not sure of the correct behavior to emulate here, as the MediaPlayer 962488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // documentation is not detailed enough. There are three possibilities: 963488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // 1. Playback is paused for the entire time that a seek is in progress. 964488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // 2. Playback continues normally until the seek is complete. 965488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // 3. Somewhere between these two extremes - playback continues for 966488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // a while and then pauses until the seek is complete. 967488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // I have decided to emulate the first. I don't think that 96868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg // implementations should depend on any of these particular behaviors 96968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg // and consider the behavior indeterminate. 970488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(200); 971488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(seekListener); 972488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 973488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 974488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 975488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(600); 976488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(seekListener).onSeekComplete(mediaPlayer); 977488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // Check that the completion callback is scheduled properly 978488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // but no alternative seek callbacks. 979488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isTrue(); 980488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 981488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyNoMoreInteractions(seekListener); 982f9ca6710b1c355ac802f3d39b97d6a0c6ea540edFr Jeremy Krieg assertThat(scheduler.getCurrentTime()).isEqualTo(startTime + 750); 983488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(1000); 984488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PLAYBACK_COMPLETED); 985488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 986488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 987488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 98868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testSimulatenousEventsAllRun() { 98968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg // Simultaneous events should all run even if 99068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg // one of them stops playback. 99101511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg MediaEvent e1 = new MediaEvent() { 99201511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg @Override 99301511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg public void run(MediaPlayer mp, ShadowMediaPlayer smp) { 99401511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg smp.doStop(); 99568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 99668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg }; 99701511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg MediaEvent e2 = Mockito.mock(MediaEvent.class); 99868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 99901511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.scheduleEventAtOffset(100, e1); 100001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.scheduleEventAtOffset(100, e2); 100168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 100201511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.setState(INITIALIZED); 100368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.doStart(); 100468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(100); 100501511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg // Verify that the first event ran 100601511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg assertThat(shadowMediaPlayer.isReallyPlaying()).isFalse(); 100701511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg Mockito.verify(e2).run(mediaPlayer, shadowMediaPlayer); 100868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 100968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 101001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg @Test 101101511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg public void testResetCancelsCallbacks() { 101201511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.setState(STARTED); 101301511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg mediaPlayer.seekTo(100); 101401511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg MediaEvent e = Mockito.mock(MediaEvent.class); 101501511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.postEventDelayed(e, 200); 101601511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg mediaPlayer.reset(); 101701511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg 101801511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(0); 101901511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg } 102001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg 102101511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg @Test 102201511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg public void testReleaseCancelsSeekCallback() { 102301511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.setState(STARTED); 102401511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg mediaPlayer.seekTo(100); 102501511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg MediaEvent e = Mockito.mock(MediaEvent.class); 102601511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.postEventDelayed(e, 200); 102701511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg mediaPlayer.release(); 102801511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg 102901511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(0); 103001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg } 103168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 103268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 1033488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSeekManualCallback() { 1034488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // Need to put the player into a state where seeking is allowed 1035488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(STARTED); 1036488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // seekDelay of -1 signifies that OnSeekComplete won't be 1037488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg // invoked automatically by the shadow player itself. 1038488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setSeekDelay(-1); 1039488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1040488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getPendingSeek()).as("pendingSeek before") 1041488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .isEqualTo(-1); 1042488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg int[] positions = { 0, 5, 2, 999 }; 1043488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg int prevPos = 0; 1044488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg for (int position : positions) { 1045488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.seekTo(position); 1046488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1047488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getPendingSeek()).as("pendingSeek") 1048488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .isEqualTo(position); 1049488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).as("pendingSeekCurrentPos") 1050488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg .isEqualTo(prevPos); 1051488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1052488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokeSeekCompleteListener(); 1053488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1054488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getPendingSeek()).isEqualTo(-1); 1055488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(position); 1056488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg prevPos = position; 1057488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1058488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1059488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1060488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 1061488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPreparedListenerCalled() { 1062488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokePreparedListener(); 1063488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PREPARED); 1064488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(preparedListener).onPrepared(mediaPlayer); 1065488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1066488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1067488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 1068488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testPreparedWithoutListenerDoesNotThrowException() { 1069488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnPreparedListener(null); 1070488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.invokePreparedListener(); 1071488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1072488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(PREPARED); 1073488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(preparedListener); 107429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 107529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams 107629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams @Test 107768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testInfoListenerCalled() { 107868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.invokeInfoListener(21, 32); 107968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verify(infoListener).onInfo(mediaPlayer, 21, 32); 108068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 108168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 108268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 108368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testInfoWithoutListenerDoesNotThrowException() { 108468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg mediaPlayer.setOnInfoListener(null); 108568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.invokeInfoListener(3, 44); 108668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 108768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verifyZeroInteractions(infoListener); 108868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 108968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 109068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 109129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams public void testErrorListenerCalledNoOnCompleteCalledWhenReturnTrue() { 109268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.when(errorListener.onError(mediaPlayer, 112, 221)).thenReturn(true); 1093f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams 109468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.invokeErrorListener(112, 221); 1095f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams 1096488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isEqualTo(ERROR); 109768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verify(errorListener).onError(mediaPlayer, 112, 221); 1098488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 109929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 110035e7d84cecbfbead4447a35ee05fe9eb6b651b09Phil Goodwin 110129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams @Test 110229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams public void testErrorListenerCalledOnCompleteCalledWhenReturnFalse() { 1103488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.when(errorListener.onError(mediaPlayer, 0, 0)).thenReturn(false); 1104f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams 110568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.invokeErrorListener(321, 11); 1106f3a67bea2e9e481c7344b416ec0e90ceb27ec005Christian Williams 110768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verify(errorListener).onError(mediaPlayer, 321, 11); 1108488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 1109488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1110488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1111488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 1112488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testErrorCausesOnCompleteCalledWhenNoErrorListener() { 1113488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setOnErrorListener(null); 1114488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 111568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.invokeErrorListener(321, 21); 1116488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1117488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(errorListener); 1118488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 1119488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 112068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 112168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 112268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testReleaseStopsScheduler() { 112368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.doStart(); 112468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg mediaPlayer.release(); 112568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(0); 112668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 112768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 112868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 112968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testResetStopsScheduler() { 113068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.doStart(); 113168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg mediaPlayer.reset(); 113268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(0); 113368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 113468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 113568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 113668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testDoStartStop() { 113768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.isReallyPlaying()).isFalse(); 113868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(100); 113968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.doStart(); 114068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.isReallyPlaying()).isTrue(); 114168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(0); 114268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isSameAs(IDLE); 114368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 114468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(100); 114568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100); 114668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 114768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.doStop(); 114868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.isReallyPlaying()).isFalse(); 114968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100); 115068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isSameAs(IDLE); 115168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 115268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(50); 115368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100); 115468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 115568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1156488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 1157488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testScheduleErrorAtOffsetWhileNotPlaying() { 115801511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.scheduleErrorAtOffset(500, 1, 3); 115901511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.setState(INITIALIZED); 1160488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 1161488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 116268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1163488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(499); 1164488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(errorListener); 1165488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1166488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 1167488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verify(errorListener).onError(mediaPlayer, 1, 3); 1168488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isSameAs(ERROR); 1169488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(scheduler.advanceToLastPostedRunnable()).isFalse(); 117068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(500); 1171488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1172488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 117368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 117468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testScheduleErrorAtOffsetInPast() { 117501511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.scheduleErrorAtOffset(200, 1, 2); 117601511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.setState(INITIALIZED); 117768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.setCurrentPosition(400); 117868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.setState(PAUSED); 117955891718490f94b2f1375e766638eb0d0c7b6442Fr Jeremy Krieg mediaPlayer.start(); 118068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.unPause(); 118168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verifyZeroInteractions(errorListener); 118268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 118368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 118468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 118568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testScheduleBufferUnderrunAtOffset() { 118601511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg info.scheduleBufferUnderrunAtOffset(100, 50); 118701511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.setState(INITIALIZED); 118868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 118968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg mediaPlayer.start(); 119068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 119168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(99); 119268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 119368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verifyZeroInteractions(infoListener); 119468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 119568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(1); 119668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verify(infoListener).onInfo(mediaPlayer, 119768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg MediaPlayer.MEDIA_INFO_BUFFERING_START, 0); 119868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100); 119968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.isReallyPlaying()).isFalse(); 120068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 120168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(49); 120268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verifyZeroInteractions(infoListener); 120368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 120468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg scheduler.advanceBy(1); 120568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100); 120668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verify(infoListener).onInfo(mediaPlayer, 120768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg MediaPlayer.MEDIA_INFO_BUFFERING_END, 0); 1208488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1209488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(100); 121068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(200); 1211488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 121268598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1213488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 121468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testRemoveEventAtOffset() { 12153dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 12163dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg mediaPlayer.start(); 12173dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12183dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(200); 12193dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12203dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg MediaEvent e = info.scheduleInfoAtOffset( 12213dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 500, 1, 3); 12223dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12233dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(299); 12243dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg info.removeEventAtOffset(500, e); 12253dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceToLastPostedRunnable(); 12263dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verifyZeroInteractions(infoListener); 1227488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 122868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1229488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 123068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testRemoveEvent() { 12313dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 12323dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg mediaPlayer.start(); 12333dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12343dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(200); 12353dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12363dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg MediaEvent e = info.scheduleInfoAtOffset(500, 1, 3); 12373dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12383dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(299); 12393dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStop(); 12403dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg info.removeEvent(e); 12413dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStart(); 12423dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceToLastPostedRunnable(); 12433dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verifyZeroInteractions(infoListener); 124468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 124568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 124668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 124768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg public void testScheduleMultipleRunnables() { 12483dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 12493dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(25); 12503dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg mediaPlayer.start(); 12513dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12523dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(200); 12533dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(1); 12543dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStop(); 12553dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg info.scheduleInfoAtOffset(250, 2, 4); 12563dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStart(); 12573dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(1); 12583dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12593dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg MediaEvent e1 = Mockito.mock(MediaEvent.class); 12603dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12613dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStop(); 12623dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg info.scheduleEventAtOffset(400, e1); 12633dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStart(); 12643dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12653dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(49); 12663dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verifyZeroInteractions(infoListener); 12673dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(1); 12683dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verify(infoListener).onInfo(mediaPlayer, 2, 4); 12693dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(149); 12703dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStop(); 12713dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg info.scheduleErrorAtOffset(675, 32, 22); 12723dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg shadowMediaPlayer.doStart(); 12733dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verifyZeroInteractions(e1); 12743dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(1); 12753dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verify(e1).run(mediaPlayer, shadowMediaPlayer); 12763dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12773dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg mediaPlayer.pause(); 12783dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(0); 12793dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(324); 12803dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg MediaEvent e2 = Mockito.mock(MediaEvent.class); 12813dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg info.scheduleEventAtOffset(680, e2); 12823dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg mediaPlayer.start(); 12833dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(274); 12843dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verifyZeroInteractions(errorListener); 12853dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg 12863dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg scheduler.advanceBy(1); 12873dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verify(errorListener).onError(mediaPlayer, 32, 22); 12883dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg assertThat(scheduler.size()).isEqualTo(0); 12893dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(675); 12903dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).isSameAs(ERROR); 12913dd0d2adcc3980f079b23c2767ad4641fb52a577Fr Jeremy Krieg Mockito.verifyZeroInteractions(e2); 1292488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1293488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1294488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 129501511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg public void testSetDataSourceExceptionWithWrongExceptionTypeAsserts() { 1296488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg boolean fail = false; 129701511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg Map<DataSource,Exception> exceptions = ReflectionHelpers.getStaticField(ShadowMediaPlayer.class, "exceptions"); 12983c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg DataSource ds = toDataSource("dummy"); 12993c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg Exception e = new CloneNotSupportedException(); // just a convenient, non-RuntimeException in java.lang 13003c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg exceptions.put(ds, e); 13013c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 1302488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg try { 13033c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg shadowMediaPlayer.setDataSource(ds); 1304488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg fail = true; 13053c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } catch (AssertionError a) { 13063c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } catch (IOException ioe) { 13073c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg Assertions.fail("Got exception <" + ioe + ">; expecting assertion"); 1308488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 13093c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg if (fail) { 131001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg Assertions.fail("setDataSource() should assert with non-IOException,non-RuntimeException"); 131168598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg } 1312488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 131368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1314488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 13153c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg public void testSetDataSourceCustomExceptionOverridesIllegalState() { 1316488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 13173c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg ShadowMediaPlayer.addException(toDataSource("dummy"), new IOException()); 1318488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg try { 13193c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg mediaPlayer.setDataSource("dummy"); 132031e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Assertions.fail("Expecting IOException to be thrown"); 132131e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg } catch (IOException eThrown) { 1322488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } catch (Exception eThrown) { 132331e36655586ca27d91d70b368697247e2f7d6e44Fr Jeremy Krieg Assertions.fail(eThrown + " was thrown, expecting IOException"); 1324488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1325488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 132668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 132768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg @Test 1328488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testGetSetLooping() { 1329488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.isLooping()).isFalse(); 1330488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setLooping(true); 1331488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.isLooping()).isTrue(); 1332488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setLooping(false); 1333488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.isLooping()).isFalse(); 1334488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 133568598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1336488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg /** 13377d074bb6c8e8c5e3f73faec0f35a6cf129227ebaChristian Williams * If the looping mode was being set to {@code true} 133868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg * {@link MediaPlayer#setLooping(boolean)}, the MediaPlayer object shall 133968598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg * remain in the Started state. 1340488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg */ 1341488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 1342488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSetLoopingCalledWhilePlaying() { 1343488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PREPARED); 1344488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 1345488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(200); 134668598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1347488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setLooping(true); 1348488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1100); 1349488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1350488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 1351488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(300); 1352488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1353488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setLooping(false); 1354488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(699); 1355488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 1356488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1357488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(1); 135868598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg Mockito.verify(completionListener).onCompletion(mediaPlayer); 1359488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 136068598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1361488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 1362488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testSetLoopingCalledWhileStartable() { 136368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg final State[] startableStates = { PREPARED, PAUSED }; 1364488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg for (State state : startableStates) { 1365488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setCurrentPosition(500); 1366488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(state); 1367488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1368488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.setLooping(true); 1369488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 1370488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1371488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg scheduler.advanceBy(700); 1372488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg Mockito.verifyZeroInteractions(completionListener); 137368598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).as(state.toString()) 137468598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg .isEqualTo(200); 1375488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 1376488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg } 137768598f02699c35ced163b4829b35e69a1398e05dFr Jeremy Krieg 1378488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg /** 1379488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg * While in the PlaybackCompleted state, calling start() can restart the 1380488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg * playback from the beginning of the audio/video source. 1381488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg */ 1382488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg @Test 1383488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg public void testStartAfterPlaybackCompleted() { 1384488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setState(PLAYBACK_COMPLETED); 1385488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg shadowMediaPlayer.setCurrentPosition(1000); 1386488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg 1387488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg mediaPlayer.start(); 1388488ccaff0e8869571096b9e0c29e0cf59bcc3054Fr Jeremy Krieg assertThat(mediaPlayer.getCurrentPosition()).isEqualTo(0); 138929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 13903c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 13913c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg @Test 13923c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg public void testResetStaticState() { 13933c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg ShadowMediaPlayer.CreateListener createListener = Mockito 13943c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .mock(ShadowMediaPlayer.CreateListener.class); 13953c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg ShadowMediaPlayer.setCreateListener(createListener); 13963c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(ShadowMediaPlayer.createListener) 13973c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .as("createListener") 13983c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .isSameAs(createListener); 13993c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg DataSource dummy = toDataSource("stuff"); 14003c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg IOException e = new IOException(); 14013c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg addException(dummy, e); 140201511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg 14033c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg try { 14043c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg shadowMediaPlayer.setState(IDLE); 14053c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg shadowMediaPlayer.setDataSource(dummy); 14063c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg Assertions.failBecauseExceptionWasNotThrown(e.getClass()); 14073c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } catch (IOException e2) { 14083c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(e2).as("thrown exception").isSameAs(e); 14093c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } 141001511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg // Check that the mediaInfo was cleared 141101511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg shadowMediaPlayer.doSetDataSource(defaultSource); 141201511b35932be9701736faee2cde7d47580ef1b7Fr Jeremy Krieg assertThat(shadowMediaPlayer.getMediaInfo()).as("mediaInfo:before").isNotNull(); 14133c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 14143c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg ShadowMediaPlayer.resetStaticState(); 14153c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 14163c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg // Check that the listener was cleared. 14173c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(ShadowMediaPlayer.createListener) 14183c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .as("createListener") 14193c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .isNull(); 14203c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 1421c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg // Check that the mediaInfo was cleared. 1422c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg try { 1423c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg shadowMediaPlayer.doSetDataSource(defaultSource); 1424727342e5d817c96f5cb6d71578f8348d41fa6991Fr Jeremy Krieg Assertions.failBecauseExceptionWasNotThrown(IllegalArgumentException.class); 1425727342e5d817c96f5cb6d71578f8348d41fa6991Fr Jeremy Krieg } catch (IllegalArgumentException ie) { 1426c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg // We expect this if the static state has been cleared. 1427c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg } 1428c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg 14293c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg // Check that the exception was cleared. 14303c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg try { 14313c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg shadowMediaPlayer.setState(IDLE); 1432c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg ShadowMediaPlayer.addMediaInfo(dummy, info); 14333c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg shadowMediaPlayer.setDataSource(dummy); 14343c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } catch (IOException e2) { 14353c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg Assertions.fail("Exception was not cleared by resetStaticState() for <" + dummy + ">", e2); 14363c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } 1437c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg } 14383c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 14393c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg @Test 14403c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg public void setDataSourceException_withRuntimeException() { 14413c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg RuntimeException e = new RuntimeException("some dummy message"); 14423c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg addException(toDataSource("dummy"), e); 14433c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg try { 14443c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg mediaPlayer.setDataSource("dummy"); 14453c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg Assertions.failBecauseExceptionWasNotThrown(e.getClass()); 14463c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } catch (Exception caught) { 14473c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(caught).isSameAs(e); 14483c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(e.getStackTrace()[0].getClassName()) 14493c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .as("Stack trace should originate in Shadow") 14503c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .isEqualTo(ShadowMediaPlayer.class.getName()); 14513c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } 14523c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } 14533c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg 14543c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg @Test 14553c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg public void setDataSourceException_withIOException() { 14563c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg IOException e = new IOException("some dummy message"); 14573c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg addException(toDataSource("dummy"), e); 14583c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg shadowMediaPlayer.setState(IDLE); 14593c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg try { 14603c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg mediaPlayer.setDataSource("dummy"); 14613c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg Assertions.failBecauseExceptionWasNotThrown(e.getClass()); 14623c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } catch (Exception caught) { 14633c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(caught).isSameAs(e); 14643c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(e.getStackTrace()[0].getClassName()) 14653c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .as("Stack trace should originate in Shadow") 14663c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg .isEqualTo(ShadowMediaPlayer.class.getName()); 14673c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg assertThat(shadowMediaPlayer.getState()).as( 14683c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg "State after " + e + " thrown should be unchanged").isSameAs(IDLE); 14693c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } 14703c9644fddd4f6722abdc38e25eaeaa6c639071aeFr Jeremy Krieg } 1471c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg 1472c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg @Test 1473c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg public void setDataSource_forNoDataSource_asserts() { 1474c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg try { 1475c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg mediaPlayer.setDataSource("some unspecified data source"); 1476727342e5d817c96f5cb6d71578f8348d41fa6991Fr Jeremy Krieg Assertions.failBecauseExceptionWasNotThrown(AssertionError.class); 1477727342e5d817c96f5cb6d71578f8348d41fa6991Fr Jeremy Krieg } catch (IllegalArgumentException a) { 1478727342e5d817c96f5cb6d71578f8348d41fa6991Fr Jeremy Krieg assertThat(a.getMessage()).as("assertionMessage") 1479727342e5d817c96f5cb6d71578f8348d41fa6991Fr Jeremy Krieg .contains("addException") 1480727342e5d817c96f5cb6d71578f8348d41fa6991Fr Jeremy Krieg .contains("addMediaInfo"); 1481c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg } catch (Exception e) { 1482c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg Assertions.fail("Unexpected exception", e); 1483c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg } 1484c0299c641ad1aa3139266a7bf9f018eded470376Fr Jeremy Krieg } 14855480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey} 1486