// Copyright 2015 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 "public/platform/WebVector.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "wtf/StdLibExtras.h"
#include "wtf/Vector.h"

namespace blink {

TEST(WebVectorTest, Iterators) {
  Vector<int> input;
  for (int i = 0; i < 5; ++i)
    input.append(i);

  WebVector<int> webVector(input);
  const WebVector<int>& constWebVector = webVector;
  Vector<int> output;

  ASSERT_EQ(input.size(), webVector.size());

  // Use begin()/end() iterators directly.
  for (WebVector<int>::iterator it = webVector.begin(); it != webVector.end();
       ++it)
    output.append(*it);
  ASSERT_EQ(input.size(), output.size());
  for (size_t i = 0; i < input.size(); ++i)
    EXPECT_EQ(input[i], output[i]);

  // Use begin()/end() const_iterators directly.
  output.clear();
  for (WebVector<int>::const_iterator it = constWebVector.begin();
       it != constWebVector.end(); ++it)
    output.append(*it);
  ASSERT_EQ(input.size(), output.size());
  for (size_t i = 0; i < input.size(); ++i)
    EXPECT_EQ(input[i], output[i]);

  // Use range-based for loop.
  output.clear();
  for (int x : webVector)
    output.append(x);
  ASSERT_EQ(input.size(), output.size());
  for (size_t i = 0; i < input.size(); ++i)
    EXPECT_EQ(input[i], output[i]);
}

TEST(WebVectorTest, IsEmpty) {
  WebVector<int> vector;
  ASSERT_TRUE(vector.isEmpty());
  int value = 1;
  vector.assign(&value, 1);
  ASSERT_EQ(1u, vector.size());
  ASSERT_FALSE(vector.isEmpty());
}

TEST(WebVectorTest, Swap) {
  const int firstData[] = {1, 2, 3, 4, 5};
  const int secondData[] = {6, 5, 8};
  const size_t kFirstDataLength = WTF_ARRAY_LENGTH(firstData);
  const size_t kSecondDataLength = WTF_ARRAY_LENGTH(secondData);

  WebVector<int> first(firstData, kFirstDataLength);
  WebVector<int> second(secondData, kSecondDataLength);
  ASSERT_EQ(kFirstDataLength, first.size());
  ASSERT_EQ(kSecondDataLength, second.size());
  first.swap(second);
  ASSERT_EQ(kSecondDataLength, first.size());
  ASSERT_EQ(kFirstDataLength, second.size());
  for (size_t i = 0; i < first.size(); ++i)
    EXPECT_EQ(secondData[i], first[i]);
  for (size_t i = 0; i < second.size(); ++i)
    EXPECT_EQ(firstData[i], second[i]);
}

TEST(WebVectorTest, CreateFromPointer) {
  const int values[] = {1, 2, 3, 4, 5};

  WebVector<int> vector(values, 3);
  ASSERT_EQ(3u, vector.size());
  ASSERT_EQ(1, vector[0]);
  ASSERT_EQ(2, vector[1]);
  ASSERT_EQ(3, vector[2]);
}

TEST(WebVectorTest, CreateFromWtfVector) {
  Vector<int> input;
  for (int i = 0; i < 5; ++i)
    input.append(i);

  WebVector<int> vector(input);
  ASSERT_EQ(input.size(), vector.size());
  for (size_t i = 0; i < vector.size(); ++i)
    EXPECT_EQ(input[i], vector[i]);

  WebVector<int> copy(input);
  ASSERT_EQ(input.size(), copy.size());
  for (size_t i = 0; i < copy.size(); ++i)
    EXPECT_EQ(input[i], copy[i]);

  WebVector<int> assigned;
  assigned = copy;
  ASSERT_EQ(input.size(), assigned.size());
  for (size_t i = 0; i < assigned.size(); ++i)
    EXPECT_EQ(input[i], assigned[i]);
}

TEST(WebVectorTest, CreateFromStdVector) {
  std::vector<int> input;
  for (int i = 0; i < 5; ++i)
    input.push_back(i);

  WebVector<int> vector(input);
  ASSERT_EQ(input.size(), vector.size());
  for (size_t i = 0; i < vector.size(); ++i)
    EXPECT_EQ(input[i], vector[i]);

  WebVector<int> assigned;
  assigned = input;
  ASSERT_EQ(input.size(), assigned.size());
  for (size_t i = 0; i < assigned.size(); ++i)
    EXPECT_EQ(input[i], assigned[i]);
}

}  // namespace blink
