package com.bumptech.glide.load.resource.bitmap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
import android.app.Application;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.tests.Util;
import java.security.MessageDigest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = 18)
public class BitmapTransformationTest {
@Mock
private BitmapPool bitmapPool;
private Application context;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
context = RuntimeEnvironment.application;
Glide.init(new GlideBuilder().setBitmapPool(bitmapPool).build(context));
}
@After
public void tearDown() {
Glide.tearDown();
}
@Test
public void testReturnsGivenResourceWhenBitmapNotTransformed() {
BitmapTransformation transformation = new BitmapTransformation() {
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) { }
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform,
int outWidth, int outHeight) {
return toTransform;
}
};
Resource<Bitmap> resource = mockResource(100, 100);
assertEquals(resource, transformation.transform(context, resource, 1, 1));
}
@Test
public void testReturnsNewResourceWhenBitmapTransformed() {
final Bitmap transformed = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_4444);
BitmapTransformation transformation = new BitmapTransformation() {
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) { }
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap bitmap, int outWidth,
int outHeight) {
return transformed;
}
};
Resource<Bitmap> resource = mockResource(1, 2);
assertNotSame(resource, transformation.transform(context, resource, 100, 100));
}
@Test
public void testPassesGivenArgumentsToTransform() {
final int expectedWidth = 13;
final int expectedHeight = 148;
final Resource<Bitmap> resource = mockResource(223, 4123);
BitmapTransformation transformation = new BitmapTransformation() {
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) { }
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform,
int outWidth, int outHeight) {
assertEquals(bitmapPool, pool);
assertEquals(resource.get(), toTransform);
assertEquals(expectedWidth, outWidth);
assertEquals(expectedHeight, outHeight);
return resource.get();
}
};
transformation.transform(context, resource, expectedWidth, expectedHeight);
}
@Test(expected = IllegalArgumentException.class)
public void testThrowsIfGivenInvalidWidth() {
BitmapTransformation transformation = new BitmapTransformation() {
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) { }
@Override
protected Bitmap transform(@NonNull BitmapPool bitmapPool, @NonNull Bitmap toTransform,
int outWidth, int outHeight) {
return null;
}
};
transformation.transform(context, mockResource(1, 1), -1, 100);
}
@Test(expected = IllegalArgumentException.class)
public void testThrowsIfGivenInvalidHeight() {
BitmapTransformation transformation = new BitmapTransformation() {
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) { }
@Override
protected Bitmap transform(@NonNull BitmapPool bitmapPool, @NonNull Bitmap toTransform,
int outWidth, int outHeight) {
return null;
}
};
transformation.transform(context, mockResource(1, 1), 100, -1);
}
@Test
public void testReturnsNullIfTransformReturnsNull() {
BitmapTransformation transform = new BitmapTransformation() {
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) { }
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform,
int outWidth, int outHeight) {
return null;
}
};
Resource<Bitmap> resource = mockResource(100, 100);
assertNull(transform.transform(context, resource, 100, 100));
}
@Test
public void testCallsTransformWithGivenBitmapWidthIfWidthIsSizeOriginal() {
SizeTrackingTransform transform = new SizeTrackingTransform();
int expectedWidth = 200;
Resource<Bitmap> resource = mockResource(expectedWidth, 300);
transform.transform(context, resource, Target.SIZE_ORIGINAL, 500);
assertEquals(expectedWidth, transform.givenWidth);
}
@Test
public void testCallsTransformWithGivenBitmapHeightIfHeightIsSizeOriginal() {
SizeTrackingTransform transform = new SizeTrackingTransform();
int expectedHeight = 500;
Resource<Bitmap> resource = mockResource(123, expectedHeight);
transform.transform(context, resource, 444, expectedHeight);
assertEquals(expectedHeight, transform.givenHeight);
}
private Resource<Bitmap> mockResource(int width, int height) {
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Resource<Bitmap> resource = Util.mockResource();
when(resource.get()).thenReturn(bitmap);
return resource;
}
private class SizeTrackingTransform extends BitmapTransformation {
int givenWidth;
int givenHeight;
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth,
int outHeight) {
givenWidth = outWidth;
givenHeight = outHeight;
return null;
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) { }
}
}