// Copyright 2014 the V8 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.

#include "src/base/iterator.h"

#include <deque>

#include "test/unittests/test-utils.h"

namespace v8 {
namespace base {

TEST(IteratorTest, IteratorRangeEmpty) {
  base::iterator_range<char*> r;
  EXPECT_EQ(r.begin(), r.end());
  EXPECT_EQ(r.end(), r.cend());
  EXPECT_EQ(r.begin(), r.cbegin());
  EXPECT_TRUE(r.empty());
  EXPECT_EQ(0, r.size());
}

TEST(IteratorTest, IteratorRangeArray) {
  int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  base::iterator_range<int*> r1(&array[0], &array[10]);
  for (auto i : r1) {
    EXPECT_EQ(array[i], i);
  }
  EXPECT_EQ(10, r1.size());
  EXPECT_FALSE(r1.empty());
  for (size_t i = 0; i < arraysize(array); ++i) {
    EXPECT_EQ(r1[i], array[i]);
  }
  base::iterator_range<int*> r2(&array[0], &array[0]);
  EXPECT_EQ(0, r2.size());
  EXPECT_TRUE(r2.empty());
  for (auto i : array) {
    EXPECT_EQ(r2.end(), std::find(r2.begin(), r2.end(), i));
  }
}

TEST(IteratorTest, IteratorRangeDeque) {
  using C = std::deque<int>;
  C c;
  c.push_back(1);
  c.push_back(2);
  c.push_back(2);
  base::iterator_range<typename C::iterator> r(c.begin(), c.end());
  EXPECT_EQ(3, r.size());
  EXPECT_FALSE(r.empty());
  EXPECT_TRUE(c.begin() == r.begin());
  EXPECT_TRUE(c.end() == r.end());
  EXPECT_EQ(0, std::count(r.begin(), r.end(), 0));
  EXPECT_EQ(1, std::count(r.begin(), r.end(), 1));
  EXPECT_EQ(2, std::count(r.begin(), r.end(), 2));
}

TEST(IteratorTest, IteratorTypeDeduction) {
  base::iterator_range<char*> r;
  auto r2 = make_iterator_range(r.begin(), r.end());
  EXPECT_EQ(r2.begin(), r.begin());
  EXPECT_EQ(r2.end(), r2.end());
  auto I = r.begin(), E = r.end();
  // Check that this compiles and does the correct thing even if the iterators
  // are lvalues:
  auto r3 = make_iterator_range(I, E);
  EXPECT_TRUE((std::is_same<decltype(r2), decltype(r3)>::value));
  EXPECT_EQ(r3.begin(), r.begin());
  EXPECT_EQ(r3.end(), r2.end());
}
}  // namespace base
}  // namespace v8
