// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "config.h"

#include "CCScopedTexture.h"

#include "CCRenderer.h"
#include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread
#include "CCTiledLayerTestCommon.h"
#include "FakeCCGraphicsContext.h"
#include "GraphicsContext3D.h"
#include <gtest/gtest.h>

using namespace WebCore;
using namespace WebKit;
using namespace WebKitTests;

namespace {

TEST(CCScopedTextureTest, NewScopedTexture)
{
    OwnPtr<CCGraphicsContext> context(createFakeCCGraphicsContext());
    DebugScopedSetImplThread implThread;
    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(context.get()));
    OwnPtr<CCScopedTexture> texture = CCScopedTexture::create(resourceProvider.get());

    // New scoped textures do not hold a texture yet.
    EXPECT_EQ(0u, texture->id());

    // New scoped textures do not have a size yet.
    EXPECT_EQ(IntSize(), texture->size());
    EXPECT_EQ(0u, texture->bytes());
}

TEST(CCScopedTextureTest, CreateScopedTexture)
{
    OwnPtr<CCGraphicsContext> context(createFakeCCGraphicsContext());
    DebugScopedSetImplThread implThread;
    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(context.get()));
    OwnPtr<CCScopedTexture> texture = CCScopedTexture::create(resourceProvider.get());
    texture->allocate(CCRenderer::ImplPool, IntSize(30, 30), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny);

    // The texture has an allocated byte-size now.
    size_t expectedBytes = 30 * 30 * 4;
    EXPECT_EQ(expectedBytes, texture->bytes());

    EXPECT_LT(0u, texture->id());
    EXPECT_EQ(GraphicsContext3D::RGBA, texture->format());
    EXPECT_EQ(IntSize(30, 30), texture->size());
}

TEST(CCScopedTextureTest, ScopedTextureIsDeleted)
{
    OwnPtr<CCGraphicsContext> context(createFakeCCGraphicsContext());
    DebugScopedSetImplThread implThread;
    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(context.get()));

    {
        OwnPtr<CCScopedTexture> texture = CCScopedTexture::create(resourceProvider.get());

        EXPECT_EQ(0u, resourceProvider->numResources());
        texture->allocate(CCRenderer::ImplPool, IntSize(30, 30), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny);
        EXPECT_LT(0u, texture->id());
        EXPECT_EQ(1u, resourceProvider->numResources());
    }

    EXPECT_EQ(0u, resourceProvider->numResources());

    {
        OwnPtr<CCScopedTexture> texture = CCScopedTexture::create(resourceProvider.get());
        EXPECT_EQ(0u, resourceProvider->numResources());
        texture->allocate(CCRenderer::ImplPool, IntSize(30, 30), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny);
        EXPECT_LT(0u, texture->id());
        EXPECT_EQ(1u, resourceProvider->numResources());
        texture->free();
        EXPECT_EQ(0u, resourceProvider->numResources());
    }
}

TEST(CCScopedTextureTest, LeakScopedTexture)
{
    OwnPtr<CCGraphicsContext> context(createFakeCCGraphicsContext());
    DebugScopedSetImplThread implThread;
    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(context.get()));

    {
        OwnPtr<CCScopedTexture> texture = CCScopedTexture::create(resourceProvider.get());

        EXPECT_EQ(0u, resourceProvider->numResources());
        texture->allocate(CCRenderer::ImplPool, IntSize(30, 30), GraphicsContext3D::RGBA, CCResourceProvider::TextureUsageAny);
        EXPECT_LT(0u, texture->id());
        EXPECT_EQ(1u, resourceProvider->numResources());

        texture->leak();
        EXPECT_EQ(0u, texture->id());
        EXPECT_EQ(1u, resourceProvider->numResources());

        texture->free();
        EXPECT_EQ(0u, texture->id());
        EXPECT_EQ(1u, resourceProvider->numResources());
    }

    EXPECT_EQ(1u, resourceProvider->numResources());
}

}
