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