package com.android.tv.util;

import android.graphics.Bitmap;
import android.support.test.filters.SmallTest;
import android.test.AndroidTestCase;

import com.android.tv.util.BitmapUtils.ScaledBitmapInfo;

/**
 * Tests for {@link ScaledBitmapInfo}.
 */
@SmallTest
public class ScaledBitmapInfoTest extends AndroidTestCase {
    private static final Bitmap B80x100 = Bitmap.createBitmap(80, 100, Bitmap.Config.RGB_565);
    private static final Bitmap B960x1440 = Bitmap.createBitmap(960, 1440, Bitmap.Config.RGB_565);

    public void testSize_B100x100to50x50() {
        ScaledBitmapInfo actual = BitmapUtils.createScaledBitmapInfo("B80x100", B80x100, 50, 50);
        assertScaledBitmapSize(2, 40, 50, actual);
    }

    public void testNeedsToReload_B100x100to50x50() {
        ScaledBitmapInfo actual = BitmapUtils.createScaledBitmapInfo("B80x100", B80x100, 50, 50);
        assertNeedsToReload(false, actual, 25, 25);
        assertNeedsToReload(false, actual, 50, 50);
        assertNeedsToReload(false, actual, 99, 99);
        assertNeedsToReload(true, actual, 100, 100);
        assertNeedsToReload(true, actual, 101, 101);
    }

    /**
     * Reproduces <a href="http://b/20488453">b/20488453</a>.
     */
    public void testBug20488453() {
        ScaledBitmapInfo actual = BitmapUtils
                .createScaledBitmapInfo("B960x1440", B960x1440, 284, 160);
        assertScaledBitmapSize(8, 107, 160, actual);
        assertNeedsToReload(false, actual, 284, 160);
    }

    private static void assertNeedsToReload(boolean expected, ScaledBitmapInfo scaledBitmap,
            int reqWidth, int reqHeight) {
        assertEquals(scaledBitmap.id + " needToReload(" + reqWidth + "," + reqHeight + ")",
                expected, scaledBitmap.needToReload(reqWidth, reqHeight));
    }

    private static void assertScaledBitmapSize(int expectedInSampleSize, int expectedWidth,
            int expectedHeight, ScaledBitmapInfo actual) {
        assertEquals(actual.id + " inSampleSize", expectedInSampleSize, actual.inSampleSize);
        assertEquals(actual.id + " width", expectedWidth, actual.bitmap.getWidth());
        assertEquals(actual.id + " height", expectedHeight, actual.bitmap.getHeight());
    }
}
