package com.bumptech.glide.load.resource.bitmap;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.tests.Util;
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)
public class CircleCropTest {
@Mock private BitmapPool bitmapPool;
private CircleCrop circleCrop;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
when(bitmapPool.get(anyInt(), anyInt(), any(Bitmap.Config.class)))
.thenAnswer(new Util.CreateBitmap());
Context context = RuntimeEnvironment.application;
Glide.init(new GlideBuilder().setBitmapPool(bitmapPool).build(context));
circleCrop = new CircleCrop();
}
@After
public void tearDown() {
Glide.tearDown();
}
@Test
public void testTransform_withSquare() {
Bitmap redSquare = createSolidRedBitmap(50, 50);
Bitmap result = circleCrop.transform(bitmapPool, redSquare, 50, 50);
Bitmap expected = createBitmapWithRedCircle(50, 50);
assertSamePixels(expected, result);
}
@Test
public void testTransform_reusesBitmap() {
Bitmap toReuse = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888);
when(bitmapPool.get(50, 50, Bitmap.Config.ARGB_8888)).thenReturn(toReuse);
Bitmap redSquare = createSolidRedBitmap(50, 50);
Bitmap result = circleCrop.transform(bitmapPool, redSquare, 50, 50);
assertEquals(toReuse, result);
}
@Test
public void testTransform_withWideRectangle() {
Bitmap redWideRectangle = createSolidRedBitmap(100, 50);
Bitmap result = circleCrop.transform(bitmapPool, redWideRectangle, 80, 50);
Bitmap expected = createBitmapWithRedCircle(80, 50);
assertSamePixels(expected, result);
}
@Test
public void testTransform_withNarrowRectangle() {
Bitmap redNarrowRectangle = createSolidRedBitmap(20, 50);
Bitmap result = circleCrop.transform(bitmapPool, redNarrowRectangle, 40, 80);
Bitmap expected = createBitmapWithRedCircle(40, 80);
assertSamePixels(expected, result);
}
private void assertSamePixels(Bitmap expected, Bitmap actual) {
assertEquals(expected.getWidth(), actual.getWidth());
assertEquals(expected.getHeight(), actual.getHeight());
assertEquals(expected.getConfig(), actual.getConfig());
for (int y = 0; y < expected.getHeight(); y++) {
for (int x = 0; x < expected.getWidth(); x++) {
assertEquals(expected.getPixel(x, y), actual.getPixel(x, y));
}
}
}
private Bitmap createBitmapWithRedCircle(int width, int height) {
int minEdge = Math.min(width, height);
float radius = minEdge / 2f;
Bitmap result = Bitmap.createBitmap(minEdge, minEdge, Bitmap.Config.ARGB_8888);
result.setHasAlpha(true);
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
canvas.drawCircle(radius, radius, radius, paint);
return result;
}
private Bitmap createSolidRedBitmap(int width, int height) {
Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setColor(Color.RED);
Rect rect = new Rect(0, 0, width, height);
canvas.drawRect(rect, paint);
return result;
}
}