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