113481Sgiacomo.travaglini@arm.com// Copyright 2005, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com// 3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3113481Sgiacomo.travaglini@arm.com// 3213481Sgiacomo.travaglini@arm.com// The Google C++ Testing Framework (Google Test) 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This header file defines the Message class. 3513481Sgiacomo.travaglini@arm.com// 3613481Sgiacomo.travaglini@arm.com// IMPORTANT NOTE: Due to limitation of the C++ language, we have to 3713481Sgiacomo.travaglini@arm.com// leave some internal implementation details in this header file. 3813481Sgiacomo.travaglini@arm.com// They are clearly marked by comments like this: 3913481Sgiacomo.travaglini@arm.com// 4013481Sgiacomo.travaglini@arm.com// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. 4113481Sgiacomo.travaglini@arm.com// 4213481Sgiacomo.travaglini@arm.com// Such code is NOT meant to be used by a user directly, and is subject 4313481Sgiacomo.travaglini@arm.com// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user 4413481Sgiacomo.travaglini@arm.com// program! 4513481Sgiacomo.travaglini@arm.com 4613481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 4713481Sgiacomo.travaglini@arm.com#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 4813481Sgiacomo.travaglini@arm.com 4913481Sgiacomo.travaglini@arm.com#include <limits> 5013481Sgiacomo.travaglini@arm.com 5113481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-port.h" 5213481Sgiacomo.travaglini@arm.com 5313481Sgiacomo.travaglini@arm.com// Ensures that there is at least one operator<< in the global namespace. 5413481Sgiacomo.travaglini@arm.com// See Message& operator<<(...) below for why. 5513481Sgiacomo.travaglini@arm.comvoid operator<<(const testing::internal::Secret&, int); 5613481Sgiacomo.travaglini@arm.com 5713481Sgiacomo.travaglini@arm.comnamespace testing { 5813481Sgiacomo.travaglini@arm.com 5913481Sgiacomo.travaglini@arm.com// The Message class works like an ostream repeater. 6013481Sgiacomo.travaglini@arm.com// 6113481Sgiacomo.travaglini@arm.com// Typical usage: 6213481Sgiacomo.travaglini@arm.com// 6313481Sgiacomo.travaglini@arm.com// 1. You stream a bunch of values to a Message object. 6413481Sgiacomo.travaglini@arm.com// It will remember the text in a stringstream. 6513481Sgiacomo.travaglini@arm.com// 2. Then you stream the Message object to an ostream. 6613481Sgiacomo.travaglini@arm.com// This causes the text in the Message to be streamed 6713481Sgiacomo.travaglini@arm.com// to the ostream. 6813481Sgiacomo.travaglini@arm.com// 6913481Sgiacomo.travaglini@arm.com// For example; 7013481Sgiacomo.travaglini@arm.com// 7113481Sgiacomo.travaglini@arm.com// testing::Message foo; 7213481Sgiacomo.travaglini@arm.com// foo << 1 << " != " << 2; 7313481Sgiacomo.travaglini@arm.com// std::cout << foo; 7413481Sgiacomo.travaglini@arm.com// 7513481Sgiacomo.travaglini@arm.com// will print "1 != 2". 7613481Sgiacomo.travaglini@arm.com// 7713481Sgiacomo.travaglini@arm.com// Message is not intended to be inherited from. In particular, its 7813481Sgiacomo.travaglini@arm.com// destructor is not virtual. 7913481Sgiacomo.travaglini@arm.com// 8013481Sgiacomo.travaglini@arm.com// Note that stringstream behaves differently in gcc and in MSVC. You 8113481Sgiacomo.travaglini@arm.com// can stream a NULL char pointer to it in the former, but not in the 8213481Sgiacomo.travaglini@arm.com// latter (it causes an access violation if you do). The Message 8313481Sgiacomo.travaglini@arm.com// class hides this difference by treating a NULL char pointer as 8413481Sgiacomo.travaglini@arm.com// "(null)". 8513481Sgiacomo.travaglini@arm.comclass GTEST_API_ Message { 8613481Sgiacomo.travaglini@arm.com private: 8713481Sgiacomo.travaglini@arm.com // The type of basic IO manipulators (endl, ends, and flush) for 8813481Sgiacomo.travaglini@arm.com // narrow streams. 8913481Sgiacomo.travaglini@arm.com typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); 9013481Sgiacomo.travaglini@arm.com 9113481Sgiacomo.travaglini@arm.com public: 9213481Sgiacomo.travaglini@arm.com // Constructs an empty Message. 9313481Sgiacomo.travaglini@arm.com Message(); 9413481Sgiacomo.travaglini@arm.com 9513481Sgiacomo.travaglini@arm.com // Copy constructor. 9613481Sgiacomo.travaglini@arm.com Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT 9713481Sgiacomo.travaglini@arm.com *ss_ << msg.GetString(); 9813481Sgiacomo.travaglini@arm.com } 9913481Sgiacomo.travaglini@arm.com 10013481Sgiacomo.travaglini@arm.com // Constructs a Message from a C-string. 10113481Sgiacomo.travaglini@arm.com explicit Message(const char* str) : ss_(new ::std::stringstream) { 10213481Sgiacomo.travaglini@arm.com *ss_ << str; 10313481Sgiacomo.travaglini@arm.com } 10413481Sgiacomo.travaglini@arm.com 10513481Sgiacomo.travaglini@arm.com#if GTEST_OS_SYMBIAN 10613481Sgiacomo.travaglini@arm.com // Streams a value (either a pointer or not) to this object. 10713481Sgiacomo.travaglini@arm.com template <typename T> 10813481Sgiacomo.travaglini@arm.com inline Message& operator <<(const T& value) { 10913481Sgiacomo.travaglini@arm.com StreamHelper(typename internal::is_pointer<T>::type(), value); 11013481Sgiacomo.travaglini@arm.com return *this; 11113481Sgiacomo.travaglini@arm.com } 11213481Sgiacomo.travaglini@arm.com#else 11313481Sgiacomo.travaglini@arm.com // Streams a non-pointer value to this object. 11413481Sgiacomo.travaglini@arm.com template <typename T> 11513481Sgiacomo.travaglini@arm.com inline Message& operator <<(const T& val) { 11613481Sgiacomo.travaglini@arm.com // Some libraries overload << for STL containers. These 11713481Sgiacomo.travaglini@arm.com // overloads are defined in the global namespace instead of ::std. 11813481Sgiacomo.travaglini@arm.com // 11913481Sgiacomo.travaglini@arm.com // C++'s symbol lookup rule (i.e. Koenig lookup) says that these 12013481Sgiacomo.travaglini@arm.com // overloads are visible in either the std namespace or the global 12113481Sgiacomo.travaglini@arm.com // namespace, but not other namespaces, including the testing 12213481Sgiacomo.travaglini@arm.com // namespace which Google Test's Message class is in. 12313481Sgiacomo.travaglini@arm.com // 12413481Sgiacomo.travaglini@arm.com // To allow STL containers (and other types that has a << operator 12513481Sgiacomo.travaglini@arm.com // defined in the global namespace) to be used in Google Test 12613481Sgiacomo.travaglini@arm.com // assertions, testing::Message must access the custom << operator 12713481Sgiacomo.travaglini@arm.com // from the global namespace. With this using declaration, 12813481Sgiacomo.travaglini@arm.com // overloads of << defined in the global namespace and those 12913481Sgiacomo.travaglini@arm.com // visible via Koenig lookup are both exposed in this function. 13013481Sgiacomo.travaglini@arm.com using ::operator <<; 13113481Sgiacomo.travaglini@arm.com *ss_ << val; 13213481Sgiacomo.travaglini@arm.com return *this; 13313481Sgiacomo.travaglini@arm.com } 13413481Sgiacomo.travaglini@arm.com 13513481Sgiacomo.travaglini@arm.com // Streams a pointer value to this object. 13613481Sgiacomo.travaglini@arm.com // 13713481Sgiacomo.travaglini@arm.com // This function is an overload of the previous one. When you 13813481Sgiacomo.travaglini@arm.com // stream a pointer to a Message, this definition will be used as it 13913481Sgiacomo.travaglini@arm.com // is more specialized. (The C++ Standard, section 14013481Sgiacomo.travaglini@arm.com // [temp.func.order].) If you stream a non-pointer, then the 14113481Sgiacomo.travaglini@arm.com // previous definition will be used. 14213481Sgiacomo.travaglini@arm.com // 14313481Sgiacomo.travaglini@arm.com // The reason for this overload is that streaming a NULL pointer to 14413481Sgiacomo.travaglini@arm.com // ostream is undefined behavior. Depending on the compiler, you 14513481Sgiacomo.travaglini@arm.com // may get "0", "(nil)", "(null)", or an access violation. To 14613481Sgiacomo.travaglini@arm.com // ensure consistent result across compilers, we always treat NULL 14713481Sgiacomo.travaglini@arm.com // as "(null)". 14813481Sgiacomo.travaglini@arm.com template <typename T> 14913481Sgiacomo.travaglini@arm.com inline Message& operator <<(T* const& pointer) { // NOLINT 15013481Sgiacomo.travaglini@arm.com if (pointer == NULL) { 15113481Sgiacomo.travaglini@arm.com *ss_ << "(null)"; 15213481Sgiacomo.travaglini@arm.com } else { 15313481Sgiacomo.travaglini@arm.com *ss_ << pointer; 15413481Sgiacomo.travaglini@arm.com } 15513481Sgiacomo.travaglini@arm.com return *this; 15613481Sgiacomo.travaglini@arm.com } 15713481Sgiacomo.travaglini@arm.com#endif // GTEST_OS_SYMBIAN 15813481Sgiacomo.travaglini@arm.com 15913481Sgiacomo.travaglini@arm.com // Since the basic IO manipulators are overloaded for both narrow 16013481Sgiacomo.travaglini@arm.com // and wide streams, we have to provide this specialized definition 16113481Sgiacomo.travaglini@arm.com // of operator <<, even though its body is the same as the 16213481Sgiacomo.travaglini@arm.com // templatized version above. Without this definition, streaming 16313481Sgiacomo.travaglini@arm.com // endl or other basic IO manipulators to Message will confuse the 16413481Sgiacomo.travaglini@arm.com // compiler. 16513481Sgiacomo.travaglini@arm.com Message& operator <<(BasicNarrowIoManip val) { 16613481Sgiacomo.travaglini@arm.com *ss_ << val; 16713481Sgiacomo.travaglini@arm.com return *this; 16813481Sgiacomo.travaglini@arm.com } 16913481Sgiacomo.travaglini@arm.com 17013481Sgiacomo.travaglini@arm.com // Instead of 1/0, we want to see true/false for bool values. 17113481Sgiacomo.travaglini@arm.com Message& operator <<(bool b) { 17213481Sgiacomo.travaglini@arm.com return *this << (b ? "true" : "false"); 17313481Sgiacomo.travaglini@arm.com } 17413481Sgiacomo.travaglini@arm.com 17513481Sgiacomo.travaglini@arm.com // These two overloads allow streaming a wide C string to a Message 17613481Sgiacomo.travaglini@arm.com // using the UTF-8 encoding. 17713481Sgiacomo.travaglini@arm.com Message& operator <<(const wchar_t* wide_c_str); 17813481Sgiacomo.travaglini@arm.com Message& operator <<(wchar_t* wide_c_str); 17913481Sgiacomo.travaglini@arm.com 18013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_WSTRING 18113481Sgiacomo.travaglini@arm.com // Converts the given wide string to a narrow string using the UTF-8 18213481Sgiacomo.travaglini@arm.com // encoding, and streams the result to this Message object. 18313481Sgiacomo.travaglini@arm.com Message& operator <<(const ::std::wstring& wstr); 18413481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_WSTRING 18513481Sgiacomo.travaglini@arm.com 18613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_WSTRING 18713481Sgiacomo.travaglini@arm.com // Converts the given wide string to a narrow string using the UTF-8 18813481Sgiacomo.travaglini@arm.com // encoding, and streams the result to this Message object. 18913481Sgiacomo.travaglini@arm.com Message& operator <<(const ::wstring& wstr); 19013481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_GLOBAL_WSTRING 19113481Sgiacomo.travaglini@arm.com 19213481Sgiacomo.travaglini@arm.com // Gets the text streamed to this object so far as an std::string. 19313481Sgiacomo.travaglini@arm.com // Each '\0' character in the buffer is replaced with "\\0". 19413481Sgiacomo.travaglini@arm.com // 19513481Sgiacomo.travaglini@arm.com // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. 19613481Sgiacomo.travaglini@arm.com std::string GetString() const; 19713481Sgiacomo.travaglini@arm.com 19813481Sgiacomo.travaglini@arm.com private: 19913481Sgiacomo.travaglini@arm.com 20013481Sgiacomo.travaglini@arm.com#if GTEST_OS_SYMBIAN 20113481Sgiacomo.travaglini@arm.com // These are needed as the Nokia Symbian Compiler cannot decide between 20213481Sgiacomo.travaglini@arm.com // const T& and const T* in a function template. The Nokia compiler _can_ 20313481Sgiacomo.travaglini@arm.com // decide between class template specializations for T and T*, so a 20413481Sgiacomo.travaglini@arm.com // tr1::type_traits-like is_pointer works, and we can overload on that. 20513481Sgiacomo.travaglini@arm.com template <typename T> 20613481Sgiacomo.travaglini@arm.com inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) { 20713481Sgiacomo.travaglini@arm.com if (pointer == NULL) { 20813481Sgiacomo.travaglini@arm.com *ss_ << "(null)"; 20913481Sgiacomo.travaglini@arm.com } else { 21013481Sgiacomo.travaglini@arm.com *ss_ << pointer; 21113481Sgiacomo.travaglini@arm.com } 21213481Sgiacomo.travaglini@arm.com } 21313481Sgiacomo.travaglini@arm.com template <typename T> 21413481Sgiacomo.travaglini@arm.com inline void StreamHelper(internal::false_type /*is_pointer*/, 21513481Sgiacomo.travaglini@arm.com const T& value) { 21613481Sgiacomo.travaglini@arm.com // See the comments in Message& operator <<(const T&) above for why 21713481Sgiacomo.travaglini@arm.com // we need this using statement. 21813481Sgiacomo.travaglini@arm.com using ::operator <<; 21913481Sgiacomo.travaglini@arm.com *ss_ << value; 22013481Sgiacomo.travaglini@arm.com } 22113481Sgiacomo.travaglini@arm.com#endif // GTEST_OS_SYMBIAN 22213481Sgiacomo.travaglini@arm.com 22313481Sgiacomo.travaglini@arm.com // We'll hold the text streamed to this object here. 22413481Sgiacomo.travaglini@arm.com const internal::scoped_ptr< ::std::stringstream> ss_; 22513481Sgiacomo.travaglini@arm.com 22613481Sgiacomo.travaglini@arm.com // We declare (but don't implement) this to prevent the compiler 22713481Sgiacomo.travaglini@arm.com // from implementing the assignment operator. 22813481Sgiacomo.travaglini@arm.com void operator=(const Message&); 22913481Sgiacomo.travaglini@arm.com}; 23013481Sgiacomo.travaglini@arm.com 23113481Sgiacomo.travaglini@arm.com// Streams a Message to an ostream. 23213481Sgiacomo.travaglini@arm.cominline std::ostream& operator <<(std::ostream& os, const Message& sb) { 23313481Sgiacomo.travaglini@arm.com return os << sb.GetString(); 23413481Sgiacomo.travaglini@arm.com} 23513481Sgiacomo.travaglini@arm.com 23613481Sgiacomo.travaglini@arm.comnamespace internal { 23713481Sgiacomo.travaglini@arm.com 23813481Sgiacomo.travaglini@arm.com// Converts a streamable value to an std::string. A NULL pointer is 23913481Sgiacomo.travaglini@arm.com// converted to "(null)". When the input value is a ::string, 24013481Sgiacomo.travaglini@arm.com// ::std::string, ::wstring, or ::std::wstring object, each NUL 24113481Sgiacomo.travaglini@arm.com// character in it is replaced with "\\0". 24213481Sgiacomo.travaglini@arm.comtemplate <typename T> 24313481Sgiacomo.travaglini@arm.comstd::string StreamableToString(const T& streamable) { 24413481Sgiacomo.travaglini@arm.com return (Message() << streamable).GetString(); 24513481Sgiacomo.travaglini@arm.com} 24613481Sgiacomo.travaglini@arm.com 24713481Sgiacomo.travaglini@arm.com} // namespace internal 24813481Sgiacomo.travaglini@arm.com} // namespace testing 24913481Sgiacomo.travaglini@arm.com 25013481Sgiacomo.travaglini@arm.com#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ 251