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

#include "SkCachedData.h"
#include "SkYUVPlanesCache.h"
#include "SkResourceCache.h"
#include "Test.h"

enum LockedState {
    kUnlocked,
    kLocked,
};

enum CachedState {
    kNotInCache,
    kInCache,
};

static void check_data(skiatest::Reporter* reporter, SkCachedData* data,
                       int refcnt, CachedState cacheState, LockedState lockedState) {
    REPORTER_ASSERT(reporter, data->testing_only_getRefCnt() == refcnt);
    REPORTER_ASSERT(reporter, data->testing_only_isInCache() == (kInCache == cacheState));
    bool isLocked = (data->data() != nullptr);
    REPORTER_ASSERT(reporter, isLocked == (lockedState == kLocked));
}

DEF_TEST(YUVPlanesCache, reporter) {
    SkResourceCache cache(1024);

    SkYUVPlanesCache::Info yuvInfo;
    for (int i = 0; i < 3; i++) {
        yuvInfo.fSizeInfo.fSizes[i].fWidth = 20 * i;
        yuvInfo.fSizeInfo.fSizes[i].fHeight = 10 * i;
        yuvInfo.fSizeInfo.fWidthBytes[i] = 80 * i;
    }
    yuvInfo.fColorSpace = kRec601_SkYUVColorSpace;

    const uint32_t genID = 12345678;

    SkCachedData* data = SkYUVPlanesCache::FindAndRef(genID, &yuvInfo, &cache);
    REPORTER_ASSERT(reporter, nullptr == data);

    size_t size = 256;
    data = cache.newCachedData(size);
    memset(data->writable_data(), 0xff, size);

    SkYUVPlanesCache::Add(genID, data, &yuvInfo, &cache);
    check_data(reporter, data, 2, kInCache, kLocked);

    data->unref();
    check_data(reporter, data, 1, kInCache, kUnlocked);

    SkYUVPlanesCache::Info yuvInfoRead;
    data = SkYUVPlanesCache::FindAndRef(genID, &yuvInfoRead, &cache);

    REPORTER_ASSERT(reporter, data);
    REPORTER_ASSERT(reporter, data->size() == size);
    for (int i = 0; i < 3; ++i) {
        REPORTER_ASSERT(reporter, yuvInfo.fSizeInfo.fSizes[i].fWidth ==
                yuvInfoRead.fSizeInfo.fSizes[i].fWidth);
        REPORTER_ASSERT(reporter, yuvInfo.fSizeInfo.fSizes[i].fHeight ==
                yuvInfoRead.fSizeInfo.fSizes[i].fHeight);
        REPORTER_ASSERT(reporter, yuvInfo.fSizeInfo.fWidthBytes[i] ==
                yuvInfoRead.fSizeInfo.fWidthBytes[i]);
    }
    REPORTER_ASSERT(reporter, yuvInfo.fColorSpace == yuvInfoRead.fColorSpace);

    check_data(reporter, data, 2, kInCache, kLocked);

    cache.purgeAll();
    check_data(reporter, data, 1, kNotInCache, kLocked);
    data->unref();
}
