1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc. 2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved. 3e35fdd936d133bf8a48de140a3c666897588a05shiqian// 4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without 5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are 6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met: 7e35fdd936d133bf8a48de140a3c666897588a05shiqian// 8e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions of source code must retain the above copyright 9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer. 10e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Redistributions in binary form must reproduce the above 11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer 12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the 13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution. 14e35fdd936d133bf8a48de140a3c666897588a05shiqian// * Neither the name of Google Inc. nor the names of its 15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from 16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission. 17e35fdd936d133bf8a48de140a3c666897588a05shiqian// 18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e35fdd936d133bf8a48de140a3c666897588a05shiqian// 30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan) 31e35fdd936d133bf8a48de140a3c666897588a05shiqian 32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes. 33e35fdd936d133bf8a48de140a3c666897588a05shiqian// 34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file tests some commonly used argument matchers. 35e35fdd936d133bf8a48de140a3c666897588a05shiqian 3653e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-matchers.h" 37320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan#include "gmock/gmock-more-matchers.h" 38e35fdd936d133bf8a48de140a3c666897588a05shiqian 39e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string.h> 40fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan#include <time.h> 41a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan#include <deque> 42e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <functional> 43a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan#include <iostream> 44a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan#include <iterator> 45616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#include <limits> 466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <list> 476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <map> 486a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <set> 49e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <sstream> 506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <string> 51f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan#include <utility> 526a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <vector> 5353e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h" 5453e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h" 5553e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest-spi.h" 56e35fdd936d133bf8a48de140a3c666897588a05shiqian 575b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#if GTEST_HAS_STD_FORWARD_LIST_ 58b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak# include <forward_list> // NOLINT 59b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak#endif 60b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak 61e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing { 624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wannamespace internal { 64587c1b37c2f0b6d430fb13ce09326db0135b557cvladlosevGTEST_API_ string JoinAsTuple(const Strings& fields); 654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} // namespace internal 664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 67e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace gmock_matchers_test { 68e35fdd936d133bf8a48de140a3c666897588a05shiqian 69898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing std::greater; 70898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing std::less; 71ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing std::list; 72b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing std::make_pair; 73b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::map; 74b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::multimap; 75ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing std::multiset; 76ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing std::ostream; 77b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing std::pair; 7833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanusing std::set; 79e35fdd936d133bf8a48de140a3c666897588a05shiqianusing std::stringstream; 8033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanusing std::vector; 81e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::A; 82bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanusing testing::AllArgs; 83e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AllOf; 84e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::An; 85e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AnyOf; 86e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ByRef; 87b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::ContainsRegex; 88e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DoubleEq; 89616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::DoubleNear; 90e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::EndsWith; 91e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Eq; 92b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::ExplainMatchResult; 93e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Field; 94e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::FloatEq; 95616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::FloatNear; 96e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ge; 97e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Gt; 98e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::HasSubstr; 99320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanusing testing::IsEmpty; 1002d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanusing testing::IsNull; 101b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing testing::Key; 102e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Le; 103e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Lt; 104e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakeMatcher; 105e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakePolymorphicMatcher; 106b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::MatchResultListener; 107e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matcher; 108e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherCast; 109e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherInterface; 110e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matches; 111b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::MatchesRegex; 112e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveDoubleEq; 113616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::NanSensitiveDoubleNear; 114e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveFloatEq; 115616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::NanSensitiveFloatNear; 116e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ne; 117e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Not; 118e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NotNull; 119f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanusing testing::Pair; 120e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Pointee; 121ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing testing::Pointwise; 122e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::PolymorphicMatcher; 123e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Property; 124e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ref; 125e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ResultOf; 126a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanusing testing::SizeIs; 127e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StartsWith; 128e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseEq; 129e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseNe; 130e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrEq; 131e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrNe; 1322336e9c171b5894bac98f828289f537e29691896kosakusing testing::StringMatchResultListener; 133e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Truly; 134e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::TypedEq; 1352336e9c171b5894bac98f828289f537e29691896kosakusing testing::UnorderedPointwise; 136b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanusing testing::Value; 137898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing testing::WhenSorted; 138898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing testing::WhenSortedBy; 139e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::_; 1402336e9c171b5894bac98f828289f537e29691896kosakusing testing::get; 141a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanusing testing::internal::DummyMatchResultListener; 142fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanusing testing::internal::ElementMatcherPair; 143fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanusing testing::internal::ElementMatcherPairs; 144b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::ExplainMatchFailureTupleTo; 145e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::FloatingEqMatcher; 146b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wanusing testing::internal::FormatMatcherDescription; 147736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanusing testing::internal::IsReadableTypeName; 1484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::JoinAsTuple; 149f6df4c6baf244bc35a385b49ffb32be405f44e0ekosakusing testing::internal::linked_ptr; 150fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanusing testing::internal::MatchMatrix; 151b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::RE; 152f6df4c6baf244bc35a385b49ffb32be405f44e0ekosakusing testing::internal::scoped_ptr; 153a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanusing testing::internal::StreamMatchResultListener; 154b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::Strings; 15579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevusing testing::internal::linked_ptr; 156e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosevusing testing::internal::scoped_ptr; 157e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::string; 1582336e9c171b5894bac98f828289f537e29691896kosakusing testing::make_tuple; 1592336e9c171b5894bac98f828289f537e29691896kosakusing testing::tuple; 160e35fdd936d133bf8a48de140a3c666897588a05shiqian 161f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// For testing ExplainMatchResultTo(). 162f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass GreaterThanMatcher : public MatcherInterface<int> { 163f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public: 164f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} 165f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 166ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual void DescribeTo(ostream* os) const { 167b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "is > " << rhs_; 168f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 169f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 170db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan virtual bool MatchAndExplain(int lhs, 171db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 172f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const int diff = lhs - rhs_; 173f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan if (diff > 0) { 174676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which is " << diff << " more than " << rhs_; 175f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } else if (diff == 0) { 176676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which is the same as " << rhs_; 177f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } else { 178676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which is " << -diff << " less than " << rhs_; 179f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 180db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan 181db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return lhs > rhs_; 182f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 18332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 184f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private: 18532de5f53763125925e078498250f7e73a88de9edzhanyong.wan int rhs_; 186f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}; 187f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 188f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanMatcher<int> GreaterThan(int n) { 189f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan return MakeMatcher(new GreaterThanMatcher(n)); 190f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 191f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 192736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanstring OfType(const string& type_name) { 193736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#if GTEST_HAS_RTTI 194736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan return " (of type " + type_name + ")"; 195736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#else 196736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan return ""; 197736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#endif 198736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan} 199736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 200e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the given matcher. 201e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 202e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Describe(const Matcher<T>& m) { 203e35fdd936d133bf8a48de140a3c666897588a05shiqian stringstream ss; 204e35fdd936d133bf8a48de140a3c666897588a05shiqian m.DescribeTo(&ss); 205e35fdd936d133bf8a48de140a3c666897588a05shiqian return ss.str(); 206e35fdd936d133bf8a48de140a3c666897588a05shiqian} 207e35fdd936d133bf8a48de140a3c666897588a05shiqian 208e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the negation of the given matcher. 209e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 210e35fdd936d133bf8a48de140a3c666897588a05shiqianstring DescribeNegation(const Matcher<T>& m) { 211e35fdd936d133bf8a48de140a3c666897588a05shiqian stringstream ss; 212e35fdd936d133bf8a48de140a3c666897588a05shiqian m.DescribeNegationTo(&ss); 213e35fdd936d133bf8a48de140a3c666897588a05shiqian return ss.str(); 214e35fdd936d133bf8a48de140a3c666897588a05shiqian} 215e35fdd936d133bf8a48de140a3c666897588a05shiqian 216e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the reason why x matches, or doesn't match, m. 217e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherType, typename Value> 218e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Explain(const MatcherType& m, const Value& x) { 219ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan StringMatchResultListener listener; 220ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan ExplainMatchResult(m, x, &listener); 221ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return listener.str(); 222e35fdd936d133bf8a48de140a3c666897588a05shiqian} 223e35fdd936d133bf8a48de140a3c666897588a05shiqian 224a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, StreamingWorks) { 225a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan StringMatchResultListener listener; 226a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan listener << "hi" << 5; 227a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_EQ("hi5", listener.str()); 228a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 2291cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan listener.Clear(); 2301cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_EQ("", listener.str()); 2311cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 2321cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan listener << 42; 2331cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_EQ("42", listener.str()); 2341cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 235a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // Streaming shouldn't crash when the underlying ostream is NULL. 236a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan DummyMatchResultListener dummy; 237a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan dummy << "hi" << 5; 238a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan} 239a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 240a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, CanAccessUnderlyingStream) { 241a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_TRUE(DummyMatchResultListener().stream() == NULL); 242a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL); 243a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 244a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream()); 245a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan} 246a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 247a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, IsInterestedWorks) { 248a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_TRUE(StringMatchResultListener().IsInterested()); 249a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested()); 250a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 251a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_FALSE(DummyMatchResultListener().IsInterested()); 252a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested()); 253a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan} 254a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 255e35fdd936d133bf8a48de140a3c666897588a05shiqian// Makes sure that the MatcherInterface<T> interface doesn't 256e35fdd936d133bf8a48de140a3c666897588a05shiqian// change. 257e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EvenMatcherImpl : public MatcherInterface<int> { 258e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 259db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan virtual bool MatchAndExplain(int x, 260db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 261db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return x % 2 == 0; 262db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 263e35fdd936d133bf8a48de140a3c666897588a05shiqian 264ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual void DescribeTo(ostream* os) const { 265e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is an even number"; 266e35fdd936d133bf8a48de140a3c666897588a05shiqian } 267e35fdd936d133bf8a48de140a3c666897588a05shiqian 268e35fdd936d133bf8a48de140a3c666897588a05shiqian // We deliberately don't define DescribeNegationTo() and 269e35fdd936d133bf8a48de140a3c666897588a05shiqian // ExplainMatchResultTo() here, to make sure the definition of these 270e35fdd936d133bf8a48de140a3c666897588a05shiqian // two methods is optional. 271e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 272e35fdd936d133bf8a48de140a3c666897588a05shiqian 273a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan// Makes sure that the MatcherInterface API doesn't change. 274a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) { 275e35fdd936d133bf8a48de140a3c666897588a05shiqian EvenMatcherImpl m; 276e35fdd936d133bf8a48de140a3c666897588a05shiqian} 277e35fdd936d133bf8a48de140a3c666897588a05shiqian 278821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests implementing a monomorphic matcher using MatchAndExplain(). 279821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 280821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass NewEvenMatcherImpl : public MatcherInterface<int> { 281821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 282821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(int x, MatchResultListener* listener) const { 283821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const bool match = x % 2 == 0; 284821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Verifies that we can stream to a listener directly. 285821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << "value % " << 2; 286821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (listener->stream() != NULL) { 287821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Verifies that we can stream to a listener's underlying stream 288821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // too. 289821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener->stream() << " == " << (x % 2); 290821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 291821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return match; 292821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 293821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 294ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual void DescribeTo(ostream* os) const { 295821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *os << "is an even number"; 296821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 297821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 298821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 299821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) { 300821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl); 301821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_TRUE(m.Matches(2)); 302821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_FALSE(m.Matches(3)); 303821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("value % 2 == 0", Explain(m, 2)); 304821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("value % 2 == 1", Explain(m, 3)); 305821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan} 306821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 307e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests default-constructing a matcher. 308e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeDefaultConstructed) { 309e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m; 310e35fdd936d133bf8a48de140a3c666897588a05shiqian} 311e35fdd936d133bf8a48de140a3c666897588a05shiqian 312e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*. 313e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeConstructedFromMatcherInterface) { 314e35fdd936d133bf8a48de140a3c666897588a05shiqian const MatcherInterface<int>* impl = new EvenMatcherImpl; 315e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m(impl); 316e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(4)); 317e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(5)); 318e35fdd936d133bf8a48de140a3c666897588a05shiqian} 319e35fdd936d133bf8a48de140a3c666897588a05shiqian 320e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that value can be used in place of Eq(value). 321e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) { 322e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = 5; 323e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(5)); 324e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(6)); 325e35fdd936d133bf8a48de140a3c666897588a05shiqian} 326e35fdd936d133bf8a48de140a3c666897588a05shiqian 327e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NULL can be used in place of Eq(NULL). 328e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) { 329e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int*> m1 = NULL; 330e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(NULL)); 331e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 332e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(&n)); 333e35fdd936d133bf8a48de140a3c666897588a05shiqian} 334e35fdd936d133bf8a48de140a3c666897588a05shiqian 335e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that matchers are copyable. 336e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, IsCopyable) { 337e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests the copy constructor. 338e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<bool> m1 = Eq(false); 339e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(false)); 340e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(true)); 341e35fdd936d133bf8a48de140a3c666897588a05shiqian 342e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests the assignment operator. 343e35fdd936d133bf8a48de140a3c666897588a05shiqian m1 = Eq(true); 344e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(true)); 345e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(false)); 346e35fdd936d133bf8a48de140a3c666897588a05shiqian} 347e35fdd936d133bf8a48de140a3c666897588a05shiqian 348e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T>::DescribeTo() calls 349e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T>::DescribeTo(). 350e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanDescribeItself) { 351e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is an even number", 352e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(Matcher<int>(new EvenMatcherImpl))); 353e35fdd936d133bf8a48de140a3c666897588a05shiqian} 354e35fdd936d133bf8a48de140a3c666897588a05shiqian 355821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests Matcher<T>::MatchAndExplain(). 356821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MatcherTest, MatchAndExplain) { 357821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan Matcher<int> m = GreaterThan(0); 35834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan StringMatchResultListener listener1; 359821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_TRUE(m.MatchAndExplain(42, &listener1)); 360676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("which is 42 more than 0", listener1.str()); 361821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 36234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan StringMatchResultListener listener2; 363821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_FALSE(m.MatchAndExplain(-9, &listener2)); 364676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("which is 9 less than 0", listener2.str()); 365821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan} 366821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 367e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a C-string literal can be implicitly converted to a 368e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>. 369e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 370e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m1 = "hi"; 371e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("hi")); 372e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("hello")); 373e35fdd936d133bf8a48de140a3c666897588a05shiqian 374e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = "hi"; 375e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hi")); 376e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("hello")); 377e35fdd936d133bf8a48de140a3c666897588a05shiqian} 378e35fdd936d133bf8a48de140a3c666897588a05shiqian 379e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a string object can be implicitly converted to a 380e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>. 381e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) { 382e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m1 = string("hi"); 383e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("hi")); 384e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("hello")); 385e35fdd936d133bf8a48de140a3c666897588a05shiqian 386e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = string("hi"); 387e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hi")); 388e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("hello")); 389e35fdd936d133bf8a48de140a3c666897588a05shiqian} 390e35fdd936d133bf8a48de140a3c666897588a05shiqian 3911f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan#if GTEST_HAS_STRING_PIECE_ 3921f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Tests that a C-string literal can be implicitly converted to a 3931f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Matcher<StringPiece> or Matcher<const StringPiece&>. 3941f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wanTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 3951f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan Matcher<StringPiece> m1 = "cats"; 3961f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_TRUE(m1.Matches("cats")); 3971f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_FALSE(m1.Matches("dogs")); 3981f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan 3991f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan Matcher<const StringPiece&> m2 = "cats"; 4001f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_TRUE(m2.Matches("cats")); 4011f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_FALSE(m2.Matches("dogs")); 4021f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan} 4031f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan 4041f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Tests that a string object can be implicitly converted to a 4051f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Matcher<StringPiece> or Matcher<const StringPiece&>. 4061f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wanTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromString) { 4071f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan Matcher<StringPiece> m1 = string("cats"); 4081f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_TRUE(m1.Matches("cats")); 4091f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_FALSE(m1.Matches("dogs")); 4101f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan 4111f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan Matcher<const StringPiece&> m2 = string("cats"); 4121f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_TRUE(m2.Matches("cats")); 4131f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_FALSE(m2.Matches("dogs")); 4141f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan} 4151f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan 4161f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Tests that a StringPiece object can be implicitly converted to a 4171f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Matcher<StringPiece> or Matcher<const StringPiece&>. 4181f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wanTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromStringPiece) { 4191f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan Matcher<StringPiece> m1 = StringPiece("cats"); 4201f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_TRUE(m1.Matches("cats")); 4211f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_FALSE(m1.Matches("dogs")); 4221f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan 4231f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan Matcher<const StringPiece&> m2 = StringPiece("cats"); 4241f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_TRUE(m2.Matches("cats")); 4251f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan EXPECT_FALSE(m2.Matches("dogs")); 4261f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan} 4271f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan#endif // GTEST_HAS_STRING_PIECE_ 4281f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan 429e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MakeMatcher() constructs a Matcher<T> from a 430e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface* without requiring the user to explicitly 431e35fdd936d133bf8a48de140a3c666897588a05shiqian// write the type. 432e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { 433e35fdd936d133bf8a48de140a3c666897588a05shiqian const MatcherInterface<int>* dummy_impl = NULL; 434e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = MakeMatcher(dummy_impl); 435e35fdd936d133bf8a48de140a3c666897588a05shiqian} 436e35fdd936d133bf8a48de140a3c666897588a05shiqian 437821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests that MakePolymorphicMatcher() can construct a polymorphic 438821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// matcher from its implementation using the old API. 43933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanconst int g_bar = 1; 440e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ReferencesBarOrIsZeroImpl { 441e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 442e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 443db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const T& x, 444db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 445e35fdd936d133bf8a48de140a3c666897588a05shiqian const void* p = &x; 44633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return p == &g_bar || x == 0; 447e35fdd936d133bf8a48de140a3c666897588a05shiqian } 448e35fdd936d133bf8a48de140a3c666897588a05shiqian 449ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeTo(ostream* os) const { *os << "g_bar or zero"; } 450e35fdd936d133bf8a48de140a3c666897588a05shiqian 451ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeNegationTo(ostream* os) const { 45233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan *os << "doesn't reference g_bar and is not zero"; 453e35fdd936d133bf8a48de140a3c666897588a05shiqian } 454e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 455e35fdd936d133bf8a48de140a3c666897588a05shiqian 456e35fdd936d133bf8a48de140a3c666897588a05shiqian// This function verifies that MakePolymorphicMatcher() returns a 457e35fdd936d133bf8a48de140a3c666897588a05shiqian// PolymorphicMatcher<T> where T is the argument's type. 458e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() { 459e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); 460e35fdd936d133bf8a48de140a3c666897588a05shiqian} 461e35fdd936d133bf8a48de140a3c666897588a05shiqian 462821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) { 463e35fdd936d133bf8a48de140a3c666897588a05shiqian // Using a polymorphic matcher to match a reference type. 464e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m1 = ReferencesBarOrIsZero(); 465e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(0)); 466e35fdd936d133bf8a48de140a3c666897588a05shiqian // Verifies that the identity of a by-reference argument is preserved. 46733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_TRUE(m1.Matches(g_bar)); 468e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(1)); 46933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("g_bar or zero", Describe(m1)); 470e35fdd936d133bf8a48de140a3c666897588a05shiqian 471e35fdd936d133bf8a48de140a3c666897588a05shiqian // Using a polymorphic matcher to match a value type. 472e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m2 = ReferencesBarOrIsZero(); 473e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0.0)); 474e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(0.1)); 47533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("g_bar or zero", Describe(m2)); 476e35fdd936d133bf8a48de140a3c666897588a05shiqian} 477e35fdd936d133bf8a48de140a3c666897588a05shiqian 478821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests implementing a polymorphic matcher using MatchAndExplain(). 479821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 480821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass PolymorphicIsEvenImpl { 481821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 482ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeTo(ostream* os) const { *os << "is even"; } 483821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 484ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeNegationTo(ostream* os) const { 485821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *os << "is odd"; 486821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 487821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 488db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan template <typename T> 489db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const T& x, MatchResultListener* listener) const { 490db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // Verifies that we can stream to the listener directly. 491db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan *listener << "% " << 2; 492db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan if (listener->stream() != NULL) { 493db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // Verifies that we can stream to the listener's underlying stream 494db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // too. 495db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan *listener->stream() << " == " << (x % 2); 496db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 497db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return (x % 2) == 0; 498821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 499db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan}; 500821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 501821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanPolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() { 502821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return MakePolymorphicMatcher(PolymorphicIsEvenImpl()); 503821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan} 504821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 505821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) { 506821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Using PolymorphicIsEven() as a Matcher<int>. 507821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const Matcher<int> m1 = PolymorphicIsEven(); 508821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_TRUE(m1.Matches(42)); 509821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_FALSE(m1.Matches(43)); 510821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("is even", Describe(m1)); 511821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 512821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const Matcher<int> not_m1 = Not(m1); 513821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("is odd", Describe(not_m1)); 514821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 515821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("% 2 == 0", Explain(m1, 42)); 516821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 517821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Using PolymorphicIsEven() as a Matcher<char>. 518821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const Matcher<char> m2 = PolymorphicIsEven(); 519821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_TRUE(m2.Matches('\x42')); 520821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_FALSE(m2.Matches('\x43')); 521821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("is even", Describe(m2)); 522821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 523821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const Matcher<char> not_m2 = Not(m2); 524821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("is odd", Describe(not_m2)); 525821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 526821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan EXPECT_EQ("% 2 == 0", Explain(m2, '\x42')); 527821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan} 528821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 529e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher. 530e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromPolymorphicMatcher) { 531e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = MatcherCast<int>(Eq(5)); 532e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(5)); 533e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(6)); 534e35fdd936d133bf8a48de140a3c666897588a05shiqian} 535e35fdd936d133bf8a48de140a3c666897588a05shiqian 536e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types. 537e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IntValue { 538e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 539e35fdd936d133bf8a48de140a3c666897588a05shiqian // An int can be statically (although not implicitly) cast to a 540e35fdd936d133bf8a48de140a3c666897588a05shiqian // IntValue. 54132de5f53763125925e078498250f7e73a88de9edzhanyong.wan explicit IntValue(int a_value) : value_(a_value) {} 542e35fdd936d133bf8a48de140a3c666897588a05shiqian 543e35fdd936d133bf8a48de140a3c666897588a05shiqian int value() const { return value_; } 544e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 545e35fdd936d133bf8a48de140a3c666897588a05shiqian int value_; 546e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 547e35fdd936d133bf8a48de140a3c666897588a05shiqian 548e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types. 549e35fdd936d133bf8a48de140a3c666897588a05shiqianbool IsPositiveIntValue(const IntValue& foo) { 550e35fdd936d133bf8a48de140a3c666897588a05shiqian return foo.value() > 0; 551e35fdd936d133bf8a48de140a3c666897588a05shiqian} 552e35fdd936d133bf8a48de140a3c666897588a05shiqian 553e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T 554e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be statically converted to U. 555e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromCompatibleType) { 556e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = Eq(2.0); 557e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 558e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(2)); 559e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(3)); 560e35fdd936d133bf8a48de140a3c666897588a05shiqian 561e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<IntValue> m3 = Truly(IsPositiveIntValue); 562e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m4 = MatcherCast<int>(m3); 563e35fdd936d133bf8a48de140a3c666897588a05shiqian // In the following, the arguments 1 and 0 are statically converted 564e35fdd936d133bf8a48de140a3c666897588a05shiqian // to IntValue objects, and then tested by the IsPositiveIntValue() 565e35fdd936d133bf8a48de140a3c666897588a05shiqian // predicate. 566e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(1)); 567e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m4.Matches(0)); 568e35fdd936d133bf8a48de140a3c666897588a05shiqian} 569e35fdd936d133bf8a48de140a3c666897588a05shiqian 570e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>. 571e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromConstReferenceToNonReference) { 572e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m1 = Eq(0); 573e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 574e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 575e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 576e35fdd936d133bf8a48de140a3c666897588a05shiqian} 577e35fdd936d133bf8a48de140a3c666897588a05shiqian 578e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>. 579e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromReferenceToNonReference) { 580e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m1 = Eq(0); 581e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 582e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 583e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 584e35fdd936d133bf8a48de140a3c666897588a05shiqian} 585e35fdd936d133bf8a48de140a3c666897588a05shiqian 586e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 587e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToConstReference) { 588e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(0); 589e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m2 = MatcherCast<const int&>(m1); 590e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 591e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 592e35fdd936d133bf8a48de140a3c666897588a05shiqian} 593e35fdd936d133bf8a48de140a3c666897588a05shiqian 594e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>. 595e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToReference) { 596e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(0); 597e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m2 = MatcherCast<int&>(m1); 598e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 599e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(n)); 600e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 1; 601e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(n)); 602e35fdd936d133bf8a48de140a3c666897588a05shiqian} 603e35fdd936d133bf8a48de140a3c666897588a05shiqian 604e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T>. 605e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromSameType) { 606e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(0); 607e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = MatcherCast<int>(m1); 608e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(0)); 609e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(1)); 610e35fdd936d133bf8a48de140a3c666897588a05shiqian} 611e35fdd936d133bf8a48de140a3c666897588a05shiqian 612506340a66b7814b741b4b4a032ca4b059086f1bbkosak// Implicitly convertible from any type. 61379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmstruct ConvertibleFromAny { 61479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm ConvertibleFromAny(int a_value) : value(a_value) {} 61579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm template <typename T> 616506340a66b7814b741b4b4a032ca4b059086f1bbkosak ConvertibleFromAny(const T& /*a_value*/) : value(-1) { 61779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm ADD_FAILURE() << "Conversion constructor called"; 61879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 61979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm int value; 62079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}; 62179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 62279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmbool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) { 62379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return a.value == b.value; 62479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} 62579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 62679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmostream& operator<<(ostream& os, const ConvertibleFromAny& a) { 62779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return os << a.value; 62879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} 62979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 63079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(MatcherCastTest, ConversionConstructorIsUsed) { 63179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1); 63279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 63379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 63479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} 63579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 63679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(MatcherCastTest, FromConvertibleFromAny) { 63779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm Matcher<ConvertibleFromAny> m = 63879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 63979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 64079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 64179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} 64279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 6435f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakstruct IntReferenceWrapper { 6445f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak IntReferenceWrapper(const int& a_value) : value(&a_value) {} 6455f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak const int* value; 6465f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak}; 6475f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak 6485f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakbool operator==(const IntReferenceWrapper& a, const IntReferenceWrapper& b) { 6495f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak return a.value == b.value; 6505f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak} 6515f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak 6525f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakTEST(MatcherCastTest, ValueIsNotCopied) { 6535f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak int n = 42; 6545f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak Matcher<IntReferenceWrapper> m = MatcherCast<IntReferenceWrapper>(n); 6555f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak // Verify that the matcher holds a reference to n, not to its temporary copy. 6565f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak EXPECT_TRUE(m.Matches(n)); 6575f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak} 6585f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak 6591f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueclass Base { 6601f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue public: 6611f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue virtual ~Base() {} 6621f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base() {} 6631f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue private: 6641f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue GTEST_DISALLOW_COPY_AND_ASSIGN_(Base); 6651f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}; 6661f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 6671f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueclass Derived : public Base { 6681f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue public: 6691f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Derived() : Base() {} 6701f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue int i; 6711f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}; 6721f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 6731f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueclass OtherDerived : public Base {}; 67418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 67518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher. 67618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromPolymorphicMatcher) { 67718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<char> m2 = SafeMatcherCast<char>(Eq(32)); 67818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(' ')); 67918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches('\n')); 68018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 68118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 68216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where 68316cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// T and U are arithmetic types and T can be losslessly converted to 68416cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// U. 68516cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wanTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) { 68618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<double> m1 = DoubleEq(1.0); 68716cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan Matcher<float> m2 = SafeMatcherCast<float>(m1); 68816cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_TRUE(m2.Matches(1.0f)); 68916cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_FALSE(m2.Matches(2.0f)); 69016cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan 69116cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a')); 69216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_TRUE(m3.Matches('a')); 69316cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan EXPECT_FALSE(m3.Matches('b')); 69418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 69518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 69618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U 69718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// are pointers or references to a derived and a base class, correspondingly. 69818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromBaseClass) { 69918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Derived d, d2; 70018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Base*> m1 = Eq(&d); 70118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1); 70218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(&d)); 70318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(&d2)); 70418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 70518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Base&> m3 = Ref(d); 70618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3); 70718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m4.Matches(d)); 70818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m4.Matches(d2)); 70918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 71018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 71118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>. 71218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromConstReferenceToReference) { 71318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int n = 0; 71418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m1 = Ref(n); 71518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 71618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int n1 = 0; 71718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(n)); 71818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(n1)); 71918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 72018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 72118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 72218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) { 72318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m1 = Eq(0); 72418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1); 72518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(0)); 72618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(1)); 72718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 72818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 72918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>. 73018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToReference) { 73118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m1 = Eq(0); 73218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 73318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan int n = 0; 73418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(n)); 73518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan n = 1; 73618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(n)); 73718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 73818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 73918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>. 74018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromSameType) { 74118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m1 = Eq(0); 74218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> m2 = SafeMatcherCast<int>(m1); 74318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_TRUE(m2.Matches(0)); 74418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan EXPECT_FALSE(m2.Matches(1)); 74518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 74618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 74779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(SafeMatcherCastTest, ConversionConstructorIsUsed) { 74879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1); 74979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 75079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 75179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} 75279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 75379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(SafeMatcherCastTest, FromConvertibleFromAny) { 75479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm Matcher<ConvertibleFromAny> m = 75579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 75679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 75779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 75879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} 75979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 7605f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakTEST(SafeMatcherCastTest, ValueIsNotCopied) { 7615f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak int n = 42; 7625f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n); 7635f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak // Verify that the matcher holds a reference to n, not to its temporary copy. 7645f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak EXPECT_TRUE(m.Matches(n)); 7655f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak} 7665f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak 7679b1a944ec48b7f84ad2f4466ed3babd232a20db5kosakTEST(ExpectThat, TakesLiterals) { 7689b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak EXPECT_THAT(1, 1); 7699b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak EXPECT_THAT(1.0, 1.0); 7709b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak EXPECT_THAT(string(), ""); 7719b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak} 7729b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak 7739b1a944ec48b7f84ad2f4466ed3babd232a20db5kosakTEST(ExpectThat, TakesFunctions) { 7749b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak struct Helper { 7759b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak static void Func() {} 7769b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak }; 7779b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak void (*func)() = Helper::Func; 7789b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak EXPECT_THAT(func, Helper::Func); 7799b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak EXPECT_THAT(func, &Helper::Func); 7809b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak} 7819b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak 782e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() matches any value of type T. 783e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, MatchesAnyValue) { 784e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a value type. 785e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = A<double>(); 786e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(91.43)); 787e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-15.32)); 788e35fdd936d133bf8a48de140a3c666897588a05shiqian 789e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a reference type. 790e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 2; 791e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = -6; 792e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m2 = A<int&>(); 793e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(a)); 794e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(b)); 795e35fdd936d133bf8a48de140a3c666897588a05shiqian} 796e35fdd936d133bf8a48de140a3c666897588a05shiqian 797f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wanTEST(ATest, WorksForDerivedClass) { 798f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan Base base; 799f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan Derived derived; 800f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan EXPECT_THAT(&base, A<Base*>()); 801f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan // This shouldn't compile: EXPECT_THAT(&base, A<Derived*>()); 802f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan EXPECT_THAT(&derived, A<Base*>()); 803f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan EXPECT_THAT(&derived, A<Derived*>()); 804f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan} 805f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan 806e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() describes itself properly. 807e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, CanDescribeSelf) { 808e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", Describe(A<bool>())); 809e35fdd936d133bf8a48de140a3c666897588a05shiqian} 810e35fdd936d133bf8a48de140a3c666897588a05shiqian 811e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() matches any value of type T. 812e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, MatchesAnyValue) { 813e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a value type. 814e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = An<int>(); 815e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(9143)); 816e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-1532)); 817e35fdd936d133bf8a48de140a3c666897588a05shiqian 818e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests a matcher for a reference type. 819e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 2; 820e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = -6; 821e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m2 = An<int&>(); 822e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(a)); 823e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(b)); 824e35fdd936d133bf8a48de140a3c666897588a05shiqian} 825e35fdd936d133bf8a48de140a3c666897588a05shiqian 826e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() describes itself properly. 827e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, CanDescribeSelf) { 828e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", Describe(An<int>())); 829e35fdd936d133bf8a48de140a3c666897588a05shiqian} 830e35fdd936d133bf8a48de140a3c666897588a05shiqian 831e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ can be used as a matcher for any type and matches any 832e35fdd936d133bf8a48de140a3c666897588a05shiqian// value of that type. 833e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, MatchesAnyValue) { 834e35fdd936d133bf8a48de140a3c666897588a05shiqian // Uses _ as a matcher for a value type. 835e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = _; 836e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(123)); 837e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-242)); 838e35fdd936d133bf8a48de140a3c666897588a05shiqian 839e35fdd936d133bf8a48de140a3c666897588a05shiqian // Uses _ as a matcher for a reference type. 840e35fdd936d133bf8a48de140a3c666897588a05shiqian bool a = false; 841e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool b = true; 842e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const bool&> m2 = _; 843e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(a)); 844e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(b)); 845e35fdd936d133bf8a48de140a3c666897588a05shiqian} 846e35fdd936d133bf8a48de140a3c666897588a05shiqian 847e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ describes itself properly. 848e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, CanDescribeSelf) { 849e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = _; 850e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", Describe(m)); 851e35fdd936d133bf8a48de140a3c666897588a05shiqian} 852e35fdd936d133bf8a48de140a3c666897588a05shiqian 853e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(x) matches any value equal to x. 854e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, MatchesEqualValue) { 855e35fdd936d133bf8a48de140a3c666897588a05shiqian // 2 C-strings with same content but different addresses. 856e35fdd936d133bf8a48de140a3c666897588a05shiqian const char a1[] = "hi"; 857e35fdd936d133bf8a48de140a3c666897588a05shiqian const char a2[] = "hi"; 858e35fdd936d133bf8a48de140a3c666897588a05shiqian 859e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m1 = Eq(a1); 860e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(a1)); 861e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(a2)); 862e35fdd936d133bf8a48de140a3c666897588a05shiqian} 863e35fdd936d133bf8a48de140a3c666897588a05shiqian 864e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) describes itself properly. 865e35fdd936d133bf8a48de140a3c666897588a05shiqian 866e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Unprintable { 867e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 868e35fdd936d133bf8a48de140a3c666897588a05shiqian Unprintable() : c_('a') {} 869e35fdd936d133bf8a48de140a3c666897588a05shiqian 87032de5f53763125925e078498250f7e73a88de9edzhanyong.wan bool operator==(const Unprintable& /* rhs */) { return true; } 871e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 872e35fdd936d133bf8a48de140a3c666897588a05shiqian char c_; 873e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 874e35fdd936d133bf8a48de140a3c666897588a05shiqian 875e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, CanDescribeSelf) { 876e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<Unprintable> m = Eq(Unprintable()); 877e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to 1-byte object <61>", Describe(m)); 878e35fdd936d133bf8a48de140a3c666897588a05shiqian} 879e35fdd936d133bf8a48de140a3c666897588a05shiqian 880e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) can be used to match any type that supports 881e35fdd936d133bf8a48de140a3c666897588a05shiqian// comparing with type T, where T is v's type. 882e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, IsPolymorphic) { 883e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Eq(1); 884e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1)); 885e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(2)); 886e35fdd936d133bf8a48de140a3c666897588a05shiqian 887e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<char> m2 = Eq(1); 888e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches('\1')); 889e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches('a')); 890e35fdd936d133bf8a48de140a3c666897588a05shiqian} 891e35fdd936d133bf8a48de140a3c666897588a05shiqian 892e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) matches values of type T that's equal to v. 893e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, ChecksEqualityForGivenType) { 894e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<char> m1 = TypedEq<char>('a'); 895e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches('a')); 896e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches('b')); 897e35fdd936d133bf8a48de140a3c666897588a05shiqian 898e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m2 = TypedEq<int>(6); 899e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(6)); 900e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(7)); 901e35fdd936d133bf8a48de140a3c666897588a05shiqian} 902e35fdd936d133bf8a48de140a3c666897588a05shiqian 903e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq(v) describes itself properly. 904e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, CanDescribeSelf) { 905e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2))); 906e35fdd936d133bf8a48de140a3c666897588a05shiqian} 907e35fdd936d133bf8a48de140a3c666897588a05shiqian 908e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) has type Matcher<T>. 909e35fdd936d133bf8a48de140a3c666897588a05shiqian 910e35fdd936d133bf8a48de140a3c666897588a05shiqian// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T 911e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a "bare" type (i.e. not in the form of const U or U&). If v's 912e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is not T, the compiler will generate a message about 913e35fdd936d133bf8a48de140a3c666897588a05shiqian// "undefined referece". 914e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 915e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Type { 91632de5f53763125925e078498250f7e73a88de9edzhanyong.wan static bool IsTypeOf(const T& /* v */) { return true; } 917e35fdd936d133bf8a48de140a3c666897588a05shiqian 918e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T2> 919e35fdd936d133bf8a48de140a3c666897588a05shiqian static void IsTypeOf(T2 v); 920e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 921e35fdd936d133bf8a48de140a3c666897588a05shiqian 922e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, HasSpecifiedType) { 923e35fdd936d133bf8a48de140a3c666897588a05shiqian // Verfies that the type of TypedEq<T>(v) is Matcher<T>. 924e35fdd936d133bf8a48de140a3c666897588a05shiqian Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5)); 925e35fdd936d133bf8a48de140a3c666897588a05shiqian Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5)); 926e35fdd936d133bf8a48de140a3c666897588a05shiqian} 927e35fdd936d133bf8a48de140a3c666897588a05shiqian 928e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) matches anything >= v. 929e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, ImplementsGreaterThanOrEqual) { 930e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Ge(0); 931e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1)); 932e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(0)); 933e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(-1)); 934e35fdd936d133bf8a48de140a3c666897588a05shiqian} 935e35fdd936d133bf8a48de140a3c666897588a05shiqian 936e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) describes itself properly. 937e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, CanDescribeSelf) { 938e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Ge(5); 939b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is >= 5", Describe(m)); 940e35fdd936d133bf8a48de140a3c666897588a05shiqian} 941e35fdd936d133bf8a48de140a3c666897588a05shiqian 942e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) matches anything > v. 943e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, ImplementsGreaterThan) { 944e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = Gt(0); 945e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1.0)); 946e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(0.0)); 947e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(-1.0)); 948e35fdd936d133bf8a48de140a3c666897588a05shiqian} 949e35fdd936d133bf8a48de140a3c666897588a05shiqian 950e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) describes itself properly. 951e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, CanDescribeSelf) { 952e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Gt(5); 953b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is > 5", Describe(m)); 954e35fdd936d133bf8a48de140a3c666897588a05shiqian} 955e35fdd936d133bf8a48de140a3c666897588a05shiqian 956e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) matches anything <= v. 957e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, ImplementsLessThanOrEqual) { 958e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<char> m1 = Le('b'); 959e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches('a')); 960e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches('b')); 961e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches('c')); 962e35fdd936d133bf8a48de140a3c666897588a05shiqian} 963e35fdd936d133bf8a48de140a3c666897588a05shiqian 964e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) describes itself properly. 965e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, CanDescribeSelf) { 966e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Le(5); 967b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is <= 5", Describe(m)); 968e35fdd936d133bf8a48de140a3c666897588a05shiqian} 969e35fdd936d133bf8a48de140a3c666897588a05shiqian 970e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) matches anything < v. 971e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, ImplementsLessThan) { 972e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m1 = Lt("Hello"); 973e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("Abc")); 974e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("Hello")); 975e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches("Hello, world!")); 976e35fdd936d133bf8a48de140a3c666897588a05shiqian} 977e35fdd936d133bf8a48de140a3c666897588a05shiqian 978e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) describes itself properly. 979e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, CanDescribeSelf) { 980e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Lt(5); 981b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is < 5", Describe(m)); 982e35fdd936d133bf8a48de140a3c666897588a05shiqian} 983e35fdd936d133bf8a48de140a3c666897588a05shiqian 984e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) matches anything != v. 985e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, ImplementsNotEqual) { 986e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m1 = Ne(0); 987e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(1)); 988e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-1)); 989e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(0)); 990e35fdd936d133bf8a48de140a3c666897588a05shiqian} 991e35fdd936d133bf8a48de140a3c666897588a05shiqian 992e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) describes itself properly. 993e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, CanDescribeSelf) { 994e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Ne(5); 995b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to 5", Describe(m)); 996e35fdd936d133bf8a48de140a3c666897588a05shiqian} 997e35fdd936d133bf8a48de140a3c666897588a05shiqian 9982d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() matches any NULL pointer of any type. 9992d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, MatchesNullPointer) { 10002d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<int*> m1 = IsNull(); 10012d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan int* p1 = NULL; 10022d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan int n = 0; 10032d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_TRUE(m1.Matches(p1)); 10042d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_FALSE(m1.Matches(&n)); 10052d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 10062d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<const char*> m2 = IsNull(); 10072d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan const char* p2 = NULL; 10082d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_TRUE(m2.Matches(p2)); 10092d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_FALSE(m2.Matches("hi")); 10102d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 101195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if !GTEST_OS_SYMBIAN 101295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // Nokia's Symbian compiler generates: 101395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // gmock-matchers.h: ambiguous access to overloaded function 101495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)' 101595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing:: 101695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // MatcherInterface<void *> *)' 101795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // gmock-matchers.h: (point of instantiation: 'testing:: 101895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()') 101995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // gmock-matchers.h: (instantiating: 'testing::PolymorphicMatc 10202d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<void*> m3 = IsNull(); 10212d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan void* p3 = NULL; 10222d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_TRUE(m3.Matches(p3)); 10232d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef))); 102495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif 10252d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan} 10262d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 102779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(IsNullTest, LinkedPtr) { 102879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const Matcher<linked_ptr<int> > m = IsNull(); 102979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<int> null_p; 103079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<int> non_null_p(new int); 103179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 103279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_TRUE(m.Matches(null_p)); 103379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_FALSE(m.Matches(non_null_p)); 103479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev} 103579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 103679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(IsNullTest, ReferenceToConstLinkedPtr) { 103779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const Matcher<const linked_ptr<double>&> m = IsNull(); 103879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<double> null_p; 103979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<double> non_null_p(new double); 104079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 104179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_TRUE(m.Matches(null_p)); 104279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_FALSE(m.Matches(non_null_p)); 104379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev} 104479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 1045a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#if GTEST_HAS_STD_FUNCTION_ 10466305ff5a922ddf3b428f08ad3b53d07d2c08d89akosakTEST(IsNullTest, StdFunction) { 10476305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak const Matcher<std::function<void()>> m = IsNull(); 10486305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak 10496305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak EXPECT_TRUE(m.Matches(std::function<void()>())); 10506305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak EXPECT_FALSE(m.Matches([]{})); 10516305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak} 1052a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#endif // GTEST_HAS_STD_FUNCTION_ 10536305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak 10542d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() describes itself properly. 10552d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, CanDescribeSelf) { 10562d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan Matcher<int*> m = IsNull(); 10572d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan EXPECT_EQ("is NULL", Describe(m)); 1058b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't NULL", DescribeNegation(m)); 10592d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan} 10602d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 1061e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() matches any non-NULL pointer of any type. 1062e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, MatchesNonNullPointer) { 1063e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int*> m1 = NotNull(); 1064e35fdd936d133bf8a48de140a3c666897588a05shiqian int* p1 = NULL; 1065e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 1066e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(p1)); 1067e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(&n)); 1068e35fdd936d133bf8a48de140a3c666897588a05shiqian 1069e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m2 = NotNull(); 1070e35fdd936d133bf8a48de140a3c666897588a05shiqian const char* p2 = NULL; 1071e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(p2)); 1072e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hi")); 1073e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1074e35fdd936d133bf8a48de140a3c666897588a05shiqian 107579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(NotNullTest, LinkedPtr) { 107679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const Matcher<linked_ptr<int> > m = NotNull(); 107779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<int> null_p; 107879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<int> non_null_p(new int); 107979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 108079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_FALSE(m.Matches(null_p)); 108179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_TRUE(m.Matches(non_null_p)); 108279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev} 108379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 108479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(NotNullTest, ReferenceToConstLinkedPtr) { 108579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const Matcher<const linked_ptr<double>&> m = NotNull(); 108679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<double> null_p; 108779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev const linked_ptr<double> non_null_p(new double); 108879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 108979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_FALSE(m.Matches(null_p)); 109079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev EXPECT_TRUE(m.Matches(non_null_p)); 109179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev} 109279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev 1093a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#if GTEST_HAS_STD_FUNCTION_ 10946305ff5a922ddf3b428f08ad3b53d07d2c08d89akosakTEST(NotNullTest, StdFunction) { 10956305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak const Matcher<std::function<void()>> m = NotNull(); 10966305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak 10976305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak EXPECT_TRUE(m.Matches([]{})); 10986305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak EXPECT_FALSE(m.Matches(std::function<void()>())); 10996305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak} 1100a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#endif // GTEST_HAS_STD_FUNCTION_ 11016305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak 1102e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() describes itself properly. 1103e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, CanDescribeSelf) { 1104e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int*> m = NotNull(); 1105b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't NULL", Describe(m)); 1106e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1107e35fdd936d133bf8a48de140a3c666897588a05shiqian 1108e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) matches an argument that references 1109e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'variable'. 1110e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, MatchesSameVariable) { 1111e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 0; 1112e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = 0; 1113e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m = Ref(a); 1114e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 1115e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(b)); 1116e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1117e35fdd936d133bf8a48de140a3c666897588a05shiqian 1118e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) describes itself properly. 1119e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanDescribeSelf) { 1120e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 5; 1121e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int&> m = Ref(n); 1122e35fdd936d133bf8a48de140a3c666897588a05shiqian stringstream ss; 1123e35fdd936d133bf8a48de140a3c666897588a05shiqian ss << "references the variable @" << &n << " 5"; 1124e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(string(ss.str()), Describe(m)); 1125e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1126e35fdd936d133bf8a48de140a3c666897588a05shiqian 1127e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test that Ref(non_const_varialbe) can be used as a matcher for a 1128e35fdd936d133bf8a48de140a3c666897588a05shiqian// const reference. 1129e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanBeUsedAsMatcherForConstReference) { 1130e35fdd936d133bf8a48de140a3c666897588a05shiqian int a = 0; 1131e35fdd936d133bf8a48de140a3c666897588a05shiqian int b = 0; 1132e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m = Ref(a); 1133e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 1134e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(b)); 1135e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1136e35fdd936d133bf8a48de140a3c666897588a05shiqian 1137e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be 1138e35fdd936d133bf8a48de140a3c666897588a05shiqian// used wherever Ref(base) can be used (Ref(derived) is a sub-type 1139e35fdd936d133bf8a48de140a3c666897588a05shiqian// of Ref(base), but not vice versa. 1140e35fdd936d133bf8a48de140a3c666897588a05shiqian 1141e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, IsCovariant) { 1142e35fdd936d133bf8a48de140a3c666897588a05shiqian Base base, base2; 1143e35fdd936d133bf8a48de140a3c666897588a05shiqian Derived derived; 1144e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Base&> m1 = Ref(base); 1145e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(base)); 1146e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(base2)); 1147e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(derived)); 1148e35fdd936d133bf8a48de140a3c666897588a05shiqian 1149e35fdd936d133bf8a48de140a3c666897588a05shiqian m1 = Ref(derived); 1150e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(derived)); 1151e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(base)); 1152e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(base2)); 1153e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1154e35fdd936d133bf8a48de140a3c666897588a05shiqian 1155b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(RefTest, ExplainsResult) { 1156b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan int n = 0; 1157b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n), 1158b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan StartsWith("which is located @")); 1159b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 1160b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan int m = 0; 1161b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m), 1162b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan StartsWith("which is located @")); 1163b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan} 1164b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 1165e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests string comparison matchers. 1166e35fdd936d133bf8a48de140a3c666897588a05shiqian 1167e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, MatchesEqualString) { 1168e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrEq(string("Hello")); 1169e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("Hello")); 1170e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("hello")); 1171e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1172e35fdd936d133bf8a48de140a3c666897588a05shiqian 1173e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = StrEq("Hello"); 1174e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hello")); 1175e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hi")); 1176e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1177e35fdd936d133bf8a48de140a3c666897588a05shiqian 1178e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, CanDescribeSelf) { 1179aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev Matcher<string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3"); 1180aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"", 1181e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1182e35fdd936d133bf8a48de140a3c666897588a05shiqian 1183e35fdd936d133bf8a48de140a3c666897588a05shiqian string str("01204500800"); 1184e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = '\0'; 1185e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m2 = StrEq(str); 1186e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2)); 1187e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = '\0'; 1188e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m3 = StrEq(str); 1189e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3)); 1190e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1191e35fdd936d133bf8a48de140a3c666897588a05shiqian 1192e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, MatchesUnequalString) { 1193e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrNe("Hello"); 1194e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("")); 1195e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1196e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("Hello")); 1197e35fdd936d133bf8a48de140a3c666897588a05shiqian 1198e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m2 = StrNe(string("Hello")); 1199e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hello")); 1200e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hello")); 1201e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1202e35fdd936d133bf8a48de140a3c666897588a05shiqian 1203e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, CanDescribeSelf) { 1204e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrNe("Hi"); 1205b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to \"Hi\"", Describe(m)); 1206e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1207e35fdd936d133bf8a48de140a3c666897588a05shiqian 1208e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) { 1209e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrCaseEq(string("Hello")); 1210e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("Hello")); 1211e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("hello")); 1212e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("Hi")); 1213e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1214e35fdd936d133bf8a48de140a3c666897588a05shiqian 1215e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = StrCaseEq("Hello"); 1216e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("hello")); 1217e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hi")); 1218e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1219e35fdd936d133bf8a48de140a3c666897588a05shiqian 1220e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1221e35fdd936d133bf8a48de140a3c666897588a05shiqian string str1("oabocdooeoo"); 1222e35fdd936d133bf8a48de140a3c666897588a05shiqian string str2("OABOCDOOEOO"); 1223e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m0 = StrCaseEq(str1); 1224e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m0.Matches(str2 + string(1, '\0'))); 1225e35fdd936d133bf8a48de140a3c666897588a05shiqian 1226e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[3] = str2[3] = '\0'; 1227e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m1 = StrCaseEq(str1); 1228e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(str2)); 1229e35fdd936d133bf8a48de140a3c666897588a05shiqian 1230e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[0] = str1[6] = str1[7] = str1[10] = '\0'; 1231e35fdd936d133bf8a48de140a3c666897588a05shiqian str2[0] = str2[6] = str2[7] = str2[10] = '\0'; 1232e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m2 = StrCaseEq(str1); 1233e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[9] = str2[9] = '\0'; 1234e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(str2)); 1235e35fdd936d133bf8a48de140a3c666897588a05shiqian 1236e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> m3 = StrCaseEq(str1); 1237e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(str2)); 1238e35fdd936d133bf8a48de140a3c666897588a05shiqian 1239e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2 + "x")); 1240e35fdd936d133bf8a48de140a3c666897588a05shiqian str2.append(1, '\0'); 1241e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2)); 1242e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(string(str2, 0, 9))); 1243e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1244e35fdd936d133bf8a48de140a3c666897588a05shiqian 1245e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, CanDescribeSelf) { 1246e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m = StrCaseEq("Hi"); 1247e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m)); 1248e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1249e35fdd936d133bf8a48de140a3c666897588a05shiqian 1250e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1251e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrCaseNe("Hello"); 1252e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches("Hi")); 1253e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1254e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("Hello")); 1255e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches("hello")); 1256e35fdd936d133bf8a48de140a3c666897588a05shiqian 1257e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m2 = StrCaseNe(string("Hello")); 1258e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("")); 1259e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hello")); 1260e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1261e35fdd936d133bf8a48de140a3c666897588a05shiqian 1262e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, CanDescribeSelf) { 1263e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> m = StrCaseNe("Hi"); 1264b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m)); 1265e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1266e35fdd936d133bf8a48de140a3c666897588a05shiqian 1267e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching string-typed values. 1268e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForStringClasses) { 1269e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<string> m1 = HasSubstr("foo"); 1270e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(string("I love food."))); 1271e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(string("tofo"))); 1272e35fdd936d133bf8a48de140a3c666897588a05shiqian 1273e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const std::string&> m2 = HasSubstr("foo"); 1274e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(std::string("I love food."))); 1275e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(std::string("tofo"))); 1276e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1277e35fdd936d133bf8a48de140a3c666897588a05shiqian 1278e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-string-typed values. 1279e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForCStrings) { 1280e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<char*> m1 = HasSubstr("foo"); 1281e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food."))); 1282e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo"))); 1283e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1284e35fdd936d133bf8a48de140a3c666897588a05shiqian 1285e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m2 = HasSubstr("foo"); 1286e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("I love food.")); 1287e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("tofo")); 1288e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(NULL)); 1289e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1290e35fdd936d133bf8a48de140a3c666897588a05shiqian 1291e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly. 1292e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, CanDescribeSelf) { 1293e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<string> m = HasSubstr("foo\n\""); 1294e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m)); 1295e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1296e35fdd936d133bf8a48de140a3c666897588a05shiqian 1297b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, CanDescribeSelf) { 1298b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<const pair<std::string, int>&> m = Key("foo"); 1299b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m)); 1300b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m)); 1301b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan} 1302b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 1303b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(KeyTest, ExplainsResult) { 1304b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<pair<int, bool> > m = Key(GreaterThan(10)); 1305b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("whose first field is a value which is 5 less than 10", 1306b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, make_pair(5, true))); 1307b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("whose first field is a value which is 5 more than 10", 1308b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, make_pair(15, true))); 1309b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 1310b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 1311b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, MatchesCorrectly) { 1312b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan pair<int, std::string> p(25, "foo"); 1313b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Key(25)); 1314b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Not(Key(42))); 1315b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Key(Ge(20))); 1316b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Not(Key(Lt(25)))); 1317b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 1318b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 1319b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, SafelyCastsInnerMatcher) { 1320b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan Matcher<int> is_positive = Gt(0); 1321b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan Matcher<int> is_negative = Lt(0); 1322b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan pair<char, bool> p('a', true); 1323b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Key(is_positive)); 1324b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(p, Not(Key(is_negative))); 1325b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 1326b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 1327b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMap) { 1328ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan map<int, char> container; 1329b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(1, 'a')); 1330b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(2, 'b')); 1331b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(4, 'c')); 1332b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(1))); 1333b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Not(Contains(Key(3)))); 1334b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 1335b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 1336b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMultimap) { 1337ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan multimap<int, char> container; 1338b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(1, 'a')); 1339b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(2, 'b')); 1340b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(4, 'c')); 1341b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 1342b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Not(Contains(Key(25)))); 1343b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(25, 'd')); 1344b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(25))); 1345b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(25, 'e')); 1346b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(25))); 1347b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 1348b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Contains(Key(1))); 1349b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan EXPECT_THAT(container, Not(Contains(Key(3)))); 1350b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 1351b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 1352f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, Typing) { 1353f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Test verifies the following type conversions can be compiled. 1354b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42); 1355b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<const pair<const char*, int> > m2 = Pair("foo", 42); 1356b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<pair<const char*, int> > m3 = Pair("foo", 42); 1357f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1358b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<pair<int, const std::string> > m4 = Pair(25, "42"); 1359b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<pair<const std::string, int> > m5 = Pair("25", 42); 1360f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1361f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1362f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanDescribeSelf) { 1363b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42); 1364f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_EQ("has a first field that is equal to \"foo\"" 1365f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan ", and has a second field that is equal to 42", 1366f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Describe(m1)); 1367b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("has a first field that isn't equal to \"foo\"" 1368b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ", or has a second field that isn't equal to 42", 1369f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan DescribeNegation(m1)); 1370f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Double and triple negation (1 or 2 times not and description of negation). 1371b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42)); 1372b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("has a first field that isn't equal to 13" 1373f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan ", and has a second field that is equal to 42", 1374f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan DescribeNegation(m2)); 1375f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1376f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1377f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanExplainMatchResultTo) { 1378821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If neither field matches, Pair() should explain about the first 1379821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // field. 1380b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0)); 1381676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("whose first field does not match, which is 1 less than 0", 1382b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, make_pair(-1, -2))); 1383f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1384821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If the first field matches but the second doesn't, Pair() should 1385821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // explain about the second field. 1386676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("whose second field does not match, which is 2 less than 0", 1387b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, make_pair(1, -2))); 1388f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1389821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If the first field doesn't match but the second does, Pair() 1390821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // should explain about the first field. 1391676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("whose first field does not match, which is 1 less than 0", 1392b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, make_pair(-1, 2))); 1393f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1394821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If both fields match, Pair() should explain about them both. 1395676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("whose both fields match, where the first field is a value " 1396676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan "which is 1 more than 0, and the second field is a value " 1397676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan "which is 2 more than 0", 1398b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, make_pair(1, 2))); 1399676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 1400676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // If only the first match has an explanation, only this explanation should 1401676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // be printed. 1402b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0); 1403676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("whose both fields match, where the first field is a value " 1404676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan "which is 1 more than 0", 1405b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(explain_first, make_pair(1, 0))); 1406676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 1407676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // If only the second match has an explanation, only this explanation should 1408676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // be printed. 1409b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0)); 1410676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("whose both fields match, where the second field is a value " 1411676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan "which is 1 more than 0", 1412b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(explain_second, make_pair(0, 1))); 1413f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1414f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1415f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, MatchesCorrectly) { 1416b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan pair<int, std::string> p(25, "foo"); 1417f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1418f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Both fields match. 1419f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(25, "foo")); 1420f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o"))); 1421f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1422f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // 'first' doesnt' match, but 'second' matches. 1423f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(42, "foo"))); 1424f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(Lt(25), "foo"))); 1425f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1426f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // 'first' matches, but 'second' doesn't match. 1427f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(25, "bar"))); 1428f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(25, Not("foo")))); 1429f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1430f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Neither field matches. 1431f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(13, "bar"))); 1432f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a")))); 1433f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1434f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1435f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, SafelyCastsInnerMatchers) { 1436f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<int> is_positive = Gt(0); 1437f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan Matcher<int> is_negative = Lt(0); 1438b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan pair<char, bool> p('a', true); 1439f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(is_positive, _)); 1440f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(is_negative, _))); 1441f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Pair(_, is_positive)); 1442f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(p, Not(Pair(_, is_negative))); 1443f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1444f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1445f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, InsideContainsUsingMap) { 1446ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan map<int, char> container; 1447b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(1, 'a')); 1448b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(2, 'b')); 1449b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan container.insert(make_pair(4, 'c')); 145095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan EXPECT_THAT(container, Contains(Pair(1, 'a'))); 1451f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(container, Contains(Pair(1, _))); 145295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan EXPECT_THAT(container, Contains(Pair(_, 'a'))); 1453f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan EXPECT_THAT(container, Not(Contains(Pair(3, _)))); 1454f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 1455f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 1456e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s). 1457e35fdd936d133bf8a48de140a3c666897588a05shiqian 1458e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, MatchesStringWithGivenPrefix) { 1459e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = StartsWith(string("")); 1460e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("Hi")); 1461e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("")); 1462e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1463e35fdd936d133bf8a48de140a3c666897588a05shiqian 1464e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = StartsWith("Hi"); 1465e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hi")); 1466e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hi Hi!")); 1467e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("High")); 1468e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("H")); 1469e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(" Hi")); 1470e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1471e35fdd936d133bf8a48de140a3c666897588a05shiqian 1472e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, CanDescribeSelf) { 1473e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m = StartsWith("Hi"); 1474e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("starts with \"Hi\"", Describe(m)); 1475e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1476e35fdd936d133bf8a48de140a3c666897588a05shiqian 1477e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s). 1478e35fdd936d133bf8a48de140a3c666897588a05shiqian 1479e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, MatchesStringWithGivenSuffix) { 1480e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = EndsWith(""); 1481e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("Hi")); 1482e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("")); 1483e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1484e35fdd936d133bf8a48de140a3c666897588a05shiqian 1485e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = EndsWith(string("Hi")); 1486e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Hi")); 1487e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Wow Hi Hi")); 1488e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("Super Hi")); 1489e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("i")); 1490e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("Hi ")); 1491e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1492e35fdd936d133bf8a48de140a3c666897588a05shiqian 1493e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, CanDescribeSelf) { 1494e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m = EndsWith("Hi"); 1495e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("ends with \"Hi\"", Describe(m)); 1496e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1497e35fdd936d133bf8a48de140a3c666897588a05shiqian 1498e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests MatchesRegex(). 1499e35fdd936d133bf8a48de140a3c666897588a05shiqian 1500e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) { 1501e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = MatchesRegex("a.*z"); 1502e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("az")); 1503e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("abcz")); 1504e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1505e35fdd936d133bf8a48de140a3c666897588a05shiqian 1506e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z")); 1507e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("azbz")); 1508e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("az1")); 1509e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("1az")); 1510e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1511e35fdd936d133bf8a48de140a3c666897588a05shiqian 1512e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, CanDescribeSelf) { 1513e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m1 = MatchesRegex(string("Hi.*")); 1514e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1)); 1515e35fdd936d133bf8a48de140a3c666897588a05shiqian 1516d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan Matcher<const char*> m2 = MatchesRegex(new RE("a.*")); 1517d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2)); 1518e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1519e35fdd936d133bf8a48de140a3c666897588a05shiqian 1520e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ContainsRegex(). 1521e35fdd936d133bf8a48de140a3c666897588a05shiqian 1522e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) { 1523e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m1 = ContainsRegex(string("a.*z")); 1524e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("az")); 1525e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches("0abcz1")); 1526e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1527e35fdd936d133bf8a48de140a3c666897588a05shiqian 1528e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z")); 1529e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("azbz")); 1530e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches("az1")); 1531e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches("1a")); 1532e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1533e35fdd936d133bf8a48de140a3c666897588a05shiqian 1534e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, CanDescribeSelf) { 1535e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const std::string> m1 = ContainsRegex("Hi.*"); 1536e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1)); 1537e35fdd936d133bf8a48de140a3c666897588a05shiqian 1538d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan Matcher<const char*> m2 = ContainsRegex(new RE("a.*")); 1539d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2)); 1540e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1541e35fdd936d133bf8a48de140a3c666897588a05shiqian 1542e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests for wide strings. 1543e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_STD_WSTRING 1544e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, MatchesEqual) { 1545e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello")); 1546e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1547e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1548e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1549e35fdd936d133bf8a48de140a3c666897588a05shiqian 1550e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m2 = StrEq(L"Hello"); 1551e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hello")); 1552e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1553e35fdd936d133bf8a48de140a3c666897588a05shiqian 1554e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1555e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 1556e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 1557e35fdd936d133bf8a48de140a3c666897588a05shiqian 1558e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str(L"01204500800"); 1559e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1560e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m4 = StrEq(str); 1561e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(str)); 1562e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1563e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m5 = StrEq(str); 1564e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m5.Matches(str)); 1565e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1566e35fdd936d133bf8a48de140a3c666897588a05shiqian 1567e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, CanDescribeSelf) { 1568aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v"); 1569aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 1570e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1571e35fdd936d133bf8a48de140a3c666897588a05shiqian 1572e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1573e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 1574e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m2)); 1575e35fdd936d133bf8a48de140a3c666897588a05shiqian 1576e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str(L"01204500800"); 1577e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1578e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m4 = StrEq(str); 1579e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 1580e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1581e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m5 = StrEq(str); 1582e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 1583e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1584e35fdd936d133bf8a48de140a3c666897588a05shiqian 1585e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, MatchesUnequalString) { 1586e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hello"); 1587e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"")); 1588e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1589e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1590e35fdd936d133bf8a48de140a3c666897588a05shiqian 1591e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello")); 1592e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1593e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1594e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1595e35fdd936d133bf8a48de140a3c666897588a05shiqian 1596e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, CanDescribeSelf) { 1597e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hi"); 1598b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m)); 1599e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1600e35fdd936d133bf8a48de140a3c666897588a05shiqian 1601e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 1602e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello")); 1603e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1604e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"hello")); 1605e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hi")); 1606e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1607e35fdd936d133bf8a48de140a3c666897588a05shiqian 1608e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello"); 1609e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1610e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1611e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1612e35fdd936d133bf8a48de140a3c666897588a05shiqian 1613e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1614e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str1(L"oabocdooeoo"); 1615e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::wstring str2(L"OABOCDOOEOO"); 1616e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m0 = StrCaseEq(str1); 1617e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0'))); 1618e35fdd936d133bf8a48de140a3c666897588a05shiqian 1619e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[3] = str2[3] = L'\0'; 1620e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m1 = StrCaseEq(str1); 1621e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(str2)); 1622e35fdd936d133bf8a48de140a3c666897588a05shiqian 1623e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 1624e35fdd936d133bf8a48de140a3c666897588a05shiqian str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 1625e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m2 = StrCaseEq(str1); 1626e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[9] = str2[9] = L'\0'; 1627e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(str2)); 1628e35fdd936d133bf8a48de140a3c666897588a05shiqian 1629e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring&> m3 = StrCaseEq(str1); 1630e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(str2)); 1631e35fdd936d133bf8a48de140a3c666897588a05shiqian 1632e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2 + L"x")); 1633e35fdd936d133bf8a48de140a3c666897588a05shiqian str2.append(1, L'\0'); 1634e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2)); 1635e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9))); 1636e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1637e35fdd936d133bf8a48de140a3c666897588a05shiqian 1638e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, CanDescribeSelf) { 1639e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m = StrCaseEq(L"Hi"); 1640e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 1641e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1642e35fdd936d133bf8a48de140a3c666897588a05shiqian 1643e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1644e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 1645e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hi")); 1646e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1647e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1648e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1649e35fdd936d133bf8a48de140a3c666897588a05shiqian 1650e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello")); 1651e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"")); 1652e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1653e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1654e35fdd936d133bf8a48de140a3c666897588a05shiqian 1655e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, CanDescribeSelf) { 1656e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 1657b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m)); 1658e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1659e35fdd936d133bf8a48de140a3c666897588a05shiqian 1660e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values. 1661e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForStringClasses) { 1662e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher< ::std::wstring> m1 = HasSubstr(L"foo"); 1663e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food."))); 1664e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo"))); 1665e35fdd936d133bf8a48de140a3c666897588a05shiqian 1666e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo"); 1667e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food."))); 1668e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo"))); 1669e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1670e35fdd936d133bf8a48de140a3c666897588a05shiqian 1671e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values. 1672e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForCStrings) { 1673e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 1674e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 1675e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 1676e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1677e35fdd936d133bf8a48de140a3c666897588a05shiqian 1678e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 1679e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"I love food.")); 1680e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"tofo")); 1681e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(NULL)); 1682e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1683e35fdd936d133bf8a48de140a3c666897588a05shiqian 1684e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly. 1685e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, CanDescribeSelf) { 1686e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::std::wstring> m = HasSubstr(L"foo\n\""); 1687e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 1688e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1689e35fdd936d133bf8a48de140a3c666897588a05shiqian 1690e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s). 1691e35fdd936d133bf8a48de140a3c666897588a05shiqian 1692e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) { 1693e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L"")); 1694e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1695e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1696e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1697e35fdd936d133bf8a48de140a3c666897588a05shiqian 1698e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi"); 1699e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1700e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 1701e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"High")); 1702e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"H")); 1703e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L" Hi")); 1704e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1705e35fdd936d133bf8a48de140a3c666897588a05shiqian 1706e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, CanDescribeSelf) { 1707e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring> m = StartsWith(L"Hi"); 1708e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 1709e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1710e35fdd936d133bf8a48de140a3c666897588a05shiqian 1711e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s). 1712e35fdd936d133bf8a48de140a3c666897588a05shiqian 1713e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) { 1714e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = EndsWith(L""); 1715e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1716e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1717e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1718e35fdd936d133bf8a48de140a3c666897588a05shiqian 1719e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi")); 1720e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1721e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 1722e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Super Hi")); 1723e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"i")); 1724e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi ")); 1725e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1726e35fdd936d133bf8a48de140a3c666897588a05shiqian 1727e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, CanDescribeSelf) { 1728e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::std::wstring> m = EndsWith(L"Hi"); 1729e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 1730e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1731e35fdd936d133bf8a48de140a3c666897588a05shiqian 1732e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_HAS_STD_WSTRING 1733e35fdd936d133bf8a48de140a3c666897588a05shiqian 1734e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_GLOBAL_WSTRING 1735e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, MatchesEqual) { 1736e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello")); 1737e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1738e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1739e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1740e35fdd936d133bf8a48de140a3c666897588a05shiqian 1741e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m2 = StrEq(L"Hello"); 1742e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hello")); 1743e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1744e35fdd936d133bf8a48de140a3c666897588a05shiqian 1745e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1746e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 1747e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 1748e35fdd936d133bf8a48de140a3c666897588a05shiqian 1749e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str(L"01204500800"); 1750e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1751e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m4 = StrEq(str); 1752e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(str)); 1753e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1754e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m5 = StrEq(str); 1755e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m5.Matches(str)); 1756e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1757e35fdd936d133bf8a48de140a3c666897588a05shiqian 1758e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, CanDescribeSelf) { 1759aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev Matcher< ::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v"); 1760aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 1761e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 1762e35fdd936d133bf8a48de140a3c666897588a05shiqian 1763e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1764e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 1765e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m2)); 1766e35fdd936d133bf8a48de140a3c666897588a05shiqian 1767e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str(L"01204500800"); 1768e35fdd936d133bf8a48de140a3c666897588a05shiqian str[3] = L'\0'; 1769e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m4 = StrEq(str); 1770e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 1771e35fdd936d133bf8a48de140a3c666897588a05shiqian str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1772e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m5 = StrEq(str); 1773e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 1774e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1775e35fdd936d133bf8a48de140a3c666897588a05shiqian 1776e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, MatchesUnequalString) { 1777e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hello"); 1778e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"")); 1779e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1780e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1781e35fdd936d133bf8a48de140a3c666897588a05shiqian 1782e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello")); 1783e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1784e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1785e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1786e35fdd936d133bf8a48de140a3c666897588a05shiqian 1787e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, CanDescribeSelf) { 1788e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrNe(L"Hi"); 1789b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m)); 1790e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1791e35fdd936d133bf8a48de140a3c666897588a05shiqian 1792e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 1793e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello")); 1794e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hello")); 1795e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"hello")); 1796e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hi")); 1797e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 1798e35fdd936d133bf8a48de140a3c666897588a05shiqian 1799e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello"); 1800e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"hello")); 1801e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi")); 1802e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1803e35fdd936d133bf8a48de140a3c666897588a05shiqian 1804e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1805e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str1(L"oabocdooeoo"); 1806e35fdd936d133bf8a48de140a3c666897588a05shiqian ::wstring str2(L"OABOCDOOEOO"); 1807e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m0 = StrCaseEq(str1); 1808e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0'))); 1809e35fdd936d133bf8a48de140a3c666897588a05shiqian 1810e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[3] = str2[3] = L'\0'; 1811e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m1 = StrCaseEq(str1); 1812e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(str2)); 1813e35fdd936d133bf8a48de140a3c666897588a05shiqian 1814e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 1815e35fdd936d133bf8a48de140a3c666897588a05shiqian str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 1816e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m2 = StrCaseEq(str1); 1817e35fdd936d133bf8a48de140a3c666897588a05shiqian str1[9] = str2[9] = L'\0'; 1818e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(str2)); 1819e35fdd936d133bf8a48de140a3c666897588a05shiqian 1820e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring&> m3 = StrCaseEq(str1); 1821e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(str2)); 1822e35fdd936d133bf8a48de140a3c666897588a05shiqian 1823e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2 + L"x")); 1824e35fdd936d133bf8a48de140a3c666897588a05shiqian str2.append(1, L'\0'); 1825e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(str2)); 1826e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9))); 1827e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1828e35fdd936d133bf8a48de140a3c666897588a05shiqian 1829e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, CanDescribeSelf) { 1830e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m = StrCaseEq(L"Hi"); 1831e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 1832e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1833e35fdd936d133bf8a48de140a3c666897588a05shiqian 1834e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1835e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 1836e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(L"Hi")); 1837e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(NULL)); 1838e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"Hello")); 1839e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(L"hello")); 1840e35fdd936d133bf8a48de140a3c666897588a05shiqian 1841e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello")); 1842e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"")); 1843e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hello")); 1844e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1845e35fdd936d133bf8a48de140a3c666897588a05shiqian 1846e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, CanDescribeSelf) { 1847e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 1848b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m)); 1849e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1850e35fdd936d133bf8a48de140a3c666897588a05shiqian 1851e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values. 1852e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForStringClasses) { 1853e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher< ::wstring> m1 = HasSubstr(L"foo"); 1854e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(::wstring(L"I love food."))); 1855e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(::wstring(L"tofo"))); 1856e35fdd936d133bf8a48de140a3c666897588a05shiqian 1857e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::wstring&> m2 = HasSubstr(L"foo"); 1858e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(::wstring(L"I love food."))); 1859e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(::wstring(L"tofo"))); 1860e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1861e35fdd936d133bf8a48de140a3c666897588a05shiqian 1862e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values. 1863e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForCStrings) { 1864e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 1865e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 1866e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 1867e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1868e35fdd936d133bf8a48de140a3c666897588a05shiqian 1869e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 1870e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"I love food.")); 1871e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"tofo")); 1872e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(NULL)); 1873e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1874e35fdd936d133bf8a48de140a3c666897588a05shiqian 1875e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly. 1876e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, CanDescribeSelf) { 1877e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher< ::wstring> m = HasSubstr(L"foo\n\""); 1878e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 1879e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1880e35fdd936d133bf8a48de140a3c666897588a05shiqian 1881e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s). 1882e35fdd936d133bf8a48de140a3c666897588a05shiqian 1883e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) { 1884e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L"")); 1885e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1886e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1887e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1888e35fdd936d133bf8a48de140a3c666897588a05shiqian 1889e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::wstring&> m2 = StartsWith(L"Hi"); 1890e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1891e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 1892e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"High")); 1893e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"H")); 1894e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L" Hi")); 1895e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1896e35fdd936d133bf8a48de140a3c666897588a05shiqian 1897e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, CanDescribeSelf) { 1898e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring> m = StartsWith(L"Hi"); 1899e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 1900e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1901e35fdd936d133bf8a48de140a3c666897588a05shiqian 1902e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s). 1903e35fdd936d133bf8a48de140a3c666897588a05shiqian 1904e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) { 1905e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const wchar_t*> m1 = EndsWith(L""); 1906e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"Hi")); 1907e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(L"")); 1908e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(NULL)); 1909e35fdd936d133bf8a48de140a3c666897588a05shiqian 1910e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi")); 1911e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Hi")); 1912e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 1913e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m2.Matches(L"Super Hi")); 1914e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"i")); 1915e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(L"Hi ")); 1916e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1917e35fdd936d133bf8a48de140a3c666897588a05shiqian 1918e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, CanDescribeSelf) { 1919e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const ::wstring> m = EndsWith(L"Hi"); 1920e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 1921e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1922e35fdd936d133bf8a48de140a3c666897588a05shiqian 1923e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_HAS_GLOBAL_WSTRING 1924e35fdd936d133bf8a48de140a3c666897588a05shiqian 1925e35fdd936d133bf8a48de140a3c666897588a05shiqian 1926bd0188320de5aab1b09718e2c466387099d43cfbkosaktypedef ::testing::tuple<long, int> Tuple2; // NOLINT 1927e35fdd936d133bf8a48de140a3c666897588a05shiqian 1928e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() matches a 2-tuple where the first field == the 1929e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1930e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, MatchesEqualArguments) { 1931e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Eq(); 1932e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1933e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1934e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1935e35fdd936d133bf8a48de140a3c666897588a05shiqian 1936e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() describes itself properly. 1937e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, CanDescribeSelf) { 1938e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Eq(); 1939ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("are an equal pair", Describe(m)); 1940e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1941e35fdd936d133bf8a48de140a3c666897588a05shiqian 1942e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() matches a 2-tuple where the first field >= the 1943e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1944e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, MatchesGreaterThanOrEqualArguments) { 1945e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ge(); 1946e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1947e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1948e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1949e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1950e35fdd936d133bf8a48de140a3c666897588a05shiqian 1951e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() describes itself properly. 1952e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, CanDescribeSelf) { 1953e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ge(); 1954ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("are a pair where the first >= the second", Describe(m)); 1955e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1956e35fdd936d133bf8a48de140a3c666897588a05shiqian 1957e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() matches a 2-tuple where the first field > the 1958e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1959e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, MatchesGreaterThanArguments) { 1960e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Gt(); 1961e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1962e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1963e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1964e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1965e35fdd936d133bf8a48de140a3c666897588a05shiqian 1966e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() describes itself properly. 1967e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, CanDescribeSelf) { 1968e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Gt(); 1969ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("are a pair where the first > the second", Describe(m)); 1970e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1971e35fdd936d133bf8a48de140a3c666897588a05shiqian 1972e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() matches a 2-tuple where the first field <= the 1973e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1974e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, MatchesLessThanOrEqualArguments) { 1975e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Le(); 1976e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1977e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1978e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 1979e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1980e35fdd936d133bf8a48de140a3c666897588a05shiqian 1981e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() describes itself properly. 1982e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, CanDescribeSelf) { 1983e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Le(); 1984ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("are a pair where the first <= the second", Describe(m)); 1985e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1986e35fdd936d133bf8a48de140a3c666897588a05shiqian 1987e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() matches a 2-tuple where the first field < the 1988e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 1989e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, MatchesLessThanArguments) { 1990e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Lt(); 1991e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1992e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1993e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 1994e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1995e35fdd936d133bf8a48de140a3c666897588a05shiqian 1996e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() describes itself properly. 1997e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, CanDescribeSelf) { 1998e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Lt(); 1999ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("are a pair where the first < the second", Describe(m)); 2000e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2001e35fdd936d133bf8a48de140a3c666897588a05shiqian 2002e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() matches a 2-tuple where the first field != the 2003e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field. 2004e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, MatchesUnequalArguments) { 2005e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ne(); 2006e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 2007e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 2008e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 2009e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2010e35fdd936d133bf8a48de140a3c666897588a05shiqian 2011e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() describes itself properly. 2012e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, CanDescribeSelf) { 2013e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const Tuple2&> m = Ne(); 2014ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("are an unequal pair", Describe(m)); 2015e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2016e35fdd936d133bf8a48de140a3c666897588a05shiqian 2017e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) matches any value that doesn't match m. 2018e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, NegatesMatcher) { 2019e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 2020e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Not(Eq(2)); 2021e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 2022e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 2023e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2024e35fdd936d133bf8a48de140a3c666897588a05shiqian 2025e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) describes itself properly. 2026e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, CanDescribeSelf) { 2027e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Not(Eq(5)); 2028b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't equal to 5", Describe(m)); 2029e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2030e35fdd936d133bf8a48de140a3c666897588a05shiqian 203118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the Not matcher. 203218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) { 203318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // greater_than_5 is a monomorphic matcher. 203418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> greater_than_5 = Gt(5); 203518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 203618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m = Not(greater_than_5); 203718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = Not(greater_than_5); 203818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m3 = Not(m); 203918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 204018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 204102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan// Helper to allow easy testing of AllOf matchers with num parameters. 204202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wanvoid AllOfMatches(int num, const Matcher<int>& m) { 204302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan SCOPED_TRACE(Describe(m)); 204402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan EXPECT_TRUE(m.Matches(0)); 204502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan for (int i = 1; i <= num; ++i) { 204602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan EXPECT_FALSE(m.Matches(i)); 204702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan } 204802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan EXPECT_TRUE(m.Matches(num + 1)); 204902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan} 205002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan 2051e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) matches any value that matches all of 2052e35fdd936d133bf8a48de140a3c666897588a05shiqian// the given matchers. 2053e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, MatchesWhenAllMatch) { 2054e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 2055e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Le(2), Ge(1)); 2056e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 2057e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2)); 2058e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 2059e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(3)); 2060e35fdd936d133bf8a48de140a3c666897588a05shiqian 2061e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2)); 2062e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 2063e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 2064e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1)); 2065e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 2066e35fdd936d133bf8a48de140a3c666897588a05shiqian 2067e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 2068e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(4)); 2069e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(3)); 2070e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 2071e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1)); 2072e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 2073e35fdd936d133bf8a48de140a3c666897588a05shiqian 2074e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 2075e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(0)); 2076e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 2077e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(3)); 207802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan 207902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // The following tests for varying number of sub-matchers. Due to the way 208002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // the sub-matchers are handled it is enough to test every sub-matcher once 208102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // with sub-matchers using the same matcher type. Varying matcher types are 208202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // checked for above. 208302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(2, AllOf(Ne(1), Ne(2))); 208402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3))); 208502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4))); 208602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5))); 208702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6))); 208802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7))); 208902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), 209002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan Ne(8))); 209102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), 209202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan Ne(8), Ne(9))); 209302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), 209402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan Ne(9), Ne(10))); 2095e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2096e35fdd936d133bf8a48de140a3c666897588a05shiqian 2097616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#if GTEST_LANG_CXX11 2098616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Tests the variadic version of the AllOfMatcher. 2099616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST(AllOfTest, VariadicMatchesWhenAllMatch) { 2100616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // Make sure AllOf is defined in the right namespace and does not depend on 2101616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // ADL. 2102616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan ::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); 2103616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), 2104616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(9), Ne(10), Ne(11)); 2105616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11))))))))))")); 2106616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan AllOfMatches(11, m); 2107616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), 2108616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15), 2109616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(16), Ne(17), Ne(18), Ne(19), Ne(20), Ne(21), Ne(22), 2110616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(23), Ne(24), Ne(25), Ne(26), Ne(27), Ne(28), Ne(29), 2111616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(30), Ne(31), Ne(32), Ne(33), Ne(34), Ne(35), Ne(36), 2112616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(37), Ne(38), Ne(39), Ne(40), Ne(41), Ne(42), Ne(43), 2113616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49), 2114616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Ne(50))); 2115616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 2116616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2117616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#endif // GTEST_LANG_CXX11 2118616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2119e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) describes itself properly. 2120e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, CanDescribeSelf) { 2121e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 2122e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Le(2), Ge(1)); 2123b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m)); 2124e35fdd936d133bf8a48de140a3c666897588a05shiqian 2125e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2)); 2126b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(is > 0) and " 2127b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 1) and " 2128b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "(isn't equal to 2))", 2129e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 2130e35fdd936d133bf8a48de140a3c666897588a05shiqian 2131e35fdd936d133bf8a48de140a3c666897588a05shiqian 2132e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 213379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((is > 0) and " 213479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't equal to 1)) and " 2135b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 2) and " 213679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't equal to 3))", 2137e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 2138e35fdd936d133bf8a48de140a3c666897588a05shiqian 2139e35fdd936d133bf8a48de140a3c666897588a05shiqian 2140e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 214179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((is >= 0) and " 214279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is < 10)) and " 2143b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 3) and " 2144b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 5) and " 214579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't equal to 7)))", 2146b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Describe(m)); 2147b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan} 2148b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2149b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// Tests that AllOf(m1, ..., mn) describes its negation properly. 2150b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AllOfTest, CanDescribeNegation) { 2151b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<int> m; 2152b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(Le(2), Ge(1)); 2153b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(isn't <= 2) or " 2154b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "(isn't >= 1)", 2155b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2156b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2157b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(Gt(0), Ne(1), Ne(2)); 2158b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(isn't > 0) or " 2159b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((is equal to 1) or " 2160b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "(is equal to 2))", 2161b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2162b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2163b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2164b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 216579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((isn't > 0) or " 216679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is equal to 1)) or " 2167b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((is equal to 2) or " 216879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is equal to 3))", 2169b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2170b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2171b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2172b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 217379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((isn't >= 0) or " 217479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't < 10)) or " 2175b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((is equal to 3) or " 2176b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((is equal to 5) or " 217779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is equal to 7)))", 2178b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2179e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2180e35fdd936d133bf8a48de140a3c666897588a05shiqian 218118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AllOf matcher. 218218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) { 218318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // greater_than_5 and less_than_10 are monomorphic matchers. 218418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> greater_than_5 = Gt(5); 218518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> less_than_10 = Lt(10); 218618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 218718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m = AllOf(greater_than_5, less_than_10); 218818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = AllOf(greater_than_5, less_than_10); 218918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m3 = AllOf(greater_than_5, m2); 219018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 219118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Tests that BothOf works when composing itself. 219218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10); 219318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10); 219418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 219518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 2196b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AllOfTest, ExplainsResult) { 2197b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<int> m; 2198b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2199b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Successful match. Both matchers need to explain. The second 2200b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // matcher doesn't give an explanation, so only the first matcher's 2201b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explanation is printed. 2202b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(GreaterThan(10), Lt(30)); 2203b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 15 more than 10", Explain(m, 25)); 2204b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2205b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Successful match. Both matchers need to explain. 2206b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(GreaterThan(10), GreaterThan(20)); 2207b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20", 2208b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, 30)); 2209b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2210b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Successful match. All matchers need to explain. The second 2211b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // matcher doesn't given an explanation. 2212b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20)); 2213b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20", 2214b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, 25)); 2215b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2216b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Successful match. All matchers need to explain. 2217b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30)); 2218b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, " 2219b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "and which is 10 more than 30", 2220b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, 40)); 2221b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2222b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Failed match. The first matcher, which failed, needs to 2223b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explain. 2224b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(GreaterThan(10), GreaterThan(20)); 2225b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 less than 10", Explain(m, 5)); 2226b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2227b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Failed match. The second matcher, which failed, needs to 2228b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explain. Since it doesn't given an explanation, nothing is 2229b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // printed. 2230b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(GreaterThan(10), Lt(30)); 2231b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("", Explain(m, 40)); 2232b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2233b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Failed match. The second matcher, which failed, needs to 2234b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explain. 2235b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AllOf(GreaterThan(10), GreaterThan(20)); 2236b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 less than 20", Explain(m, 15)); 2237b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan} 2238b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 223902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan// Helper to allow easy testing of AnyOf matchers with num parameters. 224002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wanvoid AnyOfMatches(int num, const Matcher<int>& m) { 224102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan SCOPED_TRACE(Describe(m)); 224202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan EXPECT_FALSE(m.Matches(0)); 224302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan for (int i = 1; i <= num; ++i) { 224402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan EXPECT_TRUE(m.Matches(i)); 224502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan } 224602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan EXPECT_FALSE(m.Matches(num + 1)); 224702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan} 224802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan 2249e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) matches any value that matches at 2250e35fdd936d133bf8a48de140a3c666897588a05shiqian// least one of the given matchers. 2251e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, MatchesWhenAnyMatches) { 2252e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 2253e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(1), Ge(3)); 2254e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 2255e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(4)); 2256e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 2257e35fdd936d133bf8a48de140a3c666897588a05shiqian 2258e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2)); 2259e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(-1)); 2260e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 2261e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2)); 2262e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 2263e35fdd936d133bf8a48de140a3c666897588a05shiqian 2264e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 2265e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(-1)); 2266e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(1)); 2267e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2)); 2268e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 2269e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(0)); 2270e35fdd936d133bf8a48de140a3c666897588a05shiqian 2271e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(0), Gt(10), 3, 5, 7); 2272e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(0)); 2273e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(11)); 2274e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(3)); 2275e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(2)); 227602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan 227702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // The following tests for varying number of sub-matchers. Due to the way 227802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // the sub-matchers are handled it is enough to test every sub-matcher once 227902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // with sub-matchers using the same matcher type. Varying matcher types are 228002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan // checked for above. 228102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(2, AnyOf(1, 2)); 228202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(3, AnyOf(1, 2, 3)); 228302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(4, AnyOf(1, 2, 3, 4)); 228402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5)); 228502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6)); 228602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7)); 228702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8)); 228802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9)); 228902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); 2290e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2291e35fdd936d133bf8a48de140a3c666897588a05shiqian 2292616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#if GTEST_LANG_CXX11 2293616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Tests the variadic version of the AnyOfMatcher. 2294616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST(AnyOfTest, VariadicMatchesWhenAnyMatches) { 2295616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // Also make sure AnyOf is defined in the right namespace and does not depend 2296616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // on ADL. 2297616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); 2298616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2299616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11))))))))))")); 2300616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan AnyOfMatches(11, m); 2301616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2302616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 2303616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 2304616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 2305616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 41, 42, 43, 44, 45, 46, 47, 48, 49, 50)); 2306616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 2307616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2308616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#endif // GTEST_LANG_CXX11 2309616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2310e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) describes itself properly. 2311e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, CanDescribeSelf) { 2312e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m; 2313e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(1), Ge(3)); 2314b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(is <= 1) or (is >= 3)", 2315e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 2316e35fdd936d133bf8a48de140a3c666897588a05shiqian 2317e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2)); 2318b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(is < 0) or " 2319e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 1) or (is equal to 2))", 2320e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 2321e35fdd936d133bf8a48de140a3c666897588a05shiqian 2322e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 232379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((is < 0) or " 232479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is equal to 1)) or " 2325e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 2) or " 232679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is equal to 3))", 2327e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 2328e35fdd936d133bf8a48de140a3c666897588a05shiqian 2329e35fdd936d133bf8a48de140a3c666897588a05shiqian m = AnyOf(Le(0), Gt(10), 3, 5, 7); 233079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((is <= 0) or " 233179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is > 10)) or " 2332e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 3) or " 2333e35fdd936d133bf8a48de140a3c666897588a05shiqian "((is equal to 5) or " 233479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(is equal to 7)))", 2335e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 2336e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2337e35fdd936d133bf8a48de140a3c666897588a05shiqian 2338b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// Tests that AnyOf(m1, ..., mn) describes its negation properly. 2339b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AnyOfTest, CanDescribeNegation) { 2340b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<int> m; 2341b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(Le(1), Ge(3)); 2342b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(isn't <= 1) and (isn't >= 3)", 2343b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2344b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2345b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(Lt(0), Eq(1), Eq(2)); 2346b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("(isn't < 0) and " 2347b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 1) and (isn't equal to 2))", 2348b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2349b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2350b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 235179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((isn't < 0) and " 235279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't equal to 1)) and " 2353b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 2) and " 235479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't equal to 3))", 2355b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2356b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2357b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(Le(0), Gt(10), 3, 5, 7); 235879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm EXPECT_EQ("((isn't <= 0) and " 235979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't > 10)) and " 2360b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 3) and " 2361b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "((isn't equal to 5) and " 236279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm "(isn't equal to 7)))", 2363b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 2364b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan} 2365b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 236618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AnyOf matcher. 236718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) { 236818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // greater_than_5 and less_than_10 are monomorphic matchers. 236918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> greater_than_5 = Gt(5); 237018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int> less_than_10 = Lt(10); 237118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 237218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m = AnyOf(greater_than_5, less_than_10); 237318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10); 237418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m3 = AnyOf(greater_than_5, m2); 237518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 237618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Tests that EitherOf works when composing itself. 237718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10); 237818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10); 237918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 238018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 2381b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AnyOfTest, ExplainsResult) { 2382b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Matcher<int> m; 2383b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2384b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Failed match. Both matchers need to explain. The second 2385b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // matcher doesn't give an explanation, so only the first matcher's 2386b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explanation is printed. 2387b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(GreaterThan(10), Lt(0)); 2388b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 less than 10", Explain(m, 5)); 2389b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2390b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Failed match. Both matchers need to explain. 2391b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(GreaterThan(10), GreaterThan(20)); 2392b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20", 2393b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, 5)); 2394b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2395b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Failed match. All matchers need to explain. The second 2396b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // matcher doesn't given an explanation. 2397b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30)); 2398b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30", 2399b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, 5)); 2400b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2401b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Failed match. All matchers need to explain. 2402b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30)); 2403b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, " 2404b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "and which is 25 less than 30", 2405b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, 5)); 2406b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2407b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Successful match. The first matcher, which succeeded, needs to 2408b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explain. 2409b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(GreaterThan(10), GreaterThan(20)); 2410b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 more than 10", Explain(m, 15)); 2411b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2412b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Successful match. The second matcher, which succeeded, needs to 2413b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explain. Since it doesn't given an explanation, nothing is 2414b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // printed. 2415b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(GreaterThan(10), Lt(30)); 2416b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("", Explain(m, 0)); 2417b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2418b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Successful match. The second matcher, which succeeded, needs to 2419b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explain. 2420b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan m = AnyOf(GreaterThan(30), GreaterThan(20)); 2421b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 5 more than 20", Explain(m, 25)); 2422b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan} 2423b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 2424e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following predicate function and predicate functor are for 2425e35fdd936d133bf8a48de140a3c666897588a05shiqian// testing the Truly(predicate) matcher. 2426e35fdd936d133bf8a48de140a3c666897588a05shiqian 2427e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns non-zero if the input is positive. Note that the return 2428e35fdd936d133bf8a48de140a3c666897588a05shiqian// type of this function is not bool. It's OK as Truly() accepts any 2429e35fdd936d133bf8a48de140a3c666897588a05shiqian// unary function or functor whose return type can be implicitly 2430e35fdd936d133bf8a48de140a3c666897588a05shiqian// converted to bool. 2431e35fdd936d133bf8a48de140a3c666897588a05shiqianint IsPositive(double x) { 2432e35fdd936d133bf8a48de140a3c666897588a05shiqian return x > 0 ? 1 : 0; 2433e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2434e35fdd936d133bf8a48de140a3c666897588a05shiqian 2435e35fdd936d133bf8a48de140a3c666897588a05shiqian// This functor returns true if the input is greater than the given 2436e35fdd936d133bf8a48de140a3c666897588a05shiqian// number. 2437e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IsGreaterThan { 2438e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 2439e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit IsGreaterThan(int threshold) : threshold_(threshold) {} 2440e35fdd936d133bf8a48de140a3c666897588a05shiqian 2441e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator()(int n) const { return n > threshold_; } 244232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 2443e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 244432de5f53763125925e078498250f7e73a88de9edzhanyong.wan int threshold_; 2445e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 2446e35fdd936d133bf8a48de140a3c666897588a05shiqian 2447e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing Truly(). 2448e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int foo = 0; 2449e35fdd936d133bf8a48de140a3c666897588a05shiqian 2450e35fdd936d133bf8a48de140a3c666897588a05shiqian// This predicate returns true iff the argument references foo and has 2451e35fdd936d133bf8a48de140a3c666897588a05shiqian// a zero value. 2452e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ReferencesFooAndIsZero(const int& n) { 2453e35fdd936d133bf8a48de140a3c666897588a05shiqian return (&n == &foo) && (n == 0); 2454e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2455e35fdd936d133bf8a48de140a3c666897588a05shiqian 2456e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) matches what satisfies the given 2457e35fdd936d133bf8a48de140a3c666897588a05shiqian// predicate. 2458e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, MatchesWhatSatisfiesThePredicate) { 2459e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = Truly(IsPositive); 2460e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(2.0)); 2461e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(-1.5)); 2462e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2463e35fdd936d133bf8a48de140a3c666897588a05shiqian 2464e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate_functor) works too. 2465e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanBeUsedWithFunctor) { 2466e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> m = Truly(IsGreaterThan(5)); 2467e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(6)); 2468e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(4)); 2469e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2470e35fdd936d133bf8a48de140a3c666897588a05shiqian 24718d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// A class that can be implicitly converted to bool. 24728d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wanclass ConvertibleToBool { 24738d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan public: 24748d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan explicit ConvertibleToBool(int number) : number_(number) {} 24758d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan operator bool() const { return number_ != 0; } 24768d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan 24778d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan private: 24788d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan int number_; 24798d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan}; 24808d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan 24818d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wanConvertibleToBool IsNotZero(int number) { 24828d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan return ConvertibleToBool(number); 24838d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan} 24848d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan 24858d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// Tests that the predicate used in Truly() may return a class that's 24868d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// implicitly convertible to bool, even when the class has no 24878d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// operator!(). 24888d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wanTEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) { 24898d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan Matcher<int> m = Truly(IsNotZero); 24908d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan EXPECT_TRUE(m.Matches(1)); 24918d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan EXPECT_FALSE(m.Matches(0)); 24928d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan} 24938d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan 2494e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) can describe itself properly. 2495e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanDescribeSelf) { 2496e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = Truly(IsPositive); 2497e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("satisfies the given predicate", 2498e35fdd936d133bf8a48de140a3c666897588a05shiqian Describe(m)); 2499e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2500e35fdd936d133bf8a48de140a3c666897588a05shiqian 2501e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) works when the matcher takes its 2502e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument by reference. 2503e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, WorksForByRefArguments) { 2504e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> m = Truly(ReferencesFooAndIsZero); 2505e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(foo)); 2506e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 0; 2507e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(n)); 2508e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2509e35fdd936d133bf8a48de140a3c666897588a05shiqian 2510e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) is a predicate satisfied by whatever that 2511e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches matcher m. 2512e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) { 2513e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(Matches(Ge(0))(1)); 2514e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(Matches(Eq('a'))('b')); 2515e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2516e35fdd936d133bf8a48de140a3c666897588a05shiqian 2517e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) works when the matcher takes its argument by 2518e35fdd936d133bf8a48de140a3c666897588a05shiqian// reference. 2519e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksOnByRefArguments) { 2520e35fdd936d133bf8a48de140a3c666897588a05shiqian int m = 0, n = 0; 2521e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n)); 2522e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(Matches(Ref(m))(n)); 2523e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2524e35fdd936d133bf8a48de140a3c666897588a05shiqian 2525e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a Matcher on non-reference type can be used in 2526e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches(). 2527e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksWithMatcherOnNonRefType) { 2528e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> eq5 = Eq(5); 2529e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(Matches(eq5)(5)); 2530e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(Matches(eq5)(2)); 2531e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2532e35fdd936d133bf8a48de140a3c666897588a05shiqian 2533b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Tests Value(value, matcher). Since Value() is a simple wrapper for 2534b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Matches(), which has been tested already, we don't spend a lot of 2535b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// effort on testing Value(). 2536b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithPolymorphicMatcher) { 2537b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_TRUE(Value("hi", StartsWith("h"))); 2538b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_FALSE(Value(5, Gt(10))); 2539b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 2540b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2541b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithMonomorphicMatcher) { 2542b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const Matcher<int> is_zero = Eq(0); 2543b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_TRUE(Value(0, is_zero)); 2544b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_FALSE(Value('a', is_zero)); 2545b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2546b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan int n = 0; 2547b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const Matcher<const int&> ref_n = Ref(n); 2548b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_TRUE(Value(n, ref_n)); 2549b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_FALSE(Value(1, ref_n)); 2550b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 2551b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2552a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) { 255334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan StringMatchResultListener listener1; 2554a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1)); 255534b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan EXPECT_EQ("% 2 == 0", listener1.str()); 255634b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan 255734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan StringMatchResultListener listener2; 2558a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2)); 255934b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan EXPECT_EQ("", listener2.str()); 256034b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan} 256134b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan 2562a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) { 256334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan const Matcher<int> is_even = PolymorphicIsEven(); 256434b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan StringMatchResultListener listener1; 2565a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1)); 256634b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan EXPECT_EQ("% 2 == 0", listener1.str()); 256734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan 256834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan const Matcher<const double&> is_zero = Eq(0); 256934b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan StringMatchResultListener listener2; 2570a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2)); 257134b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan EXPECT_EQ("", listener2.str()); 257234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan} 257334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan 2574a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanMATCHER_P(Really, inner_matcher, "") { 2575a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan return ExplainMatchResult(inner_matcher, arg, result_listener); 2576a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan} 2577a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 2578a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksInsideMATCHER) { 2579a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan EXPECT_THAT(0, Really(Eq(0))); 2580a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan} 2581a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 2582bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForTuple) { 2583bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt())); 2584bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt()))); 2585bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan} 2586bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 2587bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForNonTuple) { 2588bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT(42, AllArgs(Gt(0))); 2589bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_THAT('a', Not(AllArgs(Eq('b')))); 2590bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan} 2591bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 2592bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanclass AllArgsHelper { 2593bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan public: 259432de5f53763125925e078498250f7e73a88de9edzhanyong.wan AllArgsHelper() {} 259532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 2596bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan MOCK_METHOD2(Helper, int(char x, int y)); 259732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 259832de5f53763125925e078498250f7e73a88de9edzhanyong.wan private: 259932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper); 2600bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}; 2601bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 2602bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksInWithClause) { 2603bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan AllArgsHelper helper; 2604bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan ON_CALL(helper, Helper(_, _)) 2605bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .With(AllArgs(Lt())) 2606bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .WillByDefault(Return(1)); 2607bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_CALL(helper, Helper(_, _)); 2608bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_CALL(helper, Helper(_, _)) 2609bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .With(AllArgs(Gt())) 2610bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan .WillOnce(Return(2)); 2611bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 2612bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_EQ(1, helper.Helper('\1', 2)); 2613bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan EXPECT_EQ(2, helper.Helper('a', 1)); 2614bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan} 2615bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 2616e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 2617e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches the matcher. 2618e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) { 2619e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT(5, Ge(2)) << "This should succeed."; 2620e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT("Foo", EndsWith("oo")); 2621e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too."; 2622e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_THAT("Hello", StartsWith("Hell")); 2623e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2624e35fdd936d133bf8a48de140a3c666897588a05shiqian 2625e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 2626e35fdd936d133bf8a48de140a3c666897588a05shiqian// doesn't match the matcher. 2627e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) { 2628e35fdd936d133bf8a48de140a3c666897588a05shiqian // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(), 2629e35fdd936d133bf8a48de140a3c666897588a05shiqian // which cannot reference auto variables. 2630736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan static unsigned short n; // NOLINT 2631e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 5; 26322b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 26332b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // VC++ prior to version 8.0 SP1 has a bug where it will not see any 26342b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // functions declared in the namespace scope from within nested classes. 26352b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all 26362b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // namespace-level functions invoked inside them need to be explicitly 26372b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // resolved. 26382b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)), 2639e35fdd936d133bf8a48de140a3c666897588a05shiqian "Value of: n\n" 2640b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "Expected: is > 10\n" 2641736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan " Actual: 5" + OfType("unsigned short")); 2642e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 0; 26432b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_NONFATAL_FAILURE( 26442b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))), 26452b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan "Value of: n\n" 2646b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "Expected: (is <= 7) and (is >= 5)\n" 2647736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan " Actual: 0" + OfType("unsigned short")); 2648e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2649e35fdd936d133bf8a48de140a3c666897588a05shiqian 2650e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument 2651e35fdd936d133bf8a48de140a3c666897588a05shiqian// has a reference type. 2652e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForByRefArguments) { 2653e35fdd936d133bf8a48de140a3c666897588a05shiqian // We use a static variable here as EXPECT_FATAL_FAILURE() cannot 2654e35fdd936d133bf8a48de140a3c666897588a05shiqian // reference auto variables. 2655e35fdd936d133bf8a48de140a3c666897588a05shiqian static int n; 2656e35fdd936d133bf8a48de140a3c666897588a05shiqian n = 0; 2657e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_THAT(n, AllOf(Le(7), Ref(n))); 26582b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 2659e35fdd936d133bf8a48de140a3c666897588a05shiqian "Value of: n\n" 2660e35fdd936d133bf8a48de140a3c666897588a05shiqian "Expected: does not reference the variable @"); 2661e35fdd936d133bf8a48de140a3c666897588a05shiqian // Tests the "Actual" part. 26622b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 2663736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan "Actual: 0" + OfType("int") + ", which is located @"); 2664e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2665e35fdd936d133bf8a48de140a3c666897588a05shiqian 266695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if !GTEST_OS_SYMBIAN 2667e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is 2668e35fdd936d133bf8a48de140a3c666897588a05shiqian// monomorphic. 266995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan 267095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's 267195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// Symbian compiler: it tries to compile 267295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// template<T, U> class MatcherCastImpl { ... 2673db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// virtual bool MatchAndExplain(T x, ...) const { 2674db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// return source_matcher_.MatchAndExplain(static_cast<U>(x), ...); 267595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// with U == string and T == const char* 267695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... ) 267795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// the compiler silently crashes with no output. 267895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x) 267995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// the code compiles but the converted string is bogus. 2680e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) { 2681e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> starts_with_he = StartsWith("he"); 2682e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT("hello", starts_with_he); 2683e35fdd936d133bf8a48de140a3c666897588a05shiqian 2684e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> ends_with_ok = EndsWith("ok"); 2685e35fdd936d133bf8a48de140a3c666897588a05shiqian ASSERT_THAT("book", ends_with_ok); 2686736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan const string bad = "bad"; 2687736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok), 2688736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan "Value of: bad\n" 2689736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan "Expected: ends with \"ok\"\n" 2690736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan " Actual: \"bad\""); 2691e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> is_greater_than_5 = Gt(5); 2692e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5), 2693e35fdd936d133bf8a48de140a3c666897588a05shiqian "Value of: 5\n" 2694b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "Expected: is > 5\n" 2695736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan " Actual: 5" + OfType("int")); 2696e35fdd936d133bf8a48de140a3c666897588a05shiqian} 269795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif // !GTEST_OS_SYMBIAN 2698e35fdd936d133bf8a48de140a3c666897588a05shiqian 2699e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests floating-point matchers. 2700e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType> 2701e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FloatingPointTest : public testing::Test { 2702e35fdd936d133bf8a48de140a3c666897588a05shiqian protected: 270335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan typedef testing::internal::FloatingPoint<RawType> Floating; 2704e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename Floating::Bits Bits; 2705e35fdd936d133bf8a48de140a3c666897588a05shiqian 270635877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan FloatingPointTest() 270735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan : max_ulps_(Floating::kMaxUlps), 270835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan zero_bits_(Floating(0).bits()), 270935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan one_bits_(Floating(1).bits()), 271035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan infinity_bits_(Floating(Floating::Infinity()).bits()), 27114a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai close_to_positive_zero_(AsBits(zero_bits_ + max_ulps_/2)), 27124a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai close_to_negative_zero_(AsBits(zero_bits_ + max_ulps_ - max_ulps_/2)), 27134a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai further_from_negative_zero_(-AsBits( 2714cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai zero_bits_ + max_ulps_ + 1 - max_ulps_/2)), 27154a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai close_to_one_(AsBits(one_bits_ + max_ulps_)), 27164a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai further_from_one_(AsBits(one_bits_ + max_ulps_ + 1)), 271735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan infinity_(Floating::Infinity()), 27184a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai close_to_infinity_(AsBits(infinity_bits_ - max_ulps_)), 27194a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai further_from_infinity_(AsBits(infinity_bits_ - max_ulps_ - 1)), 272035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan max_(Floating::Max()), 27214a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai nan1_(AsBits(Floating::kExponentBitMask | 1)), 27224a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai nan2_(AsBits(Floating::kExponentBitMask | 200)) { 2723e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2724e35fdd936d133bf8a48de140a3c666897588a05shiqian 2725e35fdd936d133bf8a48de140a3c666897588a05shiqian void TestSize() { 2726e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ(sizeof(RawType), sizeof(Bits)); 2727e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2728e35fdd936d133bf8a48de140a3c666897588a05shiqian 2729e35fdd936d133bf8a48de140a3c666897588a05shiqian // A battery of tests for FloatingEqMatcher::Matches. 2730e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_maker is a pointer to a function which creates a FloatingEqMatcher. 2731e35fdd936d133bf8a48de140a3c666897588a05shiqian void TestMatches( 2732e35fdd936d133bf8a48de140a3c666897588a05shiqian testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) { 2733e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m1 = matcher_maker(0.0); 2734e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(-0.0)); 2735e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(close_to_positive_zero_)); 2736e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m1.Matches(close_to_negative_zero_)); 2737e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m1.Matches(1.0)); 2738e35fdd936d133bf8a48de140a3c666897588a05shiqian 2739e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_); 2740e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m2.Matches(further_from_negative_zero_)); 2741e35fdd936d133bf8a48de140a3c666897588a05shiqian 2742e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m3 = matcher_maker(1.0); 2743e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m3.Matches(close_to_one_)); 2744e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(further_from_one_)); 2745e35fdd936d133bf8a48de140a3c666897588a05shiqian 2746e35fdd936d133bf8a48de140a3c666897588a05shiqian // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above. 2747e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m3.Matches(0.0)); 2748e35fdd936d133bf8a48de140a3c666897588a05shiqian 2749e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m4 = matcher_maker(-infinity_); 2750e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m4.Matches(-close_to_infinity_)); 2751e35fdd936d133bf8a48de140a3c666897588a05shiqian 2752e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType> m5 = matcher_maker(infinity_); 2753e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m5.Matches(close_to_infinity_)); 2754e35fdd936d133bf8a48de140a3c666897588a05shiqian 2755e35fdd936d133bf8a48de140a3c666897588a05shiqian // This is interesting as the representations of infinity_ and nan1_ 2756e35fdd936d133bf8a48de140a3c666897588a05shiqian // are only 1 DLP apart. 2757e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m5.Matches(nan1_)); 2758e35fdd936d133bf8a48de140a3c666897588a05shiqian 2759e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_maker can produce a Matcher<const RawType&>, which is needed in 2760e35fdd936d133bf8a48de140a3c666897588a05shiqian // some cases. 2761e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const RawType&> m6 = matcher_maker(0.0); 2762e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m6.Matches(-0.0)); 2763e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m6.Matches(close_to_positive_zero_)); 2764e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m6.Matches(1.0)); 2765e35fdd936d133bf8a48de140a3c666897588a05shiqian 2766e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_maker can produce a Matcher<RawType&>, which is needed in some 2767e35fdd936d133bf8a48de140a3c666897588a05shiqian // cases. 2768e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<RawType&> m7 = matcher_maker(0.0); 2769e35fdd936d133bf8a48de140a3c666897588a05shiqian RawType x = 0.0; 2770e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m7.Matches(x)); 2771e35fdd936d133bf8a48de140a3c666897588a05shiqian x = 0.01f; 2772e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m7.Matches(x)); 2773e35fdd936d133bf8a48de140a3c666897588a05shiqian } 2774e35fdd936d133bf8a48de140a3c666897588a05shiqian 2775e35fdd936d133bf8a48de140a3c666897588a05shiqian // Pre-calculated numbers to be used by the tests. 2776e35fdd936d133bf8a48de140a3c666897588a05shiqian 2777cbce23fb86705aff7f9f1294a295027d7ed674efMark Mentovai const size_t max_ulps_; 2778e35fdd936d133bf8a48de140a3c666897588a05shiqian 277935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const Bits zero_bits_; // The bits that represent 0.0. 278035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const Bits one_bits_; // The bits that represent 1.0. 278135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const Bits infinity_bits_; // The bits that represent +infinity. 2782e35fdd936d133bf8a48de140a3c666897588a05shiqian 278335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan // Some numbers close to 0.0. 278435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType close_to_positive_zero_; 278535877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType close_to_negative_zero_; 278635877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType further_from_negative_zero_; 2787e35fdd936d133bf8a48de140a3c666897588a05shiqian 278835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan // Some numbers close to 1.0. 278935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType close_to_one_; 279035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType further_from_one_; 2791e35fdd936d133bf8a48de140a3c666897588a05shiqian 279235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan // Some numbers close to +infinity. 279335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType infinity_; 279435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType close_to_infinity_; 279535877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType further_from_infinity_; 2796e35fdd936d133bf8a48de140a3c666897588a05shiqian 279735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan // Maximum representable value that's not infinity. 279835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType max_; 2799e35fdd936d133bf8a48de140a3c666897588a05shiqian 280035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan // Some NaNs. 280135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType nan1_; 280235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan const RawType nan2_; 2803cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai 2804cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai private: 2805cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai template <typename T> 28064a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai static RawType AsBits(T value) { 2807cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai return Floating::ReinterpretBits(static_cast<Bits>(value)); 2808cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai } 280935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan}; 2810e35fdd936d133bf8a48de140a3c666897588a05shiqian 2811616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Tests floating-point matchers with fixed epsilons. 2812616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wantemplate <typename RawType> 2813616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanclass FloatingPointNearTest : public FloatingPointTest<RawType> { 2814616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan protected: 2815616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan typedef FloatingPointTest<RawType> ParentType; 2816616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2817616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon. 2818616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // matcher_maker is a pointer to a function which creates a FloatingEqMatcher. 2819616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan void TestNearMatches( 2820616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan testing::internal::FloatingEqMatcher<RawType> 2821616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan (*matcher_maker)(RawType, RawType)) { 2822616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<RawType> m1 = matcher_maker(0.0, 0.0); 2823616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m1.Matches(0.0)); 2824616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m1.Matches(-0.0)); 2825616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_)); 2826616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_)); 2827616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m1.Matches(1.0)); 2828616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2829616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<RawType> m2 = matcher_maker(0.0, 1.0); 2830616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m2.Matches(0.0)); 2831616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m2.Matches(-0.0)); 2832616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m2.Matches(1.0)); 2833616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m2.Matches(-1.0)); 2834616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m2.Matches(ParentType::close_to_one_)); 2835616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_)); 2836616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2837616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // Check that inf matches inf, regardless of the of the specified max 2838616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // absolute error. 2839616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0); 2840616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m3.Matches(ParentType::infinity_)); 2841616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_)); 2842616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m3.Matches(-ParentType::infinity_)); 2843616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2844616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0); 2845616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m4.Matches(-ParentType::infinity_)); 2846616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_)); 2847616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m4.Matches(ParentType::infinity_)); 2848616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2849616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // Test various overflow scenarios. 285035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_); 285135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_TRUE(m5.Matches(ParentType::max_)); 285235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_FALSE(m5.Matches(-ParentType::max_)); 285335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan 285435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_); 285535877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_FALSE(m6.Matches(ParentType::max_)); 285635877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_TRUE(m6.Matches(-ParentType::max_)); 285735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan 285835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0); 285935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_TRUE(m7.Matches(ParentType::max_)); 286035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_FALSE(m7.Matches(-ParentType::max_)); 286135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan 286235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0); 286335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_FALSE(m8.Matches(ParentType::max_)); 286435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_TRUE(m8.Matches(-ParentType::max_)); 2865616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2866616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // The difference between max() and -max() normally overflows to infinity, 2867616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // but it should still match if the max_abs_error is also infinity. 2868616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<RawType> m9 = matcher_maker( 286935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan ParentType::max_, ParentType::infinity_); 287035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan EXPECT_TRUE(m8.Matches(-ParentType::max_)); 2871616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2872616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // matcher_maker can produce a Matcher<const RawType&>, which is needed in 2873616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // some cases. 2874616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0); 2875616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m10.Matches(-0.0)); 2876616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_)); 2877616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m10.Matches(ParentType::close_to_one_)); 2878616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2879616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // matcher_maker can produce a Matcher<RawType&>, which is needed in some 2880616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // cases. 2881616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<RawType&> m11 = matcher_maker(0.0, 1.0); 2882616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan RawType x = 0.0; 2883616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m11.Matches(x)); 2884616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan x = 1.0f; 2885616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m11.Matches(x)); 2886616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan x = -1.0f; 2887616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m11.Matches(x)); 2888616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan x = 1.1f; 2889616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m11.Matches(x)); 2890616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan x = -1.1f; 2891616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m11.Matches(x)); 2892616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan } 2893616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}; 2894616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2895e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing floats. 2896e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<float> FloatTest; 2897e35fdd936d133bf8a48de140a3c666897588a05shiqian 2898e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) { 2899e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&FloatEq); 2900e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2901e35fdd936d133bf8a48de140a3c666897588a05shiqian 2902e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) { 2903e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&NanSensitiveFloatEq); 2904e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2905e35fdd936d133bf8a48de140a3c666897588a05shiqian 2906e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCannotMatchNaN) { 2907e35fdd936d133bf8a48de140a3c666897588a05shiqian // FloatEq never matches NaN. 2908e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m = FloatEq(nan1_); 2909e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan1_)); 2910e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan2_)); 2911e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 2912e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2913e35fdd936d133bf8a48de140a3c666897588a05shiqian 2914e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) { 2915e35fdd936d133bf8a48de140a3c666897588a05shiqian // NanSensitiveFloatEq will match NaN. 2916e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m = NanSensitiveFloatEq(nan1_); 2917e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan1_)); 2918e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan2_)); 2919e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 2920e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2921e35fdd936d133bf8a48de140a3c666897588a05shiqian 2922e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCanDescribeSelf) { 2923e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m1 = FloatEq(2.0f); 2924e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 2925b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 2926e35fdd936d133bf8a48de140a3c666897588a05shiqian 2927e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m2 = FloatEq(0.5f); 2928e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 2929b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 2930e35fdd936d133bf8a48de140a3c666897588a05shiqian 2931e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m3 = FloatEq(nan1_); 2932e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("never matches", Describe(m3)); 2933e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", DescribeNegation(m3)); 2934e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2935e35fdd936d133bf8a48de140a3c666897588a05shiqian 2936e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) { 2937e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m1 = NanSensitiveFloatEq(2.0f); 2938e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 2939b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 2940e35fdd936d133bf8a48de140a3c666897588a05shiqian 2941e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m2 = NanSensitiveFloatEq(0.5f); 2942e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 2943b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 2944e35fdd936d133bf8a48de140a3c666897588a05shiqian 2945e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<float> m3 = NanSensitiveFloatEq(nan1_); 2946e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is NaN", Describe(m3)); 2947b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 2948e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2949e35fdd936d133bf8a48de140a3c666897588a05shiqian 2950616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Instantiate FloatingPointTest for testing floats with a user-specified 2951616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// max absolute error. 2952616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wantypedef FloatingPointNearTest<float> FloatNearTest; 2953616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2954616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, FloatNearMatches) { 2955616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan TestNearMatches(&FloatNear); 2956616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 2957616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2958616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) { 2959616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan TestNearMatches(&NanSensitiveFloatNear); 2960616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 2961616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2962616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, FloatNearCanDescribeSelf) { 2963616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m1 = FloatNear(2.0f, 0.5f); 2964616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 2965616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 2966616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 2967616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2968616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m2 = FloatNear(0.5f, 0.5f); 2969616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 2970616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 2971616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 2972616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2973616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m3 = FloatNear(nan1_, 0.0); 2974616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("never matches", Describe(m3)); 2975616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is anything", DescribeNegation(m3)); 2976616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 2977616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2978616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) { 2979616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f); 2980616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 2981616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 2982616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 2983616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2984616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f); 2985616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 2986616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 2987616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 2988616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2989616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f); 2990616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is NaN", Describe(m3)); 2991616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 2992616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 2993616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 2994616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, FloatNearCannotMatchNaN) { 2995616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // FloatNear never matches NaN. 2996616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f); 2997616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(nan1_)); 2998616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(nan2_)); 2999616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(1.0)); 3000616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3001616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3002616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) { 3003616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // NanSensitiveFloatNear will match NaN. 3004616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f); 3005616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m.Matches(nan1_)); 3006616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m.Matches(nan2_)); 3007616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(1.0)); 3008616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3009616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3010e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing doubles. 3011e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<double> DoubleTest; 3012e35fdd936d133bf8a48de140a3c666897588a05shiqian 3013e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) { 3014e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&DoubleEq); 3015e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3016e35fdd936d133bf8a48de140a3c666897588a05shiqian 3017e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) { 3018e35fdd936d133bf8a48de140a3c666897588a05shiqian TestMatches(&NanSensitiveDoubleEq); 3019e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3020e35fdd936d133bf8a48de140a3c666897588a05shiqian 3021e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCannotMatchNaN) { 3022e35fdd936d133bf8a48de140a3c666897588a05shiqian // DoubleEq never matches NaN. 3023e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = DoubleEq(nan1_); 3024e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan1_)); 3025e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(nan2_)); 3026e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 3027e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3028e35fdd936d133bf8a48de140a3c666897588a05shiqian 3029e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) { 3030e35fdd936d133bf8a48de140a3c666897588a05shiqian // NanSensitiveDoubleEq will match NaN. 3031e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m = NanSensitiveDoubleEq(nan1_); 3032e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan1_)); 3033e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(nan2_)); 3034e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(1.0)); 3035e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3036e35fdd936d133bf8a48de140a3c666897588a05shiqian 3037e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCanDescribeSelf) { 3038e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = DoubleEq(2.0); 3039e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 3040b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 3041e35fdd936d133bf8a48de140a3c666897588a05shiqian 3042e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m2 = DoubleEq(0.5); 3043e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 3044b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 3045e35fdd936d133bf8a48de140a3c666897588a05shiqian 3046e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m3 = DoubleEq(nan1_); 3047e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("never matches", Describe(m3)); 3048e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is anything", DescribeNegation(m3)); 3049e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3050e35fdd936d133bf8a48de140a3c666897588a05shiqian 3051e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) { 3052e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m1 = NanSensitiveDoubleEq(2.0); 3053e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 2", Describe(m1)); 3054b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 3055e35fdd936d133bf8a48de140a3c666897588a05shiqian 3056e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m2 = NanSensitiveDoubleEq(0.5); 3057e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is approximately 0.5", Describe(m2)); 3058b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 3059e35fdd936d133bf8a48de140a3c666897588a05shiqian 3060e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double> m3 = NanSensitiveDoubleEq(nan1_); 3061e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("is NaN", Describe(m3)); 3062b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 3063e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3064e35fdd936d133bf8a48de140a3c666897588a05shiqian 3065616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Instantiate FloatingPointTest for testing floats with a user-specified 3066616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// max absolute error. 3067616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wantypedef FloatingPointNearTest<double> DoubleNearTest; 3068616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3069616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, DoubleNearMatches) { 3070616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan TestNearMatches(&DoubleNear); 3071616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3072616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3073616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) { 3074616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan TestNearMatches(&NanSensitiveDoubleNear); 3075616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3076616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3077616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) { 3078616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m1 = DoubleNear(2.0, 0.5); 3079616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 3080616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 3081616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 3082616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3083616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m2 = DoubleNear(0.5, 0.5); 3084616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 3085616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 3086616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 3087616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3088616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m3 = DoubleNear(nan1_, 0.0); 3089616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("never matches", Describe(m3)); 3090616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is anything", DescribeNegation(m3)); 3091616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3092616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 30936b817803104b30d5951c652a1427492db116a490kosakTEST_F(DoubleNearTest, ExplainsResultWhenMatchFails) { 30946b817803104b30d5951c652a1427492db116a490kosak EXPECT_EQ("", Explain(DoubleNear(2.0, 0.1), 2.05)); 30956b817803104b30d5951c652a1427492db116a490kosak EXPECT_EQ("which is 0.2 from 2", Explain(DoubleNear(2.0, 0.1), 2.2)); 30966b817803104b30d5951c652a1427492db116a490kosak EXPECT_EQ("which is -0.3 from 2", Explain(DoubleNear(2.0, 0.1), 1.7)); 30976b817803104b30d5951c652a1427492db116a490kosak 30986b817803104b30d5951c652a1427492db116a490kosak const string explanation = Explain(DoubleNear(2.1, 1e-10), 2.1 + 1.2e-10); 30996b817803104b30d5951c652a1427492db116a490kosak // Different C++ implementations may print floating-point numbers 31006b817803104b30d5951c652a1427492db116a490kosak // slightly differently. 31016b817803104b30d5951c652a1427492db116a490kosak EXPECT_TRUE(explanation == "which is 1.2e-10 from 2.1" || // GCC 31026b817803104b30d5951c652a1427492db116a490kosak explanation == "which is 1.2e-010 from 2.1") // MSVC 31036b817803104b30d5951c652a1427492db116a490kosak << " where explanation is \"" << explanation << "\"."; 31046b817803104b30d5951c652a1427492db116a490kosak} 31056b817803104b30d5951c652a1427492db116a490kosak 3106616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) { 3107616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5); 3108616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 3109616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 3110616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 3111616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3112616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5); 3113616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 3114616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ( 3115616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 3116616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3117616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1); 3118616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("is NaN", Describe(m3)); 3119616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 3120616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3121616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3122616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) { 3123616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // DoubleNear never matches NaN. 3124616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1); 3125616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(nan1_)); 3126616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(nan2_)); 3127616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(1.0)); 3128616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3129616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3130616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) { 3131616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan // NanSensitiveDoubleNear will match NaN. 3132616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1); 3133616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m.Matches(nan1_)); 3134616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_TRUE(m.Matches(nan2_)); 3135616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan EXPECT_FALSE(m.Matches(1.0)); 3136616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan} 3137616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan 3138e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointer) { 3139e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int*> m = Pointee(Ge(0)); 3140e35fdd936d133bf8a48de140a3c666897588a05shiqian 3141e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 1; 3142e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&n)); 3143e35fdd936d133bf8a48de140a3c666897588a05shiqian n = -1; 3144e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&n)); 3145e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 3146e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3147e35fdd936d133bf8a48de140a3c666897588a05shiqian 3148e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointerToConst) { 3149e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const double*> m = Pointee(Ge(0)); 3150e35fdd936d133bf8a48de140a3c666897588a05shiqian 3151e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 1; 3152e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&x)); 3153e35fdd936d133bf8a48de140a3c666897588a05shiqian x = -1; 3154e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&x)); 3155e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 3156e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3157e35fdd936d133bf8a48de140a3c666897588a05shiqian 3158e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToConstRawPointer) { 3159e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int* const &> m = Pointee(Ge(0)); 3160e35fdd936d133bf8a48de140a3c666897588a05shiqian 3161e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 1; 3162e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&n)); 3163e35fdd936d133bf8a48de140a3c666897588a05shiqian n = -1; 3164e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&n)); 3165e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 3166e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3167e35fdd936d133bf8a48de140a3c666897588a05shiqian 3168e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToNonConstRawPointer) { 3169e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<double* &> m = Pointee(Ge(0)); 3170e35fdd936d133bf8a48de140a3c666897588a05shiqian 3171e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 1.0; 3172e35fdd936d133bf8a48de140a3c666897588a05shiqian double* p = &x; 3173e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(p)); 3174e35fdd936d133bf8a48de140a3c666897588a05shiqian x = -1; 3175e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(p)); 3176e35fdd936d133bf8a48de140a3c666897588a05shiqian p = NULL; 3177e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(p)); 3178e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3179e35fdd936d133bf8a48de140a3c666897588a05shiqian 31801f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueMATCHER_P(FieldIIs, inner_matcher, "") { 31811f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue return ExplainMatchResult(inner_matcher, arg.i, result_listener); 31821f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 31831f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 3184c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai#if GTEST_HAS_RTTI 3185c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai 31861f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, SameType) { 31871f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Derived derived; 31881f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue derived.i = 4; 31891f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 31901f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue // Right type. A pointer is passed down. 31911f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base* as_base_ptr = &derived; 31921f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull()))); 31931f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4)))); 31941f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, 31951f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5))))); 31961f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 31971f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 31981f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, WrongTypes) { 31991f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base base; 32001f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Derived derived; 32011f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue OtherDerived other_derived; 32021f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32031f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue // Wrong types. NULL is passed. 32041f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_)))); 32051f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull())); 32061f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base* as_base_ptr = &derived; 32071f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_)))); 32081f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull())); 32091f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue as_base_ptr = &other_derived; 32101f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_)))); 32111f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull())); 32121f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 32131f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32141f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, AlreadyNull) { 32151f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue // Already NULL. 32161f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base* as_base_ptr = NULL; 32171f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull())); 32181f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 32191f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32201f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahuestruct AmbiguousCastTypes { 32211f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue class VirtualDerived : public virtual Base {}; 32221f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue class DerivedSub1 : public VirtualDerived {}; 32231f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue class DerivedSub2 : public VirtualDerived {}; 32241f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {}; 32251f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}; 32261f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32271f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, AmbiguousCast) { 32281f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue AmbiguousCastTypes::DerivedSub1 sub1; 32291f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue AmbiguousCastTypes::ManyDerivedInHierarchy many_derived; 32301f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue // Multiply derived from Base. dynamic_cast<> returns NULL. 32311f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base* as_base_ptr = 32321f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived); 32331f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ptr, 32341f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull())); 32351f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue as_base_ptr = &sub1; 32361f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT( 32371f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue as_base_ptr, 32381f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull()))); 32391f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 32401f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32411f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, Describe) { 32421f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_)); 32431f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue const string prefix = 32441f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue "when dynamic_cast to " + internal::GetTypeName<Derived*>() + ", "; 32451f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_EQ(prefix + "points to a value that is anything", Describe(matcher)); 32461f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_EQ(prefix + "does not point to a value that is anything", 32471f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue DescribeNegation(matcher)); 32481f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 32491f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32501f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, Explain) { 32511f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_)); 32521f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base* null = NULL; 32531f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(Explain(matcher, null), HasSubstr("NULL")); 32541f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Derived derived; 32551f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_TRUE(matcher.Matches(&derived)); 32561f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(Explain(matcher, &derived), HasSubstr("which points to ")); 32571f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32581f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue // With references, the matcher itself can fail. Test for that one. 32591f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_); 32601f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(Explain(ref_matcher, derived), 32611f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue HasSubstr("which cannot be dynamic_cast")); 32621f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 32631f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32641f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, GoodReference) { 32651f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Derived derived; 32661f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue derived.i = 4; 32671f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base& as_base_ref = derived; 32681f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4))); 32691f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5)))); 32701f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 32711f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 32721f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, BadReference) { 32731f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Derived derived; 32741f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Base& as_base_ref = derived; 32751f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_))); 32761f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 32771f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 3278c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai#endif // GTEST_HAS_RTTI 3279c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai 3280ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev// Minimal const-propagating pointer. 3281ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosevtemplate <typename T> 3282ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosevclass ConstPropagatingPtr { 3283ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev public: 3284ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev typedef T element_type; 3285ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev 3286ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev ConstPropagatingPtr() : val_() {} 3287ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev explicit ConstPropagatingPtr(T* t) : val_(t) {} 3288ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {} 3289ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev 3290ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev T* get() { return val_; } 3291ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev T& operator*() { return *val_; } 3292ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev // Most smart pointers return non-const T* and T& from the next methods. 3293ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev const T* get() const { return val_; } 3294ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev const T& operator*() const { return *val_; } 3295ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev 3296ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev private: 3297ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev T* val_; 3298ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev}; 3299ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev 3300ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosevTEST(PointeeTest, WorksWithConstPropagatingPointers) { 3301ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5)); 3302ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev int three = 3; 3303ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev const ConstPropagatingPtr<int> co(&three); 3304ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev ConstPropagatingPtr<int> o(&three); 3305ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev EXPECT_TRUE(m.Matches(o)); 3306ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev EXPECT_TRUE(m.Matches(co)); 3307ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev *o = 6; 3308ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev EXPECT_FALSE(m.Matches(o)); 3309ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>())); 3310ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev} 3311ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev 3312e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, NeverMatchesNull) { 3313e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const char*> m = Pointee(_); 3314e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 3315e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3316e35fdd936d133bf8a48de140a3c666897588a05shiqian 3317e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that we can write Pointee(value) instead of Pointee(Eq(value)). 3318e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, MatchesAgainstAValue) { 3319e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int*> m = Pointee(5); 3320e35fdd936d133bf8a48de140a3c666897588a05shiqian 3321e35fdd936d133bf8a48de140a3c666897588a05shiqian int n = 5; 3322e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&n)); 3323e35fdd936d133bf8a48de140a3c666897588a05shiqian n = -1; 3324e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&n)); 3325e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 3326e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3327e35fdd936d133bf8a48de140a3c666897588a05shiqian 3328e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanDescribeSelf) { 3329e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int*> m = Pointee(Gt(3)); 3330b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("points to a value that is > 3", Describe(m)); 3331b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("does not point to a value that is > 3", 3332e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeNegation(m)); 3333e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3334e35fdd936d133bf8a48de140a3c666897588a05shiqian 3335e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanExplainMatchResult) { 3336e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const string*> m = Pointee(StartsWith("Hi")); 3337e35fdd936d133bf8a48de140a3c666897588a05shiqian 3338e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL))); 3339e35fdd936d133bf8a48de140a3c666897588a05shiqian 3340736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan const Matcher<long*> m2 = Pointee(GreaterThan(1)); // NOLINT 3341736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan long n = 3; // NOLINT 3342736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1", 3343676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan Explain(m2, &n)); 3344676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan} 3345676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 3346676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wanTEST(PointeeTest, AlwaysExplainsPointee) { 3347676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan const Matcher<int*> m = Pointee(0); 3348676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan int n = 42; 3349736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n)); 3350e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3351e35fdd936d133bf8a48de140a3c666897588a05shiqian 3352e35fdd936d133bf8a48de140a3c666897588a05shiqian// An uncopyable class. 3353e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Uncopyable { 3354e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 33551f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Uncopyable() : value_(-1) {} 335632de5f53763125925e078498250f7e73a88de9edzhanyong.wan explicit Uncopyable(int a_value) : value_(a_value) {} 3357e35fdd936d133bf8a48de140a3c666897588a05shiqian 3358e35fdd936d133bf8a48de140a3c666897588a05shiqian int value() const { return value_; } 33591f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue void set_value(int i) { value_ = i; } 33601f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 3361e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 33621f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue int value_; 3363e35fdd936d133bf8a48de140a3c666897588a05shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable); 3364e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3365e35fdd936d133bf8a48de140a3c666897588a05shiqian 3366e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns true iff x.value() is positive. 3367e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; } 3368e35fdd936d133bf8a48de140a3c666897588a05shiqian 33691f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueMATCHER_P(UncopyableIs, inner_matcher, "") { 33701f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue return ExplainMatchResult(inner_matcher, arg.value(), result_listener); 33711f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 33721f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 3373e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined struct for testing Field(). 3374e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct AStruct { 3375e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct() : x(0), y(1.0), z(5), p(NULL) {} 3376e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct(const AStruct& rhs) 3377e35fdd936d133bf8a48de140a3c666897588a05shiqian : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {} 3378e35fdd936d133bf8a48de140a3c666897588a05shiqian 3379e35fdd936d133bf8a48de140a3c666897588a05shiqian int x; // A non-const field. 3380e35fdd936d133bf8a48de140a3c666897588a05shiqian const double y; // A const field. 3381e35fdd936d133bf8a48de140a3c666897588a05shiqian Uncopyable z; // An uncopyable field. 3382e35fdd936d133bf8a48de140a3c666897588a05shiqian const char* p; // A pointer field. 338332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 338432de5f53763125925e078498250f7e73a88de9edzhanyong.wan private: 338532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(AStruct); 3386e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3387e35fdd936d133bf8a48de140a3c666897588a05shiqian 3388e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived struct for testing Field(). 3389e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct DerivedStruct : public AStruct { 3390e35fdd936d133bf8a48de140a3c666897588a05shiqian char ch; 339132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 339232de5f53763125925e078498250f7e73a88de9edzhanyong.wan private: 339332de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(DerivedStruct); 3394e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3395e35fdd936d133bf8a48de140a3c666897588a05shiqian 3396e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is non-const. 3397e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForNonConstField) { 3398e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::x, Ge(0)); 3399e35fdd936d133bf8a48de140a3c666897588a05shiqian 3400e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3401e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3402e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 3403e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3404e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3405e35fdd936d133bf8a48de140a3c666897588a05shiqian 3406e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is const. 3407e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForConstField) { 3408e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3409e35fdd936d133bf8a48de140a3c666897588a05shiqian 3410e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0)); 3411e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3412e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::y, Le(0.0)); 3413e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3414e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3415e35fdd936d133bf8a48de140a3c666897588a05shiqian 3416e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is not copyable. 3417e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForUncopyableField) { 3418e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3419e35fdd936d133bf8a48de140a3c666897588a05shiqian 3420e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive)); 3421e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3422e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::z, Not(Truly(ValueIsPositive))); 3423e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3424e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3425e35fdd936d133bf8a48de140a3c666897588a05shiqian 3426e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is a pointer. 3427e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForPointerField) { 3428e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matching against NULL. 3429e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL)); 3430e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3431e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3432e35fdd936d133bf8a48de140a3c666897588a05shiqian a.p = "hi"; 3433e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3434e35fdd936d133bf8a48de140a3c666897588a05shiqian 3435e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matching a pointer that is not NULL. 3436e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::p, StartsWith("hi")); 3437e35fdd936d133bf8a48de140a3c666897588a05shiqian a.p = "hill"; 3438e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3439e35fdd936d133bf8a48de140a3c666897588a05shiqian a.p = "hole"; 3440e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3441e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3442e35fdd936d133bf8a48de140a3c666897588a05shiqian 3443e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the object is passed by reference. 3444e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForByRefArgument) { 3445e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 3446e35fdd936d133bf8a48de140a3c666897588a05shiqian 3447e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3448e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3449e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 3450e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3451e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3452e35fdd936d133bf8a48de140a3c666897588a05shiqian 3453e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type 3454e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of Foo. 3455e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForArgumentOfSubType) { 3456e35fdd936d133bf8a48de140a3c666897588a05shiqian // Note that the matcher expects DerivedStruct but we say AStruct 3457e35fdd936d133bf8a48de140a3c666897588a05shiqian // inside Field(). 3458e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0)); 3459e35fdd936d133bf8a48de140a3c666897588a05shiqian 3460e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedStruct d; 3461e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(d)); 3462e35fdd936d133bf8a48de140a3c666897588a05shiqian d.x = -1; 3463e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(d)); 3464e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3465e35fdd936d133bf8a48de140a3c666897588a05shiqian 3466e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, m) works when field's type and m's 3467e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument type are compatible but not the same. 3468e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForCompatibleMatcherType) { 3469e35fdd936d133bf8a48de140a3c666897588a05shiqian // The field is an int, but the inner matcher expects a signed char. 3470e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, 3471e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<signed char>(Ge(0))); 3472e35fdd936d133bf8a48de140a3c666897588a05shiqian 3473e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3474e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3475e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 3476e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3477e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3478e35fdd936d133bf8a48de140a3c666897588a05shiqian 3479e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself. 3480e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanDescribeSelf) { 3481e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 3482e35fdd936d133bf8a48de140a3c666897588a05shiqian 3483b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 3484b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 3485e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3486e35fdd936d133bf8a48de140a3c666897588a05shiqian 3487e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the match result. 3488e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanExplainMatchResult) { 3489e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 3490e35fdd936d133bf8a48de140a3c666897588a05shiqian 3491e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3492e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = 1; 3493736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a)); 3494e35fdd936d133bf8a48de140a3c666897588a05shiqian 3495e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::x, GreaterThan(0)); 3496736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ( 3497736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan "whose given field is 1" + OfType("int") + ", which is 1 more than 0", 3498736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan Explain(m, a)); 3499e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3500e35fdd936d133bf8a48de140a3c666897588a05shiqian 3501e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to const. 3502e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToConst) { 3503e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 3504e35fdd936d133bf8a48de140a3c666897588a05shiqian 3505e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3506e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 3507e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 3508e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 3509e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3510e35fdd936d133bf8a48de140a3c666897588a05shiqian 3511e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to non-const. 3512e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToNonConst) { 3513e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AStruct*> m = Field(&AStruct::x, Ge(0)); 3514e35fdd936d133bf8a48de140a3c666897588a05shiqian 3515e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3516e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 3517e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = -1; 3518e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 3519e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3520e35fdd936d133bf8a48de140a3c666897588a05shiqian 35216953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// Tests that Field() works when the argument is a reference to a const pointer. 35226953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wanTEST(FieldForPointerTest, WorksForReferenceToConstPointer) { 35236953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0)); 35246953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan 35256953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan AStruct a; 35266953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan EXPECT_TRUE(m.Matches(&a)); 35276953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan a.x = -1; 35286953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan EXPECT_FALSE(m.Matches(&a)); 35296953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan} 35306953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan 3531e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() does not match the NULL pointer. 3532e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, DoesNotMatchNull) { 3533e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, _); 3534e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 3535e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3536e35fdd936d133bf8a48de140a3c666897588a05shiqian 3537e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type 3538e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of const Foo*. 3539e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForArgumentOfSubType) { 3540e35fdd936d133bf8a48de140a3c666897588a05shiqian // Note that the matcher expects DerivedStruct but we say AStruct 3541e35fdd936d133bf8a48de140a3c666897588a05shiqian // inside Field(). 3542e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0)); 3543e35fdd936d133bf8a48de140a3c666897588a05shiqian 3544e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedStruct d; 3545e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&d)); 3546e35fdd936d133bf8a48de140a3c666897588a05shiqian d.x = -1; 3547e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&d)); 3548e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3549e35fdd936d133bf8a48de140a3c666897588a05shiqian 3550e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself when used to match a pointer. 3551e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanDescribeSelf) { 3552e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 3553e35fdd936d133bf8a48de140a3c666897588a05shiqian 3554b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 3555b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 3556e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3557e35fdd936d133bf8a48de140a3c666897588a05shiqian 3558e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the result of matching a pointer. 3559e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanExplainMatchResult) { 3560e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 3561e35fdd936d133bf8a48de140a3c666897588a05shiqian 3562e35fdd936d133bf8a48de140a3c666897588a05shiqian AStruct a; 3563e35fdd936d133bf8a48de140a3c666897588a05shiqian a.x = 1; 3564e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL))); 3565736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"), 3566736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan Explain(m, &a)); 3567e35fdd936d133bf8a48de140a3c666897588a05shiqian 3568e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Field(&AStruct::x, GreaterThan(0)); 3569736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") + 3570736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan ", which is 1 more than 0", Explain(m, &a)); 3571e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3572e35fdd936d133bf8a48de140a3c666897588a05shiqian 3573e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined class for testing Property(). 3574e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AClass { 3575e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 3576e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass() : n_(0) {} 3577e35fdd936d133bf8a48de140a3c666897588a05shiqian 3578e35fdd936d133bf8a48de140a3c666897588a05shiqian // A getter that returns a non-reference. 3579e35fdd936d133bf8a48de140a3c666897588a05shiqian int n() const { return n_; } 3580e35fdd936d133bf8a48de140a3c666897588a05shiqian 3581e35fdd936d133bf8a48de140a3c666897588a05shiqian void set_n(int new_n) { n_ = new_n; } 3582e35fdd936d133bf8a48de140a3c666897588a05shiqian 3583e35fdd936d133bf8a48de140a3c666897588a05shiqian // A getter that returns a reference to const. 3584e35fdd936d133bf8a48de140a3c666897588a05shiqian const string& s() const { return s_; } 3585e35fdd936d133bf8a48de140a3c666897588a05shiqian 3586e35fdd936d133bf8a48de140a3c666897588a05shiqian void set_s(const string& new_s) { s_ = new_s; } 3587e35fdd936d133bf8a48de140a3c666897588a05shiqian 3588e35fdd936d133bf8a48de140a3c666897588a05shiqian // A getter that returns a reference to non-const. 3589e35fdd936d133bf8a48de140a3c666897588a05shiqian double& x() const { return x_; } 3590e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 3591e35fdd936d133bf8a48de140a3c666897588a05shiqian int n_; 3592e35fdd936d133bf8a48de140a3c666897588a05shiqian string s_; 3593e35fdd936d133bf8a48de140a3c666897588a05shiqian 3594e35fdd936d133bf8a48de140a3c666897588a05shiqian static double x_; 3595e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3596e35fdd936d133bf8a48de140a3c666897588a05shiqian 3597e35fdd936d133bf8a48de140a3c666897588a05shiqiandouble AClass::x_ = 0.0; 3598e35fdd936d133bf8a48de140a3c666897588a05shiqian 3599e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived class for testing Property(). 3600e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DerivedClass : public AClass { 36016414d806cd7d0954cce81348552fdd1e5bd31515kosak public: 36026414d806cd7d0954cce81348552fdd1e5bd31515kosak int k() const { return k_; } 3603e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 3604e35fdd936d133bf8a48de140a3c666897588a05shiqian int k_; 3605e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3606e35fdd936d133bf8a48de140a3c666897588a05shiqian 3607e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property() 3608e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference. 3609e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForNonReferenceProperty) { 3610e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 3611e35fdd936d133bf8a48de140a3c666897588a05shiqian 3612e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3613e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 3614e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3615e35fdd936d133bf8a48de140a3c666897588a05shiqian 3616e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(-1); 3617e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3618e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3619e35fdd936d133bf8a48de140a3c666897588a05shiqian 3620e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property() 3621e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const. 3622e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToConstProperty) { 3623e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi")); 3624e35fdd936d133bf8a48de140a3c666897588a05shiqian 3625e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3626e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hill"); 3627e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3628e35fdd936d133bf8a48de140a3c666897588a05shiqian 3629e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hole"); 3630e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3631e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3632e35fdd936d133bf8a48de140a3c666897588a05shiqian 3633e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property() 3634e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const. 3635e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToNonConstProperty) { 3636e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 0.0; 3637e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3638e35fdd936d133bf8a48de140a3c666897588a05shiqian 3639e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::x, Ref(x)); 3640e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3641e35fdd936d133bf8a48de140a3c666897588a05shiqian 3642e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Property(&AClass::x, Not(Ref(x))); 3643e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3644e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3645e35fdd936d133bf8a48de140a3c666897588a05shiqian 3646e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument is 3647e35fdd936d133bf8a48de140a3c666897588a05shiqian// passed by value. 3648e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForByValueArgument) { 3649e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AClass> m = Property(&AClass::s, StartsWith("hi")); 3650e35fdd936d133bf8a48de140a3c666897588a05shiqian 3651e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3652e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hill"); 3653e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3654e35fdd936d133bf8a48de140a3c666897588a05shiqian 3655e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hole"); 3656e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3657e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3658e35fdd936d133bf8a48de140a3c666897588a05shiqian 3659e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's 3660e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of Foo. 3661e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForArgumentOfSubType) { 3662e35fdd936d133bf8a48de140a3c666897588a05shiqian // The matcher expects a DerivedClass, but inside the Property() we 3663e35fdd936d133bf8a48de140a3c666897588a05shiqian // say AClass. 3664e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0)); 3665e35fdd936d133bf8a48de140a3c666897588a05shiqian 3666e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedClass d; 3667e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(1); 3668e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(d)); 3669e35fdd936d133bf8a48de140a3c666897588a05shiqian 3670e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(-1); 3671e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(d)); 3672e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3673e35fdd936d133bf8a48de140a3c666897588a05shiqian 3674e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, m) works when property()'s type 3675e35fdd936d133bf8a48de140a3c666897588a05shiqian// and m's argument type are compatible but different. 3676e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForCompatibleMatcherType) { 3677e35fdd936d133bf8a48de140a3c666897588a05shiqian // n() returns an int but the inner matcher expects a signed char. 3678e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, 3679e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<signed char>(Ge(0))); 3680e35fdd936d133bf8a48de140a3c666897588a05shiqian 3681e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3682e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(a)); 3683e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(-1); 3684e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(a)); 3685e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3686e35fdd936d133bf8a48de140a3c666897588a05shiqian 3687e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself. 3688e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanDescribeSelf) { 3689e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 3690e35fdd936d133bf8a48de140a3c666897588a05shiqian 3691b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 3692b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given property isn't >= 0", 3693b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 3694e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3695e35fdd936d133bf8a48de140a3c666897588a05shiqian 3696e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the match result. 3697e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanExplainMatchResult) { 3698e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 3699e35fdd936d133bf8a48de140a3c666897588a05shiqian 3700e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3701e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 3702736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a)); 3703e35fdd936d133bf8a48de140a3c666897588a05shiqian 3704e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Property(&AClass::n, GreaterThan(0)); 3705736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ( 3706736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan "whose given property is 1" + OfType("int") + ", which is 1 more than 0", 3707736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan Explain(m, a)); 3708e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3709e35fdd936d133bf8a48de140a3c666897588a05shiqian 3710e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to const. 3711e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToConst) { 3712e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 3713e35fdd936d133bf8a48de140a3c666897588a05shiqian 3714e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3715e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 3716e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 3717e35fdd936d133bf8a48de140a3c666897588a05shiqian 3718e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(-1); 3719e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 3720e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3721e35fdd936d133bf8a48de140a3c666897588a05shiqian 3722e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to non-const. 3723e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToNonConst) { 3724e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi")); 3725e35fdd936d133bf8a48de140a3c666897588a05shiqian 3726e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3727e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hill"); 37286953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan EXPECT_TRUE(m.Matches(&a)); 37296953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan 37306953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan a.set_s("hole"); 37316953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan EXPECT_FALSE(m.Matches(&a)); 37326953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan} 37336953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan 37346953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// Tests that Property() works when the argument is a reference to a 37356953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// const pointer. 37366953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wanTEST(PropertyForPointerTest, WorksForReferenceToConstPointer) { 37376953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi")); 37386953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan 37396953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan AClass a; 37406953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan a.set_s("hill"); 3741e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&a)); 3742e35fdd936d133bf8a48de140a3c666897588a05shiqian 3743e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_s("hole"); 3744e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&a)); 3745e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3746e35fdd936d133bf8a48de140a3c666897588a05shiqian 3747e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() does not match the NULL pointer. 3748e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) { 3749e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::x, _); 3750e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(NULL)); 3751e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3752e35fdd936d133bf8a48de140a3c666897588a05shiqian 3753e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's 3754e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of const Foo*. 3755e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForArgumentOfSubType) { 3756e35fdd936d133bf8a48de140a3c666897588a05shiqian // The matcher expects a DerivedClass, but inside the Property() we 3757e35fdd936d133bf8a48de140a3c666897588a05shiqian // say AClass. 3758e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0)); 3759e35fdd936d133bf8a48de140a3c666897588a05shiqian 3760e35fdd936d133bf8a48de140a3c666897588a05shiqian DerivedClass d; 3761e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(1); 3762e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(&d)); 3763e35fdd936d133bf8a48de140a3c666897588a05shiqian 3764e35fdd936d133bf8a48de140a3c666897588a05shiqian d.set_n(-1); 3765e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(&d)); 3766e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3767e35fdd936d133bf8a48de140a3c666897588a05shiqian 3768e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself when used to match a pointer. 3769e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanDescribeSelf) { 3770e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 3771e35fdd936d133bf8a48de140a3c666897588a05shiqian 3772b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 3773b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("is an object whose given property isn't >= 0", 3774b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan DescribeNegation(m)); 3775e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3776e35fdd936d133bf8a48de140a3c666897588a05shiqian 3777e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the result of matching a pointer. 3778e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanExplainMatchResult) { 3779e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 3780e35fdd936d133bf8a48de140a3c666897588a05shiqian 3781e35fdd936d133bf8a48de140a3c666897588a05shiqian AClass a; 3782e35fdd936d133bf8a48de140a3c666897588a05shiqian a.set_n(1); 3783e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL))); 3784736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ( 3785736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan "which points to an object whose given property is 1" + OfType("int"), 3786736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan Explain(m, &a)); 3787e35fdd936d133bf8a48de140a3c666897588a05shiqian 3788e35fdd936d133bf8a48de140a3c666897588a05shiqian m = Property(&AClass::n, GreaterThan(0)); 3789736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("which points to an object whose given property is 1" + 3790736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan OfType("int") + ", which is 1 more than 0", 3791736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan Explain(m, &a)); 3792e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3793e35fdd936d133bf8a48de140a3c666897588a05shiqian 3794e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ResultOf. 3795e35fdd936d133bf8a48de140a3c666897588a05shiqian 3796e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3797e35fdd936d133bf8a48de140a3c666897588a05shiqian// function pointer. 3798e35fdd936d133bf8a48de140a3c666897588a05shiqianstring IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; } 3799e35fdd936d133bf8a48de140a3c666897588a05shiqian 3800e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionPointers) { 3801e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo"))); 3802e35fdd936d133bf8a48de140a3c666897588a05shiqian 3803e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(1)); 3804e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(2)); 3805e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3806e35fdd936d133bf8a48de140a3c666897588a05shiqian 3807e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can describe itself. 3808e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanDescribeItself) { 3809e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo")); 3810e35fdd936d133bf8a48de140a3c666897588a05shiqian 3811676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("is mapped by the given callable to a value that " 3812676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan "is equal to \"foo\"", Describe(matcher)); 3813676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("is mapped by the given callable to a value that " 3814b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "isn't equal to \"foo\"", DescribeNegation(matcher)); 3815e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3816e35fdd936d133bf8a48de140a3c666897588a05shiqian 3817e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can explain the match result. 3818e35fdd936d133bf8a48de140a3c666897588a05shiqianint IntFunction(int input) { return input == 42 ? 80 : 90; } 3819e35fdd936d133bf8a48de140a3c666897588a05shiqian 3820e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanExplainMatchResult) { 3821e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntFunction, Ge(85)); 3822736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"), 3823676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan Explain(matcher, 36)); 3824e35fdd936d133bf8a48de140a3c666897588a05shiqian 3825e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher = ResultOf(&IntFunction, GreaterThan(85)); 3826736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") + 3827736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan ", which is 5 more than 85", Explain(matcher, 36)); 3828e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3829e35fdd936d133bf8a48de140a3c666897588a05shiqian 3830e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 3831e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference. 3832e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForNonReferenceResults) { 3833e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(&IntFunction, Eq(80)); 3834e35fdd936d133bf8a48de140a3c666897588a05shiqian 3835e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(42)); 3836e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(36)); 3837e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3838e35fdd936d133bf8a48de140a3c666897588a05shiqian 3839e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 3840e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const. 3841736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wandouble& DoubleFunction(double& input) { return input; } // NOLINT 3842e35fdd936d133bf8a48de140a3c666897588a05shiqian 3843736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanUncopyable& RefUncopyableFunction(Uncopyable& obj) { // NOLINT 3844e35fdd936d133bf8a48de140a3c666897588a05shiqian return obj; 3845e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3846e35fdd936d133bf8a48de140a3c666897588a05shiqian 3847e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToNonConstResults) { 3848e35fdd936d133bf8a48de140a3c666897588a05shiqian double x = 3.14; 3849e35fdd936d133bf8a48de140a3c666897588a05shiqian double x2 = x; 3850e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x)); 3851e35fdd936d133bf8a48de140a3c666897588a05shiqian 3852e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(x)); 3853e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(x2)); 3854e35fdd936d133bf8a48de140a3c666897588a05shiqian 3855e35fdd936d133bf8a48de140a3c666897588a05shiqian // Test that ResultOf works with uncopyable objects 3856e35fdd936d133bf8a48de140a3c666897588a05shiqian Uncopyable obj(0); 3857e35fdd936d133bf8a48de140a3c666897588a05shiqian Uncopyable obj2(0); 3858e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<Uncopyable&> matcher2 = 3859e35fdd936d133bf8a48de140a3c666897588a05shiqian ResultOf(&RefUncopyableFunction, Ref(obj)); 3860e35fdd936d133bf8a48de140a3c666897588a05shiqian 3861e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher2.Matches(obj)); 3862e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher2.Matches(obj2)); 3863e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3864e35fdd936d133bf8a48de140a3c666897588a05shiqian 3865e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 3866e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const. 3867e35fdd936d133bf8a48de140a3c666897588a05shiqianconst string& StringFunction(const string& input) { return input; } 3868e35fdd936d133bf8a48de140a3c666897588a05shiqian 3869e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToConstResults) { 3870e35fdd936d133bf8a48de140a3c666897588a05shiqian string s = "foo"; 3871e35fdd936d133bf8a48de140a3c666897588a05shiqian string s2 = s; 3872e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s)); 3873e35fdd936d133bf8a48de140a3c666897588a05shiqian 3874e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(s)); 3875e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(s2)); 3876e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3877e35fdd936d133bf8a48de140a3c666897588a05shiqian 3878e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, m) works when f(x) and m's 3879e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument types are compatible but different. 3880e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForCompatibleMatcherTypes) { 3881e35fdd936d133bf8a48de140a3c666897588a05shiqian // IntFunction() returns int but the inner matcher expects a signed char. 3882e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85))); 3883e35fdd936d133bf8a48de140a3c666897588a05shiqian 3884e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(36)); 3885e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(42)); 3886e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3887e35fdd936d133bf8a48de140a3c666897588a05shiqian 3888e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that the program aborts when ResultOf is passed 3889e35fdd936d133bf8a48de140a3c666897588a05shiqian// a NULL function pointer. 3890e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) { 389104d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan EXPECT_DEATH_IF_SUPPORTED( 3892736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan ResultOf(static_cast<string(*)(int dummy)>(NULL), Eq(string("foo"))), 3893e35fdd936d133bf8a48de140a3c666897588a05shiqian "NULL function pointer is passed into ResultOf\\(\\)\\."); 3894e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3895e35fdd936d133bf8a48de140a3c666897588a05shiqian 3896e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3897e35fdd936d133bf8a48de140a3c666897588a05shiqian// function reference. 3898e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionReferences) { 3899e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo")); 3900e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(1)); 3901e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(2)); 3902e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3903e35fdd936d133bf8a48de140a3c666897588a05shiqian 3904e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3905e35fdd936d133bf8a48de140a3c666897588a05shiqian// function object. 3906e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Functor : public ::std::unary_function<int, string> { 3907e35fdd936d133bf8a48de140a3c666897588a05shiqian result_type operator()(argument_type input) const { 3908e35fdd936d133bf8a48de140a3c666897588a05shiqian return IntToStringFunction(input); 3909e35fdd936d133bf8a48de140a3c666897588a05shiqian } 3910e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3911e35fdd936d133bf8a48de140a3c666897588a05shiqian 3912e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctors) { 3913e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo"))); 3914e35fdd936d133bf8a48de140a3c666897588a05shiqian 3915e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher.Matches(1)); 3916e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher.Matches(2)); 3917e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3918e35fdd936d133bf8a48de140a3c666897588a05shiqian 3919e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3920e35fdd936d133bf8a48de140a3c666897588a05shiqian// functor with more then one operator() defined. ResultOf() must work 3921e35fdd936d133bf8a48de140a3c666897588a05shiqian// for each defined operator(). 3922e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct PolymorphicFunctor { 3923e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef int result_type; 3924e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()(int n) { return n; } 3925e35fdd936d133bf8a48de140a3c666897588a05shiqian int operator()(const char* s) { return static_cast<int>(strlen(s)); } 3926e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3927e35fdd936d133bf8a48de140a3c666897588a05shiqian 3928e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForPolymorphicFunctors) { 3929e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5)); 3930e35fdd936d133bf8a48de140a3c666897588a05shiqian 3931e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher_int.Matches(10)); 3932e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher_int.Matches(2)); 3933e35fdd936d133bf8a48de140a3c666897588a05shiqian 3934e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5)); 3935e35fdd936d133bf8a48de140a3c666897588a05shiqian 3936e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher_string.Matches("long string")); 3937e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher_string.Matches("shrt")); 3938e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3939e35fdd936d133bf8a48de140a3c666897588a05shiqian 3940e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int* ReferencingFunction(const int& n) { return &n; } 3941e35fdd936d133bf8a48de140a3c666897588a05shiqian 3942e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct ReferencingFunctor { 3943e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef const int* result_type; 3944e35fdd936d133bf8a48de140a3c666897588a05shiqian result_type operator()(const int& n) { return &n; } 3945e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3946e35fdd936d133bf8a48de140a3c666897588a05shiqian 3947e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferencingCallables) { 3948e35fdd936d133bf8a48de140a3c666897588a05shiqian const int n = 1; 3949e35fdd936d133bf8a48de140a3c666897588a05shiqian const int n2 = 1; 3950e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n)); 3951e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher2.Matches(n)); 3952e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher2.Matches(n2)); 3953e35fdd936d133bf8a48de140a3c666897588a05shiqian 3954e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n)); 3955e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(matcher3.Matches(n)); 3956e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(matcher3.Matches(n2)); 3957e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3958e35fdd936d133bf8a48de140a3c666897588a05shiqian 3959e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DivisibleByImpl { 3960e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 396132de5f53763125925e078498250f7e73a88de9edzhanyong.wan explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {} 3962e35fdd936d133bf8a48de140a3c666897588a05shiqian 3963db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // For testing using ExplainMatchResultTo() with polymorphic matchers. 3964e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 3965db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const T& n, MatchResultListener* listener) const { 3966b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "which is " << (n % divider_) << " modulo " 3967db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan << divider_; 3968e35fdd936d133bf8a48de140a3c666897588a05shiqian return (n % divider_) == 0; 3969e35fdd936d133bf8a48de140a3c666897588a05shiqian } 3970e35fdd936d133bf8a48de140a3c666897588a05shiqian 3971ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeTo(ostream* os) const { 3972e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is divisible by " << divider_; 3973e35fdd936d133bf8a48de140a3c666897588a05shiqian } 3974e35fdd936d133bf8a48de140a3c666897588a05shiqian 3975ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeNegationTo(ostream* os) const { 3976e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is not divisible by " << divider_; 3977e35fdd936d133bf8a48de140a3c666897588a05shiqian } 3978e35fdd936d133bf8a48de140a3c666897588a05shiqian 397932de5f53763125925e078498250f7e73a88de9edzhanyong.wan void set_divider(int a_divider) { divider_ = a_divider; } 3980e35fdd936d133bf8a48de140a3c666897588a05shiqian int divider() const { return divider_; } 39812b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 3982e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 39832b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan int divider_; 3984e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 3985e35fdd936d133bf8a48de140a3c666897588a05shiqian 3986e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) { 3987e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(DivisibleByImpl(n)); 3988e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3989e35fdd936d133bf8a48de140a3c666897588a05shiqian 3990e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is 3991e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why. 3992e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_False) { 3993e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 3994b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 1 modulo 4", Explain(m, 5)); 3995e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3996e35fdd936d133bf8a48de140a3c666897588a05shiqian 3997e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is 3998e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why. 3999e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_True) { 4000e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 4001b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 2 modulo 4", Explain(m, 6)); 4002e35fdd936d133bf8a48de140a3c666897588a05shiqian} 4003e35fdd936d133bf8a48de140a3c666897588a05shiqian 4004e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is 4005e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why. 4006e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_False) { 4007e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3)); 4008b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 2 modulo 3", Explain(m, 5)); 4009e35fdd936d133bf8a48de140a3c666897588a05shiqian} 4010e35fdd936d133bf8a48de140a3c666897588a05shiqian 4011e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() succeeds, all matchers are asked to explain 4012e35fdd936d133bf8a48de140a3c666897588a05shiqian// why. 4013e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True) { 4014e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3)); 4015b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6)); 4016e35fdd936d133bf8a48de140a3c666897588a05shiqian} 4017e35fdd936d133bf8a48de140a3c666897588a05shiqian 4018e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True_2) { 4019e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = AllOf(Ge(2), Le(3)); 4020e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_EQ("", Explain(m, 2)); 4021e35fdd936d133bf8a48de140a3c666897588a05shiqian} 4022e35fdd936d133bf8a48de140a3c666897588a05shiqian 4023e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainmatcherResultTest, MonomorphicMatcher) { 4024e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<int> m = GreaterThan(5); 4025676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan EXPECT_EQ("which is 1 more than 5", Explain(m, 6)); 4026e35fdd936d133bf8a48de140a3c666897588a05shiqian} 4027e35fdd936d133bf8a48de140a3c666897588a05shiqian 4028e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following two tests verify that values without a public copy 4029e35fdd936d133bf8a48de140a3c666897588a05shiqian// ctor can be used as arguments to matchers like Eq(), Ge(), and etc 4030e35fdd936d133bf8a48de140a3c666897588a05shiqian// with the help of ByRef(). 4031e35fdd936d133bf8a48de140a3c666897588a05shiqian 4032e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotCopyable { 4033e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 403432de5f53763125925e078498250f7e73a88de9edzhanyong.wan explicit NotCopyable(int a_value) : value_(a_value) {} 4035e35fdd936d133bf8a48de140a3c666897588a05shiqian 4036e35fdd936d133bf8a48de140a3c666897588a05shiqian int value() const { return value_; } 4037e35fdd936d133bf8a48de140a3c666897588a05shiqian 4038e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator==(const NotCopyable& rhs) const { 4039e35fdd936d133bf8a48de140a3c666897588a05shiqian return value() == rhs.value(); 4040e35fdd936d133bf8a48de140a3c666897588a05shiqian } 4041e35fdd936d133bf8a48de140a3c666897588a05shiqian 4042e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator>=(const NotCopyable& rhs) const { 4043e35fdd936d133bf8a48de140a3c666897588a05shiqian return value() >= rhs.value(); 4044e35fdd936d133bf8a48de140a3c666897588a05shiqian } 4045e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 4046e35fdd936d133bf8a48de140a3c666897588a05shiqian int value_; 4047e35fdd936d133bf8a48de140a3c666897588a05shiqian 4048e35fdd936d133bf8a48de140a3c666897588a05shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable); 4049e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 4050e35fdd936d133bf8a48de140a3c666897588a05shiqian 4051e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) { 4052e35fdd936d133bf8a48de140a3c666897588a05shiqian const NotCopyable const_value1(1); 4053e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1)); 4054e35fdd936d133bf8a48de140a3c666897588a05shiqian 4055e35fdd936d133bf8a48de140a3c666897588a05shiqian const NotCopyable n1(1), n2(2); 4056e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(n1)); 4057e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(n2)); 4058e35fdd936d133bf8a48de140a3c666897588a05shiqian} 4059e35fdd936d133bf8a48de140a3c666897588a05shiqian 4060e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableValueInMatchers) { 4061e35fdd936d133bf8a48de140a3c666897588a05shiqian NotCopyable value2(2); 4062e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<NotCopyable&> m = Ge(ByRef(value2)); 4063e35fdd936d133bf8a48de140a3c666897588a05shiqian 4064e35fdd936d133bf8a48de140a3c666897588a05shiqian NotCopyable n1(1), n2(2); 4065e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_FALSE(m.Matches(n1)); 4066e35fdd936d133bf8a48de140a3c666897588a05shiqian EXPECT_TRUE(m.Matches(n2)); 4067e35fdd936d133bf8a48de140a3c666897588a05shiqian} 4068e35fdd936d133bf8a48de140a3c666897588a05shiqian 4069320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, ImplementsIsEmpty) { 4070320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan vector<int> container; 4071320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_THAT(container, IsEmpty()); 4072320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan container.push_back(0); 4073320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_THAT(container, Not(IsEmpty())); 4074320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan container.push_back(1); 4075320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_THAT(container, Not(IsEmpty())); 4076320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan} 4077320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan 4078320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, WorksWithString) { 4079320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan string text; 4080320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_THAT(text, IsEmpty()); 4081320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan text = "foo"; 4082320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_THAT(text, Not(IsEmpty())); 4083320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan text = string("\0", 1); 4084320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_THAT(text, Not(IsEmpty())); 4085320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan} 4086320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan 4087320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, CanDescribeSelf) { 4088320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan Matcher<vector<int> > m = IsEmpty(); 4089320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_EQ("is empty", Describe(m)); 4090320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_EQ("isn't empty", DescribeNegation(m)); 4091320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan} 4092320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan 4093320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, ExplainsResult) { 4094320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan Matcher<vector<int> > m = IsEmpty(); 4095320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan vector<int> container; 4096320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_EQ("", Explain(m, container)); 4097320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan container.push_back(0); 4098320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan EXPECT_EQ("whose size is 1", Explain(m, container)); 4099320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan} 4100320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan 4101a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, ImplementsSizeIs) { 4102a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan vector<int> container; 4103a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, SizeIs(0)); 4104a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, Not(SizeIs(1))); 4105a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan container.push_back(0); 4106a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, Not(SizeIs(0))); 4107a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, SizeIs(1)); 4108a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan container.push_back(0); 4109a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, Not(SizeIs(0))); 4110a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, SizeIs(2)); 4111a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan} 4112a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 4113a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, WorksWithMap) { 4114a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan map<string, int> container; 4115a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, SizeIs(0)); 4116a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, Not(SizeIs(1))); 4117a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan container.insert(make_pair("foo", 1)); 4118a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, Not(SizeIs(0))); 4119a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, SizeIs(1)); 4120a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan container.insert(make_pair("bar", 2)); 4121a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, Not(SizeIs(0))); 4122a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, SizeIs(2)); 4123a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan} 4124a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 4125a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, WorksWithReferences) { 4126a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan vector<int> container; 4127a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Matcher<const vector<int>&> m = SizeIs(1); 4128a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, Not(m)); 4129a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan container.push_back(0); 4130a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_THAT(container, m); 4131a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan} 4132a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 4133a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, CanDescribeSelf) { 4134a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Matcher<vector<int> > m = SizeIs(2); 4135a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("size is equal to 2", Describe(m)); 4136a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("size isn't equal to 2", DescribeNegation(m)); 4137a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan} 4138a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 4139a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, ExplainsResult) { 4140a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Matcher<vector<int> > m1 = SizeIs(2); 4141a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Matcher<vector<int> > m2 = SizeIs(Lt(2u)); 4142a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Matcher<vector<int> > m3 = SizeIs(AnyOf(0, 3)); 4143a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Matcher<vector<int> > m4 = SizeIs(GreaterThan(1)); 4144a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan vector<int> container; 4145a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 0 doesn't match", Explain(m1, container)); 4146a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 0 matches", Explain(m2, container)); 4147a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 0 matches", Explain(m3, container)); 4148a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 0 doesn't match, which is 1 less than 1", 4149a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Explain(m4, container)); 4150a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan container.push_back(0); 4151a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan container.push_back(0); 4152a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 2 matches", Explain(m1, container)); 4153a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 2 doesn't match", Explain(m2, container)); 4154a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 2 doesn't match", Explain(m3, container)); 4155a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan EXPECT_EQ("whose size 2 matches, which is 1 more than 1", 4156a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan Explain(m4, container)); 4157a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan} 4158a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 41592b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#if GTEST_HAS_TYPED_TEST 41606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests ContainerEq with different container types, and 41616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// different element types. 41626a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 41636a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename T> 4164b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanclass ContainerEqTest : public testing::Test {}; 41656a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 41666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantypedef testing::Types< 4167ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan set<int>, 4168ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<size_t>, 4169ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan multiset<size_t>, 4170ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan list<int> > 41716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan ContainerEqTestTypes; 41726a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 41736a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes); 41746a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 41756a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that the filled container is equal to itself. 41766a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, EqualsSelf) { 41776a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 41786a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 41796a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<TypeParam> m = ContainerEq(my_set); 41806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_TRUE(m.Matches(my_set)); 41816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("", Explain(m, my_set)); 41826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 41836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 41846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that missing values are reported. 41856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueMissing) { 41866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 41876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {2, 1, 8, 5}; 41886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 41896a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 4); 41906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<TypeParam> m = ContainerEq(my_set); 41916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 4192b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which doesn't have these expected elements: 3", 4193b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, test_set)); 41946a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 41956a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 41966a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported. 41976a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAdded) { 41986a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 41996a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 5, 8, 46}; 42006a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 42016a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 6); 42026a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<const TypeParam&> m = ContainerEq(my_set); 42036a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 4204b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set)); 42056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 42066a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 42076a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together. 42086a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) { 42096a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 42106a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 8, 46}; 42116a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 42126a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 5); 42136a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<TypeParam> m = ContainerEq(my_set); 42146a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 4215b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which has these unexpected elements: 46,\n" 4216b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "and doesn't have these expected elements: 5", 4217b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, test_set)); 42186a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 42196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 42206a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests duplicated value -- expect no explanation. 42216a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, DuplicateDifference) { 42226a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 42236a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 5, 8}; 42246a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam my_set(vals, vals + 6); 42256a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan TypeParam test_set(test_vals, test_vals + 5); 42266a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan const Matcher<const TypeParam&> m = ContainerEq(my_set); 42276a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan // Depending on the container, match may be true or false 42286a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan // But in any case there should be no explanation. 42296a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("", Explain(m, test_set)); 42306a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 42312b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#endif // GTEST_HAS_TYPED_TEST 42326a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 42336a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that mutliple missing values are reported. 42346a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble. 42356a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesMissing) { 42366a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 42376a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {2, 1, 5}; 4238ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<int> my_set(vals, vals + 6); 4239ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<int> test_set(test_vals, test_vals + 3); 4240ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<vector<int> > m = ContainerEq(my_set); 42416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 4242b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which doesn't have these expected elements: 3, 8", 4243b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, test_set)); 42446a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 42456a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 42466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported. 42476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble. 42486a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAdded) { 42496a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 42506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46}; 4251ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan list<size_t> my_set(vals, vals + 6); 4252ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan list<size_t> test_set(test_vals, test_vals + 7); 4253ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<const list<size_t>&> m = ContainerEq(my_set); 42546a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 4255b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which has these unexpected elements: 92, 46", 4256b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan Explain(m, test_set)); 42576a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 42586a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 42596a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together. 42606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) { 42616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 42626a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 92, 46}; 4263ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan list<size_t> my_set(vals, vals + 6); 4264ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan list<size_t> test_set(test_vals, test_vals + 5); 4265ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<const list<size_t> > m = ContainerEq(my_set); 42666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 4267b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which has these unexpected elements: 92, 46,\n" 4268b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "and doesn't have these expected elements: 5, 8", 42696a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan Explain(m, test_set)); 42706a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 42716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 42726a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests to see that duplicate elements are detected, 42736a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// but (as above) not reported in the explanation. 42746a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) { 42756a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int vals[] = {1, 1, 2, 3, 5, 8}; 42766a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan static const int test_vals[] = {1, 2, 3, 5, 8}; 4277ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<int> my_set(vals, vals + 6); 4278ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<int> test_set(test_vals, test_vals + 5); 4279ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<vector<int> > m = ContainerEq(my_set); 42806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_TRUE(m.Matches(my_set)); 42816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_set)); 42826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan // There is nothing to report when both sets contain all the same values. 42836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_EQ("", Explain(m, test_set)); 42846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 42856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 42866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that ContainerEq works for non-trivial associative containers, 42876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// like maps. 42886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, WorksForMaps) { 4289ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan map<int, std::string> my_map; 42906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan my_map[0] = "a"; 42916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan my_map[1] = "b"; 42926a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 4293ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan map<int, std::string> test_map; 42946a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan test_map[0] = "aa"; 42956a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan test_map[1] = "b"; 42966a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 4297ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<const map<int, std::string>&> m = ContainerEq(my_map); 42986a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_TRUE(m.Matches(my_map)); 42996a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan EXPECT_FALSE(m.Matches(test_map)); 43006a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 4301b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n" 4302b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan "and doesn't have these expected elements: (0, \"a\")", 43036a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan Explain(m, test_map)); 43046a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 43056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 4306b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArray) { 43072336e9c171b5894bac98f828289f537e29691896kosak int a1[] = {1, 2, 3}; 43082336e9c171b5894bac98f828289f537e29691896kosak int a2[] = {1, 2, 3}; 43092336e9c171b5894bac98f828289f537e29691896kosak int b[] = {1, 2, 4}; 4310b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4311b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ContainerEq(a2)); 4312b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, Not(ContainerEq(b))); 4313b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 4314b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4315b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) { 43162336e9c171b5894bac98f828289f537e29691896kosak const char a1[][3] = {"hi", "lo"}; 43172336e9c171b5894bac98f828289f537e29691896kosak const char a2[][3] = {"hi", "lo"}; 43182336e9c171b5894bac98f828289f537e29691896kosak const char b[][3] = {"lo", "hi"}; 4319b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4320b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Tests using ContainerEq() in the first dimension. 4321b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ContainerEq(a2)); 4322b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, Not(ContainerEq(b))); 4323b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4324b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Tests using ContainerEq() in the second dimension. 4325b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1]))); 4326b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1]))); 4327b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 4328b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4329b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) { 43302336e9c171b5894bac98f828289f537e29691896kosak const int a1[] = {1, 2, 3}; 43312336e9c171b5894bac98f828289f537e29691896kosak const int a2[] = {1, 2, 3}; 43322336e9c171b5894bac98f828289f537e29691896kosak const int b[] = {1, 2, 3, 4}; 4333b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 43342661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan const int* const p1 = a1; 43352661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2)); 43362661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b))); 4337b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 43382336e9c171b5894bac98f828289f537e29691896kosak const int c[] = {1, 3, 2}; 43392661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c))); 4340b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 4341b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4342b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, CopiesNativeArrayParameter) { 4343b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan std::string a1[][3] = { 43442336e9c171b5894bac98f828289f537e29691896kosak {"hi", "hello", "ciao"}, 43452336e9c171b5894bac98f828289f537e29691896kosak {"bye", "see you", "ciao"} 4346b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan }; 4347b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4348b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan std::string a2[][3] = { 43492336e9c171b5894bac98f828289f537e29691896kosak {"hi", "hello", "ciao"}, 43502336e9c171b5894bac98f828289f537e29691896kosak {"bye", "see you", "ciao"} 4351b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan }; 4352b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4353b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2); 4354b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, m); 4355b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4356b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan a2[0][0] = "ha"; 4357b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan EXPECT_THAT(a1, m); 4358b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 4359b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 4360898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForEmptyContainer) { 4361898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const vector<int> numbers; 4362898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre())); 4363898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1)))); 4364898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4365898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4366898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForNonEmptyContainer) { 4367898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan vector<unsigned> numbers; 4368898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan numbers.push_back(3); 4369898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan numbers.push_back(1); 4370898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan numbers.push_back(2); 4371898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan numbers.push_back(2); 4372898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(), 4373898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan ElementsAre(3, 2, 2, 1))); 4374898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(), 4375898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan ElementsAre(1, 2, 2, 3)))); 4376898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4377898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4378898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForNonVectorContainer) { 4379898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan list<string> words; 4380898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan words.push_back("say"); 4381898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan words.push_back("hello"); 4382898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan words.push_back("world"); 4383898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(words, WhenSortedBy(less<string>(), 4384898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan ElementsAre("hello", "say", "world"))); 4385898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(words, Not(WhenSortedBy(less<string>(), 4386898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan ElementsAre("say", "hello", "world")))); 4387898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4388898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4389898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForNativeArray) { 43902336e9c171b5894bac98f828289f537e29691896kosak const int numbers[] = {1, 3, 2, 4}; 43912336e9c171b5894bac98f828289f537e29691896kosak const int sorted_numbers[] = {1, 2, 3, 4}; 4392898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4))); 4393898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, WhenSortedBy(less<int>(), 4394898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan ElementsAreArray(sorted_numbers))); 4395898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4)))); 4396898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4397898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4398898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, CanDescribeSelf) { 4399898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2)); 4400898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_EQ("(when sorted) has 2 elements where\n" 4401898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan "element #0 is equal to 1,\n" 4402898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan "element #1 is equal to 2", 4403898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan Describe(m)); 4404898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n" 4405898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan "element #0 isn't equal to 1, or\n" 4406898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan "element #1 isn't equal to 2", 4407898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan DescribeNegation(m)); 4408898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4409898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4410898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, ExplainsMatchResult) { 44112336e9c171b5894bac98f828289f537e29691896kosak const int a[] = {2, 1}; 4412898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match", 4413898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a)); 4414898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_EQ("which is { 1, 2 } when sorted", 4415898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a)); 4416898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4417898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4418898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't 4419898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// need to test it as exhaustively as we test the latter. 4420898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4421898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedTest, WorksForEmptyContainer) { 4422898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const vector<int> numbers; 4423898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, WhenSorted(ElementsAre())); 4424898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1)))); 4425898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4426898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4427898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedTest, WorksForNonEmptyContainer) { 4428898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan list<string> words; 4429898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan words.push_back("3"); 4430898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan words.push_back("1"); 4431898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan words.push_back("2"); 4432898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan words.push_back("2"); 4433898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3"))); 4434898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2")))); 4435898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 4436898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 4437a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForMapTypes) { 4438a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan map<string, int> word_counts; 4439a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan word_counts["and"] = 1; 4440a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan word_counts["the"] = 1; 4441a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan word_counts["buffalo"] = 2; 4442a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(word_counts, WhenSorted(ElementsAre( 4443a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair("and", 1), Pair("buffalo", 2), Pair("the", 1)))); 4444a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(word_counts, Not(WhenSorted(ElementsAre( 4445a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair("and", 1), Pair("the", 1), Pair("buffalo", 2))))); 4446a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan} 4447a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4448a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForMultiMapTypes) { 4449a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan multimap<int, int> ifib; 4450a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ifib.insert(make_pair(8, 6)); 4451a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ifib.insert(make_pair(2, 3)); 4452a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ifib.insert(make_pair(1, 1)); 4453a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ifib.insert(make_pair(3, 4)); 4454a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ifib.insert(make_pair(1, 2)); 4455a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ifib.insert(make_pair(5, 5)); 4456a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(ifib, WhenSorted(ElementsAre(Pair(1, 1), 4457a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(1, 2), 4458a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(2, 3), 4459a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(3, 4), 4460a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(5, 5), 4461a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(8, 6)))); 4462a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(ifib, Not(WhenSorted(ElementsAre(Pair(8, 6), 4463a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(2, 3), 4464a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(1, 1), 4465a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(3, 4), 4466a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(1, 2), 4467a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Pair(5, 5))))); 4468a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan} 4469a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4470a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForPolymorphicMatcher) { 4471a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan std::deque<int> d; 4472a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan d.push_back(2); 4473a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan d.push_back(1); 4474a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2))); 4475a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1)))); 4476a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan} 4477a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4478a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForVectorConstRefMatcher) { 4479a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan std::deque<int> d; 4480a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan d.push_back(2); 4481a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan d.push_back(1); 4482a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2); 4483a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(d, WhenSorted(vector_match)); 4484a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1); 4485a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(d, Not(WhenSorted(not_vector_match))); 4486a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan} 4487a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4488a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan// Deliberately bare pseudo-container. 4489a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan// Offers only begin() and end() accessors, yielding InputIterator. 4490a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wantemplate <typename T> 4491a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanclass Streamlike { 4492a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan private: 4493a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan class ConstIter; 4494a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan public: 4495a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan typedef ConstIter const_iterator; 4496a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan typedef T value_type; 4497a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4498a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan template <typename InIter> 4499a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Streamlike(InIter first, InIter last) : remainder_(first, last) {} 4500a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4501a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan const_iterator begin() const { 4502a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan return const_iterator(this, remainder_.begin()); 4503a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4504a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan const_iterator end() const { 4505a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan return const_iterator(this, remainder_.end()); 4506a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4507a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4508a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan private: 4509a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan class ConstIter : public std::iterator<std::input_iterator_tag, 4510a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan value_type, 4511a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ptrdiff_t, 4512cd99eb0bbd8391029cae1e05ad740f8404eb0b71kosak const value_type*, 4513cd99eb0bbd8391029cae1e05ad740f8404eb0b71kosak const value_type&> { 4514a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan public: 4515a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ConstIter(const Streamlike* s, 4516a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan typename std::list<value_type>::iterator pos) 4517a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan : s_(s), pos_(pos) {} 4518a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4519a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan const value_type& operator*() const { return *pos_; } 4520a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan const value_type* operator->() const { return &*pos_; } 4521a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ConstIter& operator++() { 4522a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan s_->remainder_.erase(pos_++); 4523a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan return *this; 4524a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4525a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4526a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan // *iter++ is required to work (see std::istreambuf_iterator). 4527a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan // (void)iter++ is also required to work. 4528a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan class PostIncrProxy { 4529a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan public: 4530a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan explicit PostIncrProxy(const value_type& value) : value_(value) {} 4531a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan value_type operator*() const { return value_; } 4532a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan private: 4533a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan value_type value_; 4534a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan }; 4535a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan PostIncrProxy operator++(int) { 4536a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan PostIncrProxy proxy(**this); 4537a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan ++(*this); 4538a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan return proxy; 4539a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4540a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4541a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan friend bool operator==(const ConstIter& a, const ConstIter& b) { 4542a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan return a.s_ == b.s_ && a.pos_ == b.pos_; 4543a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4544a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan friend bool operator!=(const ConstIter& a, const ConstIter& b) { 4545a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan return !(a == b); 4546a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4547a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4548a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan private: 4549a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan const Streamlike* s_; 4550a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan typename std::list<value_type>::iterator pos_; 4551a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan }; 4552a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4553a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) { 4554a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan os << "["; 4555a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan typedef typename std::list<value_type>::const_iterator Iter; 4556a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan const char* sep = ""; 4557a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) { 4558a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan os << sep << *it; 4559a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan sep = ","; 4560a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4561a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan os << "]"; 4562a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan return os; 4563a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4564a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4565a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan mutable std::list<value_type> remainder_; // modified by iteration 4566a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}; 4567a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4568a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(StreamlikeTest, Iteration) { 45692336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {2, 1, 4, 5, 3}; 4570a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Streamlike<int> s(a, a + 5); 4571a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Streamlike<int>::const_iterator it = s.begin(); 4572a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan const int* ip = a; 4573a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan while (it != s.end()) { 4574a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan SCOPED_TRACE(ip - a); 4575a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_EQ(*ip++, *it++); 4576a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan } 4577a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan} 4578a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 45795b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#if GTEST_HAS_STD_FORWARD_LIST_ 4580b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, WorksWithForwardList) { 4581b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak std::forward_list<int> container; 4582b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_THAT(container, BeginEndDistanceIs(0)); 4583b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_THAT(container, Not(BeginEndDistanceIs(1))); 4584b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak container.push_front(0); 4585b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_THAT(container, Not(BeginEndDistanceIs(0))); 4586b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_THAT(container, BeginEndDistanceIs(1)); 4587b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak container.push_front(0); 4588b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_THAT(container, Not(BeginEndDistanceIs(0))); 4589b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_THAT(container, BeginEndDistanceIs(2)); 4590b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak} 45915b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#endif // GTEST_HAS_STD_FORWARD_LIST_ 4592b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak 4593b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, WorksWithNonStdList) { 45942336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {1, 2, 3, 4, 5}; 4595b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Streamlike<int> s(a, a + 5); 4596b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_THAT(s, BeginEndDistanceIs(5)); 4597b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak} 4598b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak 4599b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, CanDescribeSelf) { 4600b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Matcher<vector<int> > m = BeginEndDistanceIs(2); 4601b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("distance between begin() and end() is equal to 2", Describe(m)); 4602b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("distance between begin() and end() isn't equal to 2", 4603b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak DescribeNegation(m)); 4604b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak} 4605b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak 4606b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, ExplainsResult) { 4607b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Matcher<vector<int> > m1 = BeginEndDistanceIs(2); 4608b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Matcher<vector<int> > m2 = BeginEndDistanceIs(Lt(2)); 4609b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Matcher<vector<int> > m3 = BeginEndDistanceIs(AnyOf(0, 3)); 4610b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Matcher<vector<int> > m4 = BeginEndDistanceIs(GreaterThan(1)); 4611b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak vector<int> container; 4612b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("whose distance between begin() and end() 0 doesn't match", 4613b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m1, container)); 4614b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("whose distance between begin() and end() 0 matches", 4615b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m2, container)); 4616b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("whose distance between begin() and end() 0 matches", 4617b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m3, container)); 4618b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ( 4619b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak "whose distance between begin() and end() 0 doesn't match, which is 1 " 4620b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak "less than 1", 4621b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m4, container)); 4622b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak container.push_back(0); 4623b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak container.push_back(0); 4624b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("whose distance between begin() and end() 2 matches", 4625b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m1, container)); 4626b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("whose distance between begin() and end() 2 doesn't match", 4627b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m2, container)); 4628b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ("whose distance between begin() and end() 2 doesn't match", 4629b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m3, container)); 4630b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak EXPECT_EQ( 4631b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak "whose distance between begin() and end() 2 matches, which is 1 more " 4632b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak "than 1", 4633b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak Explain(m4, container)); 4634b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak} 4635b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak 4636a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForStreamlike) { 4637a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan // Streamlike 'container' provides only minimal iterator support. 4638a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan // Its iterators are tagged with input_iterator_tag. 46392336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {2, 1, 4, 5, 3}; 46406414d806cd7d0954cce81348552fdd1e5bd31515kosak Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 4641a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5))); 4642a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3)))); 4643a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan} 4644a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 4645a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) { 46462336e9c171b5894bac98f828289f537e29691896kosak const int a[] = {2, 1, 4, 5, 3}; 46476414d806cd7d0954cce81348552fdd1e5bd31515kosak Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 4648a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5); 4649a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(s, WhenSorted(vector_match)); 4650a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3)))); 4651a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan} 4652a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan 46531cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan// Tests using ElementsAre() and ElementsAreArray() with stream-like 46541cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan// "containers". 46551cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 46561cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(ElemensAreStreamTest, WorksForStreamlike) { 46572336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {1, 2, 3, 4, 5}; 46586414d806cd7d0954cce81348552fdd1e5bd31515kosak Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 46591cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5)); 46601cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3))); 46611cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan} 46621cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 46631cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(ElemensAreArrayStreamTest, WorksForStreamlike) { 46642336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {1, 2, 3, 4, 5}; 46656414d806cd7d0954cce81348552fdd1e5bd31515kosak Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 46661cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 46671cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan vector<int> expected; 46681cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan expected.push_back(1); 46691cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan expected.push_back(2); 46701cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan expected.push_back(3); 46711cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan expected.push_back(4); 46721cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan expected.push_back(5); 46731cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(s, ElementsAreArray(expected)); 46741cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 46751cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan expected[3] = 0; 46761cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(s, Not(ElementsAreArray(expected))); 46771cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan} 46781cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 46791f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(ElementsAreTest, WorksWithUncopyable) { 46801f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Uncopyable objs[2]; 46811f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue objs[0].set_value(-3); 46821f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue objs[1].set_value(1); 46831f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive))); 46841f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 46851f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 468606678924fa3a48708f2c90e7226dfda54badc808kosakTEST(ElementsAreTest, TakesStlContainer) { 468706678924fa3a48708f2c90e7226dfda54badc808kosak const int actual[] = {3, 1, 2}; 468806678924fa3a48708f2c90e7226dfda54badc808kosak 468906678924fa3a48708f2c90e7226dfda54badc808kosak ::std::list<int> expected; 469006678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(3); 469106678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(1); 469206678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(2); 469306678924fa3a48708f2c90e7226dfda54badc808kosak EXPECT_THAT(actual, ElementsAreArray(expected)); 469406678924fa3a48708f2c90e7226dfda54badc808kosak 469506678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(4); 469606678924fa3a48708f2c90e7226dfda54badc808kosak EXPECT_THAT(actual, Not(ElementsAreArray(expected))); 469706678924fa3a48708f2c90e7226dfda54badc808kosak} 469806678924fa3a48708f2c90e7226dfda54badc808kosak 4699fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Tests for UnorderedElementsAreArray() 4700fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4701fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) { 47022336e9c171b5894bac98f828289f537e29691896kosak const int a[] = {0, 1, 2, 3, 4}; 47036414d806cd7d0954cce81348552fdd1e5bd31515kosak std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 4704fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan do { 4705fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4706fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a), 4707fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan s, &listener)) << listener.str(); 4708fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } while (std::next_permutation(s.begin(), s.end())); 4709fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4710fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4711fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST(UnorderedElementsAreArrayTest, VectorBool) { 47122336e9c171b5894bac98f828289f537e29691896kosak const bool a[] = {0, 1, 0, 1, 1}; 47132336e9c171b5894bac98f828289f537e29691896kosak const bool b[] = {1, 0, 1, 1, 0}; 47146414d806cd7d0954cce81348552fdd1e5bd31515kosak std::vector<bool> expected(a, a + GTEST_ARRAY_SIZE_(a)); 47156414d806cd7d0954cce81348552fdd1e5bd31515kosak std::vector<bool> actual(b, b + GTEST_ARRAY_SIZE_(b)); 4716fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4717fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected), 4718fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan actual, &listener)) << listener.str(); 4719fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4720fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 47215579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wanTEST(UnorderedElementsAreArrayTest, WorksForStreamlike) { 47225579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan // Streamlike 'container' provides only minimal iterator support. 47235579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan // Its iterators are tagged with input_iterator_tag, and it has no 47245579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan // size() or empty() methods. 47252336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {2, 1, 4, 5, 3}; 47266414d806cd7d0954cce81348552fdd1e5bd31515kosak Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 47275579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan 47285579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan ::std::vector<int> expected; 47295579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan expected.push_back(1); 47305579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan expected.push_back(2); 47315579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan expected.push_back(3); 47325579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan expected.push_back(4); 47335579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan expected.push_back(5); 47345579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan EXPECT_THAT(s, UnorderedElementsAreArray(expected)); 47355579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan 47365579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan expected.push_back(6); 47375579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected))); 47385579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan} 47395579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan 474006678924fa3a48708f2c90e7226dfda54badc808kosakTEST(UnorderedElementsAreArrayTest, TakesStlContainer) { 474106678924fa3a48708f2c90e7226dfda54badc808kosak const int actual[] = {3, 1, 2}; 474206678924fa3a48708f2c90e7226dfda54badc808kosak 474306678924fa3a48708f2c90e7226dfda54badc808kosak ::std::list<int> expected; 474406678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(1); 474506678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(2); 474606678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(3); 474706678924fa3a48708f2c90e7226dfda54badc808kosak EXPECT_THAT(actual, UnorderedElementsAreArray(expected)); 474806678924fa3a48708f2c90e7226dfda54badc808kosak 474906678924fa3a48708f2c90e7226dfda54badc808kosak expected.push_back(4); 475006678924fa3a48708f2c90e7226dfda54badc808kosak EXPECT_THAT(actual, Not(UnorderedElementsAreArray(expected))); 475106678924fa3a48708f2c90e7226dfda54badc808kosak} 475206678924fa3a48708f2c90e7226dfda54badc808kosak 475318489fa4f81a65ab5f42a6705c28ca2f80eab3bdkosak#if GTEST_HAS_STD_INITIALIZER_LIST_ 47541cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 47551cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest, TakesInitializerList) { 47562336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {2, 1, 4, 5, 3}; 47572336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(a, UnorderedElementsAreArray({1, 2, 3, 4, 5})); 47582336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(a, Not(UnorderedElementsAreArray({1, 2, 3, 4, 6}))); 47591cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan} 47601cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 47611cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) { 47622336e9c171b5894bac98f828289f537e29691896kosak const string a[5] = {"a", "b", "c", "d", "e"}; 47632336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(a, UnorderedElementsAreArray({"a", "b", "c", "d", "e"})); 47642336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(a, Not(UnorderedElementsAreArray({"a", "b", "c", "d", "ef"}))); 47651cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan} 47661cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 47671cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) { 47682336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {2, 1, 4, 5, 3}; 47691cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(a, UnorderedElementsAreArray( 47702336e9c171b5894bac98f828289f537e29691896kosak {Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)})); 47711cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(a, Not(UnorderedElementsAreArray( 47722336e9c171b5894bac98f828289f537e29691896kosak {Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)}))); 47731cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan} 47741cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 47751cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest, 47761cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan TakesInitializerListOfDifferentTypedMatchers) { 47772336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {2, 1, 4, 5, 3}; 47781cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan // The compiler cannot infer the type of the initializer list if its 47791cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan // elements have different types. We must explicitly specify the 47801cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan // unified element type in this case. 47811cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int> >( 47822336e9c171b5894bac98f828289f537e29691896kosak {Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)})); 47831cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int> >( 47842336e9c171b5894bac98f828289f537e29691896kosak {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)}))); 47851cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan} 47861cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 478718489fa4f81a65ab5f42a6705c28ca2f80eab3bdkosak#endif // GTEST_HAS_STD_INITIALIZER_LIST_ 47881cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan 4789fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass UnorderedElementsAreTest : public testing::Test { 4790fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan protected: 4791fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan typedef std::vector<int> IntVec; 4792fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}; 4793fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 47941f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST_F(UnorderedElementsAreTest, WorksWithUncopyable) { 47951f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue Uncopyable objs[2]; 47961f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue objs[0].set_value(-3); 47971f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue objs[1].set_value(1); 47981f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue EXPECT_THAT(objs, 47991f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3))); 48001f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue} 48011f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue 4802fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) { 48032336e9c171b5894bac98f828289f537e29691896kosak const int a[] = {1, 2, 3}; 48046414d806cd7d0954cce81348552fdd1e5bd31515kosak std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 4805fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan do { 4806fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4807fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), 4808fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan s, &listener)) << listener.str(); 4809fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } while (std::next_permutation(s.begin(), s.end())); 4810fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4811fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4812fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) { 48132336e9c171b5894bac98f828289f537e29691896kosak const int a[] = {1, 2, 3}; 48146414d806cd7d0954cce81348552fdd1e5bd31515kosak std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 4815fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<Matcher<int> > mv; 4816fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan mv.push_back(1); 4817fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan mv.push_back(2); 4818fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan mv.push_back(2); 4819fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // The element with value '3' matches nothing: fail fast. 4820fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4821fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv), 4822fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan s, &listener)) << listener.str(); 4823fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4824fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 48255579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wanTEST_F(UnorderedElementsAreTest, WorksForStreamlike) { 48265579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan // Streamlike 'container' provides only minimal iterator support. 48275579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan // Its iterators are tagged with input_iterator_tag, and it has no 48285579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan // size() or empty() methods. 48292336e9c171b5894bac98f828289f537e29691896kosak const int a[5] = {2, 1, 4, 5, 3}; 48306414d806cd7d0954cce81348552fdd1e5bd31515kosak Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 48315579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan 48325579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5)); 48335579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5))); 48345579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan} 48355579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan 4836fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// One naive implementation of the matcher runs in O(N!) time, which is too 4837fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// slow for many real-world inputs. This test shows that our matcher can match 4838fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// 100 inputs very quickly (a few milliseconds). An O(100!) is 10^158 4839fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// iterations and obviously effectively incomputable. 4840fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [ RUN ] UnorderedElementsAreTest.Performance 4841fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [ OK ] UnorderedElementsAreTest.Performance (4 ms) 4842fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, Performance) { 4843fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<int> s; 4844fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<Matcher<int> > mv; 4845fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan for (int i = 0; i < 100; ++i) { 4846fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan s.push_back(i); 4847fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan mv.push_back(_); 4848fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 4849fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan mv[50] = Eq(0); 4850fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4851fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv), 4852fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan s, &listener)) << listener.str(); 4853fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4854fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4855fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Another variant of 'Performance' with similar expectations. 4856fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [ RUN ] UnorderedElementsAreTest.PerformanceHalfStrict 4857fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [ OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms) 4858fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) { 4859fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<int> s; 4860fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<Matcher<int> > mv; 4861fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan for (int i = 0; i < 100; ++i) { 4862fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan s.push_back(i); 4863fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (i & 1) { 4864fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan mv.push_back(_); 4865fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } else { 4866fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan mv.push_back(i); 4867fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 4868fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 4869fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4870fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv), 4871fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan s, &listener)) << listener.str(); 4872fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4873fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4874fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageCountWrong) { 4875fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<int> v; 4876fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back(4); 4877fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4878fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), 4879fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v, &listener)) << listener.str(); 4880fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT(listener.str(), Eq("which has 1 element")); 4881fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4882fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4883fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) { 4884fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<int> v; 4885fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4886fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), 4887fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v, &listener)) << listener.str(); 4888fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT(listener.str(), Eq("")); 4889fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4890fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4891fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) { 4892fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<int> v; 4893fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back(1); 4894fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back(1); 4895fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4896fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2), 4897fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v, &listener)) << listener.str(); 4898fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4899fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan listener.str(), 4900fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("where the following matchers don't match any elements:\n" 4901fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "matcher #1: is equal to 2")); 4902fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4903fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4904fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) { 4905fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<int> v; 4906fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back(1); 4907fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back(2); 4908fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4909fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1), 4910fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v, &listener)) << listener.str(); 4911fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4912fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan listener.str(), 4913fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("where the following elements don't match any matchers:\n" 4914fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "element #1: 2")); 4915fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4916fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4917fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) { 4918fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<int> v; 4919fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back(2); 4920fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back(3); 4921fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4922fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2), 4923fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v, &listener)) << listener.str(); 4924fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4925fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan listener.str(), 4926fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("where" 4927fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " the following matchers don't match any elements:\n" 4928fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "matcher #0: is equal to 1\n" 4929fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "and" 4930fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " where" 4931fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " the following elements don't match any matchers:\n" 4932fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "element #1: 3")); 4933fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4934fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4935fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Test helper for formatting element, matcher index pairs in expectations. 4936fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanstatic string EMString(int element, int matcher) { 4937fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan stringstream ss; 4938fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ss << "(element #" << element << ", matcher #" << matcher << ")"; 4939fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan return ss.str(); 4940fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4941fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4942fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) { 4943fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // A situation where all elements and matchers have a match 4944fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // associated with them, but the max matching is not perfect. 4945fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<string> v; 4946fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back("a"); 4947fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back("b"); 4948fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan v.push_back("c"); 4949fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan StringMatchResultListener listener; 4950fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(ExplainMatchResult( 4951fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan UnorderedElementsAre("a", "a", AnyOf("b", "c")), v, &listener)) 4952fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << listener.str(); 4953fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4954fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan string prefix = 4955fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "where no permutation of the elements can satisfy all matchers, " 4956fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "and the closest match is 2 of 3 matchers with the " 4957fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "pairings:\n"; 4958fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4959fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // We have to be a bit loose here, because there are 4 valid max matches. 4960fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4961fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan listener.str(), 4962fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan AnyOf(prefix + "{\n " + EMString(0, 0) + 4963fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ",\n " + EMString(1, 2) + "\n}", 4964fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan prefix + "{\n " + EMString(0, 1) + 4965fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ",\n " + EMString(1, 2) + "\n}", 4966fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan prefix + "{\n " + EMString(0, 0) + 4967fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ",\n " + EMString(2, 2) + "\n}", 4968fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan prefix + "{\n " + EMString(0, 1) + 4969fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ",\n " + EMString(2, 2) + "\n}")); 4970fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4971fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4972fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, Describe) { 4973fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()), 4974fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("is empty")); 4975fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4976fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Describe<IntVec>(UnorderedElementsAre(345)), 4977fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("has 1 element and that element is equal to 345")); 4978fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4979fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Describe<IntVec>(UnorderedElementsAre(111, 222, 333)), 4980fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("has 3 elements and there exists some permutation " 4981fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "of elements such that:\n" 4982fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " - element #0 is equal to 111, and\n" 4983fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " - element #1 is equal to 222, and\n" 4984fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " - element #2 is equal to 333")); 4985fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 4986fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 4987fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, DescribeNegation) { 4988fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()), 4989fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("isn't empty")); 4990fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4991fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan DescribeNegation<IntVec>(UnorderedElementsAre(345)), 4992fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("doesn't have 1 element, or has 1 element that isn't equal to 345")); 4993fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT( 4994fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)), 4995fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Eq("doesn't have 3 elements, or there exists no permutation " 4996fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan "of elements such that:\n" 4997fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " - element #0 is equal to 123, and\n" 4998fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " - element #1 is equal to 234, and\n" 4999fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " - element #2 is equal to 345")); 5000fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 5001fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5002fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wannamespace { 5003fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5004fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Used as a check on the more complex max flow method used in the 5005fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// real testing::internal::FindMaxBipartiteMatching. This method is 5006fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// compatible but runs in worst-case factorial time, so we only 5007fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// use it in testing for small problem sizes. 5008fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wantemplate <typename Graph> 5009fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BacktrackingMaxBPMState { 5010fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan public: 5011fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // Does not take ownership of 'g'. 5012fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan explicit BacktrackingMaxBPMState(const Graph* g) : graph_(g) { } 5013fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5014fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ElementMatcherPairs Compute() { 5015fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (graph_->LhsSize() == 0 || graph_->RhsSize() == 0) { 5016fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan return best_so_far_; 5017fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5018fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan lhs_used_.assign(graph_->LhsSize(), kUnused); 5019fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan rhs_used_.assign(graph_->RhsSize(), kUnused); 5020fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) { 5021fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan matches_.clear(); 5022fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan RecurseInto(irhs); 5023fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (best_so_far_.size() == graph_->RhsSize()) 5024fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan break; 5025fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5026fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan return best_so_far_; 5027fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5028fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5029fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan private: 5030fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan static const size_t kUnused = static_cast<size_t>(-1); 5031fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5032fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan void PushMatch(size_t lhs, size_t rhs) { 5033fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan matches_.push_back(ElementMatcherPair(lhs, rhs)); 5034fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan lhs_used_[lhs] = rhs; 5035fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan rhs_used_[rhs] = lhs; 5036fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (matches_.size() > best_so_far_.size()) { 5037fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan best_so_far_ = matches_; 5038fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5039fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5040fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5041fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan void PopMatch() { 5042fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan const ElementMatcherPair& back = matches_.back(); 5043fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan lhs_used_[back.first] = kUnused; 5044fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan rhs_used_[back.second] = kUnused; 5045fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan matches_.pop_back(); 5046fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5047fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5048fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan bool RecurseInto(size_t irhs) { 5049fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (rhs_used_[irhs] != kUnused) { 5050fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan return true; 5051fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5052fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) { 5053fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (lhs_used_[ilhs] != kUnused) { 5054fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan continue; 5055fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5056fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (!graph_->HasEdge(ilhs, irhs)) { 5057fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan continue; 5058fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5059fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan PushMatch(ilhs, irhs); 5060fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (best_so_far_.size() == graph_->RhsSize()) { 5061fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan return false; 5062fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5063fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan for (size_t mi = irhs + 1; mi < graph_->RhsSize(); ++mi) { 5064fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (!RecurseInto(mi)) return false; 5065fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5066fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan PopMatch(); 5067fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5068fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan return true; 5069fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5070fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5071fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan const Graph* graph_; // not owned 5072fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<size_t> lhs_used_; 5073fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<size_t> rhs_used_; 5074fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ElementMatcherPairs matches_; 5075fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ElementMatcherPairs best_so_far_; 5076fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}; 5077fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5078fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wantemplate <typename Graph> 5079fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanconst size_t BacktrackingMaxBPMState<Graph>::kUnused; 5080fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5081fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} // namespace 5082fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5083fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Implement a simple backtracking algorithm to determine if it is possible 5084fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// to find one element per matcher, without reusing elements. 5085fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wantemplate <typename Graph> 5086fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanElementMatcherPairs 5087fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanFindBacktrackingMaxBPM(const Graph& g) { 5088fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan return BacktrackingMaxBPMState<Graph>(&g).Compute(); 5089fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 5090fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5091fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BacktrackingBPMTest : public ::testing::Test { }; 5092fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5093fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Tests the MaxBipartiteMatching algorithm with square matrices. 5094fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// The single int param is the # of nodes on each of the left and right sides. 5095fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BipartiteTest : public ::testing::TestWithParam<int> { }; 5096fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5097fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Verify all match graphs up to some moderate number of edges. 5098fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_P(BipartiteTest, Exhaustive) { 5099fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan int nodes = GetParam(); 5100fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan MatchMatrix graph(nodes, nodes); 5101fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan do { 5102fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ElementMatcherPairs matches = 5103fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan internal::FindMaxBipartiteMatching(graph); 5104fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), matches.size()) 5105fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << "graph: " << graph.DebugString(); 5106fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // Check that all elements of matches are in the graph. 5107fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // Check that elements of first and second are unique. 5108fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<bool> seen_element(graph.LhsSize()); 5109fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::vector<bool> seen_matcher(graph.RhsSize()); 5110fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan SCOPED_TRACE(PrintToString(matches)); 5111fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan for (size_t i = 0; i < matches.size(); ++i) { 5112fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan size_t ilhs = matches[i].first; 5113fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan size_t irhs = matches[i].second; 5114fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_TRUE(graph.HasEdge(ilhs, irhs)); 5115fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(seen_element[ilhs]); 5116fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_FALSE(seen_matcher[irhs]); 5117fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan seen_element[ilhs] = true; 5118fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan seen_matcher[irhs] = true; 5119fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5120fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } while (graph.NextGraph()); 5121fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 5122fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5123fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteTest, 5124fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ::testing::Range(0, 5)); 5125fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5126fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Parameterized by a pair interpreted as (LhsSize, RhsSize). 5127fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BipartiteNonSquareTest 5128fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan : public ::testing::TestWithParam<std::pair<size_t, size_t> > { 5129fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}; 5130fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5131fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(BipartiteNonSquareTest, SimpleBacktracking) { 5132fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // ....... 5133fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // 0:-----\ : 5134fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // 1:---\ | : 5135fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // 2:---\ | : 5136fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // 3:-\ | | : 5137fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // :.......: 5138fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan // 0 1 2 5139fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan MatchMatrix g(4, 3); 51402336e9c171b5894bac98f828289f537e29691896kosak static const int kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}}; 51416414d806cd7d0954cce81348552fdd1e5bd31515kosak for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) { 5142fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan g.SetEdge(kEdges[i][0], kEdges[i][1], true); 5143fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5144fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_THAT(FindBacktrackingMaxBPM(g), 5145fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan ElementsAre(Pair(3, 0), 5146fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Pair(AnyOf(1, 2), 1), 5147fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan Pair(0, 2))) << g.DebugString(); 5148fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 5149fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5150fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Verify a few nonsquare matrices. 5151fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_P(BipartiteNonSquareTest, Exhaustive) { 5152fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan size_t nlhs = GetParam().first; 5153fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan size_t nrhs = GetParam().second; 5154fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan MatchMatrix graph(nlhs, nrhs); 5155fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan do { 5156fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), 5157fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan internal::FindMaxBipartiteMatching(graph).size()) 5158fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << "graph: " << graph.DebugString() 5159fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << "\nbacktracking: " 5160fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << PrintToString(FindBacktrackingMaxBPM(graph)) 5161fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << "\nmax flow: " 5162fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << PrintToString(internal::FindMaxBipartiteMatching(graph)); 5163fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } while (graph.NextGraph()); 5164fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 5165fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5166fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteNonSquareTest, 5167fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan testing::Values( 5168fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(1, 2), 5169fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(2, 1), 5170fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(3, 2), 5171fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(2, 3), 5172fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(4, 1), 5173fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(1, 4), 5174fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(4, 3), 5175fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(3, 4))); 5176fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5177fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BipartiteRandomTest 5178fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan : public ::testing::TestWithParam<std::pair<int, int> > { 5179fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}; 5180fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5181fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Verifies a large sample of larger graphs. 5182fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_P(BipartiteRandomTest, LargerNets) { 5183fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan int nodes = GetParam().first; 5184fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan int iters = GetParam().second; 5185fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan MatchMatrix graph(nodes, nodes); 5186fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5187fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan testing::internal::Int32 seed = GTEST_FLAG(random_seed); 5188fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan if (seed == 0) { 5189fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan seed = static_cast<testing::internal::Int32>(time(NULL)); 5190fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5191fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5192fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan for (; iters > 0; --iters, ++seed) { 5193fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan srand(static_cast<int>(seed)); 5194fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan graph.Randomize(); 5195fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), 5196fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan internal::FindMaxBipartiteMatching(graph).size()) 5197fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << " graph: " << graph.DebugString() 5198fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan << "\nTo reproduce the failure, rerun the test with the flag" 5199fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan " --" << GTEST_FLAG_PREFIX_ << "random_seed=" << seed; 5200fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan } 5201fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan} 5202fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5203fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Test argument is a std::pair<int, int> representing (nodes, iters). 5204fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanINSTANTIATE_TEST_CASE_P(Samples, BipartiteRandomTest, 5205fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan testing::Values( 5206fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(5, 10000), 5207fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(6, 5000), 5208fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(7, 2000), 5209fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(8, 500), 5210fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan std::make_pair(9, 100))); 5211fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan 5212736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// Tests IsReadableTypeName(). 5213736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 5214736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) { 5215736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_TRUE(IsReadableTypeName("int")); 5216736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_TRUE(IsReadableTypeName("const unsigned char*")); 5217736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_TRUE(IsReadableTypeName("MyMap<int, void*>")); 5218736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_TRUE(IsReadableTypeName("void (*)(int, bool)")); 5219736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan} 5220736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 5221736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) { 5222736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_TRUE(IsReadableTypeName("my_long_namespace::MyClassName")); 5223736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_TRUE(IsReadableTypeName("int [5][6][7][8][9][10][11]")); 5224736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_TRUE(IsReadableTypeName("my_namespace::MyOuterClass::MyInnerClass")); 5225736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan} 5226736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 5227736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) { 5228736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_FALSE( 5229736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan IsReadableTypeName("basic_string<char, std::char_traits<char> >")); 5230736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_FALSE(IsReadableTypeName("std::vector<int, std::alloc_traits<int> >")); 5231736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan} 5232736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 5233736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) { 5234736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan EXPECT_FALSE(IsReadableTypeName("void (&)(int, bool, char, float)")); 5235736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan} 5236736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 52374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests JoinAsTuple(). 52384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsEmptyTuple) { 52404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("", JoinAsTuple(Strings())); 52414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 52424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsOneTuple) { 52442336e9c171b5894bac98f828289f537e29691896kosak const char* fields[] = {"1"}; 52454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1))); 52464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 52474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTwoTuple) { 52492336e9c171b5894bac98f828289f537e29691896kosak const char* fields[] = {"1", "a"}; 52504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2))); 52514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 52524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTenTuple) { 52542336e9c171b5894bac98f828289f537e29691896kosak const char* fields[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; 52554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)", 52564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan JoinAsTuple(Strings(fields, fields + 10))); 52574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 52584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests FormatMatcherDescription(). 52604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) { 52624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("is even", 5263b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan FormatMatcherDescription(false, "IsEven", Strings())); 5264b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan EXPECT_EQ("not (is even)", 5265b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan FormatMatcherDescription(true, "IsEven", Strings())); 52664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52672336e9c171b5894bac98f828289f537e29691896kosak const char* params[] = {"5"}; 52684a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("equals 5", 5269b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan FormatMatcherDescription(false, "Equals", 52704a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params, params + 1))); 52714a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52722336e9c171b5894bac98f828289f537e29691896kosak const char* params2[] = {"5", "8"}; 52734a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan EXPECT_EQ("is in range (5, 8)", 5274b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan FormatMatcherDescription(false, "IsInRange", 52754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan Strings(params2, params2 + 2))); 52764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan} 52774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan 52782b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::mutable_impl(). 52792b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessMutableImpl) { 52802b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 52812b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan DivisibleByImpl& impl = m.mutable_impl(); 52822b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_EQ(42, impl.divider()); 52832b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 52842b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan impl.set_divider(0); 52852b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_EQ(0, m.mutable_impl().divider()); 52862b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan} 52872b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 52882b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::impl(). 52892b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessImpl) { 52902b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 52912b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan const DivisibleByImpl& impl = m.impl(); 52922b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan EXPECT_EQ(42, impl.divider()); 52932b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan} 52942b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 5295b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(MatcherTupleTest, ExplainsMatchFailure) { 5296b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan stringstream ss1; 5297b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)), 5298b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan make_tuple('a', 10), &ss1); 5299b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ("", ss1.str()); // Successful match. 5300b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 5301b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan stringstream ss2; 5302b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))), 5303b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan make_tuple(2, 'b'), &ss2); 5304b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ(" Expected arg #0: is > 5\n" 5305b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan " Actual: 2, which is 3 less than 5\n" 5306d60c5f41c2842effec130a9b0483b92dbbed6e55zhanyong.wan " Expected arg #1: is equal to 'a' (97, 0x61)\n" 5307d60c5f41c2842effec130a9b0483b92dbbed6e55zhanyong.wan " Actual: 'b' (98, 0x62)\n", 5308b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ss2.str()); // Failed match where both arguments need explanation. 5309b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 5310b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan stringstream ss3; 5311b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))), 5312b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan make_tuple(2, 'a'), &ss3); 5313b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan EXPECT_EQ(" Expected arg #0: is > 5\n" 5314b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan " Actual: 2, which is 3 less than 5\n", 5315b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ss3.str()); // Failed match where only one argument needs 5316b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // explanation. 5317b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan} 5318b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 531933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Tests Each(). 532033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 532133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, ExplainsMatchResultCorrectly) { 532233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan set<int> a; // empty 532333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 532433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan Matcher<set<int> > m = Each(2); 532533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("", Explain(m, a)); 532633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 5327736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan Matcher<const int(&)[1]> n = Each(1); // NOLINT 532833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 53292336e9c171b5894bac98f828289f537e29691896kosak const int b[1] = {1}; 533033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("", Explain(n, b)); 533133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 533233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan n = Each(3); 533333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("whose element #0 doesn't match", Explain(n, b)); 533433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 533533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan a.insert(1); 533633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan a.insert(2); 533733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan a.insert(3); 533833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan m = Each(GreaterThan(0)); 533933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("", Explain(m, a)); 534033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 534133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan m = Each(GreaterThan(10)); 534233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10", 534333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan Explain(m, a)); 534433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 534533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 534633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, DescribesItselfCorrectly) { 534733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan Matcher<vector<int> > m = Each(1); 534833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("only contains elements that is equal to 1", Describe(m)); 534933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 535033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan Matcher<vector<int> > m2 = Not(m); 535133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2)); 535233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 535333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 535433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, MatchesVectorWhenAllElementsMatch) { 535533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan vector<int> some_vector; 535633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(some_vector, Each(1)); 535733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan some_vector.push_back(3); 535833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(some_vector, Not(Each(1))); 535933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(some_vector, Each(3)); 536033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan some_vector.push_back(1); 536133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan some_vector.push_back(2); 536233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(some_vector, Not(Each(3))); 536333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(some_vector, Each(Lt(3.5))); 536433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 536533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan vector<string> another_vector; 536633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_vector.push_back("fee"); 536733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(another_vector, Each(string("fee"))); 536833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_vector.push_back("fie"); 536933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_vector.push_back("foe"); 537033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_vector.push_back("fum"); 537133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(another_vector, Not(Each(string("fee")))); 537233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 537333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 537433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, MatchesMapWhenAllElementsMatch) { 537533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan map<const char*, int> my_map; 537633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const char* bar = "a string"; 537733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan my_map[bar] = 2; 537833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(my_map, Each(make_pair(bar, 2))); 537933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 538033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan map<string, int> another_map; 538133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1))); 538233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_map["fee"] = 1; 538333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1))); 538433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_map["fie"] = 2; 538533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_map["foe"] = 3; 538633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan another_map["fum"] = 4; 538733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1)))); 538833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1)))); 538933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(another_map, Each(Pair(_, Gt(0)))); 539033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 539133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 539233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, AcceptsMatcher) { 53932336e9c171b5894bac98f828289f537e29691896kosak const int a[] = {1, 2, 3}; 539433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(a, Each(Gt(0))); 539533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(a, Not(Each(Gt(1)))); 539633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 539733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 539833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, WorksForNativeArrayAsTuple) { 53992336e9c171b5894bac98f828289f537e29691896kosak const int a[] = {1, 2}; 540033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const int* const pointer = a; 540133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0))); 540233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1)))); 540333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 540433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 5405ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// For testing Pointwise(). 5406ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanclass IsHalfOfMatcher { 5407ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan public: 5408ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename T1, typename T2> 5409ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan bool MatchAndExplain(const tuple<T1, T2>& a_pair, 5410ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan MatchResultListener* listener) const { 5411ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (get<0>(a_pair) == get<1>(a_pair)/2) { 5412ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << "where the second is " << get<1>(a_pair); 5413ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return true; 5414ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } else { 5415ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << "where the second/2 is " << get<1>(a_pair)/2; 5416ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return false; 5417ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 5418ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 5419ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5420ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeTo(ostream* os) const { 5421ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "are a pair where the first is half of the second"; 5422ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 5423ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5424ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan void DescribeNegationTo(ostream* os) const { 5425ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "are a pair where the first isn't half of the second"; 5426ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 5427ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}; 5428ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5429ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanPolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() { 5430ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return MakePolymorphicMatcher(IsHalfOfMatcher()); 5431ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5432ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5433ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, DescribesSelf) { 5434ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<int> rhs; 5435ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(1); 5436ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(2); 5437ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(3); 5438ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs); 5439ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("contains 3 values, where each value and its corresponding value " 5440ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan "in { 1, 2, 3 } are a pair where the first is half of the second", 5441ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Describe(m)); 5442ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("doesn't contain exactly 3 values, or contains a value x at some " 5443ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan "index i where x and the i-th value of { 1, 2, 3 } are a pair " 5444ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan "where the first isn't half of the second", 5445ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan DescribeNegation(m)); 5446ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5447ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5448ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, MakesCopyOfRhs) { 5449ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan list<signed char> rhs; 5450ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(2); 5451ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(4); 5452ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 54532336e9c171b5894bac98f828289f537e29691896kosak int lhs[] = {1, 2}; 5454ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs); 5455ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, m); 5456ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5457ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // Changing rhs now shouldn't affect m, which made a copy of rhs. 5458ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(6); 5459ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, m); 5460ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5461ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5462ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, WorksForLhsNativeArray) { 54632336e9c171b5894bac98f828289f537e29691896kosak const int lhs[] = {1, 2, 3}; 5464ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<int> rhs; 5465ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(2); 5466ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(4); 5467ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs.push_back(6); 5468ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Pointwise(Lt(), rhs)); 5469ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 5470ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5471ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5472ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, WorksForRhsNativeArray) { 54732336e9c171b5894bac98f828289f537e29691896kosak const int rhs[] = {1, 2, 3}; 5474ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan vector<int> lhs; 5475ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan lhs.push_back(2); 5476ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan lhs.push_back(4); 5477ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan lhs.push_back(6); 5478ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Pointwise(Gt(), rhs)); 5479ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs))); 5480ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5481ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 54822336e9c171b5894bac98f828289f537e29691896kosak#if GTEST_HAS_STD_INITIALIZER_LIST_ 54832336e9c171b5894bac98f828289f537e29691896kosak 54842336e9c171b5894bac98f828289f537e29691896kosakTEST(PointwiseTest, WorksForRhsInitializerList) { 54852336e9c171b5894bac98f828289f537e29691896kosak const vector<int> lhs{2, 4, 6}; 54862336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Pointwise(Gt(), {1, 2, 3})); 54872336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Not(Pointwise(Lt(), {3, 3, 7}))); 54882336e9c171b5894bac98f828289f537e29691896kosak} 54892336e9c171b5894bac98f828289f537e29691896kosak 54902336e9c171b5894bac98f828289f537e29691896kosak#endif // GTEST_HAS_STD_INITIALIZER_LIST_ 54912336e9c171b5894bac98f828289f537e29691896kosak 5492ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, RejectsWrongSize) { 54932336e9c171b5894bac98f828289f537e29691896kosak const double lhs[2] = {1, 2}; 54942336e9c171b5894bac98f828289f537e29691896kosak const int rhs[1] = {0}; 5495ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 5496ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("which contains 2 values", 5497ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Explain(Pointwise(Gt(), rhs), lhs)); 5498ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 54992336e9c171b5894bac98f828289f537e29691896kosak const int rhs2[3] = {0, 1, 2}; 5500ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2))); 5501ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5502ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5503ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, RejectsWrongContent) { 55042336e9c171b5894bac98f828289f537e29691896kosak const double lhs[3] = {1, 2, 3}; 55052336e9c171b5894bac98f828289f537e29691896kosak const int rhs[3] = {2, 6, 4}; 5506ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs))); 5507ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("where the value pair (2, 6) at index #1 don't match, " 5508ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan "where the second/2 is 3", 5509ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Explain(Pointwise(IsHalfOf(), rhs), lhs)); 5510ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5511ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5512ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, AcceptsCorrectContent) { 55132336e9c171b5894bac98f828289f537e29691896kosak const double lhs[3] = {1, 2, 3}; 55142336e9c171b5894bac98f828289f537e29691896kosak const int rhs[3] = {2, 4, 6}; 5515ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs)); 5516ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs)); 5517ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5518ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5519ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, AllowsMonomorphicInnerMatcher) { 55202336e9c171b5894bac98f828289f537e29691896kosak const double lhs[3] = {1, 2, 3}; 55212336e9c171b5894bac98f828289f537e29691896kosak const int rhs[3] = {2, 4, 6}; 5522ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf(); 5523ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Pointwise(m1, rhs)); 5524ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs)); 5525ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 5526ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // This type works as a tuple<const double&, const int&> can be 5527ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // implicitly cast to tuple<double, int>. 5528ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<tuple<double, int> > m2 = IsHalfOf(); 5529ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_THAT(lhs, Pointwise(m2, rhs)); 5530ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs)); 5531ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 5532ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 55332336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, DescribesSelf) { 55342336e9c171b5894bac98f828289f537e29691896kosak vector<int> rhs; 55352336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(1); 55362336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(2); 55372336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(3); 55382336e9c171b5894bac98f828289f537e29691896kosak const Matcher<const vector<int>&> m = UnorderedPointwise(IsHalfOf(), rhs); 55392336e9c171b5894bac98f828289f537e29691896kosak EXPECT_EQ( 55402336e9c171b5894bac98f828289f537e29691896kosak "has 3 elements and there exists some permutation of elements such " 55412336e9c171b5894bac98f828289f537e29691896kosak "that:\n" 55422336e9c171b5894bac98f828289f537e29691896kosak " - element #0 and 1 are a pair where the first is half of the second, " 55432336e9c171b5894bac98f828289f537e29691896kosak "and\n" 55442336e9c171b5894bac98f828289f537e29691896kosak " - element #1 and 2 are a pair where the first is half of the second, " 55452336e9c171b5894bac98f828289f537e29691896kosak "and\n" 55462336e9c171b5894bac98f828289f537e29691896kosak " - element #2 and 3 are a pair where the first is half of the second", 55472336e9c171b5894bac98f828289f537e29691896kosak Describe(m)); 55482336e9c171b5894bac98f828289f537e29691896kosak EXPECT_EQ( 55492336e9c171b5894bac98f828289f537e29691896kosak "doesn't have 3 elements, or there exists no permutation of elements " 55502336e9c171b5894bac98f828289f537e29691896kosak "such that:\n" 55512336e9c171b5894bac98f828289f537e29691896kosak " - element #0 and 1 are a pair where the first is half of the second, " 55522336e9c171b5894bac98f828289f537e29691896kosak "and\n" 55532336e9c171b5894bac98f828289f537e29691896kosak " - element #1 and 2 are a pair where the first is half of the second, " 55542336e9c171b5894bac98f828289f537e29691896kosak "and\n" 55552336e9c171b5894bac98f828289f537e29691896kosak " - element #2 and 3 are a pair where the first is half of the second", 55562336e9c171b5894bac98f828289f537e29691896kosak DescribeNegation(m)); 55572336e9c171b5894bac98f828289f537e29691896kosak} 55582336e9c171b5894bac98f828289f537e29691896kosak 55592336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, MakesCopyOfRhs) { 55602336e9c171b5894bac98f828289f537e29691896kosak list<signed char> rhs; 55612336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(2); 55622336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(4); 55632336e9c171b5894bac98f828289f537e29691896kosak 55642336e9c171b5894bac98f828289f537e29691896kosak int lhs[] = {2, 1}; 55652336e9c171b5894bac98f828289f537e29691896kosak const Matcher<const int (&)[2]> m = UnorderedPointwise(IsHalfOf(), rhs); 55662336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, m); 55672336e9c171b5894bac98f828289f537e29691896kosak 55682336e9c171b5894bac98f828289f537e29691896kosak // Changing rhs now shouldn't affect m, which made a copy of rhs. 55692336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(6); 55702336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, m); 55712336e9c171b5894bac98f828289f537e29691896kosak} 55722336e9c171b5894bac98f828289f537e29691896kosak 55732336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, WorksForLhsNativeArray) { 55742336e9c171b5894bac98f828289f537e29691896kosak const int lhs[] = {1, 2, 3}; 55752336e9c171b5894bac98f828289f537e29691896kosak vector<int> rhs; 55762336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(4); 55772336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(6); 55782336e9c171b5894bac98f828289f537e29691896kosak rhs.push_back(2); 55792336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, UnorderedPointwise(Lt(), rhs)); 55802336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs))); 55812336e9c171b5894bac98f828289f537e29691896kosak} 55822336e9c171b5894bac98f828289f537e29691896kosak 55832336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, WorksForRhsNativeArray) { 55842336e9c171b5894bac98f828289f537e29691896kosak const int rhs[] = {1, 2, 3}; 55852336e9c171b5894bac98f828289f537e29691896kosak vector<int> lhs; 55862336e9c171b5894bac98f828289f537e29691896kosak lhs.push_back(4); 55872336e9c171b5894bac98f828289f537e29691896kosak lhs.push_back(2); 55882336e9c171b5894bac98f828289f537e29691896kosak lhs.push_back(6); 55892336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, UnorderedPointwise(Gt(), rhs)); 55902336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), rhs))); 55912336e9c171b5894bac98f828289f537e29691896kosak} 55922336e9c171b5894bac98f828289f537e29691896kosak 55932336e9c171b5894bac98f828289f537e29691896kosak#if GTEST_HAS_STD_INITIALIZER_LIST_ 55942336e9c171b5894bac98f828289f537e29691896kosak 55952336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, WorksForRhsInitializerList) { 55962336e9c171b5894bac98f828289f537e29691896kosak const vector<int> lhs{2, 4, 6}; 55972336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, UnorderedPointwise(Gt(), {5, 1, 3})); 55982336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), {1, 1, 7}))); 55992336e9c171b5894bac98f828289f537e29691896kosak} 56002336e9c171b5894bac98f828289f537e29691896kosak 56012336e9c171b5894bac98f828289f537e29691896kosak#endif // GTEST_HAS_STD_INITIALIZER_LIST_ 56022336e9c171b5894bac98f828289f537e29691896kosak 56032336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, RejectsWrongSize) { 56042336e9c171b5894bac98f828289f537e29691896kosak const double lhs[2] = {1, 2}; 56052336e9c171b5894bac98f828289f537e29691896kosak const int rhs[1] = {0}; 56062336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs))); 56072336e9c171b5894bac98f828289f537e29691896kosak EXPECT_EQ("which has 2 elements", 56082336e9c171b5894bac98f828289f537e29691896kosak Explain(UnorderedPointwise(Gt(), rhs), lhs)); 56092336e9c171b5894bac98f828289f537e29691896kosak 56102336e9c171b5894bac98f828289f537e29691896kosak const int rhs2[3] = {0, 1, 2}; 56112336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs2))); 56122336e9c171b5894bac98f828289f537e29691896kosak} 56132336e9c171b5894bac98f828289f537e29691896kosak 56142336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, RejectsWrongContent) { 56152336e9c171b5894bac98f828289f537e29691896kosak const double lhs[3] = {1, 2, 3}; 56162336e9c171b5894bac98f828289f537e29691896kosak const int rhs[3] = {2, 6, 6}; 56172336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, Not(UnorderedPointwise(IsHalfOf(), rhs))); 56182336e9c171b5894bac98f828289f537e29691896kosak EXPECT_EQ("where the following elements don't match any matchers:\n" 56192336e9c171b5894bac98f828289f537e29691896kosak "element #1: 2", 56202336e9c171b5894bac98f828289f537e29691896kosak Explain(UnorderedPointwise(IsHalfOf(), rhs), lhs)); 56212336e9c171b5894bac98f828289f537e29691896kosak} 56222336e9c171b5894bac98f828289f537e29691896kosak 56232336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, AcceptsCorrectContentInSameOrder) { 56242336e9c171b5894bac98f828289f537e29691896kosak const double lhs[3] = {1, 2, 3}; 56252336e9c171b5894bac98f828289f537e29691896kosak const int rhs[3] = {2, 4, 6}; 56262336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs)); 56272336e9c171b5894bac98f828289f537e29691896kosak} 56282336e9c171b5894bac98f828289f537e29691896kosak 56292336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, AcceptsCorrectContentInDifferentOrder) { 56302336e9c171b5894bac98f828289f537e29691896kosak const double lhs[3] = {1, 2, 3}; 56312336e9c171b5894bac98f828289f537e29691896kosak const int rhs[3] = {6, 4, 2}; 56322336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs)); 56332336e9c171b5894bac98f828289f537e29691896kosak} 56342336e9c171b5894bac98f828289f537e29691896kosak 56352336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) { 56362336e9c171b5894bac98f828289f537e29691896kosak const double lhs[3] = {1, 2, 3}; 56372336e9c171b5894bac98f828289f537e29691896kosak const int rhs[3] = {4, 6, 2}; 56382336e9c171b5894bac98f828289f537e29691896kosak const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf(); 56392336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, UnorderedPointwise(m1, rhs)); 56402336e9c171b5894bac98f828289f537e29691896kosak 56412336e9c171b5894bac98f828289f537e29691896kosak // This type works as a tuple<const double&, const int&> can be 56422336e9c171b5894bac98f828289f537e29691896kosak // implicitly cast to tuple<double, int>. 56432336e9c171b5894bac98f828289f537e29691896kosak const Matcher<tuple<double, int> > m2 = IsHalfOf(); 56442336e9c171b5894bac98f828289f537e29691896kosak EXPECT_THAT(lhs, UnorderedPointwise(m2, rhs)); 56452336e9c171b5894bac98f828289f537e29691896kosak} 56462336e9c171b5894bac98f828289f537e29691896kosak 5647e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace gmock_matchers_test 5648e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace testing 5649