@Test public void clearOnDetach_onAttach_afterLoadCleared_doesNotBeingRequest() { attachStateTarget.clearOnDetach(); attachStateTarget.setRequest(request); when(request.isCleared()).thenReturn(true); attachStateTarget.onLoadCleared(/*placeholder=*/ null); shadowView.callOnAttachedToWindow(); verify(request, never()).begin(); }
@Test public void testSizeCallbacksAreCalledInOrderPreDraw() { SizeReadyCallback[] cbs = new SizeReadyCallback[25]; for (int i = 0; i < cbs.length; i++) { cbs[i] = mock(SizeReadyCallback.class); target.getSize(cbs[i]); } int width = 100, height = 111; shadowView .setWidth(width) .setHeight(height) .setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); InOrder order = inOrder((Object[]) cbs); for (SizeReadyCallback cb : cbs) { order.verify(cb).onSizeReady(eq(width), eq(height)); } }
@Test public void getSize_withLayoutParams_notLaidOut_doesCallSizeReady() { shadowView .setLayoutParams(new LayoutParams(10, 10)) .setWidth(100) .setHeight(100) .setIsLaidOut(false); target.getSize(cb); verify(cb, times(1)).onSizeReady(anyInt(), anyInt()); }
@Test public void testCallbacksFromMultipleRequestsAreNotifiedOnPreDraw() { SizeReadyCallback firstCb = mock(SizeReadyCallback.class); SizeReadyCallback secondCb = mock(SizeReadyCallback.class); target.getSize(firstCb); target.getSize(secondCb); int width = 68; int height = 875; LayoutParams layoutParams = new LayoutParams(width, height); view.setLayoutParams(layoutParams); shadowView.setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); shadowObserver.fireOnPreDrawListeners(); verify(firstCb, times(1)).onSizeReady(eq(width), eq(height)); verify(secondCb, times(1)).onSizeReady(eq(width), eq(height)); }
@Test public void testDoesAddSecondListenerIfFirstListenerIsRemovedBeforeSecondRequest() { SizeReadyCallback cb1 = mock(SizeReadyCallback.class); target.getSize(cb1); view.setLayoutParams(new LayoutParams(100, 100)); shadowView.setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); assertThat(shadowObserver.getPreDrawListeners()).hasSize(0); SizeReadyCallback cb2 = mock(SizeReadyCallback.class); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); target.getSize(cb2); view.setLayoutParams(new LayoutParams(100, 100)); shadowObserver.fireOnPreDrawListeners(); verify(cb2).onSizeReady(anyInt(), anyInt()); }
@SuppressWarnings("ResultOfMethodCallIgnored") @Test public void onLoadCleared_withoutClearOnDetach_doesNotRemoveListeners() { OnAttachStateChangeListener expected = new OnAttachStateChangeListener() { @Override public void onViewAttachedToWindow(View v) { } @Override public void onViewDetachedFromWindow(View v) { } }; shadowView.addOnAttachStateChangeListener(expected); attachStateTarget.onLoadCleared(/*placeholder=*/ null); assertThat(shadowView.attachStateListeners).containsExactly(expected); }
@Test public void testMatchParentWidthAndHeight() { LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); view.setLayoutParams(params); target.getSize(cb); verify(cb, never()).onSizeReady(anyInt(), anyInt()); int width = 32; int height = 45; shadowView .setWidth(width) .setHeight(height) .setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); verify(cb).onSizeReady(eq(width), eq(height)); }
@Test public void getSize_withWrapContentWidthAndMatchParentHeight_usesDisplayDimenWidthAndHeight() { LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); view.setLayoutParams(params); setDisplayDimens(500, 600); target.getSize(cb); verify(cb, never()).onSizeReady(anyInt(), anyInt()); int height = 32; shadowView .setHeight(height) .setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); verify(cb).onSizeReady(600, height); }
@Test public void getSize_withMatchParentWidthAndWrapContentHeight_usesWidthAndDisplayDimenHeight() { LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); view.setLayoutParams(params); setDisplayDimens(300, 400); target.getSize(cb); verify(cb, never()).onSizeReady(anyInt(), anyInt()); int width = 32; shadowView .setWidth(width) .setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); verify(cb).onSizeReady(width, 400); }
@Test public void testCallbackIsNotCalledTwiceIfPreDrawFiresTwice() { target.getSize(cb); LayoutParams layoutParams = new LayoutParams(1234, 4123); view.setLayoutParams(layoutParams); shadowView.setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); shadowObserver.fireOnPreDrawListeners(); verify(cb, times(1)).onSizeReady(anyInt(), anyInt()); }
@Test public void getSize_withWrapContentWidthAndValidHeight_usesDisplayDimenAndValidHeight() { int height = 100; LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, height); view.setLayoutParams(params); shadowView.setIsLaidOut(true); setDisplayDimens(100, 200); target.getSize(cb); verify(cb).onSizeReady(200, height); }
@Test public void getSize_withBothWrapContent_usesDisplayDimens() { LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); view.setLayoutParams(layoutParams); shadowView.setIsLaidOut(true); setDisplayDimens(200, 300); target.getSize(cb); verify(cb).onSizeReady(300, 300); }
@Test public void clearOnDetach_onDetach_withRunningRequest_pausesRequestOnce() { attachStateTarget.clearOnDetach(); attachStateTarget.setRequest(request); shadowView.callOnDetachedFromWindow(); verify(request).clear(); }
@Test public void testDoesNotThrowOnPreDrawIfViewTreeObserverIsDead() { target.getSize(cb); int width = 1; int height = 2; LayoutParams layoutParams = new LayoutParams(width, height); view.setLayoutParams(layoutParams); shadowView.setIsLaidOut(true); shadowObserver.setIsAlive(false); shadowObserver.fireOnPreDrawListeners(); verify(cb).onSizeReady(eq(width), eq(height)); }
@Test public void testDoesNotNotifyCallbackTwiceIfAddedTwice() { target.getSize(cb); target.getSize(cb); view.setLayoutParams(new LayoutParams(100, 100)); shadowView.setIsLaidOut(true); shadowObserver.fireOnPreDrawListeners(); verify(cb, times(1)).onSizeReady(anyInt(), anyInt()); }
@Test public void clearOnDetach_afterLoadClearedAndRestarted_onAttach_beingsRequest() { attachStateTarget.clearOnDetach(); attachStateTarget.setRequest(request); when(request.isCleared()).thenReturn(true); attachStateTarget.onLoadCleared(/*placeholder=*/ null); attachStateTarget.onLoadStarted(/*placeholder=*/ null); shadowView.callOnAttachedToWindow(); verify(request).begin(); }
@Test public void clearOnDetach_onAttach_withRunningRequest_doesNotBeginRequest() { attachStateTarget.clearOnDetach(); attachStateTarget.setRequest(request); when(request.isCleared()).thenReturn(false); shadowView.callOnAttachedToWindow(); verify(request, never()).begin(); }
@Test public void clearOnDetach_onDetach_afterMultipleClearOnDetaches_removesListener() { attachStateTarget .clearOnDetach() .clearOnDetach() .clearOnDetach(); attachStateTarget.onLoadCleared(/*placeholder=*/ null); attachStateTarget.setRequest(request); shadowView.callOnDetachedFromWindow(); verify(request, never()).clear(); }
@Test public void clearOnDetach_onDetach_afterOnLoadCleared_removesListener() { attachStateTarget.clearOnDetach(); attachStateTarget.onLoadCleared(/*placeholder=*/ null); attachStateTarget.setRequest(request); shadowView.callOnDetachedFromWindow(); verify(request, never()).clear(); }
@Test public void getSize_withValidWidthAndHeight_notLaidOut_notLayoutRequested_callsSizeReady() { shadowView .setWidth(100) .setHeight(100) .setIsLaidOut(false); target.getSize(cb); verify(cb).onSizeReady(100, 100); }