// Copyright 2020 The Tint 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 "src/traits.h"

#include "gtest/gtest.h"

namespace tint {
namespace traits {

namespace {
struct S {};
void F1(S) {}
void F3(int, S, float) {}
}  // namespace

TEST(ParamType, Function) {
  F1({});        // Avoid unused method warning
  F3(0, {}, 0);  // Avoid unused method warning
  static_assert(std::is_same_v<ParameterType<decltype(&F1), 0>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&F3), 0>, int>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&F3), 1>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&F3), 2>, float>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&F1)>, void>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&F3)>, void>, "");
  static_assert(SignatureOfT<decltype(&F1)>::parameter_count == 1, "");
  static_assert(SignatureOfT<decltype(&F3)>::parameter_count == 3, "");
}

TEST(ParamType, Method) {
  class C {
   public:
    void F1(S) {}
    void F3(int, S, float) {}
  };
  C().F1({});        // Avoid unused method warning
  C().F3(0, {}, 0);  // Avoid unused method warning
  static_assert(std::is_same_v<ParameterType<decltype(&C::F1), 0>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 0>, int>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 1>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 2>, float>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&C::F1)>, void>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&C::F3)>, void>, "");
  static_assert(SignatureOfT<decltype(&C::F1)>::parameter_count == 1, "");
  static_assert(SignatureOfT<decltype(&C::F3)>::parameter_count == 3, "");
}

TEST(ParamType, ConstMethod) {
  class C {
   public:
    void F1(S) const {}
    void F3(int, S, float) const {}
  };
  C().F1({});        // Avoid unused method warning
  C().F3(0, {}, 0);  // Avoid unused method warning
  static_assert(std::is_same_v<ParameterType<decltype(&C::F1), 0>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 0>, int>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 1>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 2>, float>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&C::F1)>, void>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&C::F3)>, void>, "");
  static_assert(SignatureOfT<decltype(&C::F1)>::parameter_count == 1, "");
  static_assert(SignatureOfT<decltype(&C::F3)>::parameter_count == 3, "");
}

TEST(ParamType, StaticMethod) {
  class C {
   public:
    static void F1(S) {}
    static void F3(int, S, float) {}
  };
  C::F1({});        // Avoid unused method warning
  C::F3(0, {}, 0);  // Avoid unused method warning
  static_assert(std::is_same_v<ParameterType<decltype(&C::F1), 0>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 0>, int>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 1>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 2>, float>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&C::F1)>, void>, "");
  static_assert(std::is_same_v<ReturnType<decltype(&C::F3)>, void>, "");
  static_assert(SignatureOfT<decltype(&C::F1)>::parameter_count == 1, "");
  static_assert(SignatureOfT<decltype(&C::F3)>::parameter_count == 3, "");
}

TEST(ParamType, FunctionLike) {
  using F1 = std::function<void(S)>;
  using F3 = std::function<void(int, S, float)>;
  static_assert(std::is_same_v<ParameterType<F1, 0>, S>, "");
  static_assert(std::is_same_v<ParameterType<F3, 0>, int>, "");
  static_assert(std::is_same_v<ParameterType<F3, 1>, S>, "");
  static_assert(std::is_same_v<ParameterType<F3, 2>, float>, "");
  static_assert(std::is_same_v<ReturnType<F1>, void>, "");
  static_assert(std::is_same_v<ReturnType<F3>, void>, "");
  static_assert(SignatureOfT<F1>::parameter_count == 1, "");
  static_assert(SignatureOfT<F3>::parameter_count == 3, "");
}

TEST(ParamType, Lambda) {
  auto l1 = [](S) {};
  auto l3 = [](int, S, float) {};
  static_assert(std::is_same_v<ParameterType<decltype(l1), 0>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(l3), 0>, int>, "");
  static_assert(std::is_same_v<ParameterType<decltype(l3), 1>, S>, "");
  static_assert(std::is_same_v<ParameterType<decltype(l3), 2>, float>, "");
  static_assert(std::is_same_v<ReturnType<decltype(l1)>, void>, "");
  static_assert(std::is_same_v<ReturnType<decltype(l3)>, void>, "");
  static_assert(SignatureOfT<decltype(l1)>::parameter_count == 1, "");
  static_assert(SignatureOfT<decltype(l3)>::parameter_count == 3, "");
}

TEST(Slice, Empty) {
  auto sliced = Slice<0, 0>(std::make_tuple<>());
  static_assert(std::tuple_size_v<decltype(sliced)> == 0, "");
}

