github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/src/third_party/googlemock/test/gmock-generated-matchers_test.cc (about) 1 // Copyright 2008, 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 // Google Mock - a framework for writing C++ mock classes. 31 // 32 // This file tests the built-in matchers generated by a script. 33 34 #include "gmock/gmock-generated-matchers.h" 35 36 #include <list> 37 #include <map> 38 #include <set> 39 #include <sstream> 40 #include <string> 41 #include <utility> 42 #include <vector> 43 44 #include "gmock/gmock.h" 45 #include "gtest/gtest.h" 46 #include "gtest/gtest-spi.h" 47 48 namespace { 49 50 using std::list; 51 using std::map; 52 using std::pair; 53 using std::set; 54 using std::stringstream; 55 using std::vector; 56 using std::tr1::get; 57 using std::tr1::make_tuple; 58 using std::tr1::tuple; 59 using testing::_; 60 using testing::Args; 61 using testing::Contains; 62 using testing::ElementsAre; 63 using testing::ElementsAreArray; 64 using testing::Eq; 65 using testing::Ge; 66 using testing::Gt; 67 using testing::Le; 68 using testing::Lt; 69 using testing::MakeMatcher; 70 using testing::Matcher; 71 using testing::MatcherInterface; 72 using testing::MatchResultListener; 73 using testing::Ne; 74 using testing::Not; 75 using testing::Pointee; 76 using testing::PrintToString; 77 using testing::Ref; 78 using testing::StaticAssertTypeEq; 79 using testing::StrEq; 80 using testing::Value; 81 using testing::internal::ElementsAreArrayMatcher; 82 using testing::internal::string; 83 84 // Evaluates to the number of elements in 'array'. 85 #define GMOCK_ARRAY_SIZE_(a) (sizeof(a) / sizeof(a[0])) 86 87 // Returns the description of the given matcher. 88 template <typename T> 89 string Describe(const Matcher<T>& m) { 90 stringstream ss; 91 m.DescribeTo(&ss); 92 return ss.str(); 93 } 94 95 // Returns the description of the negation of the given matcher. 96 template <typename T> 97 string DescribeNegation(const Matcher<T>& m) { 98 stringstream ss; 99 m.DescribeNegationTo(&ss); 100 return ss.str(); 101 } 102 103 // Returns the reason why x matches, or doesn't match, m. 104 template <typename MatcherType, typename Value> 105 string Explain(const MatcherType& m, const Value& x) { 106 stringstream ss; 107 m.ExplainMatchResultTo(x, &ss); 108 return ss.str(); 109 } 110 111 // Tests Args<k0, ..., kn>(m). 112 113 TEST(ArgsTest, AcceptsZeroTemplateArg) { 114 const tuple<int, bool> t(5, true); 115 EXPECT_THAT(t, Args<>(Eq(tuple<>()))); 116 EXPECT_THAT(t, Not(Args<>(Ne(tuple<>())))); 117 } 118 119 TEST(ArgsTest, AcceptsOneTemplateArg) { 120 const tuple<int, bool> t(5, true); 121 EXPECT_THAT(t, Args<0>(Eq(make_tuple(5)))); 122 EXPECT_THAT(t, Args<1>(Eq(make_tuple(true)))); 123 EXPECT_THAT(t, Not(Args<1>(Eq(make_tuple(false))))); 124 } 125 126 TEST(ArgsTest, AcceptsTwoTemplateArgs) { 127 const tuple<short, int, long> t(4, 5, 6L); // NOLINT 128 129 EXPECT_THAT(t, (Args<0, 1>(Lt()))); 130 EXPECT_THAT(t, (Args<1, 2>(Lt()))); 131 EXPECT_THAT(t, Not(Args<0, 2>(Gt()))); 132 } 133 134 TEST(ArgsTest, AcceptsRepeatedTemplateArgs) { 135 const tuple<short, int, long> t(4, 5, 6L); // NOLINT 136 EXPECT_THAT(t, (Args<0, 0>(Eq()))); 137 EXPECT_THAT(t, Not(Args<1, 1>(Ne()))); 138 } 139 140 TEST(ArgsTest, AcceptsDecreasingTemplateArgs) { 141 const tuple<short, int, long> t(4, 5, 6L); // NOLINT 142 EXPECT_THAT(t, (Args<2, 0>(Gt()))); 143 EXPECT_THAT(t, Not(Args<2, 1>(Lt()))); 144 } 145 146 // The MATCHER*() macros trigger warning C4100 (unreferenced formal 147 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 148 // the macro definition, as the warnings are generated when the macro 149 // is expanded and macro expansion cannot contain #pragma. Therefore 150 // we suppress them here. 151 #ifdef _MSC_VER 152 # pragma warning(push) 153 # pragma warning(disable:4100) 154 #endif 155 156 MATCHER(SumIsZero, "") { 157 return get<0>(arg) + get<1>(arg) + get<2>(arg) == 0; 158 } 159 160 TEST(ArgsTest, AcceptsMoreTemplateArgsThanArityOfOriginalTuple) { 161 EXPECT_THAT(make_tuple(-1, 2), (Args<0, 0, 1>(SumIsZero()))); 162 EXPECT_THAT(make_tuple(1, 2), Not(Args<0, 0, 1>(SumIsZero()))); 163 } 164 165 TEST(ArgsTest, CanBeNested) { 166 const tuple<short, int, long, int> t(4, 5, 6L, 6); // NOLINT 167 EXPECT_THAT(t, (Args<1, 2, 3>(Args<1, 2>(Eq())))); 168 EXPECT_THAT(t, (Args<0, 1, 3>(Args<0, 2>(Lt())))); 169 } 170 171 TEST(ArgsTest, CanMatchTupleByValue) { 172 typedef tuple<char, int, int> Tuple3; 173 const Matcher<Tuple3> m = Args<1, 2>(Lt()); 174 EXPECT_TRUE(m.Matches(Tuple3('a', 1, 2))); 175 EXPECT_FALSE(m.Matches(Tuple3('b', 2, 2))); 176 } 177 178 TEST(ArgsTest, CanMatchTupleByReference) { 179 typedef tuple<char, char, int> Tuple3; 180 const Matcher<const Tuple3&> m = Args<0, 1>(Lt()); 181 EXPECT_TRUE(m.Matches(Tuple3('a', 'b', 2))); 182 EXPECT_FALSE(m.Matches(Tuple3('b', 'b', 2))); 183 } 184 185 // Validates that arg is printed as str. 186 MATCHER_P(PrintsAs, str, "") { 187 return testing::PrintToString(arg) == str; 188 } 189 190 TEST(ArgsTest, AcceptsTenTemplateArgs) { 191 EXPECT_THAT(make_tuple(0, 1L, 2, 3L, 4, 5, 6, 7, 8, 9), 192 (Args<9, 8, 7, 6, 5, 4, 3, 2, 1, 0>( 193 PrintsAs("(9, 8, 7, 6, 5, 4, 3, 2, 1, 0)")))); 194 EXPECT_THAT(make_tuple(0, 1L, 2, 3L, 4, 5, 6, 7, 8, 9), 195 Not(Args<9, 8, 7, 6, 5, 4, 3, 2, 1, 0>( 196 PrintsAs("(0, 8, 7, 6, 5, 4, 3, 2, 1, 0)")))); 197 } 198 199 TEST(ArgsTest, DescirbesSelfCorrectly) { 200 const Matcher<tuple<int, bool, char> > m = Args<2, 0>(Lt()); 201 EXPECT_EQ("are a tuple whose fields (#2, #0) are a pair where " 202 "the first < the second", 203 Describe(m)); 204 } 205 206 TEST(ArgsTest, DescirbesNestedArgsCorrectly) { 207 const Matcher<const tuple<int, bool, char, int>&> m = 208 Args<0, 2, 3>(Args<2, 0>(Lt())); 209 EXPECT_EQ("are a tuple whose fields (#0, #2, #3) are a tuple " 210 "whose fields (#2, #0) are a pair where the first < the second", 211 Describe(m)); 212 } 213 214 TEST(ArgsTest, DescribesNegationCorrectly) { 215 const Matcher<tuple<int, char> > m = Args<1, 0>(Gt()); 216 EXPECT_EQ("are a tuple whose fields (#1, #0) aren't a pair " 217 "where the first > the second", 218 DescribeNegation(m)); 219 } 220 221 TEST(ArgsTest, ExplainsMatchResultWithoutInnerExplanation) { 222 const Matcher<tuple<bool, int, int> > m = Args<1, 2>(Eq()); 223 EXPECT_EQ("whose fields (#1, #2) are (42, 42)", 224 Explain(m, make_tuple(false, 42, 42))); 225 EXPECT_EQ("whose fields (#1, #2) are (42, 43)", 226 Explain(m, make_tuple(false, 42, 43))); 227 } 228 229 // For testing Args<>'s explanation. 230 class LessThanMatcher : public MatcherInterface<tuple<char, int> > { 231 public: 232 virtual void DescribeTo(::std::ostream* os) const {} 233 234 virtual bool MatchAndExplain(tuple<char, int> value, 235 MatchResultListener* listener) const { 236 const int diff = get<0>(value) - get<1>(value); 237 if (diff > 0) { 238 *listener << "where the first value is " << diff 239 << " more than the second"; 240 } 241 return diff < 0; 242 } 243 }; 244 245 Matcher<tuple<char, int> > LessThan() { 246 return MakeMatcher(new LessThanMatcher); 247 } 248 249 TEST(ArgsTest, ExplainsMatchResultWithInnerExplanation) { 250 const Matcher<tuple<char, int, int> > m = Args<0, 2>(LessThan()); 251 EXPECT_EQ("whose fields (#0, #2) are ('a' (97, 0x61), 42), " 252 "where the first value is 55 more than the second", 253 Explain(m, make_tuple('a', 42, 42))); 254 EXPECT_EQ("whose fields (#0, #2) are ('\\0', 43)", 255 Explain(m, make_tuple('\0', 42, 43))); 256 } 257 258 // For testing ExplainMatchResultTo(). 259 class GreaterThanMatcher : public MatcherInterface<int> { 260 public: 261 explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} 262 263 virtual void DescribeTo(::std::ostream* os) const { 264 *os << "is greater than " << rhs_; 265 } 266 267 virtual bool MatchAndExplain(int lhs, 268 MatchResultListener* listener) const { 269 const int diff = lhs - rhs_; 270 if (diff > 0) { 271 *listener << "which is " << diff << " more than " << rhs_; 272 } else if (diff == 0) { 273 *listener << "which is the same as " << rhs_; 274 } else { 275 *listener << "which is " << -diff << " less than " << rhs_; 276 } 277 278 return lhs > rhs_; 279 } 280 281 private: 282 int rhs_; 283 }; 284 285 Matcher<int> GreaterThan(int n) { 286 return MakeMatcher(new GreaterThanMatcher(n)); 287 } 288 289 // Tests for ElementsAre(). 290 291 TEST(ElementsAreTest, CanDescribeExpectingNoElement) { 292 Matcher<const vector<int>&> m = ElementsAre(); 293 EXPECT_EQ("is empty", Describe(m)); 294 } 295 296 TEST(ElementsAreTest, CanDescribeExpectingOneElement) { 297 Matcher<vector<int> > m = ElementsAre(Gt(5)); 298 EXPECT_EQ("has 1 element that is > 5", Describe(m)); 299 } 300 301 TEST(ElementsAreTest, CanDescribeExpectingManyElements) { 302 Matcher<list<string> > m = ElementsAre(StrEq("one"), "two"); 303 EXPECT_EQ("has 2 elements where\n" 304 "element #0 is equal to \"one\",\n" 305 "element #1 is equal to \"two\"", Describe(m)); 306 } 307 308 TEST(ElementsAreTest, CanDescribeNegationOfExpectingNoElement) { 309 Matcher<vector<int> > m = ElementsAre(); 310 EXPECT_EQ("isn't empty", DescribeNegation(m)); 311 } 312 313 TEST(ElementsAreTest, CanDescribeNegationOfExpectingOneElment) { 314 Matcher<const list<int>& > m = ElementsAre(Gt(5)); 315 EXPECT_EQ("doesn't have 1 element, or\n" 316 "element #0 isn't > 5", DescribeNegation(m)); 317 } 318 319 TEST(ElementsAreTest, CanDescribeNegationOfExpectingManyElements) { 320 Matcher<const list<string>& > m = ElementsAre("one", "two"); 321 EXPECT_EQ("doesn't have 2 elements, or\n" 322 "element #0 isn't equal to \"one\", or\n" 323 "element #1 isn't equal to \"two\"", DescribeNegation(m)); 324 } 325 326 TEST(ElementsAreTest, DoesNotExplainTrivialMatch) { 327 Matcher<const list<int>& > m = ElementsAre(1, Ne(2)); 328 329 list<int> test_list; 330 test_list.push_back(1); 331 test_list.push_back(3); 332 EXPECT_EQ("", Explain(m, test_list)); // No need to explain anything. 333 } 334 335 TEST(ElementsAreTest, ExplainsNonTrivialMatch) { 336 Matcher<const vector<int>& > m = 337 ElementsAre(GreaterThan(1), 0, GreaterThan(2)); 338 339 const int a[] = { 10, 0, 100 }; 340 vector<int> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 341 EXPECT_EQ("whose element #0 matches, which is 9 more than 1,\n" 342 "and whose element #2 matches, which is 98 more than 2", 343 Explain(m, test_vector)); 344 } 345 346 TEST(ElementsAreTest, CanExplainMismatchWrongSize) { 347 Matcher<const list<int>& > m = ElementsAre(1, 3); 348 349 list<int> test_list; 350 // No need to explain when the container is empty. 351 EXPECT_EQ("", Explain(m, test_list)); 352 353 test_list.push_back(1); 354 EXPECT_EQ("which has 1 element", Explain(m, test_list)); 355 } 356 357 TEST(ElementsAreTest, CanExplainMismatchRightSize) { 358 Matcher<const vector<int>& > m = ElementsAre(1, GreaterThan(5)); 359 360 vector<int> v; 361 v.push_back(2); 362 v.push_back(1); 363 EXPECT_EQ("whose element #0 doesn't match", Explain(m, v)); 364 365 v[0] = 1; 366 EXPECT_EQ("whose element #1 doesn't match, which is 4 less than 5", 367 Explain(m, v)); 368 } 369 370 TEST(ElementsAreTest, MatchesOneElementVector) { 371 vector<string> test_vector; 372 test_vector.push_back("test string"); 373 374 EXPECT_THAT(test_vector, ElementsAre(StrEq("test string"))); 375 } 376 377 TEST(ElementsAreTest, MatchesOneElementList) { 378 list<string> test_list; 379 test_list.push_back("test string"); 380 381 EXPECT_THAT(test_list, ElementsAre("test string")); 382 } 383 384 TEST(ElementsAreTest, MatchesThreeElementVector) { 385 vector<string> test_vector; 386 test_vector.push_back("one"); 387 test_vector.push_back("two"); 388 test_vector.push_back("three"); 389 390 EXPECT_THAT(test_vector, ElementsAre("one", StrEq("two"), _)); 391 } 392 393 TEST(ElementsAreTest, MatchesOneElementEqMatcher) { 394 vector<int> test_vector; 395 test_vector.push_back(4); 396 397 EXPECT_THAT(test_vector, ElementsAre(Eq(4))); 398 } 399 400 TEST(ElementsAreTest, MatchesOneElementAnyMatcher) { 401 vector<int> test_vector; 402 test_vector.push_back(4); 403 404 EXPECT_THAT(test_vector, ElementsAre(_)); 405 } 406 407 TEST(ElementsAreTest, MatchesOneElementValue) { 408 vector<int> test_vector; 409 test_vector.push_back(4); 410 411 EXPECT_THAT(test_vector, ElementsAre(4)); 412 } 413 414 TEST(ElementsAreTest, MatchesThreeElementsMixedMatchers) { 415 vector<int> test_vector; 416 test_vector.push_back(1); 417 test_vector.push_back(2); 418 test_vector.push_back(3); 419 420 EXPECT_THAT(test_vector, ElementsAre(1, Eq(2), _)); 421 } 422 423 TEST(ElementsAreTest, MatchesTenElementVector) { 424 const int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 425 vector<int> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 426 427 EXPECT_THAT(test_vector, 428 // The element list can contain values and/or matchers 429 // of different types. 430 ElementsAre(0, Ge(0), _, 3, 4, Ne(2), Eq(6), 7, 8, _)); 431 } 432 433 TEST(ElementsAreTest, DoesNotMatchWrongSize) { 434 vector<string> test_vector; 435 test_vector.push_back("test string"); 436 test_vector.push_back("test string"); 437 438 Matcher<vector<string> > m = ElementsAre(StrEq("test string")); 439 EXPECT_FALSE(m.Matches(test_vector)); 440 } 441 442 TEST(ElementsAreTest, DoesNotMatchWrongValue) { 443 vector<string> test_vector; 444 test_vector.push_back("other string"); 445 446 Matcher<vector<string> > m = ElementsAre(StrEq("test string")); 447 EXPECT_FALSE(m.Matches(test_vector)); 448 } 449 450 TEST(ElementsAreTest, DoesNotMatchWrongOrder) { 451 vector<string> test_vector; 452 test_vector.push_back("one"); 453 test_vector.push_back("three"); 454 test_vector.push_back("two"); 455 456 Matcher<vector<string> > m = ElementsAre( 457 StrEq("one"), StrEq("two"), StrEq("three")); 458 EXPECT_FALSE(m.Matches(test_vector)); 459 } 460 461 TEST(ElementsAreTest, WorksForNestedContainer) { 462 const char* strings[] = { 463 "Hi", 464 "world" 465 }; 466 467 vector<list<char> > nested; 468 for (size_t i = 0; i < GMOCK_ARRAY_SIZE_(strings); i++) { 469 nested.push_back(list<char>(strings[i], strings[i] + strlen(strings[i]))); 470 } 471 472 EXPECT_THAT(nested, ElementsAre(ElementsAre('H', Ne('e')), 473 ElementsAre('w', 'o', _, _, 'd'))); 474 EXPECT_THAT(nested, Not(ElementsAre(ElementsAre('H', 'e'), 475 ElementsAre('w', 'o', _, _, 'd')))); 476 } 477 478 TEST(ElementsAreTest, WorksWithByRefElementMatchers) { 479 int a[] = { 0, 1, 2 }; 480 vector<int> v(a, a + GMOCK_ARRAY_SIZE_(a)); 481 482 EXPECT_THAT(v, ElementsAre(Ref(v[0]), Ref(v[1]), Ref(v[2]))); 483 EXPECT_THAT(v, Not(ElementsAre(Ref(v[0]), Ref(v[1]), Ref(a[2])))); 484 } 485 486 TEST(ElementsAreTest, WorksWithContainerPointerUsingPointee) { 487 int a[] = { 0, 1, 2 }; 488 vector<int> v(a, a + GMOCK_ARRAY_SIZE_(a)); 489 490 EXPECT_THAT(&v, Pointee(ElementsAre(0, 1, _))); 491 EXPECT_THAT(&v, Not(Pointee(ElementsAre(0, _, 3)))); 492 } 493 494 TEST(ElementsAreTest, WorksWithNativeArrayPassedByReference) { 495 int array[] = { 0, 1, 2 }; 496 EXPECT_THAT(array, ElementsAre(0, 1, _)); 497 EXPECT_THAT(array, Not(ElementsAre(1, _, _))); 498 EXPECT_THAT(array, Not(ElementsAre(0, _))); 499 } 500 501 class NativeArrayPassedAsPointerAndSize { 502 public: 503 NativeArrayPassedAsPointerAndSize() {} 504 505 MOCK_METHOD2(Helper, void(int* array, int size)); 506 507 private: 508 GTEST_DISALLOW_COPY_AND_ASSIGN_(NativeArrayPassedAsPointerAndSize); 509 }; 510 511 TEST(ElementsAreTest, WorksWithNativeArrayPassedAsPointerAndSize) { 512 int array[] = { 0, 1 }; 513 ::std::tr1::tuple<int*, size_t> array_as_tuple(array, 2); 514 EXPECT_THAT(array_as_tuple, ElementsAre(0, 1)); 515 EXPECT_THAT(array_as_tuple, Not(ElementsAre(0))); 516 517 NativeArrayPassedAsPointerAndSize helper; 518 EXPECT_CALL(helper, Helper(_, _)) 519 .With(ElementsAre(0, 1)); 520 helper.Helper(array, 2); 521 } 522 523 TEST(ElementsAreTest, WorksWithTwoDimensionalNativeArray) { 524 const char a2[][3] = { "hi", "lo" }; 525 EXPECT_THAT(a2, ElementsAre(ElementsAre('h', 'i', '\0'), 526 ElementsAre('l', 'o', '\0'))); 527 EXPECT_THAT(a2, ElementsAre(StrEq("hi"), StrEq("lo"))); 528 EXPECT_THAT(a2, ElementsAre(Not(ElementsAre('h', 'o', '\0')), 529 ElementsAre('l', 'o', '\0'))); 530 } 531 532 TEST(ElementsAreTest, AcceptsStringLiteral) { 533 string array[] = { "hi", "one", "two" }; 534 EXPECT_THAT(array, ElementsAre("hi", "one", "two")); 535 EXPECT_THAT(array, Not(ElementsAre("hi", "one", "too"))); 536 } 537 538 #ifndef _MSC_VER 539 540 // The following test passes a value of type const char[] to a 541 // function template that expects const T&. Some versions of MSVC 542 // generates a compiler error C2665 for that. We believe it's a bug 543 // in MSVC. Therefore this test is #if-ed out for MSVC. 544 545 // Declared here with the size unknown. Defined AFTER the following test. 546 extern const char kHi[]; 547 548 TEST(ElementsAreTest, AcceptsArrayWithUnknownSize) { 549 // The size of kHi is not known in this test, but ElementsAre() should 550 // still accept it. 551 552 string array1[] = { "hi" }; 553 EXPECT_THAT(array1, ElementsAre(kHi)); 554 555 string array2[] = { "ho" }; 556 EXPECT_THAT(array2, Not(ElementsAre(kHi))); 557 } 558 559 const char kHi[] = "hi"; 560 561 #endif // _MSC_VER 562 563 TEST(ElementsAreTest, MakesCopyOfArguments) { 564 int x = 1; 565 int y = 2; 566 // This should make a copy of x and y. 567 ::testing::internal::ElementsAreMatcher<std::tr1::tuple<int, int> > 568 polymorphic_matcher = ElementsAre(x, y); 569 // Changing x and y now shouldn't affect the meaning of the above matcher. 570 x = y = 0; 571 const int array1[] = { 1, 2 }; 572 EXPECT_THAT(array1, polymorphic_matcher); 573 const int array2[] = { 0, 0 }; 574 EXPECT_THAT(array2, Not(polymorphic_matcher)); 575 } 576 577 578 // Tests for ElementsAreArray(). Since ElementsAreArray() shares most 579 // of the implementation with ElementsAre(), we don't test it as 580 // thoroughly here. 581 582 TEST(ElementsAreArrayTest, CanBeCreatedWithValueArray) { 583 const int a[] = { 1, 2, 3 }; 584 585 vector<int> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 586 EXPECT_THAT(test_vector, ElementsAreArray(a)); 587 588 test_vector[2] = 0; 589 EXPECT_THAT(test_vector, Not(ElementsAreArray(a))); 590 } 591 592 TEST(ElementsAreArrayTest, CanBeCreatedWithArraySize) { 593 const char* a[] = { "one", "two", "three" }; 594 595 vector<string> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 596 EXPECT_THAT(test_vector, ElementsAreArray(a, GMOCK_ARRAY_SIZE_(a))); 597 598 const char** p = a; 599 test_vector[0] = "1"; 600 EXPECT_THAT(test_vector, Not(ElementsAreArray(p, GMOCK_ARRAY_SIZE_(a)))); 601 } 602 603 TEST(ElementsAreArrayTest, CanBeCreatedWithoutArraySize) { 604 const char* a[] = { "one", "two", "three" }; 605 606 vector<string> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 607 EXPECT_THAT(test_vector, ElementsAreArray(a)); 608 609 test_vector[0] = "1"; 610 EXPECT_THAT(test_vector, Not(ElementsAreArray(a))); 611 } 612 613 TEST(ElementsAreArrayTest, CanBeCreatedWithMatcherArray) { 614 const Matcher<string> kMatcherArray[] = 615 { StrEq("one"), StrEq("two"), StrEq("three") }; 616 617 vector<string> test_vector; 618 test_vector.push_back("one"); 619 test_vector.push_back("two"); 620 test_vector.push_back("three"); 621 EXPECT_THAT(test_vector, ElementsAreArray(kMatcherArray)); 622 623 test_vector.push_back("three"); 624 EXPECT_THAT(test_vector, Not(ElementsAreArray(kMatcherArray))); 625 } 626 627 TEST(ElementsAreArrayTest, CanBeCreatedWithVector) { 628 const int a[] = { 1, 2, 3 }; 629 vector<int> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 630 const vector<int> expected(a, a + GMOCK_ARRAY_SIZE_(a)); 631 EXPECT_THAT(test_vector, ElementsAreArray(expected)); 632 test_vector.push_back(4); 633 EXPECT_THAT(test_vector, Not(ElementsAreArray(expected))); 634 } 635 636 #if GTEST_LANG_CXX11 637 638 TEST(ElementsAreArrayTest, TakesInitializerList) { 639 const int a[5] = { 1, 2, 3, 4, 5 }; 640 EXPECT_THAT(a, ElementsAreArray({ 1, 2, 3, 4, 5 })); 641 EXPECT_THAT(a, Not(ElementsAreArray({ 1, 2, 3, 5, 4 }))); 642 EXPECT_THAT(a, Not(ElementsAreArray({ 1, 2, 3, 4, 6 }))); 643 } 644 645 TEST(ElementsAreArrayTest, TakesInitializerListOfCStrings) { 646 const string a[5] = { "a", "b", "c", "d", "e" }; 647 EXPECT_THAT(a, ElementsAreArray({ "a", "b", "c", "d", "e" })); 648 EXPECT_THAT(a, Not(ElementsAreArray({ "a", "b", "c", "e", "d" }))); 649 EXPECT_THAT(a, Not(ElementsAreArray({ "a", "b", "c", "d", "ef" }))); 650 } 651 652 TEST(ElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) { 653 const int a[5] = { 1, 2, 3, 4, 5 }; 654 EXPECT_THAT(a, ElementsAreArray( 655 { Eq(1), Eq(2), Eq(3), Eq(4), Eq(5) })); 656 EXPECT_THAT(a, Not(ElementsAreArray( 657 { Eq(1), Eq(2), Eq(3), Eq(4), Eq(6) }))); 658 } 659 660 TEST(ElementsAreArrayTest, 661 TakesInitializerListOfDifferentTypedMatchers) { 662 const int a[5] = { 1, 2, 3, 4, 5 }; 663 // The compiler cannot infer the type of the initializer list if its 664 // elements have different types. We must explicitly specify the 665 // unified element type in this case. 666 EXPECT_THAT(a, ElementsAreArray<Matcher<int> >( 667 { Eq(1), Ne(-2), Ge(3), Le(4), Eq(5) })); 668 EXPECT_THAT(a, Not(ElementsAreArray<Matcher<int> >( 669 { Eq(1), Ne(-2), Ge(3), Le(4), Eq(6) }))); 670 } 671 672 #endif // GTEST_LANG_CXX11 673 674 TEST(ElementsAreArrayTest, CanBeCreatedWithMatcherVector) { 675 const int a[] = { 1, 2, 3 }; 676 const Matcher<int> kMatchers[] = { Eq(1), Eq(2), Eq(3) }; 677 vector<int> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 678 const vector<Matcher<int> > expected( 679 kMatchers, kMatchers + GMOCK_ARRAY_SIZE_(kMatchers)); 680 EXPECT_THAT(test_vector, ElementsAreArray(expected)); 681 test_vector.push_back(4); 682 EXPECT_THAT(test_vector, Not(ElementsAreArray(expected))); 683 } 684 685 TEST(ElementsAreArrayTest, CanBeCreatedWithIteratorRange) { 686 const int a[] = { 1, 2, 3 }; 687 const vector<int> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 688 const vector<int> expected(a, a + GMOCK_ARRAY_SIZE_(a)); 689 EXPECT_THAT(test_vector, ElementsAreArray(expected.begin(), expected.end())); 690 // Pointers are iterators, too. 691 EXPECT_THAT(test_vector, ElementsAreArray(a, a + GMOCK_ARRAY_SIZE_(a))); 692 // The empty range of NULL pointers should also be okay. 693 int* const null_int = NULL; 694 EXPECT_THAT(test_vector, Not(ElementsAreArray(null_int, null_int))); 695 EXPECT_THAT((vector<int>()), ElementsAreArray(null_int, null_int)); 696 } 697 698 // Since ElementsAre() and ElementsAreArray() share much of the 699 // implementation, we only do a sanity test for native arrays here. 700 TEST(ElementsAreArrayTest, WorksWithNativeArray) { 701 ::std::string a[] = { "hi", "ho" }; 702 ::std::string b[] = { "hi", "ho" }; 703 704 EXPECT_THAT(a, ElementsAreArray(b)); 705 EXPECT_THAT(a, ElementsAreArray(b, 2)); 706 EXPECT_THAT(a, Not(ElementsAreArray(b, 1))); 707 } 708 709 TEST(ElementsAreArrayTest, SourceLifeSpan) { 710 const int a[] = { 1, 2, 3 }; 711 vector<int> test_vector(a, a + GMOCK_ARRAY_SIZE_(a)); 712 vector<int> expect(a, a + GMOCK_ARRAY_SIZE_(a)); 713 ElementsAreArrayMatcher<int> matcher_maker = 714 ElementsAreArray(expect.begin(), expect.end()); 715 EXPECT_THAT(test_vector, matcher_maker); 716 // Changing in place the values that initialized matcher_maker should not 717 // affect matcher_maker anymore. It should have made its own copy of them. 718 typedef vector<int>::iterator Iter; 719 for (Iter it = expect.begin(); it != expect.end(); ++it) { *it += 10; } 720 EXPECT_THAT(test_vector, matcher_maker); 721 test_vector.push_back(3); 722 EXPECT_THAT(test_vector, Not(matcher_maker)); 723 } 724 725 // Tests for the MATCHER*() macro family. 726 727 // Tests that a simple MATCHER() definition works. 728 729 MATCHER(IsEven, "") { return (arg % 2) == 0; } 730 731 TEST(MatcherMacroTest, Works) { 732 const Matcher<int> m = IsEven(); 733 EXPECT_TRUE(m.Matches(6)); 734 EXPECT_FALSE(m.Matches(7)); 735 736 EXPECT_EQ("is even", Describe(m)); 737 EXPECT_EQ("not (is even)", DescribeNegation(m)); 738 EXPECT_EQ("", Explain(m, 6)); 739 EXPECT_EQ("", Explain(m, 7)); 740 } 741 742 // This also tests that the description string can reference 'negation'. 743 MATCHER(IsEven2, negation ? "is odd" : "is even") { 744 if ((arg % 2) == 0) { 745 // Verifies that we can stream to result_listener, a listener 746 // supplied by the MATCHER macro implicitly. 747 *result_listener << "OK"; 748 return true; 749 } else { 750 *result_listener << "% 2 == " << (arg % 2); 751 return false; 752 } 753 } 754 755 // This also tests that the description string can reference matcher 756 // parameters. 757 MATCHER_P2(EqSumOf, x, y, 758 string(negation ? "doesn't equal" : "equals") + " the sum of " + 759 PrintToString(x) + " and " + PrintToString(y)) { 760 if (arg == (x + y)) { 761 *result_listener << "OK"; 762 return true; 763 } else { 764 // Verifies that we can stream to the underlying stream of 765 // result_listener. 766 if (result_listener->stream() != NULL) { 767 *result_listener->stream() << "diff == " << (x + y - arg); 768 } 769 return false; 770 } 771 } 772 773 // Tests that the matcher description can reference 'negation' and the 774 // matcher parameters. 775 TEST(MatcherMacroTest, DescriptionCanReferenceNegationAndParameters) { 776 const Matcher<int> m1 = IsEven2(); 777 EXPECT_EQ("is even", Describe(m1)); 778 EXPECT_EQ("is odd", DescribeNegation(m1)); 779 780 const Matcher<int> m2 = EqSumOf(5, 9); 781 EXPECT_EQ("equals the sum of 5 and 9", Describe(m2)); 782 EXPECT_EQ("doesn't equal the sum of 5 and 9", DescribeNegation(m2)); 783 } 784 785 // Tests explaining match result in a MATCHER* macro. 786 TEST(MatcherMacroTest, CanExplainMatchResult) { 787 const Matcher<int> m1 = IsEven2(); 788 EXPECT_EQ("OK", Explain(m1, 4)); 789 EXPECT_EQ("% 2 == 1", Explain(m1, 5)); 790 791 const Matcher<int> m2 = EqSumOf(1, 2); 792 EXPECT_EQ("OK", Explain(m2, 3)); 793 EXPECT_EQ("diff == -1", Explain(m2, 4)); 794 } 795 796 // Tests that the body of MATCHER() can reference the type of the 797 // value being matched. 798 799 MATCHER(IsEmptyString, "") { 800 StaticAssertTypeEq< ::std::string, arg_type>(); 801 return arg == ""; 802 } 803 804 MATCHER(IsEmptyStringByRef, "") { 805 StaticAssertTypeEq<const ::std::string&, arg_type>(); 806 return arg == ""; 807 } 808 809 TEST(MatcherMacroTest, CanReferenceArgType) { 810 const Matcher< ::std::string> m1 = IsEmptyString(); 811 EXPECT_TRUE(m1.Matches("")); 812 813 const Matcher<const ::std::string&> m2 = IsEmptyStringByRef(); 814 EXPECT_TRUE(m2.Matches("")); 815 } 816 817 // Tests that MATCHER() can be used in a namespace. 818 819 namespace matcher_test { 820 MATCHER(IsOdd, "") { return (arg % 2) != 0; } 821 } // namespace matcher_test 822 823 TEST(MatcherMacroTest, WorksInNamespace) { 824 Matcher<int> m = matcher_test::IsOdd(); 825 EXPECT_FALSE(m.Matches(4)); 826 EXPECT_TRUE(m.Matches(5)); 827 } 828 829 // Tests that Value() can be used to compose matchers. 830 MATCHER(IsPositiveOdd, "") { 831 return Value(arg, matcher_test::IsOdd()) && arg > 0; 832 } 833 834 TEST(MatcherMacroTest, CanBeComposedUsingValue) { 835 EXPECT_THAT(3, IsPositiveOdd()); 836 EXPECT_THAT(4, Not(IsPositiveOdd())); 837 EXPECT_THAT(-1, Not(IsPositiveOdd())); 838 } 839 840 // Tests that a simple MATCHER_P() definition works. 841 842 MATCHER_P(IsGreaterThan32And, n, "") { return arg > 32 && arg > n; } 843 844 TEST(MatcherPMacroTest, Works) { 845 const Matcher<int> m = IsGreaterThan32And(5); 846 EXPECT_TRUE(m.Matches(36)); 847 EXPECT_FALSE(m.Matches(5)); 848 849 EXPECT_EQ("is greater than 32 and 5", Describe(m)); 850 EXPECT_EQ("not (is greater than 32 and 5)", DescribeNegation(m)); 851 EXPECT_EQ("", Explain(m, 36)); 852 EXPECT_EQ("", Explain(m, 5)); 853 } 854 855 // Tests that the description is calculated correctly from the matcher name. 856 MATCHER_P(_is_Greater_Than32and_, n, "") { return arg > 32 && arg > n; } 857 858 TEST(MatcherPMacroTest, GeneratesCorrectDescription) { 859 const Matcher<int> m = _is_Greater_Than32and_(5); 860 861 EXPECT_EQ("is greater than 32 and 5", Describe(m)); 862 EXPECT_EQ("not (is greater than 32 and 5)", DescribeNegation(m)); 863 EXPECT_EQ("", Explain(m, 36)); 864 EXPECT_EQ("", Explain(m, 5)); 865 } 866 867 // Tests that a MATCHER_P matcher can be explicitly instantiated with 868 // a reference parameter type. 869 870 class UncopyableFoo { 871 public: 872 explicit UncopyableFoo(char value) : value_(value) {} 873 private: 874 UncopyableFoo(const UncopyableFoo&); 875 void operator=(const UncopyableFoo&); 876 877 char value_; 878 }; 879 880 MATCHER_P(ReferencesUncopyable, variable, "") { return &arg == &variable; } 881 882 TEST(MatcherPMacroTest, WorksWhenExplicitlyInstantiatedWithReference) { 883 UncopyableFoo foo1('1'), foo2('2'); 884 const Matcher<const UncopyableFoo&> m = 885 ReferencesUncopyable<const UncopyableFoo&>(foo1); 886 887 EXPECT_TRUE(m.Matches(foo1)); 888 EXPECT_FALSE(m.Matches(foo2)); 889 890 // We don't want the address of the parameter printed, as most 891 // likely it will just annoy the user. If the address is 892 // interesting, the user should consider passing the parameter by 893 // pointer instead. 894 EXPECT_EQ("references uncopyable 1-byte object <31>", Describe(m)); 895 } 896 897 898 // Tests that the body of MATCHER_Pn() can reference the parameter 899 // types. 900 901 MATCHER_P3(ParamTypesAreIntLongAndChar, foo, bar, baz, "") { 902 StaticAssertTypeEq<int, foo_type>(); 903 StaticAssertTypeEq<long, bar_type>(); // NOLINT 904 StaticAssertTypeEq<char, baz_type>(); 905 return arg == 0; 906 } 907 908 TEST(MatcherPnMacroTest, CanReferenceParamTypes) { 909 EXPECT_THAT(0, ParamTypesAreIntLongAndChar(10, 20L, 'a')); 910 } 911 912 // Tests that a MATCHER_Pn matcher can be explicitly instantiated with 913 // reference parameter types. 914 915 MATCHER_P2(ReferencesAnyOf, variable1, variable2, "") { 916 return &arg == &variable1 || &arg == &variable2; 917 } 918 919 TEST(MatcherPnMacroTest, WorksWhenExplicitlyInstantiatedWithReferences) { 920 UncopyableFoo foo1('1'), foo2('2'), foo3('3'); 921 const Matcher<const UncopyableFoo&> m = 922 ReferencesAnyOf<const UncopyableFoo&, const UncopyableFoo&>(foo1, foo2); 923 924 EXPECT_TRUE(m.Matches(foo1)); 925 EXPECT_TRUE(m.Matches(foo2)); 926 EXPECT_FALSE(m.Matches(foo3)); 927 } 928 929 TEST(MatcherPnMacroTest, 930 GeneratesCorretDescriptionWhenExplicitlyInstantiatedWithReferences) { 931 UncopyableFoo foo1('1'), foo2('2'); 932 const Matcher<const UncopyableFoo&> m = 933 ReferencesAnyOf<const UncopyableFoo&, const UncopyableFoo&>(foo1, foo2); 934 935 // We don't want the addresses of the parameters printed, as most 936 // likely they will just annoy the user. If the addresses are 937 // interesting, the user should consider passing the parameters by 938 // pointers instead. 939 EXPECT_EQ("references any of (1-byte object <31>, 1-byte object <32>)", 940 Describe(m)); 941 } 942 943 // Tests that a simple MATCHER_P2() definition works. 944 945 MATCHER_P2(IsNotInClosedRange, low, hi, "") { return arg < low || arg > hi; } 946 947 TEST(MatcherPnMacroTest, Works) { 948 const Matcher<const long&> m = IsNotInClosedRange(10, 20); // NOLINT 949 EXPECT_TRUE(m.Matches(36L)); 950 EXPECT_FALSE(m.Matches(15L)); 951 952 EXPECT_EQ("is not in closed range (10, 20)", Describe(m)); 953 EXPECT_EQ("not (is not in closed range (10, 20))", DescribeNegation(m)); 954 EXPECT_EQ("", Explain(m, 36L)); 955 EXPECT_EQ("", Explain(m, 15L)); 956 } 957 958 // Tests that MATCHER*() definitions can be overloaded on the number 959 // of parameters; also tests MATCHER_Pn() where n >= 3. 960 961 MATCHER(EqualsSumOf, "") { return arg == 0; } 962 MATCHER_P(EqualsSumOf, a, "") { return arg == a; } 963 MATCHER_P2(EqualsSumOf, a, b, "") { return arg == a + b; } 964 MATCHER_P3(EqualsSumOf, a, b, c, "") { return arg == a + b + c; } 965 MATCHER_P4(EqualsSumOf, a, b, c, d, "") { return arg == a + b + c + d; } 966 MATCHER_P5(EqualsSumOf, a, b, c, d, e, "") { return arg == a + b + c + d + e; } 967 MATCHER_P6(EqualsSumOf, a, b, c, d, e, f, "") { 968 return arg == a + b + c + d + e + f; 969 } 970 MATCHER_P7(EqualsSumOf, a, b, c, d, e, f, g, "") { 971 return arg == a + b + c + d + e + f + g; 972 } 973 MATCHER_P8(EqualsSumOf, a, b, c, d, e, f, g, h, "") { 974 return arg == a + b + c + d + e + f + g + h; 975 } 976 MATCHER_P9(EqualsSumOf, a, b, c, d, e, f, g, h, i, "") { 977 return arg == a + b + c + d + e + f + g + h + i; 978 } 979 MATCHER_P10(EqualsSumOf, a, b, c, d, e, f, g, h, i, j, "") { 980 return arg == a + b + c + d + e + f + g + h + i + j; 981 } 982 983 TEST(MatcherPnMacroTest, CanBeOverloadedOnNumberOfParameters) { 984 EXPECT_THAT(0, EqualsSumOf()); 985 EXPECT_THAT(1, EqualsSumOf(1)); 986 EXPECT_THAT(12, EqualsSumOf(10, 2)); 987 EXPECT_THAT(123, EqualsSumOf(100, 20, 3)); 988 EXPECT_THAT(1234, EqualsSumOf(1000, 200, 30, 4)); 989 EXPECT_THAT(12345, EqualsSumOf(10000, 2000, 300, 40, 5)); 990 EXPECT_THAT("abcdef", 991 EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f')); 992 EXPECT_THAT("abcdefg", 993 EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g')); 994 EXPECT_THAT("abcdefgh", 995 EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 996 "h")); 997 EXPECT_THAT("abcdefghi", 998 EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 999 "h", 'i')); 1000 EXPECT_THAT("abcdefghij", 1001 EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 1002 "h", 'i', ::std::string("j"))); 1003 1004 EXPECT_THAT(1, Not(EqualsSumOf())); 1005 EXPECT_THAT(-1, Not(EqualsSumOf(1))); 1006 EXPECT_THAT(-12, Not(EqualsSumOf(10, 2))); 1007 EXPECT_THAT(-123, Not(EqualsSumOf(100, 20, 3))); 1008 EXPECT_THAT(-1234, Not(EqualsSumOf(1000, 200, 30, 4))); 1009 EXPECT_THAT(-12345, Not(EqualsSumOf(10000, 2000, 300, 40, 5))); 1010 EXPECT_THAT("abcdef ", 1011 Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f'))); 1012 EXPECT_THAT("abcdefg ", 1013 Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 1014 'g'))); 1015 EXPECT_THAT("abcdefgh ", 1016 Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 1017 "h"))); 1018 EXPECT_THAT("abcdefghi ", 1019 Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 1020 "h", 'i'))); 1021 EXPECT_THAT("abcdefghij ", 1022 Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 1023 "h", 'i', ::std::string("j")))); 1024 } 1025 1026 // Tests that a MATCHER_Pn() definition can be instantiated with any 1027 // compatible parameter types. 1028 TEST(MatcherPnMacroTest, WorksForDifferentParameterTypes) { 1029 EXPECT_THAT(123, EqualsSumOf(100L, 20, static_cast<char>(3))); 1030 EXPECT_THAT("abcd", EqualsSumOf(::std::string("a"), "b", 'c', "d")); 1031 1032 EXPECT_THAT(124, Not(EqualsSumOf(100L, 20, static_cast<char>(3)))); 1033 EXPECT_THAT("abcde", Not(EqualsSumOf(::std::string("a"), "b", 'c', "d"))); 1034 } 1035 1036 // Tests that the matcher body can promote the parameter types. 1037 1038 MATCHER_P2(EqConcat, prefix, suffix, "") { 1039 // The following lines promote the two parameters to desired types. 1040 std::string prefix_str(prefix); 1041 char suffix_char = static_cast<char>(suffix); 1042 return arg == prefix_str + suffix_char; 1043 } 1044 1045 TEST(MatcherPnMacroTest, SimpleTypePromotion) { 1046 Matcher<std::string> no_promo = 1047 EqConcat(std::string("foo"), 't'); 1048 Matcher<const std::string&> promo = 1049 EqConcat("foo", static_cast<int>('t')); 1050 EXPECT_FALSE(no_promo.Matches("fool")); 1051 EXPECT_FALSE(promo.Matches("fool")); 1052 EXPECT_TRUE(no_promo.Matches("foot")); 1053 EXPECT_TRUE(promo.Matches("foot")); 1054 } 1055 1056 // Verifies the type of a MATCHER*. 1057 1058 TEST(MatcherPnMacroTest, TypesAreCorrect) { 1059 // EqualsSumOf() must be assignable to a EqualsSumOfMatcher variable. 1060 EqualsSumOfMatcher a0 = EqualsSumOf(); 1061 1062 // EqualsSumOf(1) must be assignable to a EqualsSumOfMatcherP variable. 1063 EqualsSumOfMatcherP<int> a1 = EqualsSumOf(1); 1064 1065 // EqualsSumOf(p1, ..., pk) must be assignable to a EqualsSumOfMatcherPk 1066 // variable, and so on. 1067 EqualsSumOfMatcherP2<int, char> a2 = EqualsSumOf(1, '2'); 1068 EqualsSumOfMatcherP3<int, int, char> a3 = EqualsSumOf(1, 2, '3'); 1069 EqualsSumOfMatcherP4<int, int, int, char> a4 = EqualsSumOf(1, 2, 3, '4'); 1070 EqualsSumOfMatcherP5<int, int, int, int, char> a5 = 1071 EqualsSumOf(1, 2, 3, 4, '5'); 1072 EqualsSumOfMatcherP6<int, int, int, int, int, char> a6 = 1073 EqualsSumOf(1, 2, 3, 4, 5, '6'); 1074 EqualsSumOfMatcherP7<int, int, int, int, int, int, char> a7 = 1075 EqualsSumOf(1, 2, 3, 4, 5, 6, '7'); 1076 EqualsSumOfMatcherP8<int, int, int, int, int, int, int, char> a8 = 1077 EqualsSumOf(1, 2, 3, 4, 5, 6, 7, '8'); 1078 EqualsSumOfMatcherP9<int, int, int, int, int, int, int, int, char> a9 = 1079 EqualsSumOf(1, 2, 3, 4, 5, 6, 7, 8, '9'); 1080 EqualsSumOfMatcherP10<int, int, int, int, int, int, int, int, int, char> a10 = 1081 EqualsSumOf(1, 2, 3, 4, 5, 6, 7, 8, 9, '0'); 1082 1083 // Avoid "unused variable" warnings. 1084 (void)a0; 1085 (void)a1; 1086 (void)a2; 1087 (void)a3; 1088 (void)a4; 1089 (void)a5; 1090 (void)a6; 1091 (void)a7; 1092 (void)a8; 1093 (void)a9; 1094 (void)a10; 1095 } 1096 1097 // Tests that matcher-typed parameters can be used in Value() inside a 1098 // MATCHER_Pn definition. 1099 1100 // Succeeds if arg matches exactly 2 of the 3 matchers. 1101 MATCHER_P3(TwoOf, m1, m2, m3, "") { 1102 const int count = static_cast<int>(Value(arg, m1)) 1103 + static_cast<int>(Value(arg, m2)) + static_cast<int>(Value(arg, m3)); 1104 return count == 2; 1105 } 1106 1107 TEST(MatcherPnMacroTest, CanUseMatcherTypedParameterInValue) { 1108 EXPECT_THAT(42, TwoOf(Gt(0), Lt(50), Eq(10))); 1109 EXPECT_THAT(0, Not(TwoOf(Gt(-1), Lt(1), Eq(0)))); 1110 } 1111 1112 // Tests Contains(). 1113 1114 TEST(ContainsTest, ListMatchesWhenElementIsInContainer) { 1115 list<int> some_list; 1116 some_list.push_back(3); 1117 some_list.push_back(1); 1118 some_list.push_back(2); 1119 EXPECT_THAT(some_list, Contains(1)); 1120 EXPECT_THAT(some_list, Contains(Gt(2.5))); 1121 EXPECT_THAT(some_list, Contains(Eq(2.0f))); 1122 1123 list<string> another_list; 1124 another_list.push_back("fee"); 1125 another_list.push_back("fie"); 1126 another_list.push_back("foe"); 1127 another_list.push_back("fum"); 1128 EXPECT_THAT(another_list, Contains(string("fee"))); 1129 } 1130 1131 TEST(ContainsTest, ListDoesNotMatchWhenElementIsNotInContainer) { 1132 list<int> some_list; 1133 some_list.push_back(3); 1134 some_list.push_back(1); 1135 EXPECT_THAT(some_list, Not(Contains(4))); 1136 } 1137 1138 TEST(ContainsTest, SetMatchesWhenElementIsInContainer) { 1139 set<int> some_set; 1140 some_set.insert(3); 1141 some_set.insert(1); 1142 some_set.insert(2); 1143 EXPECT_THAT(some_set, Contains(Eq(1.0))); 1144 EXPECT_THAT(some_set, Contains(Eq(3.0f))); 1145 EXPECT_THAT(some_set, Contains(2)); 1146 1147 set<const char*> another_set; 1148 another_set.insert("fee"); 1149 another_set.insert("fie"); 1150 another_set.insert("foe"); 1151 another_set.insert("fum"); 1152 EXPECT_THAT(another_set, Contains(Eq(string("fum")))); 1153 } 1154 1155 TEST(ContainsTest, SetDoesNotMatchWhenElementIsNotInContainer) { 1156 set<int> some_set; 1157 some_set.insert(3); 1158 some_set.insert(1); 1159 EXPECT_THAT(some_set, Not(Contains(4))); 1160 1161 set<const char*> c_string_set; 1162 c_string_set.insert("hello"); 1163 EXPECT_THAT(c_string_set, Not(Contains(string("hello").c_str()))); 1164 } 1165 1166 TEST(ContainsTest, ExplainsMatchResultCorrectly) { 1167 const int a[2] = { 1, 2 }; 1168 Matcher<const int (&)[2]> m = Contains(2); 1169 EXPECT_EQ("whose element #1 matches", Explain(m, a)); 1170 1171 m = Contains(3); 1172 EXPECT_EQ("", Explain(m, a)); 1173 1174 m = Contains(GreaterThan(0)); 1175 EXPECT_EQ("whose element #0 matches, which is 1 more than 0", Explain(m, a)); 1176 1177 m = Contains(GreaterThan(10)); 1178 EXPECT_EQ("", Explain(m, a)); 1179 } 1180 1181 TEST(ContainsTest, DescribesItselfCorrectly) { 1182 Matcher<vector<int> > m = Contains(1); 1183 EXPECT_EQ("contains at least one element that is equal to 1", Describe(m)); 1184 1185 Matcher<vector<int> > m2 = Not(m); 1186 EXPECT_EQ("doesn't contain any element that is equal to 1", Describe(m2)); 1187 } 1188 1189 TEST(ContainsTest, MapMatchesWhenElementIsInContainer) { 1190 map<const char*, int> my_map; 1191 const char* bar = "a string"; 1192 my_map[bar] = 2; 1193 EXPECT_THAT(my_map, Contains(pair<const char* const, int>(bar, 2))); 1194 1195 map<string, int> another_map; 1196 another_map["fee"] = 1; 1197 another_map["fie"] = 2; 1198 another_map["foe"] = 3; 1199 another_map["fum"] = 4; 1200 EXPECT_THAT(another_map, Contains(pair<const string, int>(string("fee"), 1))); 1201 EXPECT_THAT(another_map, Contains(pair<const string, int>("fie", 2))); 1202 } 1203 1204 TEST(ContainsTest, MapDoesNotMatchWhenElementIsNotInContainer) { 1205 map<int, int> some_map; 1206 some_map[1] = 11; 1207 some_map[2] = 22; 1208 EXPECT_THAT(some_map, Not(Contains(pair<const int, int>(2, 23)))); 1209 } 1210 1211 TEST(ContainsTest, ArrayMatchesWhenElementIsInContainer) { 1212 const char* string_array[] = { "fee", "fie", "foe", "fum" }; 1213 EXPECT_THAT(string_array, Contains(Eq(string("fum")))); 1214 } 1215 1216 TEST(ContainsTest, ArrayDoesNotMatchWhenElementIsNotInContainer) { 1217 int int_array[] = { 1, 2, 3, 4 }; 1218 EXPECT_THAT(int_array, Not(Contains(5))); 1219 } 1220 1221 TEST(ContainsTest, AcceptsMatcher) { 1222 const int a[] = { 1, 2, 3 }; 1223 EXPECT_THAT(a, Contains(Gt(2))); 1224 EXPECT_THAT(a, Not(Contains(Gt(4)))); 1225 } 1226 1227 TEST(ContainsTest, WorksForNativeArrayAsTuple) { 1228 const int a[] = { 1, 2 }; 1229 const int* const pointer = a; 1230 EXPECT_THAT(make_tuple(pointer, 2), Contains(1)); 1231 EXPECT_THAT(make_tuple(pointer, 2), Not(Contains(Gt(3)))); 1232 } 1233 1234 TEST(ContainsTest, WorksForTwoDimensionalNativeArray) { 1235 int a[][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; 1236 EXPECT_THAT(a, Contains(ElementsAre(4, 5, 6))); 1237 EXPECT_THAT(a, Contains(Contains(5))); 1238 EXPECT_THAT(a, Not(Contains(ElementsAre(3, 4, 5)))); 1239 EXPECT_THAT(a, Contains(Not(Contains(5)))); 1240 } 1241 1242 TEST(AllOfTest, HugeMatcher) { 1243 // Verify that using AllOf with many arguments doesn't cause 1244 // the compiler to exceed template instantiation depth limit. 1245 EXPECT_THAT(0, testing::AllOf(_, _, _, _, _, _, _, _, _, 1246 testing::AllOf(_, _, _, _, _, _, _, _, _, _))); 1247 } 1248 1249 TEST(AnyOfTest, HugeMatcher) { 1250 // Verify that using AnyOf with many arguments doesn't cause 1251 // the compiler to exceed template instantiation depth limit. 1252 EXPECT_THAT(0, testing::AnyOf(_, _, _, _, _, _, _, _, _, 1253 testing::AnyOf(_, _, _, _, _, _, _, _, _, _))); 1254 } 1255 1256 namespace adl_test { 1257 1258 // Verifies that the implementation of ::testing::AllOf and ::testing::AnyOf 1259 // don't issue unqualified recursive calls. If they do, the argument dependent 1260 // name lookup will cause AllOf/AnyOf in the 'adl_test' namespace to be found 1261 // as a candidate and the compilation will break due to an ambiguous overload. 1262 1263 // The matcher must be in the same namespace as AllOf/AnyOf to make argument 1264 // dependent lookup find those. 1265 MATCHER(M, "") { return true; } 1266 1267 template <typename T1, typename T2> 1268 bool AllOf(const T1& t1, const T2& t2) { return true; } 1269 1270 TEST(AllOfTest, DoesNotCallAllOfUnqualified) { 1271 EXPECT_THAT(42, testing::AllOf( 1272 M(), M(), M(), M(), M(), M(), M(), M(), M(), M())); 1273 } 1274 1275 template <typename T1, typename T2> bool 1276 AnyOf(const T1& t1, const T2& t2) { return true; } 1277 1278 TEST(AnyOfTest, DoesNotCallAnyOfUnqualified) { 1279 EXPECT_THAT(42, testing::AnyOf( 1280 M(), M(), M(), M(), M(), M(), M(), M(), M(), M())); 1281 } 1282 1283 } // namespace adl_test 1284 1285 #ifdef _MSC_VER 1286 # pragma warning(pop) 1287 #endif 1288 1289 } // namespace