// Copyright 2018 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#include <lib/unittest/unittest.h>

// TODO(mcgrathr): unittests are ignored, leaving unused definitions here.
// Eventually the test code should only be compiled at all in configurations
// that actually use it.

#if LK_DEBUGLEVEL != 0

#include <ktl/move.h>
#include <ktl/type_traits.h>
#include <ktl/variant.h>

#include <ktl/enforce.h>

namespace {

struct no_copy {
  no_copy(const no_copy&) = delete;
  no_copy(no_copy&&) = default;
  no_copy& operator=(const no_copy&) = delete;
  no_copy& operator=(no_copy&&) = default;
};

struct no_move {
  no_move(const no_move&) = default;
  no_move(no_move&&) = delete;
  no_move& operator=(const no_move&) = default;
  no_move& operator=(no_move&&) = delete;
};

struct no_copy_no_move {
  no_copy_no_move(const no_copy_no_move&) = delete;
  no_copy_no_move(no_copy_no_move&&) = delete;
  no_copy_no_move& operator=(const no_copy_no_move&) = delete;
  no_copy_no_move& operator=(no_copy_no_move&&) = delete;
};

struct non_trivial_destructor {
  ~non_trivial_destructor() {}
};

struct non_trivial_copy {
  non_trivial_copy(const non_trivial_copy&) {}
  non_trivial_copy(non_trivial_copy&&) = default;
  non_trivial_copy& operator=(const non_trivial_copy&) { return *this; }
  non_trivial_copy& operator=(non_trivial_copy&&) = default;
};

struct non_trivial_move {
  non_trivial_move(const non_trivial_move&) = default;
  non_trivial_move(non_trivial_move&&) {}
  non_trivial_move& operator=(const non_trivial_move&) = default;
  non_trivial_move& operator=(non_trivial_move&&) { return *this; }
};

struct literal_traits {
  using variant = ktl::variant<ktl::monostate, int, long int>;

  static constexpr ktl::monostate a_value{};
  static constexpr int b_value = 10;
  static constexpr long int c_value = 25;
  static constexpr long int c2_value = 42;

  static variant a, b, c;
  static constexpr variant const_a{};
  static constexpr variant const_b{ktl::in_place_index<1>, b_value};
  static constexpr variant const_c{ktl::in_place_index<2>, c_value};
};

literal_traits::variant literal_traits::a;
literal_traits::variant literal_traits::b{ktl::in_place_index<1>, literal_traits::b_value};
literal_traits::variant literal_traits::c{ktl::in_place_index<2>, literal_traits::c_value};

struct complex_traits {
  using variant = ktl::variant<ktl::monostate, int, const char*>;

  static const ktl::monostate a_value;
  static const int b_value;
  static const char* const c_value;
  static const char* const c2_value;

