123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720 |
- #include "gmock/internal/gmock-internal-utils.h"
- #include <stdlib.h>
- #include <cstdint>
- #include <map>
- #include <memory>
- #include <sstream>
- #include <string>
- #include <vector>
- #include "gmock/gmock.h"
- #include "gmock/internal/gmock-port.h"
- #include "gtest/gtest-spi.h"
- #include "gtest/gtest.h"
- #define GTEST_IMPLEMENTATION_ 1
- #include "src/gtest-internal-inl.h"
- #undef GTEST_IMPLEMENTATION_
- #if GTEST_OS_CYGWIN
- # include <sys/types.h> // For ssize_t. NOLINT
- #endif
- namespace proto2 {
- class Message;
- }
- namespace testing {
- namespace internal {
- namespace {
- TEST(JoinAsTupleTest, JoinsEmptyTuple) {
- EXPECT_EQ("", JoinAsTuple(Strings()));
- }
- TEST(JoinAsTupleTest, JoinsOneTuple) {
- const char* fields[] = {"1"};
- EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1)));
- }
- TEST(JoinAsTupleTest, JoinsTwoTuple) {
- const char* fields[] = {"1", "a"};
- EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2)));
- }
- TEST(JoinAsTupleTest, JoinsTenTuple) {
- const char* fields[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
- EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)",
- JoinAsTuple(Strings(fields, fields + 10)));
- }
- TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {
- EXPECT_EQ("", ConvertIdentifierNameToWords(""));
- EXPECT_EQ("", ConvertIdentifierNameToWords("_"));
- EXPECT_EQ("", ConvertIdentifierNameToWords("__"));
- }
- TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {
- EXPECT_EQ("1", ConvertIdentifierNameToWords("_1"));
- EXPECT_EQ("2", ConvertIdentifierNameToWords("2_"));
- EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_"));
- EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56"));
- }
- TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {
- EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord"));
- EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar"));
- EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_"));
- EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_"));
- EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar"));
- }
- TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {
- EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar"));
- EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_"));
- EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_"));
- EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar"));
- }
- TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {
- EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123"));
- EXPECT_EQ("chapter 11 section 1",
- ConvertIdentifierNameToWords("_Chapter11Section_1_"));
- }
- TEST(GetRawPointerTest, WorksForSmartPointers) {
- const char* const raw_p1 = new const char('a');
- const std::unique_ptr<const char> p1(raw_p1);
- EXPECT_EQ(raw_p1, GetRawPointer(p1));
- double* const raw_p2 = new double(2.5);
- const std::shared_ptr<double> p2(raw_p2);
- EXPECT_EQ(raw_p2, GetRawPointer(p2));
- }
- TEST(GetRawPointerTest, WorksForRawPointers) {
- int* p = nullptr;
- EXPECT_TRUE(nullptr == GetRawPointer(p));
- int n = 1;
- EXPECT_EQ(&n, GetRawPointer(&n));
- }
- class Base {};
- class Derived : public Base {};
- TEST(KindOfTest, Bool) {
- EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool));
- }
- TEST(KindOfTest, Integer) {
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long long));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long long));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t));
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t));
- #if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN
-
- EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t));
- #endif
- }
- TEST(KindOfTest, FloatingPoint) {
- EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float));
- EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double));
- EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double));
- }
- TEST(KindOfTest, Other) {
- EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*));
- EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**));
- EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base));
- }
- TEST(LosslessArithmeticConvertibleTest, BoolToBool) {
- EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, BoolToInteger) {
- EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));
- EXPECT_TRUE(
- (LosslessArithmeticConvertible<bool, unsigned long>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {
- EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, IntegerToBool) {
- EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {
-
- EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));
-
- EXPECT_TRUE((LosslessArithmeticConvertible<
- unsigned short, uint64_t>::value));
-
- EXPECT_FALSE((LosslessArithmeticConvertible<
- short, uint64_t>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<
- signed char, unsigned int>::value));
-
- EXPECT_TRUE((LosslessArithmeticConvertible<
- unsigned char, unsigned char>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<
- unsigned long, unsigned long>::value));
-
- EXPECT_FALSE((LosslessArithmeticConvertible<
- unsigned char, signed char>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<uint64_t, int64_t>::value));
-
- EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<int64_t, unsigned int>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {
-
-
- EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<
- short, long double>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {
- EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {
- EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<double, int64_t>::value));
- EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));
- }
- TEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {
-
- EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));
-
- EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));
- EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));
-
- EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));
- GTEST_INTENTIONAL_CONST_COND_PUSH_()
- if (sizeof(double) == sizeof(long double)) {
- GTEST_INTENTIONAL_CONST_COND_POP_()
-
-
- EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));
- } else {
- EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));
- }
- }
- TEST(TupleMatchesTest, WorksForSize0) {
- std::tuple<> matchers;
- std::tuple<> values;
- EXPECT_TRUE(TupleMatches(matchers, values));
- }
- TEST(TupleMatchesTest, WorksForSize1) {
- std::tuple<Matcher<int> > matchers(Eq(1));
- std::tuple<int> values1(1), values2(2);
- EXPECT_TRUE(TupleMatches(matchers, values1));
- EXPECT_FALSE(TupleMatches(matchers, values2));
- }
- TEST(TupleMatchesTest, WorksForSize2) {
- std::tuple<Matcher<int>, Matcher<char> > matchers(Eq(1), Eq('a'));
- std::tuple<int, char> values1(1, 'a'), values2(1, 'b'), values3(2, 'a'),
- values4(2, 'b');
- EXPECT_TRUE(TupleMatches(matchers, values1));
- EXPECT_FALSE(TupleMatches(matchers, values2));
- EXPECT_FALSE(TupleMatches(matchers, values3));
- EXPECT_FALSE(TupleMatches(matchers, values4));
- }
- TEST(TupleMatchesTest, WorksForSize5) {
- std::tuple<Matcher<int>, Matcher<char>, Matcher<bool>,
- Matcher<long>,
- Matcher<std::string> >
- matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi"));
- std::tuple<int, char, bool, long, std::string>
- values1(1, 'a', true, 2L, "hi"), values2(1, 'a', true, 2L, "hello"),
- values3(2, 'a', true, 2L, "hi");
- EXPECT_TRUE(TupleMatches(matchers, values1));
- EXPECT_FALSE(TupleMatches(matchers, values2));
- EXPECT_FALSE(TupleMatches(matchers, values3));
- }
- TEST(AssertTest, SucceedsOnTrue) {
- Assert(true, __FILE__, __LINE__, "This should succeed.");
- Assert(true, __FILE__, __LINE__);
- }
- TEST(AssertTest, FailsFatallyOnFalse) {
- EXPECT_DEATH_IF_SUPPORTED({
- Assert(false, __FILE__, __LINE__, "This should fail.");
- }, "");
- EXPECT_DEATH_IF_SUPPORTED({
- Assert(false, __FILE__, __LINE__);
- }, "");
- }
- TEST(ExpectTest, SucceedsOnTrue) {
- Expect(true, __FILE__, __LINE__, "This should succeed.");
- Expect(true, __FILE__, __LINE__);
- }
- TEST(ExpectTest, FailsNonfatallyOnFalse) {
- EXPECT_NONFATAL_FAILURE({
- Expect(false, __FILE__, __LINE__, "This should fail.");
- }, "This should fail");
- EXPECT_NONFATAL_FAILURE({
- Expect(false, __FILE__, __LINE__);
- }, "Expectation failed");
- }
- class LogIsVisibleTest : public ::testing::Test {
- protected:
- void SetUp() override { original_verbose_ = GMOCK_FLAG(verbose); }
- void TearDown() override { GMOCK_FLAG(verbose) = original_verbose_; }
- std::string original_verbose_;
- };
- TEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {
- GMOCK_FLAG(verbose) = kInfoVerbosity;
- EXPECT_TRUE(LogIsVisible(kInfo));
- EXPECT_TRUE(LogIsVisible(kWarning));
- }
- TEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {
- GMOCK_FLAG(verbose) = kErrorVerbosity;
- EXPECT_FALSE(LogIsVisible(kInfo));
- EXPECT_FALSE(LogIsVisible(kWarning));
- }
- TEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {
- GMOCK_FLAG(verbose) = kWarningVerbosity;
- EXPECT_FALSE(LogIsVisible(kInfo));
- EXPECT_TRUE(LogIsVisible(kWarning));
- }
- #if GTEST_HAS_STREAM_REDIRECTION
- void TestLogWithSeverity(const std::string& verbosity, LogSeverity severity,
- bool should_print) {
- const std::string old_flag = GMOCK_FLAG(verbose);
- GMOCK_FLAG(verbose) = verbosity;
- CaptureStdout();
- Log(severity, "Test log.\n", 0);
- if (should_print) {
- EXPECT_THAT(GetCapturedStdout().c_str(),
- ContainsRegex(
- severity == kWarning ?
- "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n" :
- "^\nTest log\\.\nStack trace:\n"));
- } else {
- EXPECT_STREQ("", GetCapturedStdout().c_str());
- }
- GMOCK_FLAG(verbose) = old_flag;
- }
- TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {
- const std::string saved_flag = GMOCK_FLAG(verbose);
- GMOCK_FLAG(verbose) = kInfoVerbosity;
- CaptureStdout();
- Log(kInfo, "Test log.\n", -1);
- EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str());
- GMOCK_FLAG(verbose) = saved_flag;
- }
- struct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface {
- std::string CurrentStackTrace(int max_depth, int skip_count) override {
- return (testing::Message() << max_depth << "::" << skip_count << "\n")
- .GetString();
- }
- void UponLeavingGTest() override {}
- };
- TEST(LogTest, NoSkippingStackFrameInOptMode) {
- MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter;
- GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter);
- CaptureStdout();
- Log(kWarning, "Test log.\n", 100);
- const std::string log = GetCapturedStdout();
- std::string expected_trace =
- (testing::Message() << GTEST_FLAG(stack_trace_depth) << "::").GetString();
- std::string expected_message =
- "\nGMOCK WARNING:\n"
- "Test log.\n"
- "Stack trace:\n" +
- expected_trace;
- EXPECT_THAT(log, HasSubstr(expected_message));
- int skip_count = atoi(log.substr(expected_message.size()).c_str());
- # if defined(NDEBUG)
-
- const int expected_skip_count = 0;
- # else
-
- const int expected_skip_count = 100;
- # endif
-
-
-
- EXPECT_THAT(skip_count,
- AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10)));
-
- GetUnitTestImpl()->set_os_stack_trace_getter(nullptr);
- }
- TEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {
- TestLogWithSeverity(kInfoVerbosity, kInfo, true);
- TestLogWithSeverity(kInfoVerbosity, kWarning, true);
- }
- TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {
- TestLogWithSeverity(kWarningVerbosity, kInfo, false);
- TestLogWithSeverity(kWarningVerbosity, kWarning, true);
- }
- TEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {
- TestLogWithSeverity(kErrorVerbosity, kInfo, false);
- TestLogWithSeverity(kErrorVerbosity, kWarning, false);
- }
- TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {
- TestLogWithSeverity("invalid", kInfo, false);
- TestLogWithSeverity("invalid", kWarning, true);
- }
- std::string GrabOutput(void(*logger)(), const char* verbosity) {
- const std::string saved_flag = GMOCK_FLAG(verbose);
- GMOCK_FLAG(verbose) = verbosity;
- CaptureStdout();
- logger();
- GMOCK_FLAG(verbose) = saved_flag;
- return GetCapturedStdout();
- }
- class DummyMock {
- public:
- MOCK_METHOD0(TestMethod, void());
- MOCK_METHOD1(TestMethodArg, void(int dummy));
- };
- void ExpectCallLogger() {
- DummyMock mock;
- EXPECT_CALL(mock, TestMethod());
- mock.TestMethod();
- }
- TEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {
- EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)),
- HasSubstr("EXPECT_CALL(mock, TestMethod())"));
- }
- TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {
- EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());
- }
- TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsError) {
- EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());
- }
- void OnCallLogger() {
- DummyMock mock;
- ON_CALL(mock, TestMethod());
- }
- TEST(OnCallTest, LogsWhenVerbosityIsInfo) {
- EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)),
- HasSubstr("ON_CALL(mock, TestMethod())"));
- }
- TEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {
- EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());
- }
- TEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {
- EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());
- }
- void OnCallAnyArgumentLogger() {
- DummyMock mock;
- ON_CALL(mock, TestMethodArg(_));
- }
- TEST(OnCallTest, LogsAnythingArgument) {
- EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)),
- HasSubstr("ON_CALL(mock, TestMethodArg(_)"));
- }
- #endif
- TEST(StlContainerViewTest, WorksForStlContainer) {
- StaticAssertTypeEq<std::vector<int>,
- StlContainerView<std::vector<int> >::type>();
- StaticAssertTypeEq<const std::vector<double>&,
- StlContainerView<std::vector<double> >::const_reference>();
- typedef std::vector<char> Chars;
- Chars v1;
- const Chars& v2(StlContainerView<Chars>::ConstReference(v1));
- EXPECT_EQ(&v1, &v2);
- v1.push_back('a');
- Chars v3 = StlContainerView<Chars>::Copy(v1);
- EXPECT_THAT(v3, Eq(v3));
- }
- TEST(StlContainerViewTest, WorksForStaticNativeArray) {
- StaticAssertTypeEq<NativeArray<int>,
- StlContainerView<int[3]>::type>();
- StaticAssertTypeEq<NativeArray<double>,
- StlContainerView<const double[4]>::type>();
- StaticAssertTypeEq<NativeArray<char[3]>,
- StlContainerView<const char[2][3]>::type>();
- StaticAssertTypeEq<const NativeArray<int>,
- StlContainerView<int[2]>::const_reference>();
- int a1[3] = { 0, 1, 2 };
- NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);
- EXPECT_EQ(3U, a2.size());
- EXPECT_EQ(a1, a2.begin());
- const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);
- ASSERT_EQ(3U, a3.size());
- EXPECT_EQ(0, a3.begin()[0]);
- EXPECT_EQ(1, a3.begin()[1]);
- EXPECT_EQ(2, a3.begin()[2]);
-
- a1[0] = 3;
- EXPECT_EQ(0, a3.begin()[0]);
- }
- TEST(StlContainerViewTest, WorksForDynamicNativeArray) {
- StaticAssertTypeEq<NativeArray<int>,
- StlContainerView<std::tuple<const int*, size_t> >::type>();
- StaticAssertTypeEq<
- NativeArray<double>,
- StlContainerView<std::tuple<std::shared_ptr<double>, int> >::type>();
- StaticAssertTypeEq<
- const NativeArray<int>,
- StlContainerView<std::tuple<const int*, int> >::const_reference>();
- int a1[3] = { 0, 1, 2 };
- const int* const p1 = a1;
- NativeArray<int> a2 =
- StlContainerView<std::tuple<const int*, int> >::ConstReference(
- std::make_tuple(p1, 3));
- EXPECT_EQ(3U, a2.size());
- EXPECT_EQ(a1, a2.begin());
- const NativeArray<int> a3 = StlContainerView<std::tuple<int*, size_t> >::Copy(
- std::make_tuple(static_cast<int*>(a1), 3));
- ASSERT_EQ(3U, a3.size());
- EXPECT_EQ(0, a3.begin()[0]);
- EXPECT_EQ(1, a3.begin()[1]);
- EXPECT_EQ(2, a3.begin()[2]);
-
- a1[0] = 3;
- EXPECT_EQ(0, a3.begin()[0]);
- }
- TEST(FunctionTest, Nullary) {
- typedef Function<int()> F;
- EXPECT_EQ(0u, F::ArgumentCount);
- EXPECT_TRUE((std::is_same<int, F::Result>::value));
- EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentTuple>::value));
- EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentMatcherTuple>::value));
- EXPECT_TRUE((std::is_same<void(), F::MakeResultVoid>::value));
- EXPECT_TRUE((std::is_same<IgnoredValue(), F::MakeResultIgnoredValue>::value));
- }
- TEST(FunctionTest, Unary) {
- typedef Function<int(bool)> F;
- EXPECT_EQ(1u, F::ArgumentCount);
- EXPECT_TRUE((std::is_same<int, F::Result>::value));
- EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
- EXPECT_TRUE((std::is_same<std::tuple<bool>, F::ArgumentTuple>::value));
- EXPECT_TRUE((
- std::is_same<std::tuple<Matcher<bool>>, F::ArgumentMatcherTuple>::value));
- EXPECT_TRUE((std::is_same<void(bool), F::MakeResultVoid>::value));
- EXPECT_TRUE((std::is_same<IgnoredValue(bool),
- F::MakeResultIgnoredValue>::value));
- }
- TEST(FunctionTest, Binary) {
- typedef Function<int(bool, const long&)> F;
- EXPECT_EQ(2u, F::ArgumentCount);
- EXPECT_TRUE((std::is_same<int, F::Result>::value));
- EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
- EXPECT_TRUE((std::is_same<const long&, F::Arg<1>::type>::value));
- EXPECT_TRUE((std::is_same<std::tuple<bool, const long&>,
- F::ArgumentTuple>::value));
- EXPECT_TRUE(
- (std::is_same<std::tuple<Matcher<bool>, Matcher<const long&>>,
- F::ArgumentMatcherTuple>::value));
- EXPECT_TRUE((std::is_same<void(bool, const long&),
- F::MakeResultVoid>::value));
- EXPECT_TRUE((std::is_same<IgnoredValue(bool, const long&),
- F::MakeResultIgnoredValue>::value));
- }
- TEST(FunctionTest, LongArgumentList) {
- typedef Function<char(bool, int, char*, int&, const long&)> F;
- EXPECT_EQ(5u, F::ArgumentCount);
- EXPECT_TRUE((std::is_same<char, F::Result>::value));
- EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
- EXPECT_TRUE((std::is_same<int, F::Arg<1>::type>::value));
- EXPECT_TRUE((std::is_same<char*, F::Arg<2>::type>::value));
- EXPECT_TRUE((std::is_same<int&, F::Arg<3>::type>::value));
- EXPECT_TRUE((std::is_same<const long&, F::Arg<4>::type>::value));
- EXPECT_TRUE(
- (std::is_same<std::tuple<bool, int, char*, int&, const long&>,
- F::ArgumentTuple>::value));
- EXPECT_TRUE(
- (std::is_same<
- std::tuple<Matcher<bool>, Matcher<int>, Matcher<char*>, Matcher<int&>,
- Matcher<const long&>>,
- F::ArgumentMatcherTuple>::value));
- EXPECT_TRUE(
- (std::is_same<void(bool, int, char*, int&, const long&),
- F::MakeResultVoid>::value));
- EXPECT_TRUE((
- std::is_same<IgnoredValue(bool, int, char*, int&, const long&),
- F::MakeResultIgnoredValue>::value));
- }
- }
- }
- }
|