blob: 814d124810f726c332f566a3b8ab7fd34f4e8766 [file] [log] [blame]
package org.robolectric.shadows;
import static com.google.common.truth.Truth.assertThat;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.robolectric.Shadows.shadowOf;
import android.app.Application;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.net.Uri;
import android.provider.MediaStore;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.InputStream;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.R;
@RunWith(AndroidJUnit4.class)
public class ShadowBitmapFactoryTest {
private Application context;
@Before
public void setUp() throws Exception {
context = ApplicationProvider.getApplicationContext();
}
@Test
public void decodeResource_shouldSetDescriptionAndCreatedFrom() {
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.an_image);
ShadowBitmap shadowBitmap = shadowOf(bitmap);
assertEquals("Bitmap for resource:org.robolectric:drawable/an_image", shadowBitmap.getDescription());
assertEquals(R.drawable.an_image, shadowBitmap.getCreatedFromResId());
assertEquals(64, bitmap.getWidth());
assertEquals(53, bitmap.getHeight());
}
@Test
public void decodeResource_shouldSetDefaultBitmapConfig() {
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.an_image);
assertThat(bitmap.getConfig()).isEqualTo(Bitmap.Config.ARGB_8888);
assertThat(bitmap.getRowBytes()).isNotEqualTo(0);
}
@Test
public void withResId0_decodeResource_shouldReturnNull() {
assertThat(BitmapFactory.decodeResource(context.getResources(), 0)).isNull();
}
@Test
public void decodeResource_shouldPassABitmapConfig() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ALPHA_8;
Bitmap bitmap =
BitmapFactory.decodeResource(context.getResources(), R.drawable.an_image, options);
assertThat(bitmap.getConfig()).isEqualTo(Bitmap.Config.ALPHA_8);
}
@Test
public void decodeFile_shouldSetDescriptionAndCreatedFrom() {
Bitmap bitmap = BitmapFactory.decodeFile("/some/file.jpg");
ShadowBitmap shadowBitmap = shadowOf(bitmap);
assertEquals("Bitmap for file:/some/file.jpg", shadowBitmap.getDescription());
assertEquals("/some/file.jpg", shadowBitmap.getCreatedFromPath());
assertEquals(100, bitmap.getWidth());
assertEquals(100, bitmap.getHeight());
}
@Test
public void decodeStream_shouldSetDescriptionAndCreatedFrom() throws Exception {
InputStream inputStream =
context.getContentResolver().openInputStream(Uri.parse("content:/path"));
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
ShadowBitmap shadowBitmap = shadowOf(bitmap);
assertEquals("Bitmap for content:/path", shadowBitmap.getDescription());
assertEquals(inputStream, shadowBitmap.getCreatedFromStream());
assertEquals(100, bitmap.getWidth());
assertEquals(100, bitmap.getHeight());
bitmap.getPixels(new int[bitmap.getHeight() * bitmap.getWidth()], 0, 0, 0, 0, bitmap.getWidth(), bitmap.getHeight());
}
@Test
public void decodeBytes_shouldSetDescriptionAndCreatedFrom() throws Exception {
byte[] yummyBites = "Hi!".getBytes("UTF-8");
Bitmap bitmap = BitmapFactory.decodeByteArray(yummyBites, 100, 100);
ShadowBitmap shadowBitmap = shadowOf(bitmap);
assertEquals("Bitmap for Hi! bytes 100..100", shadowBitmap.getDescription());
assertEquals(yummyBites, shadowBitmap.getCreatedFromBytes());
assertEquals(100, bitmap.getWidth());
assertEquals(100, bitmap.getHeight());
}
@Test
public void decodeStream_shouldSetDescriptionWithNullOptions() throws Exception {
InputStream inputStream =
context.getContentResolver().openInputStream(Uri.parse("content:/path"));
Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, null);
assertEquals("Bitmap for content:/path", shadowOf(bitmap).getDescription());
assertEquals(100, bitmap.getWidth());
assertEquals(100, bitmap.getHeight());
}
@Test
public void decodeResource_shouldGetWidthAndHeightFromHints() {
ShadowBitmapFactory.provideWidthAndHeightHints(R.drawable.an_image, 123, 456);
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.an_image);
assertEquals("Bitmap for resource:org.robolectric:drawable/an_image", shadowOf(bitmap).getDescription());
assertEquals(123, bitmap.getWidth());
assertEquals(456, bitmap.getHeight());
}
@Test
public void decodeResource_canTakeOptions() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 100;
Bitmap bitmap =
BitmapFactory.decodeResource(context.getResources(), R.drawable.an_image, options);
assertEquals(true, shadowOf(bitmap).getDescription().contains("inSampleSize=100"));
}
@Test
public void decodeResourceStream_canTakeOptions() throws Exception {
BitmapFactory.Options options = new BitmapFactory.Options();
InputStream inputStream =
context.getContentResolver().openInputStream(Uri.parse("content:/path"));
options.inSampleSize = 100;
Bitmap bitmap =
BitmapFactory.decodeResourceStream(
context.getResources(), null, inputStream, null, options);
assertEquals(true, shadowOf(bitmap).getDescription().contains("inSampleSize=100"));
}
@Test
public void decodeFile_shouldGetWidthAndHeightFromHints() {
ShadowBitmapFactory.provideWidthAndHeightHints("/some/file.jpg", 123, 456);
Bitmap bitmap = BitmapFactory.decodeFile("/some/file.jpg");
assertEquals("Bitmap for file:/some/file.jpg", shadowOf(bitmap).getDescription());
assertEquals(123, bitmap.getWidth());
assertEquals(456, bitmap.getHeight());
}
@Test
public void decodeFileEtc_shouldSetOptionsOutWidthAndOutHeightFromHints() {
ShadowBitmapFactory.provideWidthAndHeightHints("/some/file.jpg", 123, 456);
BitmapFactory.Options options = new BitmapFactory.Options();
BitmapFactory.decodeFile("/some/file.jpg", options);
assertEquals(123, options.outWidth);
assertEquals(456, options.outHeight);
}
@Test
public void decodeUri_shouldGetWidthAndHeightFromHints() throws Exception {
ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse("content:/path"), 123, 456);
Bitmap bitmap =
MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse("content:/path"));
assertEquals("Bitmap for content:/path", shadowOf(bitmap).getDescription());
assertEquals(123, bitmap.getWidth());
assertEquals(456, bitmap.getHeight());
}
@SuppressWarnings("ObjectToString")
@Test
public void decodeFileDescriptor_shouldGetWidthAndHeightFromHints() throws Exception {
File tmpFile = File.createTempFile("BitmapFactoryTest", null);
try {
tmpFile.deleteOnExit();
try (FileInputStream is = new FileInputStream(tmpFile)) {
FileDescriptor fd = is.getFD();
ShadowBitmapFactory.provideWidthAndHeightHints(fd, 123, 456);
Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fd);
assertEquals("Bitmap for fd:" + fd, shadowOf(bitmap).getDescription());
assertEquals(123, bitmap.getWidth());
assertEquals(456, bitmap.getHeight());
}
} finally {
tmpFile.delete();
}
}
@Test
public void decodeByteArray_shouldGetWidthAndHeightFromHints() {
String data = "arbitrary bytes";
ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse(data), 123, 456);
byte[] bytes = data.getBytes(UTF_8);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
assertEquals("Bitmap for " + data, shadowOf(bitmap).getDescription());
assertEquals(123, bitmap.getWidth());
assertEquals(456, bitmap.getHeight());
}
@Test
public void decodeByteArray_shouldIncludeOffsets() {
String data = "arbitrary bytes";
ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse(data), 123, 456);
byte[] bytes = data.getBytes(UTF_8);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 1, bytes.length - 2);
assertEquals("Bitmap for " + data + " bytes 1..13", shadowOf(bitmap).getDescription());
}
@Test
public void decodeStream_shouldGetWidthAndHeightFromHints() throws Exception {
ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse("content:/path"), 123, 456);
InputStream inputStream =
context.getContentResolver().openInputStream(Uri.parse("content:/path"));
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
assertEquals("Bitmap for content:/path", shadowOf(bitmap).getDescription());
assertEquals(123, bitmap.getWidth());
assertEquals(456, bitmap.getHeight());
}
@Test
public void decodeStream_shouldGetWidthAndHeightFromActualImage() {
InputStream inputStream =
getClass().getClassLoader().getResourceAsStream("res/drawable/fourth_image.jpg");
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
assertEquals("Bitmap", shadowOf(bitmap).getDescription());
assertEquals(160, bitmap.getWidth());
assertEquals(107, bitmap.getHeight());
}
@Test
public void decodeWithDifferentSampleSize() {
String name = "test";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 0;
Bitmap bm = ShadowBitmapFactory.create(name, options);
assertThat(bm.getWidth()).isEqualTo(100);
assertThat(bm.getHeight()).isEqualTo(100);
options.inSampleSize = 2;
bm = ShadowBitmapFactory.create(name, options);
assertThat(bm.getWidth()).isEqualTo(50);
assertThat(bm.getHeight()).isEqualTo(50);
options.inSampleSize = 101;
bm = ShadowBitmapFactory.create(name, options);
assertThat(bm.getWidth()).isEqualTo(1);
assertThat(bm.getHeight()).isEqualTo(1);
}
@Test
public void createShouldSetSizeToValueFromMapAsFirstPriority() {
ShadowBitmapFactory.provideWidthAndHeightHints("image.png", 111, 222);
final Bitmap bitmap = ShadowBitmapFactory.create("file:image.png", null, new Point(50, 60));
assertThat(bitmap.getWidth()).isEqualTo(111);
assertThat(bitmap.getHeight()).isEqualTo(222);
}
@Test
public void createShouldSetSizeToParameterAsSecondPriority() {
final Bitmap bitmap = ShadowBitmapFactory.create(null, null, new Point(70, 80));
assertThat(bitmap.getWidth()).isEqualTo(70);
assertThat(bitmap.getHeight()).isEqualTo(80);
}
@Test
public void createShouldSetSizeToHardcodedValueAsLastPriority() {
final Bitmap bitmap = ShadowBitmapFactory.create(null, null, null);
assertThat(bitmap.getWidth()).isEqualTo(100);
assertThat(bitmap.getHeight()).isEqualTo(100);
}
}