/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "Test.h"
#include "SkScaledImageCache.h"

static void make_bm(SkBitmap* bm, int w, int h) {
    bm->setConfig(SkBitmap::kARGB_8888_Config, w, h);
    bm->allocPixels();
}

static void TestImageCache(skiatest::Reporter* reporter) {
    static const int COUNT = 10;
    static const int DIM = 256;
    static const size_t defLimit = DIM * DIM * 4 * COUNT + 1024;    // 1K slop
    SkScaledImageCache cache(defLimit);
    SkScaledImageCache::ID* id;

    SkBitmap bm[COUNT];
    
    SkScalar scale = 2;
    for (int i = 0; i < COUNT; ++i) {
        SkBitmap tmp;

        make_bm(&bm[i], DIM, DIM);
        id = cache.findAndLock(bm[i], scale, scale, &tmp);
        REPORTER_ASSERT(reporter, NULL == id);

        make_bm(&tmp, DIM, DIM);
        id = cache.addAndLock(bm[i], scale, scale, tmp);
        REPORTER_ASSERT(reporter, NULL != id);

        SkBitmap tmp2;
        SkScaledImageCache::ID* id2 = cache.findAndLock(bm[i], scale, scale,
                                                        &tmp2);
        REPORTER_ASSERT(reporter, id == id2);
        REPORTER_ASSERT(reporter, tmp.pixelRef() == tmp2.pixelRef());
        REPORTER_ASSERT(reporter, tmp.width() == tmp2.width());
        REPORTER_ASSERT(reporter, tmp.height() == tmp2.height());
        cache.unlock(id2);

        cache.unlock(id);
    }

    // stress test, should trigger purges
    for (size_t i = 0; i < COUNT * 100; ++i) {
        SkBitmap tmp;
        
        make_bm(&tmp, DIM, DIM);
        id = cache.addAndLock(bm[0], scale, scale, tmp);
        REPORTER_ASSERT(reporter, NULL != id);
        cache.unlock(id);
        
        scale += 1;
    }

    cache.setByteLimit(0);
}

#include "TestClassDef.h"
DEFINE_TESTCLASS("ImageCache", TestImageCacheClass, TestImageCache)
