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