// Copyright 2014 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 "cc/quads/list_container.h"

#include <vector>
#include "cc/quads/draw_quad.h"
#include "cc/quads/largest_draw_quad.h"
#include "cc/quads/render_pass_draw_quad.h"
#include "cc/quads/shared_quad_state.h"
#include "cc/quads/stream_video_draw_quad.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cc {
namespace {

int kMagicNumberToUseForDrawQuadOne = 42;
int kMagicNumberToUseForDrawQuadTwo = 314;

bool isConstSharedQuadStatePointer(const SharedQuadState* ptr) {
  return true;
}

bool isConstSharedQuadStatePointer(SharedQuadState* ptr) {
  return false;
}

class SimpleDrawQuad : public DrawQuad {
 public:
  ~SimpleDrawQuad() override {}
  void IterateResources(const ResourceIteratorCallback& callback) override {}

  void set_value(int val) { value = val; }
  int get_value() { return value; }
  void ExtendValue(base::trace_event::TracedValue* value) const override {}

 private:
  int value;
};

class SimpleDrawQuadConstructMagicNumberOne : public SimpleDrawQuad {
 public:
  SimpleDrawQuadConstructMagicNumberOne() : SimpleDrawQuad() {
    set_value(kMagicNumberToUseForDrawQuadOne);
  }
};

class SimpleDrawQuadConstructMagicNumberTwo : public SimpleDrawQuad {
 public:
  SimpleDrawQuadConstructMagicNumberTwo() : SimpleDrawQuad() {
    set_value(kMagicNumberToUseForDrawQuadTwo);
  }
};

class MockDrawQuad : public DrawQuad {
 public:
  ~MockDrawQuad() override { Destruct(); }
  void IterateResources(const ResourceIteratorCallback& callback) override {}
  void ExtendValue(base::trace_event::TracedValue* value) const override {}
  MOCK_METHOD0(Destruct, void());
};

TEST(ListContainerTest, ConstructorCalledInAllocateAndConstruct) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize());

  size_t size = 2;
  SimpleDrawQuadConstructMagicNumberOne* dq_1 =
      list.AllocateAndConstruct<SimpleDrawQuadConstructMagicNumberOne>();
  SimpleDrawQuadConstructMagicNumberTwo* dq_2 =
      list.AllocateAndConstruct<SimpleDrawQuadConstructMagicNumberTwo>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(dq_1, list.front());
  EXPECT_EQ(dq_2, list.back());

  EXPECT_EQ(kMagicNumberToUseForDrawQuadOne, dq_1->get_value());
  EXPECT_EQ(kMagicNumberToUseForDrawQuadTwo, dq_2->get_value());
}

TEST(ListContainerTest, DestructorCalled) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize());

  size_t size = 1;
  MockDrawQuad* dq_1 = list.AllocateAndConstruct<MockDrawQuad>();

  EXPECT_CALL(*dq_1, Destruct());
  EXPECT_EQ(size, list.size());
  EXPECT_EQ(dq_1, list.front());
}

TEST(ListContainerTest, DestructorCalledOnceWhenClear) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize());
  size_t size = 1;
  MockDrawQuad* dq_1 = list.AllocateAndConstruct<MockDrawQuad>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(dq_1, list.front());

  // Make sure destructor is called once during clear, and won't be called
  // again.
  testing::MockFunction<void()> separator;
  {
    testing::InSequence s;
    EXPECT_CALL(*dq_1, Destruct());
    EXPECT_CALL(separator, Call());
    EXPECT_CALL(*dq_1, Destruct()).Times(0);
  }

  list.clear();
  separator.Call();
}

TEST(ListContainerTest, DestructorCalledOnceWhenErase) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize());
  size_t size = 1;
  MockDrawQuad* dq_1 = list.AllocateAndConstruct<MockDrawQuad>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(dq_1, list.front());

  // Make sure destructor is called once during clear, and won't be called
  // again.
  testing::MockFunction<void()> separator;
  {
    testing::InSequence s;
    EXPECT_CALL(*dq_1, Destruct());
    EXPECT_CALL(separator, Call());
    EXPECT_CALL(*dq_1, Destruct()).Times(0);
  }

  list.EraseAndInvalidateAllPointers(list.begin());
  separator.Call();
}

