1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2005, Google Inc. 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: wan@google.com (Zhanyong Wan) 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests for the Message class. 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest-message.h> 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::testing::Message; 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing ::testing::internal::StrStream; 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A helper function that turns a Message into a C string. 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char* ToCString(const Message& msg) { 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static testing::internal::String result; 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result = msg.GetString(); 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result.c_str(); 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests the testing::Message class 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests the default constructor. 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, DefaultConstructor) { 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message msg; 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("", ToCString(msg)); 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests the copy constructor. 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, CopyConstructor) { 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message msg1("Hello"); 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message msg2(msg1); 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("Hello", ToCString(msg2)); 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests constructing a Message from a C-string. 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, ConstructsFromCString) { 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message msg("Hello"); 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("Hello", ToCString(msg)); 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming a non-char pointer. 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsPointer) { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int n = 0; 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int* p = &n; 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STRNE("(null)", ToCString(Message() << p)); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming a NULL non-char pointer. 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsNullPointer) { 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int* p = NULL; 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("(null)", ToCString(Message() << p)); 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming a C string. 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsCString) { 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("Foo", ToCString(Message() << "Foo")); 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming a NULL C string. 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsNullCString) { 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville char* p = NULL; 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("(null)", ToCString(Message() << p)); 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if GTEST_HAS_STD_STRING 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming std::string. 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// As std::string has problem in MSVC when exception is disabled, we only 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// test this where std::string can be used. 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsString) { 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::std::string str("Hello"); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("Hello", ToCString(Message() << str)); 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that we can output strings containing embedded NULs. 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsStringWithEmbeddedNUL) { 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char char_array_with_nul[] = 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Here's a NUL\0 and some more string"; 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::std::string string_with_nul(char_array_with_nul, 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sizeof(char_array_with_nul) - 1); 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("Here's a NUL\\0 and some more string", 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ToCString(Message() << string_with_nul)); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GTEST_HAS_STD_STRING 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming a NUL char. 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsNULChar) { 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("\\0", ToCString(Message() << '\0')); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming int. 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsInt) { 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("123", ToCString(Message() << 123)); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that basic IO manipulators (endl, ends, and flush) can be 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// streamed to Message. 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsBasicIoManip) { 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("Line 1.\nA NUL char \\0 in line 2.", 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ToCString(Message() << "Line 1." << std::endl 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "A NUL char " << std::ends << std::flush 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << " in line 2.")); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests Message::GetString() 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, GetString) { 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message msg; 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville msg << 1 << " lamb"; 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("1 lamb", msg.GetString().c_str()); 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests streaming a Message object to an ostream. 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, StreamsToOStream) { 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message msg("Hello"); 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville StrStream ss; 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ss << msg; 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_STREQ("Hello", testing::internal::StrStreamToString(&ss).c_str()); 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests that a Message object doesn't take up too much stack space. 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(MessageTest, DoesNotTakeUpMuchStackSpace) { 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_LE(sizeof(Message), 16U); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 158