package com.squareup.picasso;
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowBitmap;
import static android.graphics.Bitmap.Config.ARGB_8888;
import static com.squareup.picasso.MediaStoreRequestHandler.PicassoKind.FULL;
import static com.squareup.picasso.MediaStoreRequestHandler.PicassoKind.MICRO;
import static com.squareup.picasso.MediaStoreRequestHandler.PicassoKind.MINI;
import static com.squareup.picasso.MediaStoreRequestHandler.getPicassoKind;
import static com.squareup.picasso.TestUtils.MEDIA_STORE_CONTENT_1_URL;
import static com.squareup.picasso.TestUtils.MEDIA_STORE_CONTENT_KEY_1;
import static com.squareup.picasso.TestUtils.makeBitmap;
import static com.squareup.picasso.TestUtils.mockAction;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.robolectric.Shadows.shadowOf;
@RunWith(RobolectricGradleTestRunner.class)
@Config(shadows = { Shadows.ShadowVideoThumbnails.class, Shadows.ShadowImageThumbnails.class })
public class MediaStoreRequestHandlerTest {
@Mock Context context;
@Before public void setUp() {
initMocks(this);
}
@Test public void decodesVideoThumbnailWithVideoMimeType() throws Exception {
Bitmap bitmap = makeBitmap();
Request request =
new Request.Builder(MEDIA_STORE_CONTENT_1_URL, 0, ARGB_8888).resize(100, 100).build();
Action action = mockAction(MEDIA_STORE_CONTENT_KEY_1, request);
MediaStoreRequestHandler requestHandler = create("video/");
Bitmap result = requestHandler.load(action.getRequest(), 0).getBitmap();
assertBitmapsEqual(result, bitmap);
}
@Test public void decodesImageThumbnailWithImageMimeType() throws Exception {
Bitmap bitmap = makeBitmap(20, 20);
Request request =
new Request.Builder(MEDIA_STORE_CONTENT_1_URL, 0, ARGB_8888).resize(100, 100).build();
Action action = mockAction(MEDIA_STORE_CONTENT_KEY_1, request);
MediaStoreRequestHandler requestHandler = create("image/png");
Bitmap result = requestHandler.load(action.getRequest(), 0).getBitmap();
assertBitmapsEqual(result, bitmap);
}
@Test public void getPicassoKindMicro() throws Exception {
assertThat(getPicassoKind(96, 96)).isEqualTo(MICRO);
assertThat(getPicassoKind(95, 95)).isEqualTo(MICRO);
}
@Test public void getPicassoKindMini() throws Exception {
assertThat(getPicassoKind(512, 384)).isEqualTo(MINI);
assertThat(getPicassoKind(100, 100)).isEqualTo(MINI);
}
@Test public void getPicassoKindFull() throws Exception {
assertThat(getPicassoKind(513, 385)).isEqualTo(FULL);
assertThat(getPicassoKind(1000, 1000)).isEqualTo(FULL);
assertThat(getPicassoKind(1000, 384)).isEqualTo(FULL);
assertThat(getPicassoKind(1000, 96)).isEqualTo(FULL);
assertThat(getPicassoKind(96, 1000)).isEqualTo(FULL);
}
private MediaStoreRequestHandler create(String mimeType) {
ContentResolver contentResolver = mock(ContentResolver.class);
when(contentResolver.getType(any(Uri.class))).thenReturn(mimeType);
return create(contentResolver);
}
private MediaStoreRequestHandler create(ContentResolver contentResolver) {
when(context.getContentResolver()).thenReturn(contentResolver);
return new MediaStoreRequestHandler(context);
}
private static void assertBitmapsEqual(Bitmap a, Bitmap b) {
ShadowBitmap shadowA = shadowOf(a);
ShadowBitmap shadowB = shadowOf(b);
if (shadowA.getHeight() != shadowB.getHeight()) {
fail();
}
if (shadowA.getWidth() != shadowB.getWidth()) {
fail();
}
if (shadowA.getDescription() != null ? !shadowA.getDescription().equals(shadowB.getDescription()) : shadowB.getDescription() != null) {
fail();
}
}
}