TEST(ListContainerTest, SimpleIndexAccessSharedQuadState) {
  ListContainer<SharedQuadState> list;

  size_t size = 3;
  SharedQuadState* sqs_1 = list.AllocateAndConstruct<SharedQuadState>();
  SharedQuadState* sqs_2 = list.AllocateAndConstruct<SharedQuadState>();
  SharedQuadState* sqs_3 = list.AllocateAndConstruct<SharedQuadState>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(sqs_1, list.front());
  EXPECT_EQ(sqs_3, list.back());
  EXPECT_EQ(list.front(), list.ElementAt(0));
  EXPECT_EQ(sqs_2, list.ElementAt(1));
  EXPECT_EQ(list.back(), list.ElementAt(2));
}

TEST(ListContainerTest, SimpleInsertionSharedQuadState) {
  ListContainer<SharedQuadState> list;

  size_t size = 3;
  SharedQuadState* sqs_1 = list.AllocateAndConstruct<SharedQuadState>();
  list.AllocateAndConstruct<SharedQuadState>();
  SharedQuadState* sqs_3 = list.AllocateAndConstruct<SharedQuadState>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(sqs_1, list.front());
  EXPECT_EQ(sqs_3, list.back());
}

TEST(ListContainerTest, SimpleInsertionAndClearSharedQuadState) {
  ListContainer<SharedQuadState> list;
  EXPECT_TRUE(list.empty());
  EXPECT_EQ(0u, list.size());

  size_t size = 3;
  SharedQuadState* sqs_1 = list.AllocateAndConstruct<SharedQuadState>();
  list.AllocateAndConstruct<SharedQuadState>();
  SharedQuadState* sqs_3 = list.AllocateAndConstruct<SharedQuadState>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(sqs_1, list.front());
  EXPECT_EQ(sqs_3, list.back());
  EXPECT_FALSE(list.empty());

  list.clear();
  EXPECT_TRUE(list.empty());
  EXPECT_EQ(0u, list.size());
}

TEST(ListContainerTest, SimpleInsertionClearAndInsertAgainSharedQuadState) {
  ListContainer<SharedQuadState> list;
  EXPECT_TRUE(list.empty());
  EXPECT_EQ(0u, list.size());

  size_t size = 2;
  SharedQuadState* sqs_front = list.AllocateAndConstruct<SharedQuadState>();
  SharedQuadState* sqs_back = list.AllocateAndConstruct<SharedQuadState>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(sqs_front, list.front());
  EXPECT_EQ(sqs_back, list.back());
  EXPECT_FALSE(list.empty());

  list.clear();
  EXPECT_TRUE(list.empty());
  EXPECT_EQ(0u, list.size());

  size = 3;
  sqs_front = list.AllocateAndConstruct<SharedQuadState>();
  list.AllocateAndConstruct<SharedQuadState>();
  sqs_back = list.AllocateAndConstruct<SharedQuadState>();

  EXPECT_EQ(size, list.size());
  EXPECT_EQ(sqs_front, list.front());
  EXPECT_EQ(sqs_back, list.back());
  EXPECT_FALSE(list.empty());
}

// This test is used to test when there is more than one allocation needed
// for, ListContainer can still perform like normal vector.
TEST(ListContainerTest,
     SimpleInsertionTriggerMoreThanOneAllocationSharedQuadState) {
  ListContainer<SharedQuadState> list(sizeof(SharedQuadState), 2);
  std::vector<SharedQuadState*> sqs_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
  }
  EXPECT_EQ(size, list.size());

  ListContainer<SharedQuadState>::Iterator iter = list.begin();
  for (std::vector<SharedQuadState*>::const_iterator sqs_iter =
           sqs_list.begin();
       sqs_iter != sqs_list.end();
       ++sqs_iter) {
    EXPECT_EQ(*sqs_iter, *iter);
    ++iter;
  }
}

