Home | History | Annotate | Download | only in shadows
      1 package org.robolectric.shadows;
      2 
      3 import static java.nio.charset.StandardCharsets.UTF_8;
      4 import static org.assertj.core.api.Assertions.assertThat;
      5 import static org.junit.Assert.assertEquals;
      6 import static org.robolectric.Shadows.shadowOf;
      7 
      8 import android.graphics.Bitmap;
      9 import android.graphics.BitmapFactory;
     10 import android.graphics.Point;
     11 import android.net.Uri;
     12 import android.provider.MediaStore;
     13 import java.io.File;
     14 import java.io.FileDescriptor;
     15 import java.io.FileInputStream;
     16 import java.io.InputStream;
     17 import org.junit.Test;
     18 import org.junit.runner.RunWith;
     19 import org.robolectric.R;
     20 import org.robolectric.RobolectricTestRunner;
     21 import org.robolectric.RuntimeEnvironment;
     22 
     23 @RunWith(RobolectricTestRunner.class)
     24 public class ShadowBitmapFactoryTest {
     25   @Test
     26   public void decodeResource_shouldSetDescriptionAndCreatedFrom() throws Exception {
     27     Bitmap bitmap = BitmapFactory.decodeResource(RuntimeEnvironment.application.getResources(), R.drawable.an_image);
     28     ShadowBitmap shadowBitmap = shadowOf(bitmap);
     29     assertEquals("Bitmap for resource:org.robolectric:drawable/an_image", shadowBitmap.getDescription());
     30     assertEquals(R.drawable.an_image, shadowBitmap.getCreatedFromResId());
     31     assertEquals(100, bitmap.getWidth());
     32     assertEquals(100, bitmap.getHeight());
     33   }
     34 
     35   @Test
     36   public void decodeResource_shouldSetDefaultBitmapConfig() throws Exception {
     37     Bitmap bitmap = BitmapFactory.decodeResource(RuntimeEnvironment.application.getResources(), R.drawable.an_image);
     38     assertThat(bitmap.getConfig()).isEqualTo(Bitmap.Config.ARGB_8888);
     39     assertThat(bitmap.getRowBytes()).isNotZero();
     40   }
     41 
     42   @Test
     43   public void withResId0_decodeResource_shouldReturnNull() throws Exception {
     44     assertThat(BitmapFactory.decodeResource(RuntimeEnvironment.application.getResources(), 0)).isNull();
     45   }
     46 
     47   @Test
     48   public void decodeResource_shouldPassABitmapConfig() throws Exception {
     49     BitmapFactory.Options options = new BitmapFactory.Options();
     50     options.inPreferredConfig = Bitmap.Config.ALPHA_8;
     51     Bitmap bitmap = BitmapFactory.decodeResource(RuntimeEnvironment.application.getResources(), R.drawable.an_image, options);
     52     assertThat(bitmap.getConfig()).isEqualTo(Bitmap.Config.ALPHA_8);
     53   }
     54 
     55   @Test
     56   public void decodeFile_shouldSetDescriptionAndCreatedFrom() throws Exception {
     57     Bitmap bitmap = BitmapFactory.decodeFile("/some/file.jpg");
     58     ShadowBitmap shadowBitmap = shadowOf(bitmap);
     59     assertEquals("Bitmap for file:/some/file.jpg", shadowBitmap.getDescription());
     60     assertEquals("/some/file.jpg", shadowBitmap.getCreatedFromPath());
     61     assertEquals(100, bitmap.getWidth());
     62     assertEquals(100, bitmap.getHeight());
     63   }
     64 
     65   @Test
     66   public void decodeStream_shouldSetDescriptionAndCreatedFrom() throws Exception {
     67     InputStream inputStream = RuntimeEnvironment.application.getContentResolver().openInputStream(Uri.parse("content:/path"));
     68     Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
     69     ShadowBitmap shadowBitmap = shadowOf(bitmap);
     70     assertEquals("Bitmap for content:/path", shadowBitmap.getDescription());
     71     assertEquals(inputStream, shadowBitmap.getCreatedFromStream());
     72     assertEquals(100, bitmap.getWidth());
     73     assertEquals(100, bitmap.getHeight());
     74     bitmap.getPixels(new int[bitmap.getHeight() * bitmap.getWidth()], 0, 0, 0, 0, bitmap.getWidth(), bitmap.getHeight());
     75   }
     76 
     77   @Test
     78   public void decodeBytes_shouldSetDescriptionAndCreatedFrom() throws Exception {
     79     byte[] yummyBites = "Hi!".getBytes("UTF-8");
     80     Bitmap bitmap = BitmapFactory.decodeByteArray(yummyBites, 100, 100);
     81     ShadowBitmap shadowBitmap = shadowOf(bitmap);
     82     assertEquals("Bitmap for Hi! bytes 100..100", shadowBitmap.getDescription());
     83     assertEquals(yummyBites, shadowBitmap.getCreatedFromBytes());
     84     assertEquals(100, bitmap.getWidth());
     85     assertEquals(100, bitmap.getHeight());
     86   }
     87 
     88   @Test
     89   public void decodeStream_shouldSetDescriptionWithNullOptions() throws Exception {
     90     InputStream inputStream = RuntimeEnvironment.application.getContentResolver().openInputStream(Uri.parse("content:/path"));
     91     Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, null);
     92     assertEquals("Bitmap for content:/path", shadowOf(bitmap).getDescription());
     93     assertEquals(100, bitmap.getWidth());
     94     assertEquals(100, bitmap.getHeight());
     95   }
     96 
     97   @Test
     98   public void decodeResource_shouldGetWidthAndHeightFromHints() throws Exception {
     99     ShadowBitmapFactory.provideWidthAndHeightHints(R.drawable.an_image, 123, 456);
    100 
    101     Bitmap bitmap = BitmapFactory.decodeResource(RuntimeEnvironment.application.getResources(), R.drawable.an_image);
    102     assertEquals("Bitmap for resource:org.robolectric:drawable/an_image", shadowOf(bitmap).getDescription());
    103     assertEquals(123, bitmap.getWidth());
    104     assertEquals(456, bitmap.getHeight());
    105   }
    106 
    107   @Test
    108   public void decodeResource_canTakeOptions() throws Exception {
    109     BitmapFactory.Options options = new BitmapFactory.Options();
    110     options.inSampleSize = 100;
    111     Bitmap bitmap = BitmapFactory.decodeResource(RuntimeEnvironment.application.getResources(), R.drawable.an_image, options);
    112     assertEquals(true, shadowOf(bitmap).getDescription().contains("inSampleSize=100"));
    113   }
    114 
    115   @Test
    116   public void decodeResourceStream_canTakeOptions() throws Exception {
    117     BitmapFactory.Options options = new BitmapFactory.Options();
    118     InputStream inputStream = RuntimeEnvironment.application.getContentResolver().openInputStream(Uri.parse("content:/path"));
    119     options.inSampleSize = 100;
    120     Bitmap bitmap = BitmapFactory.decodeResourceStream(RuntimeEnvironment.application.getResources(), null, inputStream, null, options);
    121     assertEquals(true, shadowOf(bitmap).getDescription().contains("inSampleSize=100"));
    122   }
    123 
    124   @Test
    125   public void decodeFile_shouldGetWidthAndHeightFromHints() throws Exception {
    126     ShadowBitmapFactory.provideWidthAndHeightHints("/some/file.jpg", 123, 456);
    127 
    128     Bitmap bitmap = BitmapFactory.decodeFile("/some/file.jpg");
    129     assertEquals("Bitmap for file:/some/file.jpg", shadowOf(bitmap).getDescription());
    130     assertEquals(123, bitmap.getWidth());
    131     assertEquals(456, bitmap.getHeight());
    132   }
    133 
    134   @Test
    135   public void decodeFileEtc_shouldSetOptionsOutWidthAndOutHeightFromHints() throws Exception {
    136     ShadowBitmapFactory.provideWidthAndHeightHints("/some/file.jpg", 123, 456);
    137 
    138     BitmapFactory.Options options = new BitmapFactory.Options();
    139     BitmapFactory.decodeFile("/some/file.jpg", options);
    140     assertEquals(123, options.outWidth);
    141     assertEquals(456, options.outHeight);
    142   }
    143 
    144   @Test
    145   public void decodeUri_shouldGetWidthAndHeightFromHints() throws Exception {
    146     ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse("content:/path"), 123, 456);
    147 
    148     Bitmap bitmap = MediaStore.Images.Media.getBitmap(RuntimeEnvironment.application.getContentResolver(), Uri.parse("content:/path"));
    149     assertEquals("Bitmap for content:/path", shadowOf(bitmap).getDescription());
    150     assertEquals(123, bitmap.getWidth());
    151     assertEquals(456, bitmap.getHeight());
    152   }
    153 
    154   @Test
    155   public void decodeFileDescriptor_shouldGetWidthAndHeightFromHints() throws Exception {
    156     File tmpFile = File.createTempFile("BitmapFactoryTest", null);
    157     try {
    158       tmpFile.deleteOnExit();
    159       FileInputStream is = new FileInputStream(tmpFile);
    160       try {
    161         FileDescriptor fd = is.getFD();
    162         ShadowBitmapFactory.provideWidthAndHeightHints(fd, 123, 456);
    163 
    164         Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fd);
    165         assertEquals("Bitmap for fd:" + fd, shadowOf(bitmap).getDescription());
    166         assertEquals(123, bitmap.getWidth());
    167         assertEquals(456, bitmap.getHeight());
    168       } finally {
    169         is.close();
    170       }
    171     } finally {
    172       tmpFile.delete();
    173     }
    174   }
    175 
    176   @Test
    177   public void decodeByteArray_shouldGetWidthAndHeightFromHints() throws Exception {
    178     String data = "arbitrary bytes";
    179     ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse(data), 123, 456);
    180 
    181     byte[] bytes = data.getBytes(UTF_8);
    182     Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    183     assertEquals("Bitmap for " + data, shadowOf(bitmap).getDescription());
    184     assertEquals(123, bitmap.getWidth());
    185     assertEquals(456, bitmap.getHeight());
    186   }
    187 
    188   @Test
    189   public void decodeByteArray_shouldIncludeOffsets() throws Exception {
    190     String data = "arbitrary bytes";
    191     ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse(data), 123, 456);
    192 
    193     byte[] bytes = data.getBytes(UTF_8);
    194     Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 1, bytes.length - 2);
    195     assertEquals("Bitmap for " + data + " bytes 1..13", shadowOf(bitmap).getDescription());
    196   }
    197 
    198   @Test
    199   public void decodeStream_shouldGetWidthAndHeightFromHints() throws Exception {
    200     ShadowBitmapFactory.provideWidthAndHeightHints(Uri.parse("content:/path"), 123, 456);
    201 
    202     InputStream inputStream = RuntimeEnvironment.application.getContentResolver().openInputStream(Uri.parse("content:/path"));
    203     Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    204     assertEquals("Bitmap for content:/path", shadowOf(bitmap).getDescription());
    205     assertEquals(123, bitmap.getWidth());
    206     assertEquals(456, bitmap.getHeight());
    207   }
    208 
    209   @Test
    210   public void decodeStream_shouldGetWidthAndHeightFromActualImage() throws Exception {
    211     InputStream inputStream = getClass().getClassLoader().getResourceAsStream("res/drawable/fourth_image.jpg");
    212     Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    213     assertEquals("Bitmap", shadowOf(bitmap).getDescription());
    214     assertEquals(160, bitmap.getWidth());
    215     assertEquals(107, bitmap.getHeight());
    216   }
    217 
    218   @Test
    219   public void decodeByteArray_shouldSetDataChecksum() throws Exception {
    220     byte[] data = {23, -125, 0, 52, 23, 18, 76, 43};
    221 
    222     Bitmap bitmap = ShadowBitmapFactory.decodeByteArray(data, 0, data.length);
    223     assertThat(bitmap).isNotNull();
    224     assertThat(shadowOf(bitmap).getDescription()).isEqualTo("Bitmap for byte array, checksum: 3693078531");
    225     assertThat(bitmap.getWidth()).isEqualTo(100);
    226     assertThat(bitmap.getHeight()).isEqualTo(100);
    227   }
    228 
    229   @Test
    230   public void decodeByteArray_withOptionsShouldSetDataChecksum() throws Exception {
    231     byte[] data = {23, -125, 0, 52, 23, 18, 76, 43};
    232 
    233     BitmapFactory.Options options = new BitmapFactory.Options();
    234     options.inSampleSize = 4;
    235     Bitmap bitmap = ShadowBitmapFactory.decodeByteArray(data, 0, data.length - 1, options);
    236     assertThat(shadowOf(bitmap).getDescription()).isEqualTo("Bitmap for byte array, checksum: 3693078531 bytes 0..7 with options inSampleSize=4");
    237     assertThat(bitmap.getWidth()).isEqualTo(25);
    238     assertThat(bitmap.getHeight()).isEqualTo(25);
    239   }
    240 
    241   @Test
    242   public void decodeWithDifferentSampleSize() {
    243     String name = "test";
    244     BitmapFactory.Options options = new BitmapFactory.Options();
    245 
    246     options.inSampleSize = 0;
    247     Bitmap bm = ShadowBitmapFactory.create(name, options);
    248     assertThat(bm.getWidth()).isEqualTo(100);
    249     assertThat(bm.getHeight()).isEqualTo(100);
    250 
    251     options.inSampleSize = 2;
    252     bm = ShadowBitmapFactory.create(name, options);
    253     assertThat(bm.getWidth()).isEqualTo(50);
    254     assertThat(bm.getHeight()).isEqualTo(50);
    255 
    256     options.inSampleSize = 101;
    257     bm = ShadowBitmapFactory.create(name, options);
    258     assertThat(bm.getWidth()).isEqualTo(1);
    259     assertThat(bm.getHeight()).isEqualTo(1);
    260   }
    261 
    262   @Test
    263   public void createShouldSetSizeToValueFromMapAsFirstPriority() {
    264     ShadowBitmapFactory.provideWidthAndHeightHints("image.png", 111, 222);
    265 
    266     final Bitmap bitmap = ShadowBitmapFactory.create("file:image.png", null, new Point(50, 60));
    267 
    268     assertThat(bitmap.getWidth()).isEqualTo(111);
    269     assertThat(bitmap.getHeight()).isEqualTo(222);
    270   }
    271 
    272   @Test
    273   public void createShouldSetSizeToParameterAsSecondPriority() {
    274     final Bitmap bitmap = ShadowBitmapFactory.create(null, null, new Point(70, 80));
    275 
    276     assertThat(bitmap.getWidth()).isEqualTo(70);
    277     assertThat(bitmap.getHeight()).isEqualTo(80);
    278   }
    279 
    280   @Test
    281   public void createShouldSetSizeToHardcodedValueAsLastPriority() {
    282     final Bitmap bitmap = ShadowBitmapFactory.create(null, null, null);
    283 
    284     assertThat(bitmap.getWidth()).isEqualTo(100);
    285     assertThat(bitmap.getHeight()).isEqualTo(100);
    286   }
    287 }
    288