// 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/ast/traits.h"

#include <functional>

#include "gtest/gtest.h"

namespace tint {
namespace ast {
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<ParamTypeT<decltype(&F1), 0>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&F3), 0>, int>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&F3), 1>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&F3), 2>, float>::value, "");
}

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<ParamTypeT<decltype(&C::F1), 0>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 0>, int>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 1>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 2>, float>::value,
                "");
}

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<ParamTypeT<decltype(&C::F1), 0>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 0>, int>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 1>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 2>, float>::value,
                "");
}

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<ParamTypeT<decltype(&C::F1), 0>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 0>, int>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 1>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(&C::F3), 2>, float>::value,
                "");
}

TEST(ParamType, FunctionLike) {
  using F1 = std::function<void(S)>;
  using F3 = std::function<void(int, S, float)>;
  static_assert(std::is_same<ParamTypeT<F1, 0>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<F3, 0>, int>::value, "");
  static_assert(std::is_same<ParamTypeT<F3, 1>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<F3, 2>, float>::value, "");
}

TEST(ParamType, Lambda) {
  auto l1 = [](S) {};
  auto l3 = [](int, S, float) {};
  static_assert(std::is_same<ParamTypeT<decltype(l1), 0>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(l3), 0>, int>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(l3), 1>, S>::value, "");
  static_assert(std::is_same<ParamTypeT<decltype(l3), 2>, float>::value, "");
}

}  // namespace traits
}  // namespace ast
}  // namespace tint
