// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "common/util/iterator_range.h"

#include <iterator>
#include <list>
#include <set>
#include <utility>
#include <vector>

#include "common/util/range.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

namespace verible {
namespace {

using ::testing::ElementsAre;
using ::testing::ElementsAreArray;

TEST(IteratorRangeTest, EmptyVector) {
  std::vector<int> v;
  auto range = make_range(v.begin(), v.end());
  EXPECT_EQ(range.begin(), range.end());
}

TEST(IteratorRangeTest, EmptyVectorRangeComparison) {
  std::vector<int> v;
  const auto range = make_range(v.begin(), v.end());
  const auto range2 = make_range(v.begin(), v.end());
  EXPECT_TRUE(BoundsEqual(range, range2));
  EXPECT_TRUE(BoundsEqual(range2, range));

  auto crange = make_range(v.cbegin(), v.cend());
  EXPECT_TRUE(BoundsEqual(crange, crange));
  // Testing mixed-iterator-constness
  EXPECT_TRUE(BoundsEqual(range, crange));
  EXPECT_TRUE(BoundsEqual(crange, range));
}

TEST(IteratorRangeTest, EmptyList) {
  std::list<int> v;
  auto range = make_range(v.begin(), v.end());
  EXPECT_EQ(range.begin(), range.end());
}

TEST(IteratorRangeTest, EmptySet) {
  std::set<int> v;
  auto range = make_range(v.begin(), v.end());
  EXPECT_EQ(range.begin(), range.end());
}

TEST(IteratorRangeTest, WholeVectorBeginEnd) {
  std::vector<int> v = {2, 3, 5, 7, 11, 13};
  auto range = make_range(v.begin(), v.end());
  EXPECT_THAT(range, ElementsAreArray(v));
}

TEST(IteratorRangeTest, EqualNonemptyVectorRangeComparisons) {
  std::vector<int> v = {3, 5, 11};
  auto range = make_range(v.begin(), v.end());
  auto crange = make_range(v.cbegin(), v.cend());
  EXPECT_TRUE(BoundsEqual(range, crange));
  EXPECT_TRUE(BoundsEqual(crange, range));
}

TEST(IteratorRangeTest, UnequalVectorRangeComparisons) {
  std::vector<int> v = {2, 3, 5, 7, 11, 13};
  auto range = make_range(v.begin(), v.end());
  auto range2 = make_range(range.begin() + 1, range.end());
  auto range3 = make_range(range.begin(), range.end() - 1);
  EXPECT_FALSE(BoundsEqual(range, range2));
  EXPECT_FALSE(BoundsEqual(range, range3));
  EXPECT_FALSE(BoundsEqual(range2, range));
  EXPECT_FALSE(BoundsEqual(range2, range3));
  EXPECT_FALSE(BoundsEqual(range3, range));
  EXPECT_FALSE(BoundsEqual(range3, range2));
}

TEST(IteratorRangeTest, WholeListBeginEnd) {
  std::list<int> v = {2, 3, 5, 7, 11, 13};
  auto range = make_range(v.begin(), v.end());
  EXPECT_THAT(range, ElementsAreArray(v));
}

TEST(IteratorRangeTest, WholeSetBeginEnd) {
  std::set<int> v = {2, 3, 5, 7, 11, 13};
  auto range = make_range(v.begin(), v.end());
  EXPECT_THAT(range, ElementsAreArray(v));
}

TEST(IteratorRangeTest, WholeVectorMakePair) {
  std::vector<int> v = {2, 3, 5, 7, 11, 13};
  auto range = make_range(std::make_pair(v.begin(), v.end()));
  EXPECT_THAT(range, ElementsAreArray(v));
}

TEST(IteratorRangeTest, PartArray) {
  int v[] = {2, 3, 5, 7, 11, 13};
  iterator_range<int*> range(&v[1], &v[4]);  // 3, 5, 7
  EXPECT_THAT(range, ElementsAre(3, 5, 7));
}

TEST(IteratorRangeTest, ArrayMakeRange) {
  int v[] = {2, 3, 5, 7, 11, 13};
  auto range = make_range(&v[1], &v[4]);
  EXPECT_THAT(range, ElementsAre(3, 5, 7));
}

}  // namespace
}  // namespace verible
