//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Unit tests for VertexArray and related classes.
//

#include "gmock/gmock.h"
#include "gtest/gtest.h"

#include "common/bitset_utils.h"
#include "common/utilities.h"
#include "libANGLE/VertexArray.h"

using namespace gl;

// Tests that function GetAttribIndex computes the index properly.
TEST(VertexArrayTest, VerifyGetAttribIndex)
{
    VertexArray::DirtyBits dirtyBits;
    size_t bits[] = {1, 4, 9, 16, 25, 36, 49, 64, 81, 90};
    int count     = sizeof(bits) / sizeof(size_t);
    for (int i = 0; i < count; i++)
    {
        dirtyBits.set(bits[i]);
    }

    for (size_t dirtyBit : dirtyBits)
    {
        size_t index = VertexArray::GetAttribIndex(dirtyBit);
        if (dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_ENABLED)
        {
            EXPECT_EQ(dirtyBit - VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED, index);
        }
        else if (dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_POINTER)
        {
            EXPECT_EQ(dirtyBit - VertexArray::DIRTY_BIT_ATTRIB_0_POINTER, index);
        }
        else if (dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_FORMAT)
        {
            EXPECT_EQ(dirtyBit - VertexArray::DIRTY_BIT_ATTRIB_0_FORMAT, index);
        }
        else if (dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX_BINDING)
        {
            EXPECT_EQ(dirtyBit - VertexArray::DIRTY_BIT_ATTRIB_0_BINDING, index);
        }
        else if (dirtyBit < VertexArray::DIRTY_BIT_BINDING_MAX_BUFFER)
        {
            EXPECT_EQ(dirtyBit - VertexArray::DIRTY_BIT_BINDING_0_BUFFER, index);
        }
        else if (dirtyBit < VertexArray::DIRTY_BIT_BINDING_MAX_DIVISOR)
        {
            EXPECT_EQ(dirtyBit - VertexArray::DIRTY_BIT_BINDING_0_DIVISOR, index);
        }
        else
            ASSERT_TRUE(false);
    }
}