TEST(ListContainerTest,
     CorrectAllocationSizeForMoreThanOneAllocationSharedQuadState) {
  // Constructor sets the allocation size to 2. Every time ListContainer needs
  // to allocate again, it doubles allocation size. In this test, 10 elements is
  // needed, thus ListContainerShould allocate spaces 2, 4 and 8 elements.
  ListContainer<SharedQuadState> list(sizeof(SharedQuadState), 2);
  std::vector<SharedQuadState*> sqs_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    // Before asking for a new element, space available without another
    // allocation follows.
    switch (i) {
      case 2:
      case 6:
        EXPECT_EQ(0u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 1:
      case 5:
        EXPECT_EQ(1u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 0:
      case 4:
        EXPECT_EQ(2u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 3:
        EXPECT_EQ(3u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 9:
        EXPECT_EQ(5u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 8:
        EXPECT_EQ(6u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 7:
        EXPECT_EQ(7u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      default:
        break;
    }
    sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
    // After asking for a new element, space available without another
    // allocation follows.
    switch (i) {
      case 1:
      case 5:
        EXPECT_EQ(0u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 0:
      case 4:
        EXPECT_EQ(1u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 3:
        EXPECT_EQ(2u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 2:
        EXPECT_EQ(3u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 9:
        EXPECT_EQ(4u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 8:
        EXPECT_EQ(5u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 7:
        EXPECT_EQ(6u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      case 6:
        EXPECT_EQ(7u, list.AvailableSizeWithoutAnotherAllocationForTesting());
        break;
      default:
        break;
    }
  }
  EXPECT_EQ(size, list.size());

  ListContainer<SharedQuadState>::Iterator iter = list.begin();
  for (std::vector<SharedQuadState*>::const_iterator sqs_iter =
           sqs_list.begin();
       sqs_iter != sqs_list.end();
       ++sqs_iter) {
    EXPECT_EQ(*sqs_iter, *iter);
    ++iter;
  }
}

TEST(ListContainerTest, SimpleIterationSharedQuadState) {
  ListContainer<SharedQuadState> list;
  std::vector<SharedQuadState*> sqs_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
  }
  EXPECT_EQ(size, list.size());

  size_t num_iters_in_list = 0;
  {
    std::vector<SharedQuadState*>::const_iterator sqs_iter = sqs_list.begin();
    for (ListContainer<SharedQuadState>::Iterator iter = list.begin();
         iter != list.end();
         ++iter) {
      EXPECT_EQ(*sqs_iter, *iter);
      ++num_iters_in_list;
      ++sqs_iter;
    }
  }

  size_t num_iters_in_vector = 0;
  {
    ListContainer<SharedQuadState>::Iterator iter = list.begin();
    for (std::vector<SharedQuadState*>::const_iterator sqs_iter =
             sqs_list.begin();
         sqs_iter != sqs_list.end();
         ++sqs_iter) {
      EXPECT_EQ(*sqs_iter, *iter);
      ++num_iters_in_vector;
      ++iter;
    }
  }

  EXPECT_EQ(num_iters_in_vector, num_iters_in_list);
}

TEST(ListContainerTest, SimpleConstIteratorIterationSharedQuadState) {
  ListContainer<SharedQuadState> list;
  std::vector<const SharedQuadState*> sqs_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
  }
  EXPECT_EQ(size, list.size());

  {
    std::vector<const SharedQuadState*>::const_iterator sqs_iter =
        sqs_list.begin();
    for (ListContainer<SharedQuadState>::ConstIterator iter = list.begin();
         iter != list.end();
         ++iter) {
      EXPECT_TRUE(isConstSharedQuadStatePointer(*iter));
      EXPECT_EQ(*sqs_iter, *iter);
      ++sqs_iter;
    }
  }

  {
    std::vector<const SharedQuadState*>::const_iterator sqs_iter =
        sqs_list.begin();
    for (ListContainer<SharedQuadState>::Iterator iter = list.begin();
         iter != list.end();
         ++iter) {
      EXPECT_FALSE(isConstSharedQuadStatePointer(*iter));
      EXPECT_EQ(*sqs_iter, *iter);
      ++sqs_iter;
    }
  }

  {
    ListContainer<SharedQuadState>::ConstIterator iter = list.begin();
    for (std::vector<const SharedQuadState*>::const_iterator sqs_iter =
             sqs_list.begin();
         sqs_iter != sqs_list.end();
         ++sqs_iter) {
      EXPECT_EQ(*sqs_iter, *iter);
      ++iter;
    }
  }
}

TEST(ListContainerTest, SimpleReverseInsertionSharedQuadState) {
  ListContainer<SharedQuadState> list;
  std::vector<SharedQuadState*> sqs_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
  }
  EXPECT_EQ(size, list.size());

  {
    std::vector<SharedQuadState*>::const_reverse_iterator sqs_iter =
        sqs_list.rbegin();
    for (ListContainer<SharedQuadState>::ReverseIterator iter = list.rbegin();
         iter != list.rend();
         ++iter) {
      EXPECT_EQ(*sqs_iter, *iter);
      ++sqs_iter;
    }
  }

  {
    ListContainer<SharedQuadState>::ReverseIterator iter = list.rbegin();
    for (std::vector<SharedQuadState*>::reverse_iterator sqs_iter =
             sqs_list.rbegin();
         sqs_iter != sqs_list.rend();
         ++sqs_iter) {
      EXPECT_EQ(*sqs_iter, *iter);
      ++iter;
    }
  }
}

TEST(ListContainerTest, SimpleDeletion) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize());
  std::vector<SimpleDrawQuad*> sdq_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    sdq_list.push_back(list.AllocateAndConstruct<SimpleDrawQuad>());
    sdq_list.back()->set_value(i);
  }
  EXPECT_EQ(size, list.size());

  list.EraseAndInvalidateAllPointers(list.begin());
  --size;
  EXPECT_EQ(size, list.size());
  int i = 1;
  for (ListContainer<DrawQuad>::Iterator iter = list.begin();
       iter != list.end();
       ++iter) {
    EXPECT_EQ(i, static_cast<SimpleDrawQuad*>(*iter)->get_value());
    ++i;
  }
}

TEST(ListContainerTest, SimpleIterationAndManipulation) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize());
  std::vector<SimpleDrawQuad*> sdq_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    SimpleDrawQuad* simple_dq = list.AllocateAndConstruct<SimpleDrawQuad>();
    sdq_list.push_back(simple_dq);
  }
  EXPECT_EQ(size, list.size());

  ListContainer<DrawQuad>::Iterator iter = list.begin();
  for (int i = 0; i < 10; ++i) {
    static_cast<SimpleDrawQuad*>(*iter)->set_value(i);
    ++iter;
  }

  int i = 0;
  for (std::vector<SimpleDrawQuad*>::const_iterator sdq_iter = sdq_list.begin();
       sdq_iter < sdq_list.end();
       ++sdq_iter) {
    EXPECT_EQ(i, (*sdq_iter)->get_value());
    ++i;
  }
}

TEST(ListContainerTest, SimpleManipulationWithIndexSimpleDrawQuad) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize());
  std::vector<SimpleDrawQuad*> dq_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    dq_list.push_back(list.AllocateAndConstruct<SimpleDrawQuad>());
  }
  EXPECT_EQ(size, list.size());

  for (size_t i = 0; i < size; ++i) {
    static_cast<SimpleDrawQuad*>(list.ElementAt(i))->set_value(i);
  }

  int i = 0;
  for (std::vector<SimpleDrawQuad*>::const_iterator dq_iter = dq_list.begin();
       dq_iter != dq_list.end();
       ++dq_iter, ++i) {
    EXPECT_EQ(i, (*dq_iter)->get_value());
  }
}

TEST(ListContainerTest,
     SimpleManipulationWithIndexMoreThanOneAllocationSimpleDrawQuad) {
  ListContainer<DrawQuad> list(LargestDrawQuadSize(), 2);
  std::vector<SimpleDrawQuad*> dq_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    dq_list.push_back(list.AllocateAndConstruct<SimpleDrawQuad>());
  }
  EXPECT_EQ(size, list.size());

  for (size_t i = 0; i < size; ++i) {
    static_cast<SimpleDrawQuad*>(list.ElementAt(i))->set_value(i);
  }

  int i = 0;
  for (std::vector<SimpleDrawQuad*>::const_iterator dq_iter = dq_list.begin();
       dq_iter != dq_list.end();
       ++dq_iter, ++i) {
    EXPECT_EQ(i, (*dq_iter)->get_value());
  }
}

TEST(ListContainerTest,
     SimpleIterationAndReverseIterationWithIndexSharedQuadState) {
  ListContainer<SharedQuadState> list;
  std::vector<SharedQuadState*> sqs_list;
  size_t size = 10;
  for (size_t i = 0; i < size; ++i) {
    sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
  }
  EXPECT_EQ(size, list.size());

  size_t i = 0;
  for (ListContainer<SharedQuadState>::Iterator iter = list.begin();
       iter != list.end();
       ++iter) {
    EXPECT_EQ(i, iter.index());
    ++i;
  }

  i = 0;
  for (ListContainer<SharedQuadState>::ReverseIterator iter = list.rbegin();
       iter != list.rend();
       ++iter) {
    EXPECT_EQ(i, iter.index());
    ++i;
  }
}

}  // namespace
}  // namespace cc
