| /* |
| * Copyright 2015 Facebook, Inc. |
| * |
| * 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. |
| */ |
| |
| /* |
| * @author: Marcelo Juchem <marcelo@fb.com> |
| */ |
| |
| #include <folly/Traits.h> |
| |
| #include <gtest/gtest.h> |
| #include <glog/logging.h> |
| |
| #include <string> |
| |
| using namespace std; |
| using namespace folly; |
| |
| FOLLY_CREATE_HAS_MEMBER_FN_TRAITS(has_test, test); |
| |
| struct Foo { |
| int test(); |
| int test() const; |
| string test(const string&) const; |
| }; |
| |
| struct Bar { |
| int test(); |
| double test(int,long); |
| long test(int) const; |
| }; |
| |
| struct Gaz { |
| void test(); |
| void test() const; |
| void test() /* nolint */ volatile; |
| void test() const /* nolint */ volatile; |
| }; |
| |
| struct NoCV { |
| void test(); |
| }; |
| |
| struct Const { |
| void test() const; |
| }; |
| |
| struct Volatile { |
| void test() /* nolint */ volatile; |
| }; |
| |
| struct CV { |
| void test() const /* nolint */ volatile; |
| }; |
| |
| bool log_value(const char* what, bool result) { |
| LOG(INFO) << what << ": " << boolalpha << result; |
| return result; |
| } |
| |
| #define LOG_VALUE(x) log_value(#x, x) |
| |
| TEST(HasMemberFnTraits, DirectMembers) { |
| EXPECT_TRUE(LOG_VALUE((has_test<Foo, int()>::value))); |
| EXPECT_TRUE(LOG_VALUE((has_test<Foo, int() const>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<Foo, double(int, long)>::value))); |
| EXPECT_TRUE(LOG_VALUE((has_test<Foo, string(const string&) const>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<Foo, long(int) const>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<Foo, string(string) const>::value))); |
| |
| EXPECT_TRUE(LOG_VALUE((has_test<Bar, int()>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<Bar, int() const>::value))); |
| EXPECT_TRUE(LOG_VALUE((has_test<Bar, double(int, long)>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<Bar, string(const string&) const>::value))); |
| EXPECT_TRUE(LOG_VALUE((has_test<Bar, long(int) const>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<Bar, string(string) const>::value))); |
| |
| EXPECT_TRUE(LOG_VALUE((has_test<Gaz, void()>::value))); |
| EXPECT_TRUE(LOG_VALUE((has_test<Gaz, void() const>::value))); |
| EXPECT_TRUE(LOG_VALUE((has_test<Gaz, void() /* nolint */ volatile>::value))); |
| EXPECT_TRUE(LOG_VALUE(( |
| has_test<Gaz, void() const /* nolint */ volatile>::value))); |
| EXPECT_TRUE(LOG_VALUE(( |
| has_test<Gaz, void() /* nolint */ volatile const>::value))); |
| |
| EXPECT_TRUE(LOG_VALUE((has_test<NoCV, void()>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<NoCV, void() const>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<NoCV, void() /* nolint */ volatile>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<NoCV, void() const /* nolint */ volatile>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<NoCV, void() /* nolint */ volatile const>::value))); |
| |
| EXPECT_FALSE(LOG_VALUE((has_test<Const, void()>::value))); |
| EXPECT_TRUE(LOG_VALUE((has_test<Const, void() const>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<Const, void() /* nolint */ volatile>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<Const, void() const /* nolint */ volatile>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<Const, void() /* nolint */ volatile const>::value))); |
| |
| EXPECT_FALSE(LOG_VALUE((has_test<Volatile, void()>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<Volatile, void() const>::value))); |
| EXPECT_TRUE(LOG_VALUE(( |
| has_test<Volatile, void() /* nolint */ volatile>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<Volatile, void() const /* nolint */ volatile>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<Volatile, void() /* nolint */ volatile const>::value))); |
| |
| EXPECT_FALSE(LOG_VALUE((has_test<CV, void()>::value))); |
| EXPECT_FALSE(LOG_VALUE((has_test<CV, void() const>::value))); |
| EXPECT_FALSE(LOG_VALUE(( |
| has_test<CV, void() /* nolint */ volatile>::value))); |
| EXPECT_TRUE(LOG_VALUE(( |
| has_test<CV, void() const /* nolint */ volatile>::value))); |
| EXPECT_TRUE(LOG_VALUE(( |
| has_test<CV, void() /* nolint */ volatile const>::value))); |
| } |
| |
| int main(int argc, char *argv[]) { |
| testing::InitGoogleTest(&argc, argv); |
| return RUN_ALL_TESTS(); |
| } |