diff --git a/library/src/test/java/com/bumptech/glide/request/SingleRequestTest.java b/library/src/test/java/com/bumptech/glide/request/SingleRequestTest.java index c4991eefdeb49f0d0ba39f1b45f0659c00fc3e7d..bcd5116423e11ec03e3e811c018c217adf7e16a8 100644 --- a/library/src/test/java/com/bumptech/glide/request/SingleRequestTest.java +++ b/library/src/test/java/com/bumptech/glide/request/SingleRequestTest.java @@ -2,7 +2,7 @@ package com.bumptech.glide.request; import static com.bumptech.glide.tests.Util.isADataSource; import static com.bumptech.glide.tests.Util.mockResource; -import static org.junit.Assert.assertEquals; +import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; @@ -50,112 +50,62 @@ import org.robolectric.annotation.Config; @Config(manifest = Config.NONE, sdk = 18) @SuppressWarnings("rawtypes") public class SingleRequestTest { - private RequestHarness harness = new RequestHarness(); - - /** - * {@link Number} and {@link List} are arbitrarily chosen types to test some type safety as well. - * Both are in the middle of the hierarchy having multiple descendants and ancestors. - */ - private static class RequestHarness { - Engine engine = mock(Engine.class); - Number model = 123456; - @SuppressWarnings("unchecked") - Target target = mock(Target.class); - Resource resource = mockResource(); - RequestCoordinator requestCoordinator = mock(RequestCoordinator.class); - Drawable placeholderDrawable = null; - Drawable errorDrawable = null; - Drawable fallbackDrawable = null; - @SuppressWarnings("unchecked") - RequestListener requestListener = mock(RequestListener.class); - @SuppressWarnings("unchecked") - TransitionFactory factory = mock(TransitionFactory.class); - int overrideWidth = -1; - int overrideHeight = -1; - List result = new ArrayList<>(); - GlideContext glideContext = mock(GlideContext.class); - Key signature = mock(Key.class); - Priority priority = Priority.HIGH; - boolean useUnlimitedSourceGeneratorsPool = false; - Class transcodeClass = List.class; - - Map, Transformation> transformations = new HashMap<>(); - - public RequestHarness() { - when(requestCoordinator.canSetImage(any(Request.class))).thenReturn(true); - when(requestCoordinator.canNotifyStatusChanged(any(Request.class))).thenReturn(true); - when(resource.get()).thenReturn(result); - } - public SingleRequest getRequest() { - RequestOptions requestOptions = new RequestOptions() - .error(errorDrawable) - .placeholder(placeholderDrawable) - .fallback(fallbackDrawable) - .override(overrideWidth, overrideHeight) - .priority(priority) - .signature(signature) - .useUnlimitedSourceGeneratorsPool(useUnlimitedSourceGeneratorsPool); - return SingleRequest - .obtain(glideContext, glideContext, model, transcodeClass, requestOptions, overrideWidth, - overrideHeight, priority, target, requestListener, requestCoordinator, engine, - factory); - } - } + private SingleRequestBuilder builder; @Before public void setUp() { - harness = new RequestHarness(); + builder = new SingleRequestBuilder(); } @Test public void testIsNotCompleteBeforeReceivingResource() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); assertFalse(request.isComplete()); } @Test public void testCanHandleNullResources() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.onResourceReady(null, DataSource.LOCAL); assertTrue(request.isFailed()); - verify(harness.requestListener).onLoadFailed(isAGlideException(), isA(Number.class), - eq(harness.target), anyBoolean()); + verify(builder.requestListener).onLoadFailed(isAGlideException(), isA(Number.class), + eq(builder.target), anyBoolean()); } @Test public void testCanHandleEmptyResources() { - SingleRequest request = harness.getRequest(); - when(harness.resource.get()).thenReturn(null); + SingleRequest request = builder.build(); + when(builder.resource.get()).thenReturn(null); - request.onResourceReady(harness.resource, DataSource.REMOTE); + request.onResourceReady(builder.resource, DataSource.REMOTE); assertTrue(request.isFailed()); - verify(harness.engine).release(eq(harness.resource)); - verify(harness.requestListener).onLoadFailed(isAGlideException(), any(Number.class), - eq(harness.target), anyBoolean()); + verify(builder.engine).release(eq(builder.resource)); + verify(builder.requestListener).onLoadFailed(isAGlideException(), any(Number.class), + eq(builder.target), anyBoolean()); } @Test public void testCanHandleNonConformingResources() { - SingleRequest request = harness.getRequest(); - when(((Resource) (harness.resource)).get()) + SingleRequest request = builder.build(); + when(((Resource) (builder.resource)).get()) .thenReturn("Invalid mocked String, this should be a List"); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); assertTrue(request.isFailed()); - verify(harness.engine).release(eq(harness.resource)); - verify(harness.requestListener).onLoadFailed(isAGlideException(), any(Number.class), - eq(harness.target), anyBoolean()); + verify(builder.engine).release(eq(builder.resource)); + verify(builder.requestListener).onLoadFailed(isAGlideException(), any(Number.class), + eq(builder.target), anyBoolean()); } @Test public void testIsNotFailedAfterClear() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.onResourceReady(null, DataSource.DATA_DISK_CACHE); request.clear(); @@ -165,7 +115,7 @@ public class SingleRequestTest { @Test public void testIsPausedAfterPause() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.pause(); assertTrue(request.isPaused()); @@ -173,7 +123,7 @@ public class SingleRequestTest { @Test public void testIsNotCancelledAfterPause() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.pause(); assertFalse(request.isCancelled()); @@ -181,7 +131,7 @@ public class SingleRequestTest { @Test public void testIsNotPausedAfterBeginningWhilePaused() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.pause(); request.begin(); @@ -191,7 +141,7 @@ public class SingleRequestTest { @Test public void testIsNotFailedAfterBegin() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.onResourceReady(null, DataSource.DATA_DISK_CACHE); request.begin(); @@ -201,17 +151,17 @@ public class SingleRequestTest { @Test public void testIsCompleteAfterReceivingResource() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); - request.onResourceReady(harness.resource, DataSource.LOCAL); + request.onResourceReady(builder.resource, DataSource.LOCAL); assertTrue(request.isComplete()); } @Test public void testIsNotCompleteAfterClear() { - SingleRequest request = harness.getRequest(); - request.onResourceReady(harness.resource, DataSource.REMOTE); + SingleRequest request = builder.build(); + request.onResourceReady(builder.resource, DataSource.REMOTE); request.clear(); assertFalse(request.isComplete()); @@ -219,7 +169,7 @@ public class SingleRequestTest { @Test public void testIsCancelledAfterClear() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.clear(); assertTrue(request.isCancelled()); @@ -227,11 +177,11 @@ public class SingleRequestTest { @Test public void testDoesNotNotifyTargetTwiceIfClearedTwiceInARow() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.clear(); request.clear(); - verify(harness.target, times(1)).onLoadCleared(any(Drawable.class)); + verify(builder.target, times(1)).onLoadCleared(any(Drawable.class)); } @Test @@ -246,24 +196,25 @@ public class SingleRequestTest { } }).when(requestCoordinator).canSetImage(any(Request.class)); - harness.requestCoordinator = requestCoordinator; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setRequestCoordinator(requestCoordinator) + .build(); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); verify(requestCoordinator).canSetImage(eq(request)); } @Test public void testIsNotFailedWithoutException() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); assertFalse(request.isFailed()); } @Test public void testIsFailedAfterException() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.onLoadFailed(new GlideException("test")); assertTrue(request.isFailed()); @@ -271,23 +222,23 @@ public class SingleRequestTest { @Test public void testIgnoresOnSizeReadyIfNotWaitingForSize() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.begin(); request.onSizeReady(100, 100); request.onSizeReady(100, 100); - verify(harness.engine, times(1)) + verify(builder.engine, times(1)) .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), eq(100), eq(100), eq(Object.class), eq(List.class), any(Priority.class), any(DiskCacheStrategy.class), - eq(harness.transformations), + eq(builder.transformations), anyBoolean(), anyBoolean(), any(Options.class), @@ -300,7 +251,7 @@ public class SingleRequestTest { @Test public void testIsFailedAfterNoResultAndNullException() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.onLoadFailed(new GlideException("test")); assertTrue(request.isFailed()); @@ -310,29 +261,29 @@ public class SingleRequestTest { public void testEngineLoadCancelledOnCancel() { Engine.LoadStatus loadStatus = mock(Engine.LoadStatus.class); - when(harness.engine - .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), - anyInt(), - anyInt(), - eq(Object.class), - eq(List.class), - any(Priority.class), - any(DiskCacheStrategy.class), - eq(harness.transformations), - anyBoolean(), - anyBoolean(), - any(Options.class), - anyBoolean(), - anyBoolean(), - anyBoolean(), - anyBoolean(), - any(ResourceCallback.class))) + when(builder.engine + .load( + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), + anyInt(), + anyInt(), + eq(Object.class), + eq(List.class), + any(Priority.class), + any(DiskCacheStrategy.class), + eq(builder.transformations), + anyBoolean(), + anyBoolean(), + any(Options.class), + anyBoolean(), + anyBoolean(), + anyBoolean(), + anyBoolean(), + any(ResourceCallback.class))) .thenReturn(loadStatus); - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.begin(); request.onSizeReady(100, 100); @@ -343,12 +294,12 @@ public class SingleRequestTest { @Test public void testResourceIsRecycledOnClear() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); - request.onResourceReady(harness.resource, DataSource.REMOTE); + request.onResourceReady(builder.resource, DataSource.REMOTE); request.clear(); - verify(harness.engine).release(eq(harness.resource)); + verify(builder.engine).release(eq(builder.resource)); } @Test @@ -357,12 +308,13 @@ public class SingleRequestTest { MockTarget target = new MockTarget(); - harness.placeholderDrawable = expected; - harness.target = target; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setPlaceholderDrawable(expected) + .setTarget(target) + .build(); request.begin(); - assertEquals(expected, target.currentPlaceholder); + assertThat(target.currentPlaceholder).isEqualTo(expected); } @Test @@ -371,13 +323,14 @@ public class SingleRequestTest { MockTarget target = new MockTarget(); - harness.errorDrawable = expected; - harness.target = target; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setErrorDrawable(expected) + .setTarget(target) + .build(); request.onLoadFailed(new GlideException("test")); - assertEquals(expected, target.currentPlaceholder); + assertThat(target.currentPlaceholder).isEqualTo(expected); } @Test @@ -386,14 +339,15 @@ public class SingleRequestTest { MockTarget target = new MockTarget(); - harness.errorDrawable = placeholder; - harness.target = target; - harness.model = null; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setErrorDrawable(placeholder) + .setTarget(target) + .setModel(null) + .build(); request.begin(); - assertEquals(placeholder, target.currentPlaceholder); + assertThat(target.currentPlaceholder).isEqualTo(placeholder); } @Test @@ -403,15 +357,16 @@ public class SingleRequestTest { MockTarget target = new MockTarget(); - harness.placeholderDrawable = placeholder; - harness.errorDrawable = errorPlaceholder; - harness.target = target; - harness.model = null; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setPlaceholderDrawable(placeholder) + .setErrorDrawable(errorPlaceholder) + .setTarget(target) + .setModel(null) + .build(); request.begin(); - assertEquals(errorPlaceholder, target.currentPlaceholder); + assertThat(target.currentPlaceholder).isEqualTo(errorPlaceholder); } @@ -422,41 +377,43 @@ public class SingleRequestTest { Drawable fallback = new ColorDrawable(Color.BLUE); MockTarget target = new MockTarget(); - harness.placeholderDrawable = placeholder; - harness.errorDrawable = errorPlaceholder; - harness.fallbackDrawable = fallback; - harness.target = target; - harness.model = null; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setPlaceholderDrawable(placeholder) + .setErrorDrawable(errorPlaceholder) + .setFallbackDrawable(fallback) + .setTarget(target) + .setModel(null) + .build(); request.begin(); - assertEquals(fallback, target.currentPlaceholder); + + assertThat(target.currentPlaceholder).isEqualTo(fallback); } @Test public void testIsNotRunningBeforeRunCalled() { - assertFalse(harness.getRequest().isRunning()); + assertFalse(builder.build().isRunning()); } @Test public void testIsRunningAfterRunCalled() { - Request request = harness.getRequest(); + Request request = builder.build(); request.begin(); assertTrue(request.isRunning()); } @Test public void testIsNotRunningAfterComplete() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.begin(); - request.onResourceReady(harness.resource, DataSource.REMOTE); + request.onResourceReady(builder.resource, DataSource.REMOTE); assertFalse(request.isRunning()); } @Test public void testIsNotRunningAfterFailing() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.begin(); request.onLoadFailed(new GlideException("test")); @@ -465,7 +422,7 @@ public class SingleRequestTest { @Test public void testIsNotRunningAfterClear() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.begin(); request.clear(); @@ -474,113 +431,115 @@ public class SingleRequestTest { @Test public void testCallsTargetOnResourceReadyIfNoRequestListener() { - harness.requestListener = null; - SingleRequest request = harness.getRequest(); - request.onResourceReady(harness.resource, DataSource.LOCAL); + SingleRequest request = builder + .setRequestListener(null) + .build(); + request.onResourceReady(builder.resource, DataSource.LOCAL); - verify(harness.target).onResourceReady(eq(harness.result), anyTransition()); + verify(builder.target).onResourceReady(eq(builder.result), anyTransition()); } @Test public void testCallsTargetOnResourceReadyIfRequestListenerReturnsFalse() { - SingleRequest request = harness.getRequest(); - when(harness.requestListener - .onResourceReady(any(List.class), any(Number.class), eq(harness.target), isADataSource(), + SingleRequest request = builder.build(); + when(builder.requestListener + .onResourceReady(any(List.class), any(Number.class), eq(builder.target), isADataSource(), anyBoolean())).thenReturn(false); - request.onResourceReady(harness.resource, DataSource.LOCAL); + request.onResourceReady(builder.resource, DataSource.LOCAL); - verify(harness.target).onResourceReady(eq(harness.result), anyTransition()); + verify(builder.target).onResourceReady(eq(builder.result), anyTransition()); } @Test public void testDoesNotCallTargetOnResourceReadyIfRequestListenerReturnsTrue() { - SingleRequest request = harness.getRequest(); - when(harness.requestListener - .onResourceReady(any(List.class), any(Number.class), eq(harness.target), isADataSource(), + SingleRequest request = builder.build(); + when(builder.requestListener + .onResourceReady(any(List.class), any(Number.class), eq(builder.target), isADataSource(), anyBoolean())).thenReturn(true); - request.onResourceReady(harness.resource, DataSource.REMOTE); + request.onResourceReady(builder.resource, DataSource.REMOTE); - verify(harness.target, never()).onResourceReady(any(List.class), anyTransition()); + verify(builder.target, never()).onResourceReady(any(List.class), anyTransition()); } @Test public void testCallsTargetOnExceptionIfNoRequestListener() { - harness.requestListener = null; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setRequestListener(null) + .build(); request.onLoadFailed(new GlideException("test")); - verify(harness.target).onLoadFailed(eq(harness.errorDrawable)); + verify(builder.target).onLoadFailed(eq(builder.errorDrawable)); } @Test public void testCallsTargetOnExceptionIfRequestListenerReturnsFalse() { - SingleRequest request = harness.getRequest(); - when(harness.requestListener.onLoadFailed(isAGlideException(), any(Number.class), - eq(harness.target), anyBoolean())) + SingleRequest request = builder.build(); + when(builder.requestListener.onLoadFailed(isAGlideException(), any(Number.class), + eq(builder.target), anyBoolean())) .thenReturn(false); request.onLoadFailed(new GlideException("test")); - verify(harness.target).onLoadFailed(eq(harness.errorDrawable)); + verify(builder.target).onLoadFailed(eq(builder.errorDrawable)); } @Test public void testDoesNotCallTargetOnExceptionIfRequestListenerReturnsTrue() { - SingleRequest request = harness.getRequest(); - when(harness.requestListener.onLoadFailed(isAGlideException(), any(Number.class), - eq(harness.target), anyBoolean())) + SingleRequest request = builder.build(); + when(builder.requestListener.onLoadFailed(isAGlideException(), any(Number.class), + eq(builder.target), anyBoolean())) .thenReturn(true); request.onLoadFailed(new GlideException("test")); - verify(harness.target, never()).onLoadFailed(any(Drawable.class)); + verify(builder.target, never()).onLoadFailed(any(Drawable.class)); } @Test public void testRequestListenerIsCalledWithResourceResult() { - SingleRequest request = harness.getRequest(); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + SingleRequest request = builder.build(); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); - verify(harness.requestListener) - .onResourceReady(eq(harness.result), any(Number.class), isAListTarget(), isADataSource(), + verify(builder.requestListener) + .onResourceReady(eq(builder.result), any(Number.class), isAListTarget(), isADataSource(), anyBoolean()); } @Test public void testRequestListenerIsCalledWithModel() { - SingleRequest request = harness.getRequest(); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + SingleRequest request = builder.build(); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); - verify(harness.requestListener) - .onResourceReady(any(List.class), eq(harness.model), isAListTarget(), isADataSource(), + verify(builder.requestListener) + .onResourceReady(any(List.class), eq(builder.model), isAListTarget(), isADataSource(), anyBoolean()); } @Test public void testRequestListenerIsCalledWithTarget() { - SingleRequest request = harness.getRequest(); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + SingleRequest request = builder.build(); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); - verify(harness.requestListener) - .onResourceReady(any(List.class), any(Number.class), eq(harness.target), isADataSource(), + verify(builder.requestListener) + .onResourceReady(any(List.class), any(Number.class), eq(builder.target), isADataSource(), anyBoolean()); } @Test public void testRequestListenerIsCalledWithLoadedFromMemoryIfLoadCompletesSynchronously() { - final SingleRequest request = harness.getRequest(); + final SingleRequest request = builder.build(); - when(harness.engine + when(builder.engine .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), anyInt(), anyInt(), eq(Object.class), eq(List.class), any(Priority.class), any(DiskCacheStrategy.class), - eq(harness.transformations), + eq(builder.transformations), anyBoolean(), anyBoolean(), any(Options.class), @@ -592,124 +551,129 @@ public class SingleRequestTest { .thenAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { - request.onResourceReady(harness.resource, DataSource.MEMORY_CACHE); + request.onResourceReady(builder.resource, DataSource.MEMORY_CACHE); return null; } }); request.begin(); request.onSizeReady(100, 100); - verify(harness.requestListener) - .onResourceReady(eq(harness.result), any(Number.class), isAListTarget(), + verify(builder.requestListener) + .onResourceReady(eq(builder.result), any(Number.class), isAListTarget(), eq(DataSource.MEMORY_CACHE), anyBoolean()); } @Test public void testRequestListenerIsCalledWithNotLoadedFromMemoryCacheIfLoadCompletesAsynchronously() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.onSizeReady(100, 100); - request.onResourceReady(harness.resource, DataSource.LOCAL); + request.onResourceReady(builder.resource, DataSource.LOCAL); - verify(harness.requestListener) - .onResourceReady(eq(harness.result), any(Number.class), isAListTarget(), + verify(builder.requestListener) + .onResourceReady(eq(builder.result), any(Number.class), isAListTarget(), eq(DataSource.LOCAL), anyBoolean()); } @Test public void testRequestListenerIsCalledWithIsFirstResourceIfNoRequestCoordinator() { - harness.requestCoordinator = null; - SingleRequest request = harness.getRequest(); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + SingleRequest request = builder + .setRequestCoordinator(null) + .build(); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); - verify(harness.requestListener) - .onResourceReady(eq(harness.result), any(Number.class), isAListTarget(), isADataSource(), + verify(builder.requestListener) + .onResourceReady(eq(builder.result), any(Number.class), isAListTarget(), isADataSource(), eq(true)); } @Test public void testRequestListenerIsCalledWithFirstImageIfRequestCoordinatorReturnsNoResourceSet() { - SingleRequest request = harness.getRequest(); - when(harness.requestCoordinator.isAnyResourceSet()).thenReturn(false); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + SingleRequest request = builder.build(); + when(builder.requestCoordinator.isAnyResourceSet()).thenReturn(false); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); - verify(harness.requestListener) - .onResourceReady(eq(harness.result), any(Number.class), isAListTarget(), isADataSource(), + verify(builder.requestListener) + .onResourceReady(eq(builder.result), any(Number.class), isAListTarget(), isADataSource(), eq(true)); } @Test public void testRequestListenerIsCalledWithNotIsFirstRequestIfRequestCoordinatorReturnsResourceSet() { - SingleRequest request = harness.getRequest(); - when(harness.requestCoordinator.isAnyResourceSet()).thenReturn(true); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + SingleRequest request = builder.build(); + when(builder.requestCoordinator.isAnyResourceSet()).thenReturn(true); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); - verify(harness.requestListener) - .onResourceReady(eq(harness.result), any(Number.class), isAListTarget(), + verify(builder.requestListener) + .onResourceReady(eq(builder.result), any(Number.class), isAListTarget(), isADataSource(), eq(false)); } @Test public void testTargetIsCalledWithAnimationFromFactory() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); Transition transition = mockTransition(); - when(harness.factory.build(any(DataSource.class), anyBoolean())).thenReturn(transition); - request.onResourceReady(harness.resource, DataSource.DATA_DISK_CACHE); + when(builder.transitionFactory.build(any(DataSource.class), anyBoolean())) + .thenReturn(transition); + request.onResourceReady(builder.resource, DataSource.DATA_DISK_CACHE); - verify(harness.target).onResourceReady(eq(harness.result), eq(transition)); + verify(builder.target).onResourceReady(eq(builder.result), eq(transition)); } @Test public void testCallsGetSizeIfOverrideWidthIsLessThanZero() { - harness.overrideWidth = -1; - harness.overrideHeight = 100; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setOverrideWidth(-1) + .setOverrideHeight(100) + .build(); request.begin(); - verify(harness.target).getSize(any(SizeReadyCallback.class)); + verify(builder.target).getSize(any(SizeReadyCallback.class)); } @Test public void testCallsGetSizeIfOverrideHeightIsLessThanZero() { - harness.overrideHeight = -1; - harness.overrideWidth = 100; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setOverrideWidth(100) + .setOverrideHeight(-1) + .build(); request.begin(); - verify(harness.target).getSize(any(SizeReadyCallback.class)); + verify(builder.target).getSize(any(SizeReadyCallback.class)); } @Test public void testDoesNotCallGetSizeIfOverrideWidthAndHeightAreSet() { - harness.overrideWidth = 100; - harness.overrideHeight = 100; - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setOverrideWidth(100) + .setOverrideHeight(100) + .build(); request.begin(); - verify(harness.target, never()).getSize(any(SizeReadyCallback.class)); + verify(builder.target, never()).getSize(any(SizeReadyCallback.class)); } @Test public void testCallsEngineWithOverrideWidthAndHeightIfSet() { - harness.overrideWidth = 1; - harness.overrideHeight = 2; - - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setOverrideWidth(1) + .setOverrideHeight(2) + .build(); request.begin(); - verify(harness.engine) + verify(builder.engine) .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), anyInt(), anyInt(), eq(Object.class), eq(List.class), any(Priority.class), any(DiskCacheStrategy.class), - eq(harness.transformations), + eq(builder.transformations), anyBoolean(), anyBoolean(), any(Options.class), @@ -722,31 +686,32 @@ public class SingleRequestTest { @Test public void testDoesNotSetErrorDrawableIfRequestCoordinatorDoesntAllowIt() { - harness.errorDrawable = new ColorDrawable(Color.RED); - SingleRequest request = harness.getRequest(); - when(harness.requestCoordinator.canNotifyStatusChanged(any(Request.class))).thenReturn(false); + SingleRequest request = builder + .setErrorDrawable(new ColorDrawable(Color.RED)) + .build(); + when(builder.requestCoordinator.canNotifyStatusChanged(any(Request.class))).thenReturn(false); request.onLoadFailed(new GlideException("test")); - verify(harness.target, never()).onLoadFailed(any(Drawable.class)); + verify(builder.target, never()).onLoadFailed(any(Drawable.class)); } @Test public void testCanReRunCancelledRequests() { - doAnswer(new CallSizeReady(100, 100)).when(harness.target) + doAnswer(new CallSizeReady(100, 100)).when(builder.target) .getSize(any(SizeReadyCallback.class)); - when(harness.engine + when(builder.engine .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), eq(100), eq(100), eq(Object.class), eq(List.class), any(Priority.class), any(DiskCacheStrategy.class), - eq(harness.transformations), + eq(builder.transformations), anyBoolean(), anyBoolean(), any(Options.class), @@ -755,42 +720,42 @@ public class SingleRequestTest { /*useAnimationPool=*/ anyBoolean(), anyBoolean(), any(ResourceCallback.class))) - .thenAnswer(new CallResourceCallback(harness.resource)); - SingleRequest request = harness.getRequest(); + .thenAnswer(new CallResourceCallback(builder.resource)); + SingleRequest request = builder.build(); request.begin(); request.cancel(); request.begin(); - verify(harness.target, times(2)).onResourceReady(eq(harness.result), anyTransition()); + verify(builder.target, times(2)).onResourceReady(eq(builder.result), anyTransition()); } @Test public void testResourceOnlyReceivesOneGetOnResourceReady() { - SingleRequest request = harness.getRequest(); - request.onResourceReady(harness.resource, DataSource.LOCAL); + SingleRequest request = builder.build(); + request.onResourceReady(builder.resource, DataSource.LOCAL); - verify(harness.resource, times(1)).get(); + verify(builder.resource, times(1)).get(); } @Test public void testDoesNotStartALoadIfOnSizeReadyIsCalledAfterCancel() { - SingleRequest request = harness.getRequest(); + SingleRequest request = builder.build(); request.cancel(); request.onSizeReady(100, 100); - verify(harness.engine, never()) + verify(builder.engine, never()) .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), anyInt(), anyInt(), eq(Object.class), eq(List.class), any(Priority.class), any(DiskCacheStrategy.class), - eq(harness.transformations), + eq(builder.transformations), anyBoolean(), anyBoolean(), any(Options.class), @@ -804,26 +769,26 @@ public class SingleRequestTest { @Test public void testCallsSourceUnlimitedExecutorEngineIfOptionsIsSet() { - doAnswer(new CallSizeReady(100, 100)).when(harness.target) + doAnswer(new CallSizeReady(100, 100)).when(builder.target) .getSize(any(SizeReadyCallback.class)); - harness.useUnlimitedSourceGeneratorsPool = true; - - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setUseUnlimitedSourceGeneratorsPool(true) + .build(); request.begin(); - verify(harness.engine) + verify(builder.engine) .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), anyInt(), anyInt(), eq(Object.class), eq(List.class), any(Priority.class), any(DiskCacheStrategy.class), - eq(harness.transformations), + eq(builder.transformations), anyBoolean(), anyBoolean(), any(Options.class), @@ -836,26 +801,26 @@ public class SingleRequestTest { @Test public void testCallsSourceExecutorEngineIfOptionsIsSet() { - doAnswer(new CallSizeReady(100, 100)).when(harness.target) + doAnswer(new CallSizeReady(100, 100)).when(builder.target) .getSize(any(SizeReadyCallback.class)); - harness.useUnlimitedSourceGeneratorsPool = false; - - SingleRequest request = harness.getRequest(); + SingleRequest request = builder + .setUseUnlimitedSourceGeneratorsPool(false) + .build(); request.begin(); - verify(harness.engine) + verify(builder.engine) .load( - eq(harness.glideContext), - eq(harness.model), - eq(harness.signature), + eq(builder.glideContext), + eq(builder.model), + eq(builder.signature), anyInt(), anyInt(), eq(Object.class), eq(List.class), any(Priority.class), any(DiskCacheStrategy.class), - eq(harness.transformations), + eq(builder.transformations), anyBoolean(), anyBoolean(), any(Options.class), @@ -868,53 +833,181 @@ public class SingleRequestTest { @Test public void testIsEquivalentTo() { - SingleRequest originalRequest1 = harness.getRequest(); - SingleRequest originalRequest2 = harness.getRequest(); + SingleRequest originalRequest1 = builder.build(); + SingleRequest originalRequest2 = builder.build(); assertTrue(originalRequest1.isEquivalentTo(originalRequest2)); - harness = new RequestHarness(); - harness.overrideWidth = harness.overrideWidth * 2; - SingleRequest widthRequest = harness.getRequest(); + builder = new SingleRequestBuilder(); + builder.overrideWidth = builder.overrideWidth * 2; + SingleRequest widthRequest = builder.build(); assertTrue(widthRequest.isEquivalentTo(widthRequest)); assertFalse(widthRequest.isEquivalentTo(originalRequest1)); assertFalse(originalRequest1.isEquivalentTo(widthRequest)); - harness = new RequestHarness(); - harness.overrideHeight = harness.overrideHeight * 2; - SingleRequest heightRequest = harness.getRequest(); + builder = new SingleRequestBuilder(); + builder.overrideHeight = builder.overrideHeight * 2; + SingleRequest heightRequest = builder.build(); assertTrue(heightRequest.isEquivalentTo(heightRequest)); assertFalse(heightRequest.isEquivalentTo(originalRequest1)); assertFalse(originalRequest1.isEquivalentTo(heightRequest)); - harness = new RequestHarness(); - harness.model = 12345679; - SingleRequest modelRequest = harness.getRequest(); + builder = new SingleRequestBuilder(); + builder.model = 12345679; + SingleRequest modelRequest = builder.build(); assertTrue(modelRequest.isEquivalentTo(modelRequest)); assertFalse(modelRequest.isEquivalentTo(originalRequest1)); assertFalse(originalRequest1.isEquivalentTo(modelRequest)); - harness = new RequestHarness(); - harness.model = null; - SingleRequest nullModelRequest = harness.getRequest(); + builder = new SingleRequestBuilder(); + builder.model = null; + SingleRequest nullModelRequest = builder.build(); assertTrue(nullModelRequest.isEquivalentTo(nullModelRequest)); assertFalse(nullModelRequest.isEquivalentTo(originalRequest1)); assertFalse(originalRequest1.isEquivalentTo(nullModelRequest)); - harness = new RequestHarness(); - harness.errorDrawable = new ColorDrawable(Color.GRAY); - SingleRequest errorRequest = harness.getRequest(); + builder = new SingleRequestBuilder(); + builder.errorDrawable = new ColorDrawable(Color.GRAY); + SingleRequest errorRequest = builder.build(); assertTrue(errorRequest.isEquivalentTo(errorRequest)); assertFalse(errorRequest.isEquivalentTo(originalRequest1)); assertFalse(originalRequest1.isEquivalentTo(errorRequest)); - harness = new RequestHarness(); - harness.priority = Priority.LOW; - SingleRequest priorityRequest = harness.getRequest(); + builder = new SingleRequestBuilder(); + builder.priority = Priority.LOW; + SingleRequest priorityRequest = builder.build(); assertTrue(priorityRequest.isEquivalentTo(priorityRequest)); assertFalse(priorityRequest.isEquivalentTo(originalRequest1)); assertFalse(originalRequest1.isEquivalentTo(priorityRequest)); } + static class SingleRequestBuilder { + + private Engine engine = mock(Engine.class); + private Number model = 123456; + @SuppressWarnings("unchecked") + private Target target = mock(Target.class); + private Resource resource = mockResource(); + private RequestCoordinator requestCoordinator = mock(RequestCoordinator.class); + private Drawable placeholderDrawable = null; + private Drawable errorDrawable = null; + private Drawable fallbackDrawable = null; + @SuppressWarnings("unchecked") + private RequestListener requestListener = mock(RequestListener.class); + @SuppressWarnings("unchecked") + private TransitionFactory transitionFactory = mock(TransitionFactory.class); + private int overrideWidth = -1; + private int overrideHeight = -1; + private List result = new ArrayList<>(); + private GlideContext glideContext = mock(GlideContext.class); + private Key signature = mock(Key.class); + private Priority priority = Priority.HIGH; + private boolean useUnlimitedSourceGeneratorsPool = false; + private Class transcodeClass = List.class; + private Map, Transformation> transformations = new HashMap<>(); + + SingleRequestBuilder() { + when(requestCoordinator.canSetImage(any(Request.class))).thenReturn(true); + when(requestCoordinator.canNotifyStatusChanged(any(Request.class))).thenReturn(true); + when(resource.get()).thenReturn(result); + } + + SingleRequestBuilder setEngine(Engine engine) { + this.engine = engine; + return this; + } + + SingleRequestBuilder setModel(Number model) { + this.model = model; + return this; + } + + SingleRequestBuilder setTarget(Target target) { + this.target = target; + return this; + } + + SingleRequestBuilder setResource(Resource resource) { + this.resource = resource; + return this; + } + + SingleRequestBuilder setRequestCoordinator(RequestCoordinator requestCoordinator) { + this.requestCoordinator = requestCoordinator; + return this; + } + + SingleRequestBuilder setPlaceholderDrawable(Drawable placeholderDrawable) { + this.placeholderDrawable = placeholderDrawable; + return this; + } + + SingleRequestBuilder setErrorDrawable(Drawable errorDrawable) { + this.errorDrawable = errorDrawable; + return this; + } + + SingleRequestBuilder setFallbackDrawable(Drawable fallbackDrawable) { + this.fallbackDrawable = fallbackDrawable; + return this; + } + + SingleRequestBuilder setRequestListener(RequestListener requestListener) { + this.requestListener = requestListener; + return this; + } + + SingleRequestBuilder setOverrideWidth(int overrideWidth) { + this.overrideWidth = overrideWidth; + return this; + } + + SingleRequestBuilder setOverrideHeight(int overrideHeight) { + this.overrideHeight = overrideHeight; + return this; + } + + SingleRequestBuilder setResult(List result) { + this.result = result; + return this; + } + + SingleRequestBuilder setPriority(Priority priority) { + this.priority = priority; + return this; + } + + SingleRequestBuilder setUseUnlimitedSourceGeneratorsPool( + boolean useUnlimitedSourceGeneratorsPool) { + this.useUnlimitedSourceGeneratorsPool = useUnlimitedSourceGeneratorsPool; + return this; + } + + SingleRequest build() { + RequestOptions requestOptions = new RequestOptions() + .error(errorDrawable) + .placeholder(placeholderDrawable) + .fallback(fallbackDrawable) + .override(overrideWidth, overrideHeight) + .priority(priority) + .signature(signature) + .useUnlimitedSourceGeneratorsPool(useUnlimitedSourceGeneratorsPool); + return SingleRequest.obtain( + /*context=*/glideContext, + /*glideContext=*/glideContext, + model, + transcodeClass, + requestOptions, + overrideWidth, + overrideHeight, + priority, + target, + requestListener, + requestCoordinator, + engine, + transitionFactory); + } + } + // TODO do we want to move these to Util? @SuppressWarnings("unchecked") private static Transition mockTransition() { @@ -939,15 +1032,16 @@ public class SingleRequestTest { private Resource resource; - public CallResourceCallback(Resource resource) { + CallResourceCallback(Resource resource) { this.resource = resource; } @Override public Object answer(InvocationOnMock invocationOnMock) throws Throwable { ResourceCallback cb = - (ResourceCallback) invocationOnMock.getArguments()[invocationOnMock.getArguments().length - - 1]; + (ResourceCallback) invocationOnMock.getArguments()[ + invocationOnMock.getArguments().length + - 1]; cb.onResourceReady(resource, DataSource.REMOTE); return null; } @@ -958,7 +1052,7 @@ public class SingleRequestTest { private int width; private int height; - public CallSizeReady(int width, int height) { + CallSizeReady(int width, int height) { this.width = width; this.height = height; } @@ -972,6 +1066,7 @@ public class SingleRequestTest { } private static class MockTarget implements Target { + private Drawable currentPlaceholder; @Override