// Copyright 2017 The Fuchsia 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 "peridot/lib/convert/collection_view.h"

#include <iterator>
#include <set>
#include <unordered_set>
#include <vector>

#include "gtest/gtest.h"

// Add helper to print our types.
namespace testing {
namespace internal {
template <>
std::string GetTypeName<std::vector<uint32_t>>() {
  return "std::vector<uint32_t>";
}
template <>
std::string GetTypeName<std::unordered_set<uint32_t>>() {
  return "std::unordered_set<uint32_t>";
}
template <>
std::string GetTypeName<std::set<uint32_t>>() {
  return "std::set<uint32_t>";
}
}  // namespace internal
}  // namespace testing

namespace convert {
namespace {

template <typename T>
::testing::AssertionResult Equals(const T& collection, size_t begin,
                                  size_t length, CollectionView<T> view) {
  auto it1 = std::next(collection.begin(), begin);
  auto it2 = view.begin();
  for (size_t i = 0; i < length; ++i) {
    if (it1 == collection.end()) {
      return ::testing::AssertionFailure() << "collection is not large enough.";
    }
    if (it2 == view.end()) {
      return ::testing::AssertionFailure() << "view is not large enough.";
    }
  }
  if (*it1 != *it2) {
    return ::testing::AssertionFailure() << "view is incorrect.";
  }
  return ::testing::AssertionSuccess();
}

template <typename T>
using CollectionViewTest = ::testing::Test;

using CollectionTypes =
    ::testing::Types<std::vector<uint32_t>, std::unordered_set<uint32_t>,
                     std::set<uint32_t>>;

TYPED_TEST_CASE(CollectionViewTest, CollectionTypes);

TYPED_TEST(CollectionViewTest, Views) {
  TypeParam values = {0, 1, 2, 3, 4, 5};
  CollectionView<TypeParam> view = values;

  EXPECT_TRUE(Equals(values, 0, values.size(), view));
  EXPECT_TRUE(Equals(values, 1, values.size(), view.Tail()));
  EXPECT_TRUE(Equals(values, 1, values.size() - 2,
                     view.SubCollection(1, values.size() - 2)));
  EXPECT_EQ(*std::next(values.begin()), view.Tail()[0]);
}

}  // namespace
}  // namespace convert
