Home | History | Annotate | Download | only in test
      1 // Copyright 2009, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 
     30 
     31 // Google Mock - a framework for writing C++ mock classes.
     32 //
     33 // This file tests that:
     34 // a. A header file defining a mock class can be included in multiple
     35 //    translation units without causing a link error.
     36 // b. Actions and matchers can be instantiated with identical template
     37 //    arguments in different translation units without causing link
     38 //    errors.
     39 //    The following constructs are currently tested:
     40 //    Actions:
     41 //      Return()
     42 //      Return(value)
     43 //      ReturnNull
     44 //      ReturnRef
     45 //      Assign
     46 //      SetArgPointee
     47 //      SetArrayArgument
     48 //      SetErrnoAndReturn
     49 //      Invoke(function)
     50 //      Invoke(object, method)
     51 //      InvokeWithoutArgs(function)
     52 //      InvokeWithoutArgs(object, method)
     53 //      InvokeArgument
     54 //      WithArg
     55 //      WithArgs
     56 //      WithoutArgs
     57 //      DoAll
     58 //      DoDefault
     59 //      IgnoreResult
     60 //      Throw
     61 //      ACTION()-generated
     62 //      ACTION_P()-generated
     63 //      ACTION_P2()-generated
     64 //    Matchers:
     65 //      _
     66 //      A
     67 //      An
     68 //      Eq
     69 //      Gt, Lt, Ge, Le, Ne
     70 //      NotNull
     71 //      Ref
     72 //      TypedEq
     73 //      DoubleEq
     74 //      FloatEq
     75 //      NanSensitiveDoubleEq
     76 //      NanSensitiveFloatEq
     77 //      ContainsRegex
     78 //      MatchesRegex
     79 //      EndsWith
     80 //      HasSubstr
     81 //      StartsWith
     82 //      StrCaseEq
     83 //      StrCaseNe
     84 //      StrEq
     85 //      StrNe
     86 //      ElementsAre
     87 //      ElementsAreArray
     88 //      ContainerEq
     89 //      Field
     90 //      Property
     91 //      ResultOf(function)
     92 //      ResultOf(callback)
     93 //      Pointee
     94 //      Truly(predicate)
     95 //      AddressSatisfies
     96 //      AllOf
     97 //      AnyOf
     98 //      Not
     99 //      MatcherCast<T>
    100 //
    101 //  Please note: this test does not verify the functioning of these
    102 //  constructs, only that the programs using them will link successfully.
    103 //
    104 // Implementation note:
    105 // This test requires identical definitions of Interface and Mock to be
    106 // included in different translation units.  We achieve this by writing
    107 // them in this header and #including it in gmock_link_test.cc and
    108 // gmock_link2_test.cc.  Because the symbols generated by the compiler for
    109 // those constructs must be identical in both translation units,
    110 // definitions of Interface and Mock tests MUST be kept in the SAME
    111 // NON-ANONYMOUS namespace in this file.  The test fixture class LinkTest
    112 // is defined as LinkTest1 in gmock_link_test.cc and as LinkTest2 in
    113 // gmock_link2_test.cc to avoid producing linker errors.
    114 
    115 #ifndef GMOCK_TEST_GMOCK_LINK_TEST_H_
    116 #define GMOCK_TEST_GMOCK_LINK_TEST_H_
    117 
    118 #include "gmock/gmock.h"
    119 
    120 #if !GTEST_OS_WINDOWS_MOBILE
    121 # include <errno.h>
    122 #endif
    123 
    124 #include <iostream>
    125 #include <vector>
    126 
    127 #include "gtest/gtest.h"
    128 #include "gtest/internal/gtest-port.h"
    129 
    130 using testing::_;
    131 using testing::A;
    132 using testing::Action;
    133 using testing::AllOf;
    134 using testing::AnyOf;
    135 using testing::Assign;
    136 using testing::ContainerEq;
    137 using testing::DoAll;
    138 using testing::DoDefault;
    139 using testing::DoubleEq;
    140 using testing::ElementsAre;
    141 using testing::ElementsAreArray;
    142 using testing::EndsWith;
    143 using testing::Eq;
    144 using testing::Field;
    145 using testing::FloatEq;
    146 using testing::Ge;
    147 using testing::Gt;
    148 using testing::HasSubstr;
    149 using testing::IgnoreResult;
    150 using testing::Invoke;
    151 using testing::InvokeArgument;
    152 using testing::InvokeWithoutArgs;
    153 using testing::IsNull;
    154 using testing::IsSubsetOf;
    155 using testing::IsSupersetOf;
    156 using testing::Le;
    157 using testing::Lt;
    158 using testing::Matcher;
    159 using testing::MatcherCast;
    160 using testing::NanSensitiveDoubleEq;
    161 using testing::NanSensitiveFloatEq;
    162 using testing::Ne;
    163 using testing::Not;
    164 using testing::NotNull;
    165 using testing::Pointee;
    166 using testing::Property;
    167 using testing::Ref;
    168 using testing::ResultOf;
    169 using testing::Return;
    170 using testing::ReturnNull;
    171 using testing::ReturnRef;
    172 using testing::SetArgPointee;
    173 using testing::SetArrayArgument;
    174 using testing::StartsWith;
    175 using testing::StrCaseEq;
    176 using testing::StrCaseNe;
    177 using testing::StrEq;
    178 using testing::StrNe;
    179 using testing::Truly;
    180 using testing::TypedEq;
    181 using testing::WithArg;
    182 using testing::WithArgs;
    183 using testing::WithoutArgs;
    184 
    185 #if !GTEST_OS_WINDOWS_MOBILE
    186 using testing::SetErrnoAndReturn;
    187 #endif
    188 
    189 #if GTEST_HAS_EXCEPTIONS
    190 using testing::Throw;
    191 #endif
    192 
    193 using testing::ContainsRegex;
    194 using testing::MatchesRegex;
    195 
    196 class Interface {
    197  public:
    198   virtual ~Interface() {}
    199   virtual void VoidFromString(char* str) = 0;
    200   virtual char* StringFromString(char* str) = 0;
    201   virtual int IntFromString(char* str) = 0;
    202   virtual int& IntRefFromString(char* str) = 0;
    203   virtual void VoidFromFunc(void(*func)(char* str)) = 0;
    204   virtual void VoidFromIntRef(int& n) = 0;  // NOLINT
    205   virtual void VoidFromFloat(float n) = 0;
    206   virtual void VoidFromDouble(double n) = 0;
    207   virtual void VoidFromVector(const std::vector<int>& v) = 0;
    208 };
    209 
    210 class Mock: public Interface {
    211  public:
    212   Mock() {}
    213 
    214   MOCK_METHOD1(VoidFromString, void(char* str));
    215   MOCK_METHOD1(StringFromString, char*(char* str));
    216   MOCK_METHOD1(IntFromString, int(char* str));
    217   MOCK_METHOD1(IntRefFromString, int&(char* str));
    218   MOCK_METHOD1(VoidFromFunc, void(void(*func)(char* str)));
    219   MOCK_METHOD1(VoidFromIntRef, void(int& n));  // NOLINT
    220   MOCK_METHOD1(VoidFromFloat, void(float n));
    221   MOCK_METHOD1(VoidFromDouble, void(double n));
    222   MOCK_METHOD1(VoidFromVector, void(const std::vector<int>& v));
    223 
    224  private:
    225   GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock);
    226 };
    227 
    228 class InvokeHelper {
    229  public:
    230   static void StaticVoidFromVoid() {}
    231   void VoidFromVoid() {}
    232   static void StaticVoidFromString(char* /* str */) {}
    233   void VoidFromString(char* /* str */) {}
    234   static int StaticIntFromString(char* /* str */) { return 1; }
    235   static bool StaticBoolFromString(const char* /* str */) { return true; }
    236 };
    237 
    238 class FieldHelper {
    239  public:
    240   explicit FieldHelper(int a_field) : field_(a_field) {}
    241   int field() const { return field_; }
    242   int field_;  // NOLINT -- need external access to field_ to test
    243                //           the Field matcher.
    244 };
    245 
    246 // Tests the linkage of the ReturnVoid action.
    247 TEST(LinkTest, TestReturnVoid) {
    248   Mock mock;
    249 
    250   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Return());
    251   mock.VoidFromString(nullptr);
    252 }
    253 
    254 // Tests the linkage of the Return action.
    255 TEST(LinkTest, TestReturn) {
    256   Mock mock;
    257   char ch = 'x';
    258 
    259   EXPECT_CALL(mock, StringFromString(_)).WillOnce(Return(&ch));
    260   mock.StringFromString(nullptr);
    261 }
    262 
    263 // Tests the linkage of the ReturnNull action.
    264 TEST(LinkTest, TestReturnNull) {
    265   Mock mock;
    266 
    267   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Return());
    268   mock.VoidFromString(nullptr);
    269 }
    270 
    271 // Tests the linkage of the ReturnRef action.
    272 TEST(LinkTest, TestReturnRef) {
    273   Mock mock;
    274   int n = 42;
    275 
    276   EXPECT_CALL(mock, IntRefFromString(_)).WillOnce(ReturnRef(n));
    277   mock.IntRefFromString(nullptr);
    278 }
    279 
    280 // Tests the linkage of the Assign action.
    281 TEST(LinkTest, TestAssign) {
    282   Mock mock;
    283   char ch = 'x';
    284 
    285   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Assign(&ch, 'y'));
    286   mock.VoidFromString(nullptr);
    287 }
    288 
    289 // Tests the linkage of the SetArgPointee action.
    290 TEST(LinkTest, TestSetArgPointee) {
    291   Mock mock;
    292   char ch = 'x';
    293 
    294   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(SetArgPointee<0>('y'));
    295   mock.VoidFromString(&ch);
    296 }
    297 
    298 // Tests the linkage of the SetArrayArgument action.
    299 TEST(LinkTest, TestSetArrayArgument) {
    300   Mock mock;
    301   char ch = 'x';
    302   char ch2 = 'y';
    303 
    304   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(SetArrayArgument<0>(&ch2,
    305                                                                     &ch2 + 1));
    306   mock.VoidFromString(&ch);
    307 }
    308 
    309 #if !GTEST_OS_WINDOWS_MOBILE
    310 
    311 // Tests the linkage of the SetErrnoAndReturn action.
    312 TEST(LinkTest, TestSetErrnoAndReturn) {
    313   Mock mock;
    314 
    315   int saved_errno = errno;
    316   EXPECT_CALL(mock, IntFromString(_)).WillOnce(SetErrnoAndReturn(1, -1));
    317   mock.IntFromString(nullptr);
    318   errno = saved_errno;
    319 }
    320 
    321 #endif  // !GTEST_OS_WINDOWS_MOBILE
    322 
    323 // Tests the linkage of the Invoke(function) and Invoke(object, method) actions.
    324 TEST(LinkTest, TestInvoke) {
    325   Mock mock;
    326   InvokeHelper test_invoke_helper;
    327 
    328   EXPECT_CALL(mock, VoidFromString(_))
    329       .WillOnce(Invoke(&InvokeHelper::StaticVoidFromString))
    330       .WillOnce(Invoke(&test_invoke_helper, &InvokeHelper::VoidFromString));
    331   mock.VoidFromString(nullptr);
    332   mock.VoidFromString(nullptr);
    333 }
    334 
    335 // Tests the linkage of the InvokeWithoutArgs action.
    336 TEST(LinkTest, TestInvokeWithoutArgs) {
    337   Mock mock;
    338   InvokeHelper test_invoke_helper;
    339 
    340   EXPECT_CALL(mock, VoidFromString(_))
    341       .WillOnce(InvokeWithoutArgs(&InvokeHelper::StaticVoidFromVoid))
    342       .WillOnce(InvokeWithoutArgs(&test_invoke_helper,
    343                                   &InvokeHelper::VoidFromVoid));
    344   mock.VoidFromString(nullptr);
    345   mock.VoidFromString(nullptr);
    346 }
    347 
    348 // Tests the linkage of the InvokeArgument action.
    349 TEST(LinkTest, TestInvokeArgument) {
    350   Mock mock;
    351   char ch = 'x';
    352 
    353   EXPECT_CALL(mock, VoidFromFunc(_)).WillOnce(InvokeArgument<0>(&ch));
    354   mock.VoidFromFunc(InvokeHelper::StaticVoidFromString);
    355 }
    356 
    357 // Tests the linkage of the WithArg action.
    358 TEST(LinkTest, TestWithArg) {
    359   Mock mock;
    360 
    361   EXPECT_CALL(mock, VoidFromString(_))
    362       .WillOnce(WithArg<0>(Invoke(&InvokeHelper::StaticVoidFromString)));
    363   mock.VoidFromString(nullptr);
    364 }
    365 
    366 // Tests the linkage of the WithArgs action.
    367 TEST(LinkTest, TestWithArgs) {
    368   Mock mock;
    369 
    370   EXPECT_CALL(mock, VoidFromString(_))
    371       .WillOnce(WithArgs<0>(Invoke(&InvokeHelper::StaticVoidFromString)));
    372   mock.VoidFromString(nullptr);
    373 }
    374 
    375 // Tests the linkage of the WithoutArgs action.
    376 TEST(LinkTest, TestWithoutArgs) {
    377   Mock mock;
    378 
    379   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(WithoutArgs(Return()));
    380   mock.VoidFromString(nullptr);
    381 }
    382 
    383 // Tests the linkage of the DoAll action.
    384 TEST(LinkTest, TestDoAll) {
    385   Mock mock;
    386   char ch = 'x';
    387 
    388   EXPECT_CALL(mock, VoidFromString(_))
    389       .WillOnce(DoAll(SetArgPointee<0>('y'), Return()));
    390   mock.VoidFromString(&ch);
    391 }
    392 
    393 // Tests the linkage of the DoDefault action.
    394 TEST(LinkTest, TestDoDefault) {
    395   Mock mock;
    396   char ch = 'x';
    397 
    398   ON_CALL(mock, VoidFromString(_)).WillByDefault(Return());
    399   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(DoDefault());
    400   mock.VoidFromString(&ch);
    401 }
    402 
    403 // Tests the linkage of the IgnoreResult action.
    404 TEST(LinkTest, TestIgnoreResult) {
    405   Mock mock;
    406 
    407   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(IgnoreResult(Return(42)));
    408   mock.VoidFromString(nullptr);
    409 }
    410 
    411 #if GTEST_HAS_EXCEPTIONS
    412 // Tests the linkage of the Throw action.
    413 TEST(LinkTest, TestThrow) {
    414   Mock mock;
    415 
    416   EXPECT_CALL(mock, VoidFromString(_)).WillOnce(Throw(42));
    417   EXPECT_THROW(mock.VoidFromString(nullptr), int);
    418 }
    419 #endif  // GTEST_HAS_EXCEPTIONS
    420 
    421 // The ACTION*() macros trigger warning C4100 (unreferenced formal
    422 // parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in
    423 // the macro definition, as the warnings are generated when the macro
    424 // is expanded and macro expansion cannot contain #pragma.  Therefore
    425 // we suppress them here.
    426 #ifdef _MSC_VER
    427 # pragma warning(push)
    428 # pragma warning(disable:4100)
    429 #endif
    430 
    431 // Tests the linkage of actions created using ACTION macro.
    432 namespace {
    433 ACTION(Return1) { return 1; }
    434 }
    435 
    436 TEST(LinkTest, TestActionMacro) {
    437   Mock mock;
    438 
    439   EXPECT_CALL(mock, IntFromString(_)).WillOnce(Return1());
    440   mock.IntFromString(nullptr);
    441 }
    442 
    443 // Tests the linkage of actions created using ACTION_P macro.
    444 namespace {
    445 ACTION_P(ReturnArgument, ret_value) { return ret_value; }
    446 }
    447 
    448 TEST(LinkTest, TestActionPMacro) {
    449   Mock mock;
    450 
    451   EXPECT_CALL(mock, IntFromString(_)).WillOnce(ReturnArgument(42));
    452   mock.IntFromString(nullptr);
    453 }
    454 
    455 // Tests the linkage of actions created using ACTION_P2 macro.
    456 namespace {
    457 ACTION_P2(ReturnEqualsEitherOf, first, second) {
    458   return arg0 == first || arg0 == second;
    459 }
    460 }
    461 
    462 #ifdef _MSC_VER
    463 # pragma warning(pop)
    464 #endif
    465 
    466 TEST(LinkTest, TestActionP2Macro) {
    467   Mock mock;
    468   char ch = 'x';
    469 
    470   EXPECT_CALL(mock, IntFromString(_))
    471       .WillOnce(ReturnEqualsEitherOf("one", "two"));
    472   mock.IntFromString(&ch);
    473 }
    474 
    475 // Tests the linkage of the "_" matcher.
    476 TEST(LinkTest, TestMatcherAnything) {
    477   Mock mock;
    478 
    479   ON_CALL(mock, VoidFromString(_)).WillByDefault(Return());
    480 }
    481 
    482 // Tests the linkage of the A matcher.
    483 TEST(LinkTest, TestMatcherA) {
    484   Mock mock;
    485 
    486   ON_CALL(mock, VoidFromString(A<char*>())).WillByDefault(Return());
    487 }
    488 
    489 // Tests the linkage of the Eq and the "bare value" matcher.
    490 TEST(LinkTest, TestMatchersEq) {
    491   Mock mock;
    492   const char* p = "x";
    493 
    494   ON_CALL(mock, VoidFromString(Eq(p))).WillByDefault(Return());
    495   ON_CALL(mock, VoidFromString(const_cast<char*>("y")))
    496       .WillByDefault(Return());
    497 }
    498 
    499 // Tests the linkage of the Lt, Gt, Le, Ge, and Ne matchers.
    500 TEST(LinkTest, TestMatchersRelations) {
    501   Mock mock;
    502 
    503   ON_CALL(mock, VoidFromFloat(Lt(1.0f))).WillByDefault(Return());
    504   ON_CALL(mock, VoidFromFloat(Gt(1.0f))).WillByDefault(Return());
    505   ON_CALL(mock, VoidFromFloat(Le(1.0f))).WillByDefault(Return());
    506   ON_CALL(mock, VoidFromFloat(Ge(1.0f))).WillByDefault(Return());
    507   ON_CALL(mock, VoidFromFloat(Ne(1.0f))).WillByDefault(Return());
    508 }
    509 
    510 // Tests the linkage of the NotNull matcher.
    511 TEST(LinkTest, TestMatcherNotNull) {
    512   Mock mock;
    513 
    514   ON_CALL(mock, VoidFromString(NotNull())).WillByDefault(Return());
    515 }
    516 
    517 // Tests the linkage of the IsNull matcher.
    518 TEST(LinkTest, TestMatcherIsNull) {
    519   Mock mock;
    520 
    521   ON_CALL(mock, VoidFromString(IsNull())).WillByDefault(Return());
    522 }
    523 
    524 // Tests the linkage of the Ref matcher.
    525 TEST(LinkTest, TestMatcherRef) {
    526   Mock mock;
    527   int a = 0;
    528 
    529   ON_CALL(mock, VoidFromIntRef(Ref(a))).WillByDefault(Return());
    530 }
    531 
    532 // Tests the linkage of the TypedEq matcher.
    533 TEST(LinkTest, TestMatcherTypedEq) {
    534   Mock mock;
    535   long a = 0;
    536 
    537   ON_CALL(mock, VoidFromIntRef(TypedEq<int&>(a))).WillByDefault(Return());
    538 }
    539 
    540 // Tests the linkage of the FloatEq, DoubleEq, NanSensitiveFloatEq and
    541 // NanSensitiveDoubleEq matchers.
    542 TEST(LinkTest, TestMatchersFloatingPoint) {
    543   Mock mock;
    544   float a = 0;
    545 
    546   ON_CALL(mock, VoidFromFloat(FloatEq(a))).WillByDefault(Return());
    547   ON_CALL(mock, VoidFromDouble(DoubleEq(a))).WillByDefault(Return());
    548   ON_CALL(mock, VoidFromFloat(NanSensitiveFloatEq(a))).WillByDefault(Return());
    549   ON_CALL(mock, VoidFromDouble(NanSensitiveDoubleEq(a)))
    550       .WillByDefault(Return());
    551 }
    552 
    553 // Tests the linkage of the ContainsRegex matcher.
    554 TEST(LinkTest, TestMatcherContainsRegex) {
    555   Mock mock;
    556 
    557   ON_CALL(mock, VoidFromString(ContainsRegex(".*"))).WillByDefault(Return());
    558 }
    559 
    560 // Tests the linkage of the MatchesRegex matcher.
    561 TEST(LinkTest, TestMatcherMatchesRegex) {
    562   Mock mock;
    563 
    564   ON_CALL(mock, VoidFromString(MatchesRegex(".*"))).WillByDefault(Return());
    565 }
    566 
    567 // Tests the linkage of the StartsWith, EndsWith, and HasSubstr matchers.
    568 TEST(LinkTest, TestMatchersSubstrings) {
    569   Mock mock;
    570 
    571   ON_CALL(mock, VoidFromString(StartsWith("a"))).WillByDefault(Return());
    572   ON_CALL(mock, VoidFromString(EndsWith("c"))).WillByDefault(Return());
    573   ON_CALL(mock, VoidFromString(HasSubstr("b"))).WillByDefault(Return());
    574 }
    575 
    576 // Tests the linkage of the StrEq, StrNe, StrCaseEq, and StrCaseNe matchers.
    577 TEST(LinkTest, TestMatchersStringEquality) {
    578   Mock mock;
    579   ON_CALL(mock, VoidFromString(StrEq("a"))).WillByDefault(Return());
    580   ON_CALL(mock, VoidFromString(StrNe("a"))).WillByDefault(Return());
    581   ON_CALL(mock, VoidFromString(StrCaseEq("a"))).WillByDefault(Return());
    582   ON_CALL(mock, VoidFromString(StrCaseNe("a"))).WillByDefault(Return());
    583 }
    584 
    585 // Tests the linkage of the ElementsAre matcher.
    586 TEST(LinkTest, TestMatcherElementsAre) {
    587   Mock mock;
    588 
    589   ON_CALL(mock, VoidFromVector(ElementsAre('a', _))).WillByDefault(Return());
    590 }
    591 
    592 // Tests the linkage of the ElementsAreArray matcher.
    593 TEST(LinkTest, TestMatcherElementsAreArray) {
    594   Mock mock;
    595   char arr[] = { 'a', 'b' };
    596 
    597   ON_CALL(mock, VoidFromVector(ElementsAreArray(arr))).WillByDefault(Return());
    598 }
    599 
    600 // Tests the linkage of the IsSubsetOf matcher.
    601 TEST(LinkTest, TestMatcherIsSubsetOf) {
    602   Mock mock;
    603   char arr[] = {'a', 'b'};
    604 
    605   ON_CALL(mock, VoidFromVector(IsSubsetOf(arr))).WillByDefault(Return());
    606 }
    607 
    608 // Tests the linkage of the IsSupersetOf matcher.
    609 TEST(LinkTest, TestMatcherIsSupersetOf) {
    610   Mock mock;
    611   char arr[] = {'a', 'b'};
    612 
    613   ON_CALL(mock, VoidFromVector(IsSupersetOf(arr))).WillByDefault(Return());
    614 }
    615 
    616 // Tests the linkage of the ContainerEq matcher.
    617 TEST(LinkTest, TestMatcherContainerEq) {
    618   Mock mock;
    619   std::vector<int> v;
    620 
    621   ON_CALL(mock, VoidFromVector(ContainerEq(v))).WillByDefault(Return());
    622 }
    623 
    624 // Tests the linkage of the Field matcher.
    625 TEST(LinkTest, TestMatcherField) {
    626   FieldHelper helper(0);
    627 
    628   Matcher<const FieldHelper&> m = Field(&FieldHelper::field_, Eq(0));
    629   EXPECT_TRUE(m.Matches(helper));
    630 
    631   Matcher<const FieldHelper*> m2 = Field(&FieldHelper::field_, Eq(0));
    632   EXPECT_TRUE(m2.Matches(&helper));
    633 }
    634 
    635 // Tests the linkage of the Property matcher.
    636 TEST(LinkTest, TestMatcherProperty) {
    637   FieldHelper helper(0);
    638 
    639   Matcher<const FieldHelper&> m = Property(&FieldHelper::field, Eq(0));
    640   EXPECT_TRUE(m.Matches(helper));
    641 
    642   Matcher<const FieldHelper*> m2 = Property(&FieldHelper::field, Eq(0));
    643   EXPECT_TRUE(m2.Matches(&helper));
    644 }
    645 
    646 // Tests the linkage of the ResultOf matcher.
    647 TEST(LinkTest, TestMatcherResultOf) {
    648   Matcher<char*> m = ResultOf(&InvokeHelper::StaticIntFromString, Eq(1));
    649   EXPECT_TRUE(m.Matches(nullptr));
    650 }
    651 
    652 // Tests the linkage of the ResultOf matcher.
    653 TEST(LinkTest, TestMatcherPointee) {
    654   int n = 1;
    655 
    656   Matcher<int*> m = Pointee(Eq(1));
    657   EXPECT_TRUE(m.Matches(&n));
    658 }
    659 
    660 // Tests the linkage of the Truly matcher.
    661 TEST(LinkTest, TestMatcherTruly) {
    662   Matcher<const char*> m = Truly(&InvokeHelper::StaticBoolFromString);
    663   EXPECT_TRUE(m.Matches(nullptr));
    664 }
    665 
    666 // Tests the linkage of the AllOf matcher.
    667 TEST(LinkTest, TestMatcherAllOf) {
    668   Matcher<int> m = AllOf(_, Eq(1));
    669   EXPECT_TRUE(m.Matches(1));
    670 }
    671 
    672 // Tests the linkage of the AnyOf matcher.
    673 TEST(LinkTest, TestMatcherAnyOf) {
    674   Matcher<int> m = AnyOf(_, Eq(1));
    675   EXPECT_TRUE(m.Matches(1));
    676 }
    677 
    678 // Tests the linkage of the Not matcher.
    679 TEST(LinkTest, TestMatcherNot) {
    680   Matcher<int> m = Not(_);
    681   EXPECT_FALSE(m.Matches(1));
    682 }
    683 
    684 // Tests the linkage of the MatcherCast<T>() function.
    685 TEST(LinkTest, TestMatcherCast) {
    686   Matcher<const char*> m = MatcherCast<const char*>(_);
    687   EXPECT_TRUE(m.Matches(nullptr));
    688 }
    689 
    690 #endif  // GMOCK_TEST_GMOCK_LINK_TEST_H_
    691