/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.drawee.generic;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import com.facebook.common.internal.Lists;
import com.facebook.drawee.drawable.AndroidGraphicsTestUtils;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.testing.robolectric.v2.WithTestDefaultsRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
@RunWith(WithTestDefaultsRunner.class)
public class GenericDraweeHierarchyBuilderTest {
private final Drawable mBackgroundDrawable1 = mock(BitmapDrawable.class);
private final Drawable mBackgroundDrawable2 = mock(BitmapDrawable.class);
private final Drawable mOverlayDrawable1 = mock(BitmapDrawable.class);
private final Drawable mOverlayDrawable2 = mock(BitmapDrawable.class);
private final BitmapDrawable mPlaceholderDrawable1 = mock(BitmapDrawable.class);
private final BitmapDrawable mFailureDrawable1 = mock(BitmapDrawable.class);
private final BitmapDrawable mRetryDrawable1 = mock(BitmapDrawable.class);
private final BitmapDrawable mPlaceholderDrawable2 = mock(BitmapDrawable.class);
private final BitmapDrawable mFailureDrawable2 = mock(BitmapDrawable.class);
private final BitmapDrawable mRetryDrawable2 = mock(BitmapDrawable.class);
private final BitmapDrawable mProgressBarDrawable1 = mock(BitmapDrawable.class);
private final BitmapDrawable mProgressBarDrawable2 = mock(BitmapDrawable.class);
private final BitmapDrawable mPressedStateDrawable = mock(BitmapDrawable.class);
private final Matrix mActualImageMatrix = mock(Matrix.class);
private final PointF mFocusPoint = mock(PointF.class);
private final RoundingParams mRoundingParams = mock(RoundingParams.class);
private void testInitialState(GenericDraweeHierarchyBuilder builder) {
assertEquals(300, builder.getFadeDuration());
assertEquals(null, builder.getPlaceholderImage());
assertEquals(null, builder.getPlaceholderImageScaleType());
assertEquals(null, builder.getRetryImage());
assertEquals(null, builder.getRetryImageScaleType());
assertEquals(null, builder.getFailureImage());
assertEquals(null, builder.getFailureImageScaleType());
assertEquals(null, builder.getProgressBarImage());
assertEquals(null, builder.getProgressBarImageScaleType());
assertEquals(ScalingUtils.ScaleType.CENTER_CROP, builder.getActualImageScaleType());
assertEquals(null, builder.getActualImageMatrix());
assertEquals(null, builder.getActualImageFocusPoint());
assertEquals(null, builder.getBackgrounds());
assertEquals(null, builder.getOverlays());
assertEquals(null, builder.getRoundingParams());
}
@Test
public void testBuilder() throws Exception {
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(null);
// test defaults
testInitialState(builder);
// test fade duration
builder.setFadeDuration(100);
assertEquals(100, builder.getFadeDuration());
// test image setters with default scale type
builder.setPlaceholderImage(mPlaceholderDrawable1);
builder.setRetryImage(mRetryDrawable1);
builder.setFailureImage(mFailureDrawable1);
builder.setProgressBarImage(mProgressBarDrawable1);
assertEquals(mPlaceholderDrawable1, builder.getPlaceholderImage());
assertEquals(ScalingUtils.ScaleType.CENTER_INSIDE, builder.getPlaceholderImageScaleType());
assertEquals(mRetryDrawable1, builder.getRetryImage());
assertEquals(ScalingUtils.ScaleType.CENTER_INSIDE, builder.getRetryImageScaleType());
assertEquals(mFailureDrawable1, builder.getFailureImage());
assertEquals(ScalingUtils.ScaleType.CENTER_INSIDE, builder.getFailureImageScaleType());
assertEquals(mProgressBarDrawable1, builder.getProgressBarImage());
assertEquals(ScalingUtils.ScaleType.CENTER_INSIDE, builder.getProgressBarImageScaleType());
// test image setters with explicit scale type
builder.setPlaceholderImage(mPlaceholderDrawable2, ScalingUtils.ScaleType.CENTER);
builder.setRetryImage(mRetryDrawable2, ScalingUtils.ScaleType.FIT_CENTER);
builder.setFailureImage(mFailureDrawable2, ScalingUtils.ScaleType.FIT_END);
builder.setProgressBarImage(mProgressBarDrawable2, ScalingUtils.ScaleType.CENTER_CROP);
assertEquals(mPlaceholderDrawable2, builder.getPlaceholderImage());
assertEquals(ScalingUtils.ScaleType.CENTER, builder.getPlaceholderImageScaleType());
assertEquals(mRetryDrawable2, builder.getRetryImage());
assertEquals(ScalingUtils.ScaleType.FIT_CENTER, builder.getRetryImageScaleType());
assertEquals(mFailureDrawable2, builder.getFailureImage());
assertEquals(ScalingUtils.ScaleType.FIT_END, builder.getFailureImageScaleType());
assertEquals(mProgressBarDrawable2, builder.getProgressBarImage());
assertEquals(ScalingUtils.ScaleType.CENTER_CROP, builder.getProgressBarImageScaleType());
// test actual image matrix
builder.setActualImageMatrix(mActualImageMatrix);
assertSame(mActualImageMatrix, builder.getActualImageMatrix());
assertSame(null, builder.getActualImageScaleType());
// test actual image scale type
builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_START);
assertEquals(ScalingUtils.ScaleType.FIT_START, builder.getActualImageScaleType());
// test actual image focus point
builder.setActualImageFocusPoint(mFocusPoint);
AndroidGraphicsTestUtils.assertEquals(mFocusPoint, builder.getActualImageFocusPoint(), 0f);
builder.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP);
assertSame(ScalingUtils.ScaleType.FOCUS_CROP, builder.getActualImageScaleType());
assertSame(null, builder.getActualImageMatrix());
// test backgrounds & overlays
builder.setBackgrounds(Lists.newArrayList(mBackgroundDrawable1, mBackgroundDrawable2));
builder.setOverlays(Lists.newArrayList(mOverlayDrawable1, mOverlayDrawable2));
assertArrayEquals(
builder.getBackgrounds().toArray(),
new Drawable[]{mBackgroundDrawable1, mBackgroundDrawable2});
assertArrayEquals(
builder.getOverlays().toArray(),
new Drawable[]{mOverlayDrawable1, mOverlayDrawable2});
builder.setBackground(mBackgroundDrawable2);
builder.setOverlay(mOverlayDrawable2);
builder.setPressedStateOverlay(mPressedStateDrawable);
assertArrayEquals(builder.getBackgrounds().toArray(), new Drawable[]{mBackgroundDrawable2});
assertArrayEquals(builder.getOverlays().toArray(), new Drawable[] {mOverlayDrawable2});
assertEquals(builder.getPressedStateOverlay().getClass(), StateListDrawable.class);
// test rounding params
builder.setRoundingParams(mRoundingParams);
assertEquals(mRoundingParams, builder.getRoundingParams());
// test reset
builder.reset();
testInitialState(builder);
}
}