// Copyright 2014 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_TESTING_GMOCK_SUPPORT_H_ #define V8_TESTING_GMOCK_SUPPORT_H_ #include <cmath> #include <cstring> #include <string> #include "testing/gmock/include/gmock/gmock.h" namespace testing { template <typename T> class Capture { public: Capture() : value_(), has_value_(false) {} const T& value() const { return value_; } bool has_value() const { return has_value_; } void SetValue(const T& value) { DCHECK(!has_value()); value_ = value; has_value_ = true; } private: T value_; bool has_value_; }; namespace internal { template <typename T> class CaptureEqMatcher : public MatcherInterface<T> { public: explicit CaptureEqMatcher(Capture<T>* capture) : capture_(capture) {} virtual void DescribeTo(std::ostream* os) const { *os << "captured by " << static_cast<const void*>(capture_); if (capture_->has_value()) *os << " which has value " << capture_->value(); } virtual bool MatchAndExplain(T value, MatchResultListener* listener) const { if (!capture_->has_value()) { capture_->SetValue(value); return true; } if (value != capture_->value()) { *listener << "which is not equal to " << capture_->value(); return false; } return true; } private: Capture<T>* capture_; }; } // namespace internal // Creates a polymorphic matcher that matches anything whose bit representation // is equal to that of {x}. MATCHER_P(BitEq, x, std::string(negation ? "isn't" : "is") + " bitwise equal to " + PrintToString(x)) { static_assert(sizeof(x) == sizeof(arg), "Size mismatch"); return std::memcmp(&arg, &x, sizeof(x)) == 0; } // CaptureEq(capture) captures the value passed in during matching as long as it // is unset, and once set, compares the value for equality with the argument. template <typename T> inline Matcher<T> CaptureEq(Capture<T>* capture) { return MakeMatcher(new internal::CaptureEqMatcher<T>(capture)); } // Creates a polymorphic matcher that matches any floating point NaN value. MATCHER(IsNaN, std::string(negation ? "isn't" : "is") + " not a number") { return std::isnan(arg); } } // namespace testing #endif // V8_TESTING_GMOCK_SUPPORT_H_