// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Google Mock - a framework for writing C++ mock classes. // // This file implements some commonly used variadic matchers. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ #include #include #include #include namespace testing { namespace internal { // Implements ElementsAre() and ElementsAreArray(). template class ElementsAreMatcherImpl : public MatcherInterface { public: typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; // Constructs the matcher from a sequence of element values or // element matchers. template ElementsAreMatcherImpl(InputIter first, size_t count) { matchers_.reserve(count); InputIter it = first; for (size_t i = 0; i != count; ++i, ++it) { matchers_.push_back(MatcherCast(*it)); } } // Returns true iff 'container' matches. virtual bool Matches(Container container) const { if (container.size() != count()) return false; typename RawContainer::const_iterator container_iter = container.begin(); for (size_t i = 0; i != count(); ++container_iter, ++i) { if (!matchers_[i].Matches(*container_iter)) return false; } return true; } // Describes what this matcher does. virtual void DescribeTo(::std::ostream* os) const { if (count() == 0) { *os << "is empty"; } else if (count() == 1) { *os << "has 1 element that "; matchers_[0].DescribeTo(os); } else { *os << "has " << Elements(count()) << " where\n"; for (size_t i = 0; i != count(); ++i) { *os << "element " << i << " "; matchers_[i].DescribeTo(os); if (i + 1 < count()) { *os << ",\n"; } } } } // Describes what the negation of this matcher does. virtual void DescribeNegationTo(::std::ostream* os) const { if (count() == 0) { *os << "is not empty"; return; } *os << "does not have " << Elements(count()) << ", or\n"; for (size_t i = 0; i != count(); ++i) { *os << "element " << i << " "; matchers_[i].DescribeNegationTo(os); if (i + 1 < count()) { *os << ", or\n"; } } } // Explains why 'container' matches, or doesn't match, this matcher. virtual void ExplainMatchResultTo(Container container, ::std::ostream* os) const { if (Matches(container)) { // We need to explain why *each* element matches (the obvious // ones can be skipped). bool reason_printed = false; typename RawContainer::const_iterator container_iter = container.begin(); for (size_t i = 0; i != count(); ++container_iter, ++i) { ::std::stringstream ss; matchers_[i].ExplainMatchResultTo(*container_iter, &ss); const string s = ss.str(); if (!s.empty()) { if (reason_printed) { *os << ",\n"; } *os << "element " << i << " " << s; reason_printed = true; } } } else { // We need to explain why the container doesn't match. const size_t actual_count = container.size(); if (actual_count != count()) { // The element count doesn't match. If the container is // empty, there's no need to explain anything as Google Mock // already prints the empty container. Otherwise we just need // to show how many elements there actually are. if (actual_count != 0) { *os << "has " << Elements(actual_count); } return; } // The container has the right size but at least one element // doesn't match expectation. We need to find this element and // explain why it doesn't match. typename RawContainer::const_iterator container_iter = container.begin(); for (size_t i = 0; i != count(); ++container_iter, ++i) { if (matchers_[i].Matches(*container_iter)) { continue; } *os << "element " << i << " doesn't match"; ::std::stringstream ss; matchers_[i].ExplainMatchResultTo(*container_iter, &ss); const string s = ss.str(); if (!s.empty()) { *os << " (" << s << ")"; } return; } } } private: static Message Elements(size_t count) { return Message() << count << (count == 1 ? " element" : " elements"); } size_t count() const { return matchers_.size(); } std::vector > matchers_; }; // Implements ElementsAre() of 0-10 arguments. class ElementsAreMatcher0 { public: ElementsAreMatcher0() {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher* const matchers = NULL; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 0)); } }; template class ElementsAreMatcher1 { public: explicit ElementsAreMatcher1(const T1& e1) : e1_(e1) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 1)); } private: const T1& e1_; }; template class ElementsAreMatcher2 { public: ElementsAreMatcher2(const T1& e1, const T2& e2) : e1_(e1), e2_(e2) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 2)); } private: const T1& e1_; const T2& e2_; }; template class ElementsAreMatcher3 { public: ElementsAreMatcher3(const T1& e1, const T2& e2, const T3& e3) : e1_(e1), e2_(e2), e3_(e3) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 3)); } private: const T1& e1_; const T2& e2_; const T3& e3_; }; template class ElementsAreMatcher4 { public: ElementsAreMatcher4(const T1& e1, const T2& e2, const T3& e3, const T4& e4) : e1_(e1), e2_(e2), e3_(e3), e4_(e4) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 4)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; }; template class ElementsAreMatcher5 { public: ElementsAreMatcher5(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 5)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; }; template class ElementsAreMatcher6 { public: ElementsAreMatcher6(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 6)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; }; template class ElementsAreMatcher7 { public: ElementsAreMatcher7(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 7)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; }; template class ElementsAreMatcher8 { public: ElementsAreMatcher8(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), MatcherCast(e8_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 8)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; const T8& e8_; }; template class ElementsAreMatcher9 { public: ElementsAreMatcher9(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8), e9_(e9) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), MatcherCast(e8_), MatcherCast(e9_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 9)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; const T8& e8_; const T9& e9_; }; template class ElementsAreMatcher10 { public: ElementsAreMatcher10(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, const T10& e10) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8), e9_(e9), e10_(e10) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; const Matcher matchers[] = { MatcherCast(e1_), MatcherCast(e2_), MatcherCast(e3_), MatcherCast(e4_), MatcherCast(e5_), MatcherCast(e6_), MatcherCast(e7_), MatcherCast(e8_), MatcherCast(e9_), MatcherCast(e10_), }; return MakeMatcher(new ElementsAreMatcherImpl(matchers, 10)); } private: const T1& e1_; const T2& e2_; const T3& e3_; const T4& e4_; const T5& e5_; const T6& e6_; const T7& e7_; const T8& e8_; const T9& e9_; const T10& e10_; }; // Implements ElementsAreArray(). template class ElementsAreArrayMatcher { public: ElementsAreArrayMatcher(const T* first, size_t count) : first_(first), count_(count) {} template operator Matcher() const { typedef GMOCK_REMOVE_CONST(GMOCK_REMOVE_REFERENCE(Container)) RawContainer; typedef typename RawContainer::value_type Element; return MakeMatcher(new ElementsAreMatcherImpl(first_, count_)); } private: const T* const first_; const size_t count_; }; } // namespace internal // ElementsAre(e0, e1, ..., e_n) matches an STL-style container with // (n + 1) elements, where the i-th element in the container must // match the i-th argument in the list. Each argument of // ElementsAre() can be either a value or a matcher. We support up to // 10 arguments. // // NOTE: Since ElementsAre() cares about the order of the elements, it // must not be used with containers whose elements's order is // undefined (e.g. hash_map). inline internal::ElementsAreMatcher0 ElementsAre() { return internal::ElementsAreMatcher0(); } template inline internal::ElementsAreMatcher1 ElementsAre(const T1& e1) { return internal::ElementsAreMatcher1(e1); } template inline internal::ElementsAreMatcher2 ElementsAre(const T1& e1, const T2& e2) { return internal::ElementsAreMatcher2(e1, e2); } template inline internal::ElementsAreMatcher3 ElementsAre(const T1& e1, const T2& e2, const T3& e3) { return internal::ElementsAreMatcher3(e1, e2, e3); } template inline internal::ElementsAreMatcher4 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) { return internal::ElementsAreMatcher4(e1, e2, e3, e4); } template inline internal::ElementsAreMatcher5 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5) { return internal::ElementsAreMatcher5(e1, e2, e3, e4, e5); } template inline internal::ElementsAreMatcher6 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6) { return internal::ElementsAreMatcher6(e1, e2, e3, e4, e5, e6); } template inline internal::ElementsAreMatcher7 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7) { return internal::ElementsAreMatcher7(e1, e2, e3, e4, e5, e6, e7); } template inline internal::ElementsAreMatcher8 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8) { return internal::ElementsAreMatcher8(e1, e2, e3, e4, e5, e6, e7, e8); } template inline internal::ElementsAreMatcher9 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { return internal::ElementsAreMatcher9(e1, e2, e3, e4, e5, e6, e7, e8, e9); } template inline internal::ElementsAreMatcher10 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, const T10& e10) { return internal::ElementsAreMatcher10(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); } // ElementsAreArray(array) and ElementAreArray(array, count) are like // ElementsAre(), except that they take an array of values or // matchers. The former form infers the size of 'array', which must // be a static C-style array. In the latter form, 'array' can either // be a static array or a pointer to a dynamically created array. template inline internal::ElementsAreArrayMatcher ElementsAreArray( const T* first, size_t count) { return internal::ElementsAreArrayMatcher(first, count); } template inline internal::ElementsAreArrayMatcher ElementsAreArray(const T (&array)[N]) { return internal::ElementsAreArrayMatcher(array, N); } } // namespace testing #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_