package com.nostra13.universalimageloader.core.assist;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
import com.nostra13.universalimageloader.utils.ImageSizeUtils;
import org.fest.assertions.api.Assertions;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class ImageSizeTest {
private Activity mActivity;
private ImageView mView;
private ImageAware mImageAware;
@Before
public void setUp() throws Exception {
mActivity = new Activity();
// Make and set view with some prelim values to test
mView = new TestImageView(mActivity);
mView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
mView.measure(View.MeasureSpec.makeMeasureSpec(250, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(250, View.MeasureSpec.EXACTLY));
mImageAware = new ImageViewAware(mView);
}
@Test
public void testGetImageSizeScaleTo_useImageActualSize() throws Exception {
// We layout the view to give it a width and height
mView.measure(View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.EXACTLY));
mView.layout(0, 0, 200, 200);
ImageSize expected = new ImageSize(200, 200);
ImageSize result = ImageSizeUtils.defineTargetSizeForView(mImageAware, new ImageSize(590, 590));
Assertions.assertThat(result).isNotNull();
Assertions.assertThat(result.getWidth()).isEqualTo(expected.getWidth());
Assertions.assertThat(result.getHeight()).isEqualTo(expected.getHeight());
}
/**
* This will make sure the view falls back to the ViewParams/Max/Or Config if wrap content so that it is never
* shrunk to the first image size. In this case it falls back to the config size
*
* @throws Exception
*/
@Test
public void testGetImageSizeScaleTo_dontUseImageActualSizeWithWrapContent() throws Exception {
//Set it to wrap content so that it will fall back to
mView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mView.measure(View.MeasureSpec.makeMeasureSpec(250, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(250, View.MeasureSpec.EXACTLY));
// We layout the view to give it a width and height
mView.layout(0, 0, 200, 200);
ImageSize expected = new ImageSize(500, 500);
ImageSize result = ImageSizeUtils.defineTargetSizeForView(mImageAware, new ImageSize(500, 500));
Assertions.assertThat(result).isNotNull().isEqualsToByComparingFields(expected);
}
@Test
public void testGetImageSizeScaleTo_useImageLayoutParams() throws Exception {
// Set a defined width
mView.setLayoutParams(new FrameLayout.LayoutParams(300, 300));
ImageSize expected = new ImageSize(300, 300);
ImageSize result = ImageSizeUtils.defineTargetSizeForView(mImageAware, new ImageSize(500, 500));
Assertions.assertThat(result).isNotNull().isEqualsToByComparingFields(expected);
}
@Test
public void testGetImageSizeScaleTo_useImageConfigMaxSize() throws Exception {
ImageSize expected = new ImageSize(500, 500);
ImageSize result = ImageSizeUtils.defineTargetSizeForView(mImageAware, new ImageSize(500, 500));
Assertions.assertThat(result).isNotNull().isEqualsToByComparingFields(expected);
}
@Test
public void testComputeImageSampleSize_fitInside() throws Exception {
final ViewScaleType scaleType = ViewScaleType.FIT_INSIDE;
int result;
ImageSize srcSize = new ImageSize(300, 100);
ImageSize targetSize = new ImageSize(30, 10);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(10);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(8);
srcSize = new ImageSize(300, 100);
targetSize = new ImageSize(200, 200);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(1);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(1);
srcSize = new ImageSize(300, 100);
targetSize = new ImageSize(55, 40);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(5);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(4);
srcSize = new ImageSize(300, 100);
targetSize = new ImageSize(30, 40);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(10);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(8);
srcSize = new ImageSize(5000, 70);
targetSize = new ImageSize(2000, 30);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(3);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(4);
}
@Test
public void testComputeImageSampleSize_centerCrop() throws Exception {
final ViewScaleType scaleType = ViewScaleType.CROP;
int result;
ImageSize srcSize = new ImageSize(300, 100);
ImageSize targetSize = new ImageSize(30, 10);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(10);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(8);
srcSize = new ImageSize(300, 100);
targetSize = new ImageSize(200, 200);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(1);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(1);
srcSize = new ImageSize(300, 100);
targetSize = new ImageSize(55, 40);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(2);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(2);
srcSize = new ImageSize(300, 100);
targetSize = new ImageSize(30, 30);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(3);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(2);
srcSize = new ImageSize(5000, 70);
targetSize = new ImageSize(300, 30);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, false);
Assertions.assertThat(result).isEqualTo(3);
result = ImageSizeUtils.computeImageSampleSize(srcSize, targetSize, scaleType, true);
Assertions.assertThat(result).isEqualTo(4);
}
/** Fixes {@link NoSuchMethodError} for <code>ImageView#onLayout(...)</code> */
private class TestImageView extends ImageView {
TestImageView(Context activity) {
super(activity);
}
@Override
public void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
}
}