package org.wikipedia.media; import org.junit.Test; import org.junit.runner.RunWith; import org.wikipedia.test.TestRunner; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @RunWith(TestRunner.class) public class DefaultAvPlayerTest { private static final String PATH_A = "http://pathA"; private static final String PATH_B = "http://pathB"; private final FakeAvPlayerImplementation implementation = spy(new FakeAvPlayerImplementation()); private AvPlayer subject = new DefaultAvPlayer(implementation); private final AvPlayer.Callback callback = mock(AvPlayer.Callback.class); private final AvPlayer.ErrorCallback errorCallback = mock(AvPlayer.ErrorCallback.class); @Test public void testDeinitDeinit() { subject.deinit(); verify(implementation, never()).deinit(); } @Test public void testDeinitInit() { subject.init(); subject.deinit(); verify(implementation).deinit(); } @Test public void testDeinitLoad() { implementation.setAsyncLoadFailure(true); load(PATH_A); subject.deinit(); verify(implementation).deinit(); } @Test public void testInitConstructor() { verify(implementation, never()).init(); } @Test public void testInitDeinit() { subject.deinit(); subject.init(); verify(implementation).init(); } @Test public void testInitInit() { subject.init(); subject.init(); verify(implementation).init(); } @Test public void testInitLoad() { load(PATH_A); verify(implementation).init(); } @Test public void testInitStop() { subject.stop(); verify(implementation, never()).init(); } @Test public void testLoadLoad() { load(PATH_A); verifyLoad(1, PATH_A); verifyCallback(1); verifyErrorCallback(0); } @Test public void testLoadReloadSync() { load(PATH_A); load(PATH_B); verifyLoad(1, PATH_B); verifyCallback(2); verifyErrorCallback(0); } @Test public void testLoadReloadAsync() { implementation.setAsyncLoadFailure(true); load(PATH_A); implementation.setAsyncLoadFailure(false); load(PATH_B); verifyLoad(1, PATH_B); verifyCallback(1); verifyErrorCallback(0); } @Test public void testLoadFail() { implementation.setSyncLoadFailure(true); load(PATH_A); verifyLoad(1, PATH_A); verifyCallback(0); verifyErrorCallback(1); } @Test public void testLoadPlay() { play(PATH_A); verifyLoad(1, PATH_A); verifyCallback(1); verifyErrorCallback(0); } @Test public void testStopConstructor() { subject.stop(); verify(implementation, never()).stop(); } @Test public void testStopLoad() { implementation.setAsyncLoadFailure(true); load(PATH_A); subject.stop(); verify(implementation, never()).stop(); verifyCallback(0); verifyErrorCallback(0); } @Test public void testStopPlaySync() { play(PATH_A); subject.stop(); verify(implementation, never()).stop(); verifyCallback(1); verifyErrorCallback(0); } @Test public void testStopPlayAsync() { implementation.setAsyncPlayFailure(true); play(PATH_A); subject.stop(); verify(implementation).stop(); verifyCallback(0); verifyErrorCallback(0); } @Test public void testPlayPlaySync() { play(PATH_A); play(PATH_A); verifyPlay(2); verifyCallback(2); verifyErrorCallback(0); } @Test public void testPlayPlaySyncFail() { implementation.setSyncPlayFailure(true); play(PATH_A); verifyPlay(1); verifyCallback(0); verifyErrorCallback(1); } @Test public void testPlayLoadSyncFail() { implementation.setSyncLoadFailure(true); play(PATH_A); verifyPlay(0); verifyCallback(0); verifyErrorCallback(1); } @Test public void testPlayPlayAsync() { implementation.setAsyncPlayFailure(true); play(PATH_A); implementation.setAsyncPlayFailure(false); play(PATH_A); verifyPlay(1); verifyCallback(0); verifyErrorCallback(0); } private void load(String path) { subject.load(path, callback, errorCallback); } private void play(String path) { subject.play(path, callback, errorCallback); } private void verifyCallback(int times) { verify(callback, times(times)).onSuccess(); } private void verifyErrorCallback(int times) { verify(errorCallback, times(times)).onError(); } private void verifyLoad(int times, String path) { verify(implementation, times(times)).load(eq(path), anyCallback(), anyErrorCallback()); } private void verifyPlay(int times) { verify(implementation, times(times)).play(anyCallback(), anyErrorCallback()); } private AvPlayer.Callback anyCallback() { return any(AvPlayer.Callback.class); } private AvPlayer.ErrorCallback anyErrorCallback() { return any(AvPlayer.ErrorCallback.class); } }