blob: 8ed10406c6fc9af7766b3e906b8635c4c19c3059 [file] [log] [blame]
/*
* 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();
}