  static variant a, b, c;
  static const variant const_a;
  static const variant const_b;
  static const variant const_c;
};

const ktl::monostate complex_traits::a_value{};
const int complex_traits::b_value = 10;
const char* const complex_traits::c_value = "test";
const char* const complex_traits::c2_value = "another";

complex_traits::variant complex_traits::a;
complex_traits::variant complex_traits::b{ktl::in_place_index<1>, complex_traits::b_value};
complex_traits::variant complex_traits::c{ktl::in_place_index<2>, complex_traits::c_value};

const complex_traits::variant complex_traits::const_a;
const complex_traits::variant complex_traits::const_b{ktl::in_place_index<1>,
                                                      complex_traits::b_value};
const complex_traits::variant complex_traits::const_c{ktl::in_place_index<2>,
                                                      complex_traits::c_value};

template <typename T>
bool accessors() {
  BEGIN_TEST;

  EXPECT_EQ(size_t{0}, T::a.index());
  EXPECT_TRUE(T::a_value == ktl::get<0>(T::a));
  EXPECT_TRUE(T::a_value == ktl::get<0>(T::const_a));

  EXPECT_EQ(size_t{1}, T::b.index());
  EXPECT_TRUE(T::b_value == ktl::get<1>(T::b));
  EXPECT_TRUE(T::b_value == ktl::get<1>(T::const_b));

  EXPECT_EQ(size_t{2}, T::c.index());
  EXPECT_TRUE(T::c_value == ktl::get<2>(T::c));
  EXPECT_TRUE(T::c_value == ktl::get<2>(T::const_c));

  END_TEST;
}

template <typename T>
bool copy_move_assign() {
  BEGIN_TEST;

  using b_type = ktl::decay_t<decltype(T::b_value)>;
  using c_type = ktl::decay_t<decltype(T::c_value)>;

  typename T::variant x;
  EXPECT_EQ(size_t{0}, x.index());
  EXPECT_TRUE(T::a_value == ktl::get<0>(x));

  x = T::b;
  EXPECT_EQ(size_t{1}, x.index());
  EXPECT_TRUE(ktl::holds_alternative<b_type>(x));
  EXPECT_FALSE(ktl::holds_alternative<c_type>(x));
  EXPECT_TRUE(T::b_value == ktl::get<1>(x));

  x.template emplace<2>(T::c_value);
  EXPECT_EQ(size_t{2}, x.index());
  EXPECT_FALSE(ktl::holds_alternative<b_type>(x));
  EXPECT_TRUE(ktl::holds_alternative<c_type>(x));
  EXPECT_TRUE(T::c_value == ktl::get<2>(x));

  typename T::variant y(T::b);
  EXPECT_EQ(size_t{1}, y.index());
  EXPECT_TRUE(T::b_value == ktl::get<1>(y));

  x = ktl::move(y);
  EXPECT_EQ(size_t{1}, x.index());
  EXPECT_TRUE(T::b_value == ktl::get<1>(x));

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wself-assign-overloaded"
#endif

  x = x;
  EXPECT_EQ(size_t{1}, x.index());
  EXPECT_TRUE(T::b_value == ktl::get<1>(x));

#ifdef __clang__
#pragma clang diagnostic pop
#endif

  x = ktl::move(x);
  EXPECT_EQ(size_t{1}, x.index());
  EXPECT_TRUE(ktl::holds_alternative<b_type>(x));
  EXPECT_FALSE(ktl::holds_alternative<c_type>(x));
  EXPECT_TRUE(T::b_value == ktl::get<1>(x));

  x = T::a;
  EXPECT_EQ(size_t{0}, x.index());
  EXPECT_TRUE(T::a_value == ktl::get<0>(x));

  x = T::c;
  typename T::variant z(ktl::move(x));
  EXPECT_EQ(size_t{2}, z.index());
  EXPECT_FALSE(ktl::holds_alternative<b_type>(z));
  EXPECT_TRUE(ktl::holds_alternative<c_type>(z));
  EXPECT_TRUE(T::c_value == ktl::get<2>(z));

  END_TEST;
}

template <typename T>
bool swapping() {
  BEGIN_TEST;

  typename T::variant x;
  EXPECT_EQ(size_t{0}, x.index());
  EXPECT_TRUE(T::a_value == ktl::get<0>(x));

  typename T::variant y(T::c);
  y.swap(y);
  EXPECT_EQ(size_t{2}, y.index());
  EXPECT_TRUE(T::c_value == ktl::get<2>(y));

  x.swap(y);
  EXPECT_EQ(size_t{2}, x.index());
  EXPECT_TRUE(T::c_value == ktl::get<2>(x));
  EXPECT_EQ(size_t{0}, y.index());
  EXPECT_TRUE(T::a_value == ktl::get<0>(y));

  y.template emplace<2>(T::c2_value);
  x.swap(y);
  EXPECT_EQ(size_t{2}, x.index());
  EXPECT_TRUE(T::c2_value == ktl::get<2>(x));
  EXPECT_EQ(size_t{2}, y.index());
  EXPECT_TRUE(T::c_value == ktl::get<2>(y));

  x = T::b;
  y.swap(x);
  EXPECT_EQ(size_t{2}, x.index());
  EXPECT_TRUE(T::c_value == ktl::get<2>(x));
  EXPECT_EQ(size_t{1}, y.index());
  EXPECT_TRUE(T::b_value == ktl::get<1>(y));

  x = T::a;
  y.swap(x);
  EXPECT_EQ(size_t{1}, x.index());
  EXPECT_TRUE(T::b_value == ktl::get<1>(x));
  EXPECT_EQ(size_t{0}, y.index());
  EXPECT_TRUE(T::a_value == ktl::get<0>(y));

  END_TEST;
}

// Test constexpr behavior.
namespace constexpr_test {
static_assert(literal_traits::variant().index() == 0, "");
static_assert(literal_traits::const_a.index() == 0, "");
static_assert(ktl::get<0>(literal_traits::const_a) == literal_traits::a_value, "");
static_assert(literal_traits::const_b.index() == 1, "");
static_assert(ktl::get<1>(literal_traits::const_b) == literal_traits::b_value, "");
static_assert(literal_traits::const_c.index() == 2, "");
static_assert(ktl::get<2>(literal_traits::const_c) == literal_traits::c_value, "");
}  // namespace constexpr_test

// Test comparisons.
namespace comparison_tests {
struct greater {};
struct less {};

constexpr bool operator==(greater, greater) { return true; }
constexpr bool operator<=(greater, greater) { return true; }
constexpr bool operator>=(greater, greater) { return true; }
constexpr bool operator!=(greater, greater) { return false; }
constexpr bool operator<(greater, greater) { return false; }
constexpr bool operator>(greater, greater) { return false; }

constexpr bool operator==(less, less) { return true; }
constexpr bool operator<=(less, less) { return true; }
constexpr bool operator>=(less, less) { return true; }
constexpr bool operator!=(less, less) { return false; }
constexpr bool operator<(less, less) { return false; }
constexpr bool operator>(less, less) { return false; }

constexpr bool operator==(greater, less) { return false; }
constexpr bool operator<=(greater, less) { return false; }
constexpr bool operator>=(greater, less) { return true; }
constexpr bool operator!=(greater, less) { return true; }
constexpr bool operator<(greater, less) { return false; }
constexpr bool operator>(greater, less) { return true; }

constexpr bool operator==(less, greater) { return false; }
constexpr bool operator<=(less, greater) { return true; }
constexpr bool operator>=(less, greater) { return false; }
constexpr bool operator!=(less, greater) { return true; }
constexpr bool operator<(less, greater) { return true; }
constexpr bool operator>(less, greater) { return false; }

// These definitions make ktl::monostate always compare less than
// |less| and |greater|.
constexpr bool operator==(ktl::monostate, greater) { return false; }
constexpr bool operator<=(ktl::monostate, greater) { return true; }
constexpr bool operator>=(ktl::monostate, greater) { return false; }
constexpr bool operator!=(ktl::monostate, greater) { return true; }
constexpr bool operator<(ktl::monostate, greater) { return true; }
constexpr bool operator>(ktl::monostate, greater) { return false; }

constexpr bool operator==(greater, ktl::monostate) { return false; }
constexpr bool operator<=(greater, ktl::monostate) { return false; }
constexpr bool operator>=(greater, ktl::monostate) { return true; }
constexpr bool operator!=(greater, ktl::monostate) { return true; }
constexpr bool operator<(greater, ktl::monostate) { return false; }
constexpr bool operator>(greater, ktl::monostate) { return true; }

constexpr bool operator==(ktl::monostate, less) { return false; }
constexpr bool operator<=(ktl::monostate, less) { return true; }
constexpr bool operator>=(ktl::monostate, less) { return false; }
constexpr bool operator!=(ktl::monostate, less) { return true; }
constexpr bool operator<(ktl::monostate, less) { return true; }
constexpr bool operator>(ktl::monostate, less) { return false; }

constexpr bool operator==(less, ktl::monostate) { return false; }
constexpr bool operator<=(less, ktl::monostate) { return false; }
constexpr bool operator>=(less, ktl::monostate) { return true; }
constexpr bool operator!=(less, ktl::monostate) { return true; }
constexpr bool operator<(less, ktl::monostate) { return false; }
constexpr bool operator>(less, ktl::monostate) { return true; }

template <typename T, typename U>
constexpr bool match_comparisons(T lhs, U rhs) {
  // Use the following variant for all of the tests below. Note that the types
  // are ordered such that unlike variant comparisons yield a total order.
  // That is: ktl::monostate < less < greater.
  using variant = ktl::variant<ktl::monostate, less, greater>;

  static_assert((variant{lhs} == variant{rhs}) == (lhs == rhs), "");
  static_assert((variant{lhs} != variant{rhs}) == (lhs != rhs), "");
  static_assert((variant{lhs} <= variant{rhs}) == (lhs <= rhs), "");
  static_assert((variant{lhs} >= variant{rhs}) == (lhs >= rhs), "");
  static_assert((variant{lhs} < variant{rhs}) == (lhs < rhs), "");
  static_assert((variant{lhs} > variant{rhs}) == (lhs > rhs), "");

  return true;
}

static_assert(match_comparisons(ktl::monostate{}, ktl::monostate{}), "");
static_assert(match_comparisons(ktl::monostate{}, less{}), "");
static_assert(match_comparisons(ktl::monostate{}, greater{}), "");
static_assert(match_comparisons(less{}, ktl::monostate{}), "");
static_assert(match_comparisons(less{}, less{}), "");
static_assert(match_comparisons(less{}, greater{}), "");
static_assert(match_comparisons(greater{}, ktl::monostate{}), "");
static_assert(match_comparisons(greater{}, less{}), "");
static_assert(match_comparisons(greater{}, greater{}), "");

}  // namespace comparison_tests

// Ensure the variant is copy-constructible only when the types are copyable.
namespace copy_construction_test {
static_assert(ktl::is_copy_constructible<ktl::variant<ktl::monostate>>::value, "");
static_assert(!ktl::is_copy_constructible<ktl::variant<ktl::monostate, no_copy>>::value, "");
static_assert(ktl::is_copy_constructible<ktl::variant<ktl::monostate, no_move>>::value, "");
static_assert(!ktl::is_copy_constructible<ktl::variant<ktl::monostate, no_copy_no_move>>::value,
              "");
static_assert(ktl::is_copy_constructible<literal_traits::variant>::value, "");
static_assert(ktl::is_copy_constructible<complex_traits::variant>::value, "");
}  // namespace copy_construction_test

// Ensure the variant is copy-assignable only when the types are copyable.
namespace copy_assignment_test {
static_assert(ktl::is_copy_assignable<ktl::variant<ktl::monostate>>::value, "");
static_assert(!ktl::is_copy_assignable<ktl::variant<ktl::monostate, no_copy>>::value, "");
static_assert(ktl::is_copy_assignable<ktl::variant<ktl::monostate, no_move>>::value, "");
static_assert(!ktl::is_copy_assignable<ktl::variant<ktl::monostate, no_copy_no_move>>::value, "");
static_assert(ktl::is_copy_assignable<literal_traits::variant>::value, "");
static_assert(ktl::is_copy_assignable<complex_traits::variant>::value, "");
}  // namespace copy_assignment_test

// Ensure the variant is move-constructible only when the types are movable.
// Note that copy-constructible types are also considered movable.
namespace move_construction_test {
static_assert(ktl::is_move_constructible<ktl::variant<ktl::monostate>>::value, "");
static_assert(ktl::is_move_constructible<ktl::variant<ktl::monostate, no_copy>>::value, "");
static_assert(ktl::is_move_constructible<ktl::variant<ktl::monostate, no_move>>::value, "");
static_assert(!ktl::is_move_constructible<ktl::variant<ktl::monostate, no_copy_no_move>>::value,
              "");
static_assert(ktl::is_move_constructible<literal_traits::variant>::value, "");
static_assert(ktl::is_move_constructible<complex_traits::variant>::value, "");
}  // namespace move_construction_test

// Ensure the variant is move-assignable only when the types are movable.
// Note that copy-assignable types are also considered movable.
namespace move_assignment_test {
static_assert(ktl::is_move_assignable<ktl::variant<ktl::monostate>>::value, "");
static_assert(ktl::is_move_assignable<ktl::variant<ktl::monostate, no_copy>>::value, "");
static_assert(ktl::is_move_assignable<ktl::variant<ktl::monostate, no_move>>::value, "");
static_assert(!ktl::is_move_assignable<ktl::variant<ktl::monostate, no_copy_no_move>>::value, "");
static_assert(ktl::is_move_assignable<literal_traits::variant>::value, "");
static_assert(ktl::is_move_assignable<complex_traits::variant>::value, "");
}  // namespace move_assignment_test

// Ensure that the correct sequence of base types are considered in the
// implementation of variant to ensure that the right methods participate
// in overload resolution.
namespace impl_test {

// Type with a trivial destructor, move, and copy.
namespace trivial_type {
static_assert(ktl::is_trivially_destructible<ktl::variant<ktl::monostate, int>>::value, "");
static_assert(ktl::is_trivially_move_constructible<ktl::variant<ktl::monostate, int>>::value, "");
static_assert(ktl::is_trivially_copy_constructible<ktl::variant<ktl::monostate, int>>::value, "");
static_assert(ktl::is_trivially_move_assignable<ktl::variant<ktl::monostate, int>>::value, "");
static_assert(ktl::is_trivially_copy_assignable<ktl::variant<ktl::monostate, int>>::value, "");
}  // namespace trivial_type

// Type with a non-trivial destructor implies it has non-trivial move and copy too.
namespace non_trivial_destructor_type {
static_assert(
    !ktl::is_trivially_destructible<ktl::variant<ktl::monostate, non_trivial_destructor>>::value,
    "");
static_assert(!ktl::is_trivially_move_constructible<
                  ktl::variant<ktl::monostate, non_trivial_destructor>>::value,
              "");
static_assert(!ktl::is_trivially_copy_constructible<
                  ktl::variant<ktl::monostate, non_trivial_destructor>>::value,
              "");
static_assert(
    !ktl::is_trivially_move_assignable<ktl::variant<ktl::monostate, non_trivial_destructor>>::value,
    "");
static_assert(
    !ktl::is_trivially_copy_assignable<ktl::variant<ktl::monostate, non_trivial_destructor>>::value,
    "");
}  // namespace non_trivial_destructor_type

// Type with a non-trivial move constructor actually ends up being trivially
// movable anyhow if it has a trivial copy constructor and destructor.
namespace non_trivial_move_type {
static_assert(ktl::is_trivially_destructible<ktl::variant<ktl::monostate, non_trivial_move>>::value,
              "");
static_assert(
    !ktl::is_trivially_move_constructible<ktl::variant<ktl::monostate, non_trivial_move>>::value,
    "");
static_assert(
    ktl::is_trivially_copy_constructible<ktl::variant<ktl::monostate, non_trivial_move>>::value,
    "");
static_assert(
    !ktl::is_trivially_move_assignable<ktl::variant<ktl::monostate, non_trivial_move>>::value, "");
static_assert(
    ktl::is_trivially_copy_assignable<ktl::variant<ktl::monostate, non_trivial_move>>::value, "");
}  // namespace non_trivial_move_type

// Type with a non-trivial copy constructor may be trivially movable while not
// trivially copyable.
namespace non_trivial_copy_type {
static_assert(ktl::is_trivially_destructible<ktl::variant<ktl::monostate, non_trivial_copy>>::value,
              "");
static_assert(
    ktl::is_trivially_move_constructible<ktl::variant<ktl::monostate, non_trivial_copy>>::value,
    "");
static_assert(
    !ktl::is_trivially_copy_constructible<ktl::variant<ktl::monostate, non_trivial_copy>>::value,
    "");
static_assert(
    ktl::is_trivially_move_assignable<ktl::variant<ktl::monostate, non_trivial_copy>>::value, "");
static_assert(
    !ktl::is_trivially_copy_assignable<ktl::variant<ktl::monostate, non_trivial_copy>>::value, "");
}  // namespace non_trivial_copy_type

}  // namespace impl_test

}  // namespace

UNITTEST_START_TESTCASE(variant_tests)
UNITTEST("ktl::variant accessors, literal", accessors<literal_traits>)
UNITTEST("ktl::variant accessors, compelx", accessors<complex_traits>)
UNITTEST("ktl::variant copy/move/assign, literal", copy_move_assign<literal_traits>)
UNITTEST("ktl::variant copy/move/assign, complex", copy_move_assign<complex_traits>)
UNITTEST("ktl::variant swapping, literal", swapping<literal_traits>)
UNITTEST("ktl::variant swapping, complex", swapping<complex_traits>)
UNITTEST_END_TESTCASE(variant_tests, "variant", "ktl::variant tests")

#endif  // LK_DEBUGLEVEL != 0