TEST(Slice, SingleElementSliceEmpty) {
  auto sliced = Slice<0, 0>(std::make_tuple<int>(1));
  static_assert(std::tuple_size_v<decltype(sliced)> == 0, "");
}

TEST(Slice, SingleElementSliceFull) {
  auto sliced = Slice<0, 1>(std::make_tuple<int>(1));
  static_assert(std::tuple_size_v<decltype(sliced)> == 1, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, int>,
                "");
  EXPECT_EQ(std::get<0>(sliced), 1);
}

TEST(Slice, MixedTupleSliceEmpty) {
  auto sliced = Slice<1, 0>(std::make_tuple<int, bool, float>(1, true, 2.0f));
  static_assert(std::tuple_size_v<decltype(sliced)> == 0, "");
}

TEST(Slice, MixedTupleSliceFull) {
  auto sliced = Slice<0, 3>(std::make_tuple<int, bool, float>(1, true, 2.0f));
  static_assert(std::tuple_size_v<decltype(sliced)> == 3, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, int>,
                "");
  static_assert(std::is_same_v<std::tuple_element_t<1, decltype(sliced)>, bool>,
                "");
  static_assert(
      std::is_same_v<std::tuple_element_t<2, decltype(sliced)>, float>, "");
  EXPECT_EQ(std::get<0>(sliced), 1);
  EXPECT_EQ(std::get<1>(sliced), true);
  EXPECT_EQ(std::get<2>(sliced), 2.0f);
}

TEST(Slice, MixedTupleSliceLowPart) {
  auto sliced = Slice<0, 2>(std::make_tuple<int, bool, float>(1, true, 2.0f));
  static_assert(std::tuple_size_v<decltype(sliced)> == 2, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, int>,
                "");
  static_assert(std::is_same_v<std::tuple_element_t<1, decltype(sliced)>, bool>,
                "");
  EXPECT_EQ(std::get<0>(sliced), 1);
  EXPECT_EQ(std::get<1>(sliced), true);
}

TEST(Slice, MixedTupleSliceHighPart) {
  auto sliced = Slice<1, 2>(std::make_tuple<int, bool, float>(1, true, 2.0f));
  static_assert(std::tuple_size_v<decltype(sliced)> == 2, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, bool>,
                "");
  static_assert(
      std::is_same_v<std::tuple_element_t<1, decltype(sliced)>, float>, "");
  EXPECT_EQ(std::get<0>(sliced), true);
  EXPECT_EQ(std::get<1>(sliced), 2.0f);
}

TEST(SliceTuple, Empty) {
  using sliced = SliceTuple<0, 0, std::tuple<>>;
  static_assert(std::tuple_size_v<sliced> == 0, "");
}

TEST(SliceTuple, SingleElementSliceEmpty) {
  using sliced = SliceTuple<0, 0, std::tuple<int>>;
  static_assert(std::tuple_size_v<sliced> == 0, "");
}

TEST(SliceTuple, SingleElementSliceFull) {
  using sliced = SliceTuple<0, 1, std::tuple<int>>;
  static_assert(std::tuple_size_v<sliced> == 1, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, int>, "");
}

TEST(SliceTuple, MixedTupleSliceEmpty) {
  using sliced = SliceTuple<1, 0, std::tuple<int, bool, float>>;
  static_assert(std::tuple_size_v<sliced> == 0, "");
}

TEST(SliceTuple, MixedTupleSliceFull) {
  using sliced = SliceTuple<0, 3, std::tuple<int, bool, float>>;
  static_assert(std::tuple_size_v<sliced> == 3, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, int>, "");
  static_assert(std::is_same_v<std::tuple_element_t<1, sliced>, bool>, "");
  static_assert(std::is_same_v<std::tuple_element_t<2, sliced>, float>, "");
}

TEST(SliceTuple, MixedTupleSliceLowPart) {
  using sliced = SliceTuple<0, 2, std::tuple<int, bool, float>>;
  static_assert(std::tuple_size_v<sliced> == 2, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, int>, "");
  static_assert(std::is_same_v<std::tuple_element_t<1, sliced>, bool>, "");
}

TEST(SliceTuple, MixedTupleSliceHighPart) {
  using sliced = SliceTuple<1, 2, std::tuple<int, bool, float>>;
  static_assert(std::tuple_size_v<sliced> == 2, "");
  static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, bool>, "");
  static_assert(std::is_same_v<std::tuple_element_t<1, sliced>, float>, "");
}

}  // namespace traits
}  // namespace tint
