12afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linpackage com.xtremelabs.robolectric.shadows;
22afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
32afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport static org.hamcrest.CoreMatchers.equalTo;
42afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport static org.hamcrest.CoreMatchers.sameInstance;
577f65e6034fcfcf9f736356cf081f261327520feMichael Portuesiimport static org.hamcrest.CoreMatchers.nullValue;
62afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport static org.hamcrest.MatcherAssert.assertThat;
72afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
82afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport org.junit.Before;
92afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport org.junit.Test;
102afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport org.junit.runner.RunWith;
112afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
122afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport android.media.MediaPlayer;
132afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport android.net.Uri;
142afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport android.widget.VideoView;
152afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
162afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport com.xtremelabs.robolectric.Robolectric;
172afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
182afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
192afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin@RunWith(WithTestDefaultsRunner.class)
202afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linpublic class VideoViewTest {
212afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
222afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    private VideoView view;
232afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
242afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Before public void setUp() throws Exception {
252afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin        view = new VideoView(null);
262afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
272afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
282afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
292afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldSetOnPreparedListener() throws Exception {
304e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi    	TestPreparedListener l = new TestPreparedListener();
312afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.setOnPreparedListener(l);
322afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
334e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi    	assertThat((TestPreparedListener)(shadowVideoView.getOnPreparedListener()), sameInstance(l));
342afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
352afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
362afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
372afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldSetOnErrorListener() throws Exception {
384e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi    	TestErrorListener l = new TestErrorListener();
392afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.setOnErrorListener(l);
402afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
414e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi    	assertThat((TestErrorListener)(shadowVideoView.getOnErrorListener()), sameInstance(l));
422afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
432afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
442afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
452afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldSetOnCompletionListener() throws Exception {
464e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi    	TestCompletionListener l = new TestCompletionListener();
472afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.setOnCompletionListener(l);
482afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
494e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi    	assertThat((TestCompletionListener)(shadowVideoView.getOnCompletionListener()), sameInstance(l));
502afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
512afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
522afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
5377f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    public void shouldSetVideoPath() throws Exception {
5477f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    	view.setVideoPath("video.mp4");
5577f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
5677f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    	assertThat(shadowVideoView.getVideoPath(), equalTo("video.mp4"));
5777f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    	view.setVideoPath(null);
5877f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    	assertThat(shadowVideoView.getVideoPath(), nullValue());
5977f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    }
6077f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi
6177f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    @Test
622afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldSetVideoURI() throws Exception {
632afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.setVideoURI(Uri.parse("video.mp4"));
642afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
652afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getVideoURIString(), equalTo("video.mp4"));
6677f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    	view.setVideoURI(null);
6777f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi    	assertThat(shadowVideoView.getVideoURIString(), nullValue());
682afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
692afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
702afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
712afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shoulDetermineIsPlaying() throws Exception {
722afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(view.isPlaying(), equalTo(false));
732afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.start();
742afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(view.isPlaying(), equalTo(true));
752afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.stopPlayback();
762afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(view.isPlaying(), equalTo(false));
772afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
782afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
792afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
802afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldStartPlaying() throws Exception {
812afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.start();
822afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
832afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getCurrentVideoState(), equalTo(ShadowVideoView.START));
842afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
852afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
862afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
872afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldStopPlayback() throws Exception {
882afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.stopPlayback();
892afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
902afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getCurrentVideoState(), equalTo(ShadowVideoView.STOP));
912afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
922afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
932afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
942afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldSuspendPlaying() throws Exception {
952afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.start();
962afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.suspend();
972afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
982afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getPrevVideoState(), equalTo(ShadowVideoView.START));
992afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getCurrentVideoState(), equalTo(ShadowVideoView.SUSPEND));
1002afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
1012afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1022afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
1032afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldResumePlaying() throws Exception {
1042afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.start();
1052afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.suspend();
1062afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.resume();
1072afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
1082afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getPrevVideoState(), equalTo(ShadowVideoView.SUSPEND));
1092afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getCurrentVideoState(), equalTo(ShadowVideoView.RESUME));
1102afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
1112afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1122afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1132afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    @Test
1142afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    public void shouldPausePlaying() throws Exception {
1152afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.start();
1162afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	view.pause();
1172afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	ShadowVideoView shadowVideoView = Robolectric.shadowOf(view);
1182afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getPrevVideoState(), equalTo(ShadowVideoView.START));
1192afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    	assertThat(shadowVideoView.getCurrentVideoState(), equalTo(ShadowVideoView.PAUSE));
1202afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    }
121781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin
122781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    @Test
1237598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    public void shouldDetermineIfPausable() throws Exception {
124781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	view.start();
125781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	assertThat(view.canPause(), equalTo(true));
126781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin
127781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	view.pause();
128781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	assertThat(view.canPause(), equalTo(false));
129781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin
130781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	view.resume();
131781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	assertThat(view.canPause(), equalTo(true));
132781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin
133781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	view.suspend();
134781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    	assertThat(view.canPause(), equalTo(false));
135781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin    }
1364e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi
1372afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin    /**
1384e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi     * Helper classes
1392afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin     */
1402afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1414e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi	private class TestPreparedListener implements MediaPlayer.OnPreparedListener {
1422afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		@Override
1432afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		public void onPrepared(MediaPlayer mp) {}
1442afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1452afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1464e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi	private class TestErrorListener implements MediaPlayer.OnErrorListener  {
1472afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		@Override
1482afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		public boolean onError(MediaPlayer mp, int what, int extra) {
1492afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin			return false;
1502afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		}
1512afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1522afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1534e7760479e52bdac9095f4f3ec62ee77357eeb88Michael Portuesi	private class TestCompletionListener implements MediaPlayer.OnCompletionListener {
1542afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		@Override
1552afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		public void onCompletion(MediaPlayer mp) {}
1562afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1572afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin}
158