/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.imagepipeline.memory;
import android.graphics.Bitmap;
import android.os.Build;
import org.junit.*;
import org.junit.runner.*;
import org.robolectric.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(RobolectricTestRunner.class)
public class BitmapCounterTest {
private static final int MAX_COUNT = 4;
private static final int MAX_SIZE = MAX_COUNT + 1;
private BitmapCounter mBitmapCounter;
@Before
public void setUp() {
mBitmapCounter = new BitmapCounter(MAX_COUNT, MAX_SIZE);
}
@Test
public void testBasic() {
assertState(0, 0);
assertTrue(mBitmapCounter.increase(bitmapForSize(1)));
assertState(1, 1);
assertTrue(mBitmapCounter.increase(bitmapForSize(2)));
assertState(2, 3);
mBitmapCounter.decrease(bitmapForSize(1));
assertState(1, 2);
}
@Test(expected = IllegalArgumentException.class)
public void testDecreaseTooMuch() {
assertTrue(mBitmapCounter.increase(bitmapForSize(1)));
mBitmapCounter.decrease(bitmapForSize(2));
}
@Test(expected = IllegalArgumentException.class)
public void testDecreaseTooMany() {
assertTrue(mBitmapCounter.increase(bitmapForSize(2)));
mBitmapCounter.decrease(bitmapForSize(1));
mBitmapCounter.decrease(bitmapForSize(1));
}
@Test
public void testMaxSize() {
assertTrue(mBitmapCounter.increase(bitmapForSize(MAX_SIZE)));
assertState(1, MAX_SIZE);
}
@Test
public void testMaxCount() {
for (int i = 0; i < MAX_COUNT; ++i) {
mBitmapCounter.increase(bitmapForSize(1));
}
assertState(MAX_COUNT, MAX_COUNT);
}
@Test()
public void increaseTooBigObject() {
assertFalse(mBitmapCounter.increase(bitmapForSize(MAX_SIZE + 1)));
assertState(0, 0);
}
@Test()
public void increaseTooManyObjects() {
for (int i = 0; i < MAX_COUNT; ++i) {
mBitmapCounter.increase(bitmapForSize(1));
}
assertFalse(mBitmapCounter.increase(bitmapForSize(1)));
assertState(MAX_COUNT, MAX_COUNT);
}
private void assertState(int count, long size) {
assertEquals(count, mBitmapCounter.getCount());
assertEquals(size, mBitmapCounter.getSize());
}
private Bitmap bitmapForSize(int size) {
final Bitmap bitmap = mock(Bitmap.class);
doReturn(1).when(bitmap).getHeight();
doReturn(size).when(bitmap).getRowBytes();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
doReturn(size).when(bitmap).getByteCount();
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
doReturn(size).when(bitmap).getAllocationByteCount();
}
return bitmap;
}
}