| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- // Copyright 2021 Google LLC
- //
- // 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
- //
- // https://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 "dap/traits.h"
- #include "gmock/gmock.h"
- #include "gtest/gtest.h"
- namespace dap {
- namespace traits {
- namespace {
- struct S {};
- struct E : S {};
- void F1(S) {}
- void F3(int, S, float) {}
- void E1(E) {}
- void E3(int, E, float) {}
- } // namespace
- TEST(ParameterType, Function) {
- F1({}); // Avoid unused method warning
- F3(0, {}, 0); // Avoid unused method warning
- static_assert(std::is_same<ParameterType<decltype(&F1), 0>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&F3), 0>, int>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&F3), 1>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&F3), 2>, float>::value,
- "");
- }
- TEST(ParameterType, 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<ParameterType<decltype(&C::F1), 0>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 0>, int>::value,
- "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 1>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 2>, float>::value,
- "");
- }
- TEST(ParameterType, 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<ParameterType<decltype(&C::F1), 0>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 0>, int>::value,
- "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 1>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 2>, float>::value,
- "");
- }
- TEST(ParameterType, 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<ParameterType<decltype(&C::F1), 0>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 0>, int>::value,
- "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 1>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(&C::F3), 2>, float>::value,
- "");
- }
- TEST(ParameterType, FunctionLike) {
- using F1 = std::function<void(S)>;
- using F3 = std::function<void(int, S, float)>;
- static_assert(std::is_same<ParameterType<F1, 0>, S>::value, "");
- static_assert(std::is_same<ParameterType<F3, 0>, int>::value, "");
- static_assert(std::is_same<ParameterType<F3, 1>, S>::value, "");
- static_assert(std::is_same<ParameterType<F3, 2>, float>::value, "");
- }
- TEST(ParameterType, Lambda) {
- auto l1 = [](S) {};
- auto l3 = [](int, S, float) {};
- static_assert(std::is_same<ParameterType<decltype(l1), 0>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(l3), 0>, int>::value, "");
- static_assert(std::is_same<ParameterType<decltype(l3), 1>, S>::value, "");
- static_assert(std::is_same<ParameterType<decltype(l3), 2>, float>::value, "");
- }
- TEST(HasSignature, Function) {
- F1({}); // Avoid unused method warning
- F3(0, {}, 0); // Avoid unused method warning
- static_assert(HasSignature<decltype(&F1), decltype(&F1)>::value, "");
- static_assert(HasSignature<decltype(&F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&F3), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&F1), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&F3), decltype(&F1)>::value, "");
- }
- TEST(HasSignature, 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(HasSignature<decltype(&C::F1), decltype(&F1)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&C::F1), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- }
- TEST(HasSignature, 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(HasSignature<decltype(&C::F1), decltype(&F1)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&C::F1), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- }
- TEST(HasSignature, 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(HasSignature<decltype(&C::F1), decltype(&F1)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&C::F1), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(&C::F3), decltype(&F1)>::value, "");
- }
- TEST(HasSignature, FunctionLike) {
- using f1 = std::function<void(S)>;
- using f3 = std::function<void(int, S, float)>;
- static_assert(HasSignature<f1, decltype(&F1)>::value, "");
- static_assert(HasSignature<f3, decltype(&F3)>::value, "");
- static_assert(HasSignature<f3, decltype(&F3)>::value, "");
- static_assert(HasSignature<f3, decltype(&F3)>::value, "");
- static_assert(!HasSignature<f1, decltype(&F3)>::value, "");
- static_assert(!HasSignature<f3, decltype(&F1)>::value, "");
- static_assert(!HasSignature<f3, decltype(&F1)>::value, "");
- static_assert(!HasSignature<f3, decltype(&F1)>::value, "");
- }
- TEST(HasSignature, Lambda) {
- auto l1 = [](S) {};
- auto l3 = [](int, S, float) {};
- static_assert(HasSignature<decltype(l1), decltype(&F1)>::value, "");
- static_assert(HasSignature<decltype(l3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(l3), decltype(&F3)>::value, "");
- static_assert(HasSignature<decltype(l3), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(l1), decltype(&F3)>::value, "");
- static_assert(!HasSignature<decltype(l3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(l3), decltype(&F1)>::value, "");
- static_assert(!HasSignature<decltype(l3), decltype(&F1)>::value, "");
- }
- ////
- TEST(CompatibleWith, Function) {
- F1({}); // Avoid unused method warning
- F3(0, {}, 0); // Avoid unused method warning
- E1({}); // Avoid unused method warning
- E3(0, {}, 0); // Avoid unused method warning
- static_assert(CompatibleWith<decltype(&F1), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&F3), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&F1), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&F3), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&E1), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&E3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&E3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&E3), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&F1), decltype(&E1)>::value, "");
- static_assert(!CompatibleWith<decltype(&F3), decltype(&E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&F3), decltype(&E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&F3), decltype(&E3)>::value, "");
- }
- TEST(CompatibleWith, Method) {
- class C {
- public:
- void F1(S) {}
- void F3(int, S, float) {}
- void E1(E) {}
- void E3(int, E, float) {}
- };
- C().F1({}); // Avoid unused method warning
- C().F3(0, {}, 0); // Avoid unused method warning
- C().E1({}); // Avoid unused method warning
- C().E3(0, {}, 0); // Avoid unused method warning
- static_assert(CompatibleWith<decltype(&C::F1), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F1), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E1), decltype(&C::F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F1), decltype(&C::E1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- }
- TEST(CompatibleWith, ConstMethod) {
- class C {
- public:
- void F1(S) const {}
- void F3(int, S, float) const {}
- void E1(E) const {}
- void E3(int, E, float) const {}
- };
- C().F1({}); // Avoid unused method warning
- C().F3(0, {}, 0); // Avoid unused method warning
- C().E1({}); // Avoid unused method warning
- C().E3(0, {}, 0); // Avoid unused method warning
- static_assert(CompatibleWith<decltype(&C::F1), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F1), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E1), decltype(&C::F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F1), decltype(&C::E1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- }
- TEST(CompatibleWith, StaticMethod) {
- class C {
- public:
- static void F1(S) {}
- static void F3(int, S, float) {}
- static void E1(E) {}
- static void E3(int, E, float) {}
- };
- C::F1({}); // Avoid unused method warning
- C::F3(0, {}, 0); // Avoid unused method warning
- C::E1({}); // Avoid unused method warning
- C::E3(0, {}, 0); // Avoid unused method warning
- static_assert(CompatibleWith<decltype(&C::F1), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::F3), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F1), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E1), decltype(&C::F1)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(CompatibleWith<decltype(&C::E3), decltype(&C::F3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F1), decltype(&C::E1)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- static_assert(!CompatibleWith<decltype(&C::F3), decltype(&C::E3)>::value, "");
- }
- TEST(CompatibleWith, FunctionLike) {
- using f1 = std::function<void(S)>;
- using f3 = std::function<void(int, S, float)>;
- using e1 = std::function<void(E)>;
- using e3 = std::function<void(int, E, float)>;
- static_assert(CompatibleWith<f1, decltype(&F1)>::value, "");
- static_assert(CompatibleWith<f3, decltype(&F3)>::value, "");
- static_assert(CompatibleWith<f3, decltype(&F3)>::value, "");
- static_assert(CompatibleWith<f3, decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<f1, decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<f3, decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<f3, decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<f3, decltype(&F1)>::value, "");
- static_assert(CompatibleWith<e1, f1>::value, "");
- static_assert(CompatibleWith<e3, f3>::value, "");
- static_assert(CompatibleWith<e3, f3>::value, "");
- static_assert(CompatibleWith<e3, f3>::value, "");
- static_assert(!CompatibleWith<f1, e1>::value, "");
- static_assert(!CompatibleWith<f3, e3>::value, "");
- static_assert(!CompatibleWith<f3, e3>::value, "");
- static_assert(!CompatibleWith<f3, e3>::value, "");
- }
- TEST(CompatibleWith, Lambda) {
- auto f1 = [](S) {};
- auto f3 = [](int, S, float) {};
- auto e1 = [](E) {};
- auto e3 = [](int, E, float) {};
- static_assert(CompatibleWith<decltype(f1), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(f3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(f3), decltype(&F3)>::value, "");
- static_assert(CompatibleWith<decltype(f3), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(f1), decltype(&F3)>::value, "");
- static_assert(!CompatibleWith<decltype(f3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(f3), decltype(&F1)>::value, "");
- static_assert(!CompatibleWith<decltype(f3), decltype(&F1)>::value, "");
- static_assert(CompatibleWith<decltype(e1), decltype(f1)>::value, "");
- static_assert(CompatibleWith<decltype(e3), decltype(f3)>::value, "");
- static_assert(CompatibleWith<decltype(e3), decltype(f3)>::value, "");
- static_assert(CompatibleWith<decltype(e3), decltype(f3)>::value, "");
- static_assert(!CompatibleWith<decltype(f1), decltype(e1)>::value, "");
- static_assert(!CompatibleWith<decltype(f3), decltype(e3)>::value, "");
- static_assert(!CompatibleWith<decltype(f3), decltype(e3)>::value, "");
- static_assert(!CompatibleWith<decltype(f3), decltype(e3)>::value, "");
- }
- } // namespace traits
- } // namespace dap
|