14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2005, Google Inc.
24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// All rights reserved.
34b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
44b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Redistribution and use in source and binary forms, with or without
54b6829f0d28990dd645e16386eb226d0f10c8731shiqian// modification, are permitted provided that the following conditions are
64b6829f0d28990dd645e16386eb226d0f10c8731shiqian// met:
74b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
84b6829f0d28990dd645e16386eb226d0f10c8731shiqian//     * Redistributions of source code must retain the above copyright
94b6829f0d28990dd645e16386eb226d0f10c8731shiqian// notice, this list of conditions and the following disclaimer.
104b6829f0d28990dd645e16386eb226d0f10c8731shiqian//     * Redistributions in binary form must reproduce the above
114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// copyright notice, this list of conditions and the following disclaimer
124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the documentation and/or other materials provided with the
134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// distribution.
144b6829f0d28990dd645e16386eb226d0f10c8731shiqian//     * Neither the name of Google Inc. nor the names of its
154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// contributors may be used to endorse or promote products derived from
164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this software without specific prior written permission.
174b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
294b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Author: wan@google.com (Zhanyong Wan)
314b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests for Google Test itself.  This verifies that the basic constructs of
334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test work.
344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
352620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest.h"
360ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan
370ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan// Verifies that the command line flag variables can be accessed
380ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan// in code once <gtest/gtest.h> has been #included.
390ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan// Do not move it after other #includes.
400ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wanTEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
410ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests)
420ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(break_on_failure)
430ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(catch_exceptions)
440ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(color) != "unknown"
450ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(filter) != "unknown"
460ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(list_tests)
470ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(output) != "unknown"
480ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(print_time)
499b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan      || testing::GTEST_FLAG(random_seed)
500ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(repeat) > 0
510ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan      || testing::GTEST_FLAG(show_internal_stack_frames)
529b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan      || testing::GTEST_FLAG(shuffle)
53b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan      || testing::GTEST_FLAG(stack_trace_depth) > 0
54c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan      || testing::GTEST_FLAG(stream_result_to) != "unknown"
55b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan      || testing::GTEST_FLAG(throw_on_failure);
560ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan  EXPECT_TRUE(dummy || !dummy);  // Suppresses warning that dummy is unused.
570ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan}
580ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan
5993fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev#include <limits.h>  // For INT_MAX.
6093fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev#include <stdlib.h>
6193fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev#include <string.h>
6293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev#include <time.h>
6393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev
6493fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev#include <map>
6593fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev#include <vector>
6693fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev#include <ostream>
6793fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev
682620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest-spi.h"
694b6829f0d28990dd645e16386eb226d0f10c8731shiqian
704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Indicates that this translation unit is part of Google Test's
714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// implementation.  It must come before gtest-internal-inl.h is
724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// included, or there will be a compiler error.  This trick is to
734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// prevent a user from accidentally including gtest-internal-inl.h in
744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// his code.
754cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#define GTEST_IMPLEMENTATION_ 1
764b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "src/gtest-internal-inl.h"
774cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#undef GTEST_IMPLEMENTATION_
784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
794b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing {
804b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal {
81b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan
82a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com#if GTEST_CAN_STREAM_RESULTS_
83a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
84a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comclass StreamingListenerTest : public Test {
85a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com public:
86a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  class FakeSocketWriter : public StreamingListener::AbstractSocketWriter {
87a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com   public:
88a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com    // Sends a string to the socket.
89a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com    virtual void Send(const string& message) { output_ += message; }
90a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
91a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com    string output_;
92a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  };
93a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
94a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  StreamingListenerTest()
95a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com      : fake_sock_writer_(new FakeSocketWriter),
96a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com        streamer_(fake_sock_writer_),
97a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com        test_info_obj_("FooTest", "Bar", NULL, NULL, 0, NULL) {}
98a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
99a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com protected:
100a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  string* output() { return &(fake_sock_writer_->output_); }
101a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
102a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  FakeSocketWriter* const fake_sock_writer_;
103a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  StreamingListener streamer_;
104a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  UnitTest unit_test_;
105a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  TestInfo test_info_obj_;  // The name test_info_ was taken by testing::Test.
106a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com};
107a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
108a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comTEST_F(StreamingListenerTest, OnTestProgramEnd) {
109a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  *output() = "";
110a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  streamer_.OnTestProgramEnd(unit_test_);
111a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  EXPECT_EQ("event=TestProgramEnd&passed=1\n", *output());
112a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com}
113a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
114a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comTEST_F(StreamingListenerTest, OnTestIterationEnd) {
115a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  *output() = "";
116a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  streamer_.OnTestIterationEnd(unit_test_, 42);
117a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  EXPECT_EQ("event=TestIterationEnd&passed=1&elapsed_time=0ms\n", *output());
118a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com}
119a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
120a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comTEST_F(StreamingListenerTest, OnTestCaseStart) {
121a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  *output() = "";
122a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  streamer_.OnTestCaseStart(TestCase("FooTest", "Bar", NULL, NULL));
123a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  EXPECT_EQ("event=TestCaseStart&name=FooTest\n", *output());
124a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com}
125a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
126a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comTEST_F(StreamingListenerTest, OnTestCaseEnd) {
127a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  *output() = "";
128a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  streamer_.OnTestCaseEnd(TestCase("FooTest", "Bar", NULL, NULL));
129a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  EXPECT_EQ("event=TestCaseEnd&passed=1&elapsed_time=0ms\n", *output());
130a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com}
131a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
132a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comTEST_F(StreamingListenerTest, OnTestStart) {
133a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  *output() = "";
134a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  streamer_.OnTestStart(test_info_obj_);
135a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  EXPECT_EQ("event=TestStart&name=Bar\n", *output());
136a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com}
137a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
138a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comTEST_F(StreamingListenerTest, OnTestEnd) {
139a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  *output() = "";
140a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  streamer_.OnTestEnd(test_info_obj_);
141a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  EXPECT_EQ("event=TestEnd&passed=1&elapsed_time=0ms\n", *output());
142a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com}
143a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
144a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comTEST_F(StreamingListenerTest, OnTestPartResult) {
145a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  *output() = "";
146a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  streamer_.OnTestPartResult(TestPartResult(
147a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com      TestPartResult::kFatalFailure, "foo.cc", 42, "failed=\n&%"));
148a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
149a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  // Meta characters in the failure message should be properly escaped.
150a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com  EXPECT_EQ(
151a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com      "event=TestPartResult&file=foo.cc&line=42&message=failed%3D%0A%26%25\n",
152a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com      *output());
153a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com}
154a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
155a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com#endif  // GTEST_CAN_STREAM_RESULTS_
156a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.com
157f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Provides access to otherwise private parts of the TestEventListeners class
158f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// that are needed to test it.
159f6d087b78d230d875bf5d8281112662795044680zhanyong.wanclass TestEventListenersAccessor {
160f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan public:
161f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  static TestEventListener* GetRepeater(TestEventListeners* listeners) {
162fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan    return listeners->repeater();
163fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan  }
164f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
165f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  static void SetDefaultResultPrinter(TestEventListeners* listeners,
166fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan                                      TestEventListener* listener) {
167f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    listeners->SetDefaultResultPrinter(listener);
168f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
169f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  static void SetDefaultXmlGenerator(TestEventListeners* listeners,
170fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan                                     TestEventListener* listener) {
171f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    listeners->SetDefaultXmlGenerator(listener);
172f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
173f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
174f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  static bool EventForwardingEnabled(const TestEventListeners& listeners) {
175f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    return listeners.EventForwardingEnabled();
176f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
177f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
178f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  static void SuppressEventForwarding(TestEventListeners* listeners) {
179f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    listeners->SuppressEventForwarding();
180f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
181f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan};
182f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
183dfbdf0bab51520595679a99710983daba6fc18ebvladlosevclass UnitTestRecordPropertyTestHelper : public Test {
184dfbdf0bab51520595679a99710983daba6fc18ebvladlosev protected:
185dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordPropertyTestHelper() {}
186dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
187dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  // Forwards to UnitTest::RecordProperty() to bypass access controls.
188dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  void UnitTestRecordProperty(const char* key, const std::string& value) {
189dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    unit_test_.RecordProperty(key, value);
190dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  }
191dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
192dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTest unit_test_;
193dfbdf0bab51520595679a99710983daba6fc18ebvladlosev};
194dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1954b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace internal
1964b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace testing
1974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
198760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::AssertionFailure;
199760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::AssertionResult;
200760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::AssertionSuccess;
201760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::DoubleLE;
202fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanusing testing::EmptyTestEventListener;
203dfbdf0bab51520595679a99710983daba6fc18ebvladlosevusing testing::Environment;
204760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::FloatLE;
205ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqianusing testing::GTEST_FLAG(also_run_disabled_tests);
206760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(break_on_failure);
207760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(catch_exceptions);
2084b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::GTEST_FLAG(color);
2091cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanusing testing::GTEST_FLAG(death_test_use_fork);
210760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(filter);
211760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(list_tests);
212760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(output);
213760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(print_time);
2149b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanusing testing::GTEST_FLAG(random_seed);
215760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(repeat);
216760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(show_internal_stack_frames);
2179b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanusing testing::GTEST_FLAG(shuffle);
218760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::GTEST_FLAG(stack_trace_depth);
219c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wanusing testing::GTEST_FLAG(stream_result_to);
220b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wanusing testing::GTEST_FLAG(throw_on_failure);
221760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::IsNotSubstring;
222760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::IsSubstring;
223760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::Message;
2244b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::ScopedFakeTestPartResultReporter;
22521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianusing testing::StaticAssertTypeEq;
2261cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanusing testing::Test;
227fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanusing testing::TestCase;
228678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::TestEventListeners;
229dfbdf0bab51520595679a99710983daba6fc18ebvladlosevusing testing::TestInfo;
2301cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanusing testing::TestPartResult;
2311cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanusing testing::TestPartResultArray;
232fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanusing testing::TestProperty;
233fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanusing testing::TestResult;
2348883b42f2a78976dde09f31ca72806072e33bd5fvladlosevusing testing::TimeInMillis;
2354b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::UnitTest;
236678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::AddReference;
237f6d087b78d230d875bf5d8281112662795044680zhanyong.wanusing testing::internal::AlwaysFalse;
238f6d087b78d230d875bf5d8281112662795044680zhanyong.wanusing testing::internal::AlwaysTrue;
2394b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::AppendUserMessage;
240678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::ArrayAwareFind;
241678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::ArrayEq;
242e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevusing testing::internal::CodePointToUtf8;
243678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::CompileAssertTypesEqual;
244678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::CopyArray;
24593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing testing::internal::CountIf;
2464b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::EqFailure;
247760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::internal::FloatingPoint;
24893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing testing::internal::ForEach;
2498883b42f2a78976dde09f31ca72806072e33bd5fvladlosevusing testing::internal::FormatEpochTimeInMillisAsIso8601;
250678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::FormatTimeInMillisAsSeconds;
2511cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanusing testing::internal::GTestFlagSaver;
252f904a612d9444ab36c07a8e619c113432e046f49vladlosevusing testing::internal::GetCurrentOsStackTraceExceptTop;
25393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing testing::internal::GetElementOr;
2549b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanusing testing::internal::GetNextRandomSeed;
2559b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanusing testing::internal::GetRandomSeedFromFlag;
256fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianusing testing::internal::GetTestTypeId;
2578883b42f2a78976dde09f31ca72806072e33bd5fvladlosevusing testing::internal::GetTimeInMillis;
258fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianusing testing::internal::GetTypeId;
259a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wanusing testing::internal::GetUnitTestImpl;
260678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::ImplicitlyConvertible;
2614b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::Int32;
262905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanusing testing::internal::Int32FromEnvOrDie;
263678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::IsAProtocolMessage;
264678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::IsContainer;
265678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::IsContainerTest;
266678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::IsNotContainer;
267678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::NativeArray;
268f6d087b78d230d875bf5d8281112662795044680zhanyong.wanusing testing::internal::ParseInt32Flag;
269f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comusing testing::internal::RelationToSourceCopy;
270f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comusing testing::internal::RelationToSourceReference;
271678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::RemoveConst;
272678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanusing testing::internal::RemoveReference;
273905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanusing testing::internal::ShouldRunTestOnShard;
274905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanusing testing::internal::ShouldShard;
2754b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::ShouldUseColor;
27693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing testing::internal::Shuffle;
27793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing testing::internal::ShuffleRange;
2789748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wanusing testing::internal::SkipPrefix;
2794b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::StreamableToString;
2804b6829f0d28990dd645e16386eb226d0f10c8731shiqianusing testing::internal::String;
281f6d087b78d230d875bf5d8281112662795044680zhanyong.wanusing testing::internal::TestEventListenersAccessor;
282b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wanusing testing::internal::TestResultAccessor;
28385f555add7acc03149b76db239a4cdd18433a558zhanyong.wanusing testing::internal::UInt32;
284e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevusing testing::internal::WideStringToUtf8;
285d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comusing testing::internal::edit_distance::CalculateOptimalEdits;
286d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comusing testing::internal::edit_distance::CreateUnifiedDiff;
287d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comusing testing::internal::edit_distance::EditType;
288fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanusing testing::internal::kMaxRandomSeed;
2891cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanusing testing::internal::kTestTypeIdInGoogleTest;
290f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanusing testing::internal::scoped_ptr;
291f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comusing testing::kMaxStackTraceDepth;
2924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2935d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_STREAM_REDIRECTION
294cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wanusing testing::internal::CaptureStdout;
295cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wanusing testing::internal::GetCapturedStdout;
2965d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#endif
297cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan
298f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#if GTEST_IS_THREADSAFE
299f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wanusing testing::internal::ThreadWithParam;
300f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#endif
301f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan
30293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanclass TestingVector : public std::vector<int> {
303f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan};
304f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
305f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan::std::ostream& operator<<(::std::ostream& os,
306f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan                           const TestingVector& vector) {
307f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  os << "{ ";
30893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  for (size_t i = 0; i < vector.size(); i++) {
30993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    os << vector[i] << " ";
310f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
311f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  os << "}";
312f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  return os;
313f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
314f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
3154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This line tests that we can define tests in an unnamed namespace.
3164b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace {
3174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3189b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST(GetRandomSeedFromFlagTest, HandlesZero) {
3199b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const int seed = GetRandomSeedFromFlag(0);
3209b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_LE(1, seed);
3219b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed));
3229b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
3239b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
3249b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST(GetRandomSeedFromFlagTest, PreservesValidSeed) {
3259b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(1, GetRandomSeedFromFlag(1));
3269b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(2, GetRandomSeedFromFlag(2));
3279b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1));
3289b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
3299b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan            GetRandomSeedFromFlag(kMaxRandomSeed));
3309b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
3319b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
3329b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) {
3339b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const int seed1 = GetRandomSeedFromFlag(-1);
3349b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_LE(1, seed1);
3359b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed));
3369b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
3379b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1);
3389b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_LE(1, seed2);
3399b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed));
3409b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
3419b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
3429b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST(GetNextRandomSeedTest, WorksForValidInput) {
3439b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(2, GetNextRandomSeed(1));
3449b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(3, GetNextRandomSeed(2));
3459b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
3469b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan            GetNextRandomSeed(kMaxRandomSeed - 1));
3479b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed));
3489b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
3499b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // We deliberately don't test GetNextRandomSeed() with invalid
3509b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // inputs, as that requires death tests, which are expensive.  This
3519b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // is fine as GetNextRandomSeed() is internal and has a
3529b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // straightforward definition.
3539b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
3549b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
355b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wanstatic void ClearCurrentTestPartResults() {
356b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  TestResultAccessor::ClearTestPartResults(
357b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan      GetUnitTestImpl()->current_test_result());
358b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan}
359b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan
360fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// Tests GetTypeId.
361fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian
362fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianTEST(GetTypeIdTest, ReturnsSameValueForSameType) {
363fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_EQ(GetTypeId<int>(), GetTypeId<int>());
364fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_EQ(GetTypeId<Test>(), GetTypeId<Test>());
365fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian}
366fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian
367fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianclass SubClassOfTest : public Test {};
368fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianclass AnotherSubClassOfTest : public Test {};
369fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian
370fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianTEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) {
371fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_NE(GetTypeId<int>(), GetTypeId<const int>());
372fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_NE(GetTypeId<int>(), GetTypeId<char>());
373fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_NE(GetTypeId<int>(), GetTestTypeId());
374fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_NE(GetTypeId<SubClassOfTest>(), GetTestTypeId());
375fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTestTypeId());
376fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTypeId<SubClassOfTest>());
377fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian}
378fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian
379fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// Verifies that GetTestTypeId() returns the same value, no matter it
380fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// is called from inside Google Test or outside of it.
381fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianTEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) {
382fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian  EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId());
383fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian}
384fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian
385f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian// Tests FormatTimeInMillisAsSeconds().
386f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian
387f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqianTEST(FormatTimeInMillisAsSecondsTest, FormatsZero) {
38865de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("0", FormatTimeInMillisAsSeconds(0));
389f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian}
390f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian
391f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqianTEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) {
39265de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("0.003", FormatTimeInMillisAsSeconds(3));
39365de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("0.01", FormatTimeInMillisAsSeconds(10));
39465de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("0.2", FormatTimeInMillisAsSeconds(200));
39565de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("1.2", FormatTimeInMillisAsSeconds(1200));
39665de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("3", FormatTimeInMillisAsSeconds(3000));
397f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian}
398f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian
399f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqianTEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) {
40065de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("-0.003", FormatTimeInMillisAsSeconds(-3));
40165de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("-0.01", FormatTimeInMillisAsSeconds(-10));
40265de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("-0.2", FormatTimeInMillisAsSeconds(-200));
40365de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("-1.2", FormatTimeInMillisAsSeconds(-1200));
40465de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000));
405f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian}
406f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian
4078883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// Tests FormatEpochTimeInMillisAsIso8601().  The correctness of conversion
4088883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// for particular dates below was verified in Python using
4098883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// datetime.datetime.fromutctimestamp(<timetamp>/1000).
4108883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4118883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// FormatEpochTimeInMillisAsIso8601 depends on the current timezone, so we
4128883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// have to set up a particular timezone to obtain predictable results.
4138883b42f2a78976dde09f31ca72806072e33bd5fvladlosevclass FormatEpochTimeInMillisAsIso8601Test : public Test {
4148883b42f2a78976dde09f31ca72806072e33bd5fvladlosev public:
4158883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  // On Cygwin, GCC doesn't allow unqualified integer literals to exceed
4168883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  // 32 bits, even when 64-bit integer types are available.  We have to
4178883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  // force the constants to have a 64-bit type here.
4188883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  static const TimeInMillis kMillisPerSec = 1000;
4198883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4208883b42f2a78976dde09f31ca72806072e33bd5fvladlosev private:
4218883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  virtual void SetUp() {
4228883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    saved_tz_ = NULL;
423f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com
424f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* getenv, strdup: deprecated */)
4258883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    if (getenv("TZ"))
4268883b42f2a78976dde09f31ca72806072e33bd5fvladlosev      saved_tz_ = strdup(getenv("TZ"));
427f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com    GTEST_DISABLE_MSC_WARNINGS_POP_()
4288883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4298883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // Set up the time zone for FormatEpochTimeInMillisAsIso8601 to use.  We
4308883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // cannot use the local time zone because the function's output depends
4318883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // on the time zone.
4328883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    SetTimeZone("UTC+00");
4338883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  }
4348883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4358883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  virtual void TearDown() {
4368883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    SetTimeZone(saved_tz_);
4378883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    free(const_cast<char*>(saved_tz_));
4388883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    saved_tz_ = NULL;
4398883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  }
4408883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4418883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  static void SetTimeZone(const char* time_zone) {
4428883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // tzset() distinguishes between the TZ variable being present and empty
4438883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // and not being present, so we have to consider the case of time_zone
4448883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // being NULL.
4458883b42f2a78976dde09f31ca72806072e33bd5fvladlosev#if _MSC_VER
4468883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // ...Unless it's MSVC, whose standard library's _putenv doesn't
4478883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    // distinguish between an empty and a missing variable.
4488883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    const std::string env_var =
4498883b42f2a78976dde09f31ca72806072e33bd5fvladlosev        std::string("TZ=") + (time_zone ? time_zone : "");
4508883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    _putenv(env_var.c_str());
451f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com    GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* deprecated function */)
4528883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    tzset();
453f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com    GTEST_DISABLE_MSC_WARNINGS_POP_()
4548883b42f2a78976dde09f31ca72806072e33bd5fvladlosev#else
4558883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    if (time_zone) {
4568883b42f2a78976dde09f31ca72806072e33bd5fvladlosev      setenv(("TZ"), time_zone, 1);
4578883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    } else {
4588883b42f2a78976dde09f31ca72806072e33bd5fvladlosev      unsetenv("TZ");
4598883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    }
4608883b42f2a78976dde09f31ca72806072e33bd5fvladlosev    tzset();
4618883b42f2a78976dde09f31ca72806072e33bd5fvladlosev#endif
4628883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  }
4638883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4648883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  const char* saved_tz_;
4658883b42f2a78976dde09f31ca72806072e33bd5fvladlosev};
4668883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4678883b42f2a78976dde09f31ca72806072e33bd5fvladlosevconst TimeInMillis FormatEpochTimeInMillisAsIso8601Test::kMillisPerSec;
4688883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4698883b42f2a78976dde09f31ca72806072e33bd5fvladlosevTEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsTwoDigitSegments) {
4708883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  EXPECT_EQ("2011-10-31T18:52:42",
4718883b42f2a78976dde09f31ca72806072e33bd5fvladlosev            FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec));
4728883b42f2a78976dde09f31ca72806072e33bd5fvladlosev}
4738883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4748883b42f2a78976dde09f31ca72806072e33bd5fvladlosevTEST_F(FormatEpochTimeInMillisAsIso8601Test, MillisecondsDoNotAffectResult) {
4758883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  EXPECT_EQ(
4768883b42f2a78976dde09f31ca72806072e33bd5fvladlosev      "2011-10-31T18:52:42",
4778883b42f2a78976dde09f31ca72806072e33bd5fvladlosev      FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec + 234));
4788883b42f2a78976dde09f31ca72806072e33bd5fvladlosev}
4798883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4808883b42f2a78976dde09f31ca72806072e33bd5fvladlosevTEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsLeadingZeroes) {
4818883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  EXPECT_EQ("2011-09-03T05:07:02",
4828883b42f2a78976dde09f31ca72806072e33bd5fvladlosev            FormatEpochTimeInMillisAsIso8601(1315026422 * kMillisPerSec));
4838883b42f2a78976dde09f31ca72806072e33bd5fvladlosev}
4848883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4858883b42f2a78976dde09f31ca72806072e33bd5fvladlosevTEST_F(FormatEpochTimeInMillisAsIso8601Test, Prints24HourTime) {
4868883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  EXPECT_EQ("2011-09-28T17:08:22",
4878883b42f2a78976dde09f31ca72806072e33bd5fvladlosev            FormatEpochTimeInMillisAsIso8601(1317229702 * kMillisPerSec));
4888883b42f2a78976dde09f31ca72806072e33bd5fvladlosev}
4898883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4908883b42f2a78976dde09f31ca72806072e33bd5fvladlosevTEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsEpochStart) {
4918883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  EXPECT_EQ("1970-01-01T00:00:00", FormatEpochTimeInMillisAsIso8601(0));
4928883b42f2a78976dde09f31ca72806072e33bd5fvladlosev}
4938883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
4945147b45584b1a782f016a59fdd251ce3810dc1c4vladlosev#if GTEST_CAN_COMPARE_NULL
4954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
496733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifdef __BORLANDC__
49798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Silences warnings: "Condition is always true", "Unreachable code"
498733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan#  pragma option push -w-ccc -w-rch
499733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif
50098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
501e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null
5024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// pointer literal.
5034b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(NullLiteralTest, IsTrueForNullLiterals) {
504e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL));
505e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0));
506e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U));
507e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L));
5084b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5094b6829f0d28990dd645e16386eb226d0f10c8731shiqian
510e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null
5114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// pointer literal.
5124b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(NullLiteralTest, IsFalseForNonNullLiterals) {
513e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1));
514e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0));
515e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a'));
516e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast<void*>(NULL)));
5174b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
519733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifdef __BORLANDC__
520d6b4941ba371a4de8b8ea6b69bf50741cbe97292vladlosev// Restores warnings after previous "#pragma option push" suppressed them.
521733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan#  pragma option pop
522733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif
52398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
5245147b45584b1a782f016a59fdd251ce3810dc1c4vladlosev#endif  // GTEST_CAN_COMPARE_NULL
525e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev//
526e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests CodePointToUtf8().
5274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the NUL character L'\0' is encoded correctly.
529e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(CodePointToUtf8Test, CanEncodeNul) {
5303b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("", CodePointToUtf8(L'\0'));
5314b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ASCII characters are encoded correctly.
534e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(CodePointToUtf8Test, CanEncodeAscii) {
5353b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("a", CodePointToUtf8(L'a'));
5363b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("Z", CodePointToUtf8(L'Z'));
5373b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("&", CodePointToUtf8(L'&'));
5383b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\x7F", CodePointToUtf8(L'\x7F'));
5394b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Unicode code-points that have 8 to 11 bits are encoded
5424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// as 110xxxxx 10xxxxxx.
543e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(CodePointToUtf8Test, CanEncode8To11Bits) {
5444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // 000 1101 0011 => 110-00011 10-010011
5453b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\xC3\x93", CodePointToUtf8(L'\xD3'));
5464b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // 101 0111 0110 => 110-10101 10-110110
548b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  // Some compilers (e.g., GCC on MinGW) cannot handle non-ASCII codepoints
549b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  // in wide strings and wide chars. In order to accomodate them, we have to
550b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  // introduce such character constants as integers.
5513b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\xD5\xB6",
5523b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com            CodePointToUtf8(static_cast<wchar_t>(0x576)));
5534b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Unicode code-points that have 12 to 16 bits are encoded
5564b6829f0d28990dd645e16386eb226d0f10c8731shiqian// as 1110xxxx 10xxxxxx 10xxxxxx.
557e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(CodePointToUtf8Test, CanEncode12To16Bits) {
5584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
5593b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\xE0\xA3\x93",
5603b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com            CodePointToUtf8(static_cast<wchar_t>(0x8D3)));
5614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
5633b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\xEC\x9D\x8D",
5643b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com            CodePointToUtf8(static_cast<wchar_t>(0xC74D)));
5654b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5664b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5674cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_WIDE_STRING_USES_UTF16_
5684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests in this group require a wchar_t to hold > 16 bits, and thus
5694f1d72ed86ade239a3a03b4cb4482012daab0bffshiqian// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is
570e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// 16-bit wide. This code may not compile on those systems.
5714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Unicode code-points that have 17 to 21 bits are encoded
5734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
574e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(CodePointToUtf8Test, CanEncode17To21Bits) {
5754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
5763b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\xF0\x90\xA3\x93", CodePointToUtf8(L'\x108D3'));
577e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
578e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000
5793b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\xF0\x90\x90\x80", CodePointToUtf8(L'\x10400'));
5804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
581e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
5823b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("\xF4\x88\x98\xB4", CodePointToUtf8(L'\x108634'));
5834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
5844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that encoding an invalid code-point generates the expected result.
586e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) {
5873b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com  EXPECT_EQ("(Invalid Unicode 0x1234ABCD)", CodePointToUtf8(L'\x1234ABCD'));
588e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
589e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
5904cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_WIDE_STRING_USES_UTF16_
591e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
592e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests WideStringToUtf8().
593e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
594e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that the NUL character L'\0' is encoded correctly.
595e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncodeNul) {
596e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("", WideStringToUtf8(L"", 0).c_str());
597e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("", WideStringToUtf8(L"", -1).c_str());
598e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
599e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
600e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that ASCII strings are encoded correctly.
601e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncodeAscii) {
602e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("a", WideStringToUtf8(L"a", 1).c_str());
603e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", 2).c_str());
604e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("a", WideStringToUtf8(L"a", -1).c_str());
605e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", -1).c_str());
606e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
607e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
608e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that Unicode code-points that have 8 to 11 bits are encoded
609e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// as 110xxxxx 10xxxxxx.
610e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncode8To11Bits) {
611e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 000 1101 0011 => 110-00011 10-010011
612e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", 1).c_str());
613e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", -1).c_str());
614e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
615e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 101 0111 0110 => 110-10101 10-110110
616b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s[] = { 0x576, '\0' };
617b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, 1).c_str());
618b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, -1).c_str());
619e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
620e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
621e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that Unicode code-points that have 12 to 16 bits are encoded
622e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// as 1110xxxx 10xxxxxx 10xxxxxx.
623e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncode12To16Bits) {
624e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
625b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s1[] = { 0x8D3, '\0' };
626b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, 1).c_str());
627b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, -1).c_str());
628e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
629e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
630b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s2[] = { 0xC74D, '\0' };
631b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, 1).c_str());
632b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, -1).c_str());
6334b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
6344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
635e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that the conversion stops when the function encounters \0 character.
636e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, StopsOnNulCharacter) {
637e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABC\0XYZ", 100).c_str());
638e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
639e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
640e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that the conversion stops when the function reaches the limit
641e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// specified by the 'length' parameter.
642e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) {
643e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABCDEF", 3).c_str());
644e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
645e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
6464cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_WIDE_STRING_USES_UTF16_
647e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that Unicode code-points that have 17 to 21 bits are encoded
648e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile
649e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// on the systems using UTF-16 encoding.
650e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncode17To21Bits) {
651e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
652e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", 1).c_str());
653e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", -1).c_str());
654e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
655e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
656e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", 1).c_str());
657e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", -1).c_str());
658e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
659e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
660e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that encoding an invalid code-point generates the expected result.
661e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) {
662e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ("(Invalid Unicode 0xABCDFF)",
663e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev               WideStringToUtf8(L"\xABCDFF", -1).c_str());
664e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
6654cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#else  // !GTEST_WIDE_STRING_USES_UTF16_
666e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that surrogate pairs are encoded correctly on the systems using
667e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// UTF-16 encoding in the wide strings.
668e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) {
669b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s[] = { 0xD801, 0xDC00, '\0' };
670b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xF0\x90\x90\x80", WideStringToUtf8(s, -1).c_str());
671e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
672e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
673e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that encoding an invalid UTF-16 surrogate pair
674e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// generates the expected result.
675e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) {
676e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // Leading surrogate is at the end of the string.
677b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s1[] = { 0xD800, '\0' };
678b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xED\xA0\x80", WideStringToUtf8(s1, -1).c_str());
679e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // Leading surrogate is not followed by the trailing surrogate.
680b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s2[] = { 0xD800, 'M', '\0' };
681b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xED\xA0\x80M", WideStringToUtf8(s2, -1).c_str());
682e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  // Trailing surrogate appearas without a leading surrogate.
683b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s3[] = { 0xDC00, 'P', 'Q', 'R', '\0' };
684b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_STREQ("\xED\xB0\x80PQR", WideStringToUtf8(s3, -1).c_str());
685e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
6864cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_WIDE_STRING_USES_UTF16_
687e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev
688e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Tests that codepoint concatenation works correctly.
6894cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_WIDE_STRING_USES_UTF16_
690e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
691b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s[] = { 0x108634, 0xC74D, '\n', 0x576, 0x8D3, 0x108634, '\0'};
692e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ(
693e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev      "\xF4\x88\x98\xB4"
694e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev          "\xEC\x9D\x8D"
695e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev          "\n"
696e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev          "\xD5\xB6"
697e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev          "\xE0\xA3\x93"
698e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev          "\xF4\x88\x98\xB4",
699b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan      WideStringToUtf8(s, -1).c_str());
700e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
701e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev#else
702e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevTEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
703b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t s[] = { 0xC74D, '\n', 0x576, 0x8D3, '\0'};
704e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev  EXPECT_STREQ(
705e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev      "\xEC\x9D\x8D" "\n" "\xD5\xB6" "\xE0\xA3\x93",
706b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan      WideStringToUtf8(s, -1).c_str());
707e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev}
7084cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_WIDE_STRING_USES_UTF16_
7094b6829f0d28990dd645e16386eb226d0f10c8731shiqian
71085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// Tests the Random class.
71185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan
71285f555add7acc03149b76db239a4cdd18433a558zhanyong.wanTEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) {
71385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  testing::internal::Random random(42);
71485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
71585f555add7acc03149b76db239a4cdd18433a558zhanyong.wan      random.Generate(0),
71685f555add7acc03149b76db239a4cdd18433a558zhanyong.wan      "Cannot generate a number in the range \\[0, 0\\)");
71785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
71885f555add7acc03149b76db239a4cdd18433a558zhanyong.wan      random.Generate(testing::internal::Random::kMaxRange + 1),
71985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan      "Generation of a number in \\[0, 2147483649\\) was requested, "
72085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan      "but this can only generate numbers in \\[0, 2147483648\\)");
72185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan}
72285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan
72385f555add7acc03149b76db239a4cdd18433a558zhanyong.wanTEST(RandomTest, GeneratesNumbersWithinRange) {
72485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  const UInt32 kRange = 10000;
72585f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  testing::internal::Random random(12345);
72685f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  for (int i = 0; i < 10; i++) {
72785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan    EXPECT_LT(random.Generate(kRange), kRange) << " for iteration " << i;
72885f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  }
72985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan
73085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  testing::internal::Random random2(testing::internal::Random::kMaxRange);
73185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  for (int i = 0; i < 10; i++) {
73285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan    EXPECT_LT(random2.Generate(kRange), kRange) << " for iteration " << i;
73385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  }
73485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan}
73585f555add7acc03149b76db239a4cdd18433a558zhanyong.wan
73685f555add7acc03149b76db239a4cdd18433a558zhanyong.wanTEST(RandomTest, RepeatsWhenReseeded) {
73785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  const int kSeed = 123;
73885f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  const int kArraySize = 10;
73985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  const UInt32 kRange = 10000;
74085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  UInt32 values[kArraySize];
74185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan
74285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  testing::internal::Random random(kSeed);
74385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  for (int i = 0; i < kArraySize; i++) {
74485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan    values[i] = random.Generate(kRange);
74585f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  }
74685f555add7acc03149b76db239a4cdd18433a558zhanyong.wan
74785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  random.Reseed(kSeed);
74885f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  for (int i = 0; i < kArraySize; i++) {
74985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan    EXPECT_EQ(values[i], random.Generate(kRange)) << " for iteration " << i;
75085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan  }
75185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan}
75285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan
75393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan// Tests STL container utilities.
754449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan
75593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan// Tests CountIf().
756449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan
75793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanstatic bool IsPositive(int n) { return n > 0; }
758a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan
75993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanTEST(ContainerUtilityTest, CountIf) {
76093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  std::vector<int> v;
76193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works for an empty container.
762a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan
76393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(-1);
76493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(0);
76593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works when no value satisfies.
766a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan
76793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(2);
76893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(-10);
76993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(10);
77093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ(2, CountIf(v, IsPositive));
7719644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan}
7724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
77393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan// Tests ForEach().
774f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
77593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanstatic int g_sum = 0;
77693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanstatic void Accumulate(int n) { g_sum += n; }
777f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
77893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanTEST(ContainerUtilityTest, ForEach) {
77993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  std::vector<int> v;
78093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  g_sum = 0;
78193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ForEach(v, Accumulate);
78293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ(0, g_sum);  // Works for an empty container;
783f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
78493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  g_sum = 0;
78593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(1);
78693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ForEach(v, Accumulate);
78793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ(1, g_sum);  // Works for a container with one element.
78893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan
78993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  g_sum = 0;
79093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(20);
79193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  v.push_back(300);
79293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ForEach(v, Accumulate);
79393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ(321, g_sum);
794f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
795f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
79693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan// Tests GetElementOr().
79793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanTEST(ContainerUtilityTest, GetElementOr) {
79893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  std::vector<char> a;
79993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ('x', GetElementOr(a, 0, 'x'));
800f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
80193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  a.push_back('a');
80293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  a.push_back('b');
80393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ('a', GetElementOr(a, 0, 'x'));
80493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ('b', GetElementOr(a, 1, 'x'));
80593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ('x', GetElementOr(a, -2, 'x'));
80693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_EQ('x', GetElementOr(a, 2, 'x'));
807f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
808f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
80993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanTEST(ContainerUtilityDeathTest, ShuffleRange) {
81093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  std::vector<int> a;
81193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  a.push_back(0);
81293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  a.push_back(1);
81393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  a.push_back(2);
814f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  testing::internal::Random random(1);
815f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
816f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
81793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan      ShuffleRange(&random, -1, 1, &a),
818f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      "Invalid shuffle range start -1: must be in range \\[0, 3\\]");
819f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
82093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan      ShuffleRange(&random, 4, 4, &a),
821f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      "Invalid shuffle range start 4: must be in range \\[0, 3\\]");
822f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
82393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan      ShuffleRange(&random, 3, 2, &a),
824f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      "Invalid shuffle range finish 2: must be in range \\[3, 3\\]");
825f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
82693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan      ShuffleRange(&random, 3, 4, &a),
827f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      "Invalid shuffle range finish 4: must be in range \\[3, 3\\]");
828f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
829f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
830f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanclass VectorShuffleTest : public Test {
831f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan protected:
832f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  static const int kVectorSize = 20;
833f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
834f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  VectorShuffleTest() : random_(1) {
835f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    for (int i = 0; i < kVectorSize; i++) {
83693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan      vector_.push_back(i);
837f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    }
838f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
839f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
840f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  static bool VectorIsCorrupt(const TestingVector& vector) {
84193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    if (kVectorSize != static_cast<int>(vector.size())) {
842f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      return true;
843f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    }
844f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
845f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    bool found_in_vector[kVectorSize] = { false };
84693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    for (size_t i = 0; i < vector.size(); i++) {
84793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan      const int e = vector[i];
848f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      if (e < 0 || e >= kVectorSize || found_in_vector[e]) {
849f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan        return true;
850f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      }
851f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      found_in_vector[e] = true;
852f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    }
853f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
854f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    // Vector size is correct, elements' range is correct, no
855f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    // duplicate elements.  Therefore no corruption has occurred.
856f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    return false;
857f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
858f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
859f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  static bool VectorIsNotCorrupt(const TestingVector& vector) {
860f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    return !VectorIsCorrupt(vector);
861f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
862f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
863f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) {
864f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    for (int i = begin; i < end; i++) {
86593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan      if (i != vector[i]) {
866f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan        return true;
867f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      }
868f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    }
869f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    return false;
870f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
871f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
872f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  static bool RangeIsUnshuffled(
873f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan      const TestingVector& vector, int begin, int end) {
874f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    return !RangeIsShuffled(vector, begin, end);
875f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
876f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
877f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  static bool VectorIsShuffled(const TestingVector& vector) {
878b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan    return RangeIsShuffled(vector, 0, static_cast<int>(vector.size()));
879f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
880f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
881f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  static bool VectorIsUnshuffled(const TestingVector& vector) {
882f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan    return !VectorIsShuffled(vector);
883f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
884f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
885f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  testing::internal::Random random_;
886f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  TestingVector vector_;
887f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan};  // class VectorShuffleTest
888f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
889f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanconst int VectorShuffleTest::kVectorSize;
890f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
891f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTEST_F(VectorShuffleTest, HandlesEmptyRange) {
892f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // Tests an empty range at the beginning...
89393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, 0, 0, &vector_);
894f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
895f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsUnshuffled, vector_);
896f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
897f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // ...in the middle...
89893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_);
899f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
900f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsUnshuffled, vector_);
901f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
902f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // ...at the end...
90393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_);
904f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
905f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsUnshuffled, vector_);
906f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
907f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // ...and past the end.
90893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_);
909f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
910f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsUnshuffled, vector_);
911f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
912f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
913f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) {
914f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // Tests a size one range at the beginning...
91593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, 0, 1, &vector_);
916f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
917f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsUnshuffled, vector_);
918f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
919f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // ...in the middle...
92093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_);
921f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
922f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsUnshuffled, vector_);
923f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
924f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // ...and at the end.
92593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_);
926f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
927f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsUnshuffled, vector_);
928f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
929f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
930f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// Because we use our own random number generator and a fixed seed,
931f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// we can guarantee that the following "random" tests will succeed.
932f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
933f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTEST_F(VectorShuffleTest, ShufflesEntireVector) {
93493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  Shuffle(&random_, &vector_);
935f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
936f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_;
937f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
938f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // Tests the first and last elements in particular to ensure that
939f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  // there are no off-by-one problems in our shuffle algorithm.
94093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_NE(0, vector_[0]);
94193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]);
942f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
943f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
944f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTEST_F(VectorShuffleTest, ShufflesStartOfVector) {
945f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  const int kRangeSize = kVectorSize/2;
946f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
94793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, 0, kRangeSize, &vector_);
948f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
949f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
950f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize);
951f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize);
952f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
953f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
954f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTEST_F(VectorShuffleTest, ShufflesEndOfVector) {
955f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  const int kRangeSize = kVectorSize / 2;
95693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_);
957f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
958f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
959f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
960f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize);
961f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
962f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
963f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTEST_F(VectorShuffleTest, ShufflesMiddleOfVector) {
964f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  int kRangeSize = kVectorSize/3;
96593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_);
966f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
967f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
968f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
969f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize);
970f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize);
971f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
972f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
973f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTEST_F(VectorShuffleTest, ShufflesRepeatably) {
974f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  TestingVector vector2;
975f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  for (int i = 0; i < kVectorSize; i++) {
97693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    vector2.push_back(i);
977f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
978f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
979f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  random_.Reseed(1234);
98093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  Shuffle(&random_, &vector_);
981f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  random_.Reseed(1234);
98293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  Shuffle(&random_, &vector2);
983f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
984f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
985f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  ASSERT_PRED1(VectorIsNotCorrupt, vector2);
986f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
987f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  for (int i = 0; i < kVectorSize; i++) {
98893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i;
989f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan  }
990f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan}
991f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan
992f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests the size of the AssertHelper class.
9934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
994f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(AssertHelperTest, AssertHelperIsSmall) {
99589be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan  // To avoid breaking clients that use lots of assertions in one
996f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // function, we cannot grow the size of AssertHelper.
997f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*));
99889be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan}
99989be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan
10004b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests String::EndsWithCaseInsensitive().
10014b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringTest, EndsWithCaseInsensitive) {
100203c314931649a999b0cf5deb0a434a1009157416jgm@google.com  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", "BAR"));
100303c314931649a999b0cf5deb0a434a1009157416jgm@google.com  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobaR", "bar"));
100403c314931649a999b0cf5deb0a434a1009157416jgm@google.com  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", ""));
100503c314931649a999b0cf5deb0a434a1009157416jgm@google.com  EXPECT_TRUE(String::EndsWithCaseInsensitive("", ""));
10064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
100703c314931649a999b0cf5deb0a434a1009157416jgm@google.com  EXPECT_FALSE(String::EndsWithCaseInsensitive("Foobar", "foo"));
100803c314931649a999b0cf5deb0a434a1009157416jgm@google.com  EXPECT_FALSE(String::EndsWithCaseInsensitive("foobar", "Foo"));
100903c314931649a999b0cf5deb0a434a1009157416jgm@google.com  EXPECT_FALSE(String::EndsWithCaseInsensitive("", "foo"));
10104b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
10114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
101298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// C++Builder's preprocessor is buggy; it fails to expand macros that
101398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// appear in macro parameters after wide char literals.  Provide an alias
101498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// for NULL as a workaround.
101598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wanstatic const wchar_t* const kNull = NULL;
101698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
1017e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Tests String::CaseInsensitiveWideCStringEquals
1018e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTEST(StringTest, CaseInsensitiveWideCStringEquals) {
1019e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL));
102098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L""));
102198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"", kNull));
102298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"foobar"));
102398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"foobar", kNull));
1024e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"foobar"));
1025e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"FOOBAR"));
1026e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"FOOBAR", L"foobar"));
1027e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
1028e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
10294cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS
10304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
10314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests String::ShowWideCString().
10324b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringTest, ShowWideCString) {
10334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("(null)",
10344b6829f0d28990dd645e16386eb226d0f10c8731shiqian               String::ShowWideCString(NULL).c_str());
10354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("", String::ShowWideCString(L"").c_str());
10364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("foo", String::ShowWideCString(L"foo").c_str());
10374b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
10384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1039733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS_MOBILE
1040dd4a17bc20377d250ed116b1083d851adbe45f25shiqianTEST(StringTest, AnsiAndUtf16Null) {
1041dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  EXPECT_EQ(NULL, String::AnsiToUtf16(NULL));
1042dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL));
1043dd4a17bc20377d250ed116b1083d851adbe45f25shiqian}
1044dd4a17bc20377d250ed116b1083d851adbe45f25shiqian
1045dd4a17bc20377d250ed116b1083d851adbe45f25shiqianTEST(StringTest, AnsiAndUtf16ConvertBasic) {
1046dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  const char* ansi = String::Utf16ToAnsi(L"str");
1047dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  EXPECT_STREQ("str", ansi);
1048dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  delete [] ansi;
1049dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  const WCHAR* utf16 = String::AnsiToUtf16("str");
10504e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan  EXPECT_EQ(0, wcsncmp(L"str", utf16, 3));
1051dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  delete [] utf16;
1052dd4a17bc20377d250ed116b1083d851adbe45f25shiqian}
1053dd4a17bc20377d250ed116b1083d851adbe45f25shiqian
1054dd4a17bc20377d250ed116b1083d851adbe45f25shiqianTEST(StringTest, AnsiAndUtf16ConvertPathChars) {
1055dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  const char* ansi = String::Utf16ToAnsi(L".:\\ \"*?");
1056dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  EXPECT_STREQ(".:\\ \"*?", ansi);
1057dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  delete [] ansi;
1058dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  const WCHAR* utf16 = String::AnsiToUtf16(".:\\ \"*?");
10594e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan  EXPECT_EQ(0, wcsncmp(L".:\\ \"*?", utf16, 3));
1060dd4a17bc20377d250ed116b1083d851adbe45f25shiqian  delete [] utf16;
1061dd4a17bc20377d250ed116b1083d851adbe45f25shiqian}
1062733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif  // GTEST_OS_WINDOWS_MOBILE
1063dd4a17bc20377d250ed116b1083d851adbe45f25shiqian
10644b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_OS_WINDOWS
10654b6829f0d28990dd645e16386eb226d0f10c8731shiqian
10664b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests TestProperty construction.
10674b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TestPropertyTest, StringValue) {
10684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property("key", "1");
10694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("key", property.key());
10704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("1", property.value());
10714b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
10724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
10734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests TestProperty replacing a value.
10744b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TestPropertyTest, ReplaceStringValue) {
10754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property("key", "1");
10764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("1", property.value());
10774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  property.SetValue("2");
10784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("2", property.value());
10794b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
10804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
108198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// AddFatalFailure() and AddNonfatalFailure() must be stand-alone
108298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// functions (i.e. their definitions cannot be inlined at the call
108398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// sites), or C++Builder won't compile the code.
108498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wanstatic void AddFatalFailure() {
108598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  FAIL() << "Expected fatal failure.";
108698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan}
108798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
108898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wanstatic void AddNonfatalFailure() {
108998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  ADD_FAILURE() << "Expected non-fatal failure.";
109098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan}
109198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
1092e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianclass ScopedFakeTestPartResultReporterTest : public Test {
1093acd0f32c50622ace5eb0c62b38820981c1ecd1e9tsunanet public:  // Must be public and not protected due to a bug in g++ 3.4.2.
1094e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  enum FailureMode {
1095e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    FATAL_FAILURE,
1096e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    NONFATAL_FAILURE
1097e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  };
1098e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  static void AddFailure(FailureMode failure) {
1099e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    if (failure == FATAL_FAILURE) {
110098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan      AddFatalFailure();
1101e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    } else {
110298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan      AddNonfatalFailure();
1103e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    }
1104e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
11054b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
11064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1107e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Tests that ScopedFakeTestPartResultReporter intercepts test
1108e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// failures.
1109e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) {
1110e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  TestPartResultArray results;
1111e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  {
1112e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ScopedFakeTestPartResultReporter reporter(
1113e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
1114e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        &results);
1115e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailure(NONFATAL_FAILURE);
1116e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailure(FATAL_FAILURE);
1117e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
11184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1119e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_EQ(2, results.size());
1120e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
1121e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
11224b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
11234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1124e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) {
1125e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  TestPartResultArray results;
1126e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  {
1127e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    // Tests, that the deprecated constructor still works.
1128e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ScopedFakeTestPartResultReporter reporter(&results);
1129e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailure(NONFATAL_FAILURE);
1130e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
1131e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_EQ(1, results.size());
11324b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
11334b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1134f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#if GTEST_IS_THREADSAFE
1135e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
1136e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianclass ScopedFakeTestPartResultReporterWithThreadsTest
1137e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  : public ScopedFakeTestPartResultReporterTest {
1138e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian protected:
1139e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  static void AddFailureInOtherThread(FailureMode failure) {
1140f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
1141f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan    thread.Join();
1142e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
1143e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian};
1144e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
1145e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ScopedFakeTestPartResultReporterWithThreadsTest,
1146e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian       InterceptsTestFailuresInAllThreads) {
1147e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  TestPartResultArray results;
1148e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  {
1149e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ScopedFakeTestPartResultReporter reporter(
1150e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results);
1151e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailure(NONFATAL_FAILURE);
1152e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailure(FATAL_FAILURE);
1153e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailureInOtherThread(NONFATAL_FAILURE);
1154e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    AddFailureInOtherThread(FATAL_FAILURE);
1155e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
1156e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
1157e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_EQ(4, results.size());
1158e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
1159e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
1160e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed());
1161e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed());
11624b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
11634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1164f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#endif  // GTEST_IS_THREADSAFE
1165e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
116698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.  Makes sure that they
116798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// work even if the failure is generated in a called function rather than
116898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// the current context.
1169e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
1170e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wantypedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest;
1171e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
1172e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) {
117398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FATAL_FAILURE(AddFatalFailure(), "Expected fatal failure.");
11744b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
11754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1176375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan#if GTEST_HAS_GLOBAL_STRING
1177375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wanTEST_F(ExpectFatalFailureTest, AcceptsStringObject) {
1178375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan  EXPECT_FATAL_FAILURE(AddFatalFailure(), ::string("Expected fatal failure."));
1179375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan}
1180375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan#endif
1181375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan
1182375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wanTEST_F(ExpectFatalFailureTest, AcceptsStdStringObject) {
1183375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan  EXPECT_FATAL_FAILURE(AddFatalFailure(),
1184375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan                       ::std::string("Expected fatal failure."));
1185375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan}
1186375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan
1187e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) {
1188e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  // We have another test below to verify that the macro catches fatal
1189e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  // failures generated on another thread.
119098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(),
1191e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                      "Expected fatal failure.");
11924b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
11934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
119498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
119598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Silences warnings: "Condition is always true"
1196733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option push -w-ccc
119798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
119898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
1199e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void
1200e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// function even when the statement in it contains ASSERT_*.
1201e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1202e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanint NonVoidFunction() {
1203e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
1204e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
1205e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  return 0;
1206e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan}
1207e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1208e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) {
1209e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  NonVoidFunction();
1210e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan}
1211e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1212e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the
1213e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// current function even though 'statement' generates a fatal failure.
1214e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1215e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanvoid DoesNotAbortHelper(bool* aborted) {
1216e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
1217e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
1218e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1219e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  *aborted = false;
1220e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan}
1221e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
122298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
1223d6b4941ba371a4de8b8ea6b69bf50741cbe97292vladlosev// Restores warnings after previous "#pragma option push" suppressed them.
1224733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option pop
122598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
122698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
1227e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectFatalFailureTest, DoesNotAbort) {
1228e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  bool aborted = true;
1229e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  DoesNotAbortHelper(&aborted);
1230e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_FALSE(aborted);
12314b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
12324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1233e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a
1234e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// statement that contains a macro which expands to code containing an
1235e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// unprotected comma.
12364b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1237e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianstatic int global_var = 0;
1238e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++
12394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1240e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
1241ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#ifndef __BORLANDC__
1242ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan  // ICE's in C++Builder.
1243e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE({
1244e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    GTEST_USE_UNPROTECTED_COMMA_;
124598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    AddFatalFailure();
1246e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }, "");
124798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
12484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1249e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE_ON_ALL_THREADS({
1250e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    GTEST_USE_UNPROTECTED_COMMA_;
125198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    AddFatalFailure();
1252e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }, "");
1253e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan}
1254e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1255e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}.
1256e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1257e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wantypedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest;
1258e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1259e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) {
126098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
1261e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan                          "Expected non-fatal failure.");
1262e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan}
12634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1264375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan#if GTEST_HAS_GLOBAL_STRING
1265375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wanTEST_F(ExpectNonfatalFailureTest, AcceptsStringObject) {
1266375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
1267375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan                          ::string("Expected non-fatal failure."));
1268375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan}
1269375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan#endif
1270375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan
1271375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wanTEST_F(ExpectNonfatalFailureTest, AcceptsStdStringObject) {
1272375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
1273375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan                          ::std::string("Expected non-fatal failure."));
1274375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan}
1275375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan
1276e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) {
1277e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  // We have another test below to verify that the macro catches
1278e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  // non-fatal failures generated on another thread.
127998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(),
1280e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan                                         "Expected non-fatal failure.");
1281e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan}
1282e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
1283e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a
1284e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// statement that contains a macro which expands to code containing an
1285e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// unprotected comma.
1286e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
1287e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE({
1288e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    GTEST_USE_UNPROTECTED_COMMA_;
128998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    AddNonfatalFailure();
1290e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }, "");
12914b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1292e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({
1293e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    GTEST_USE_UNPROTECTED_COMMA_;
129498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    AddNonfatalFailure();
1295e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }, "");
12964b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
12974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1298f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#if GTEST_IS_THREADSAFE
12994b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1300e44602ec83c65102035ce5304ae8de0cb16e9e56shiqiantypedef ScopedFakeTestPartResultReporterWithThreadsTest
1301e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ExpectFailureWithThreadsTest;
13024b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1303e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) {
1304e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE),
1305e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                      "Expected fatal failure.");
1306e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
1307e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
1308e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) {
1309e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(
1310e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      AddFailureInOtherThread(NONFATAL_FAILURE), "Expected non-fatal failure.");
13114b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
13124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1313f6fb532f0825024feda89c863e33a51b6ff377f5zhanyong.wan#endif  // GTEST_IS_THREADSAFE
1314e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
13151cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan// Tests the TestProperty class.
13161cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan
13171cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanTEST(TestPropertyTest, ConstructorWorks) {
13181cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  const TestProperty property("key", "value");
13191cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_STREQ("key", property.key());
13201cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_STREQ("value", property.value());
13211cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan}
13221cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan
13231cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanTEST(TestPropertyTest, SetValue) {
13241cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  TestProperty property("key", "value_1");
13251cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_STREQ("key", property.key());
13261cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  property.SetValue("value_2");
13271cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_STREQ("key", property.key());
13281cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_STREQ("value_2", property.value());
13291cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan}
13301cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan
13314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the TestResult class
13324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The test fixture for testing TestResult.
1334760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass TestResultTest : public Test {
13354b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
133693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  typedef std::vector<TestPartResult> TPRVector;
13374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // We make use of 2 TestPartResult objects,
13394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestPartResult * pr1, * pr2;
13404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // ... and 3 TestResult objects.
13424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestResult * r0, * r1, * r2;
13434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
13454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // pr1 is for success.
1346334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan    pr1 = new TestPartResult(TestPartResult::kSuccess,
1347334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan                             "foo/bar.cc",
1348334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan                             10,
1349334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan                             "Success!");
13504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13514b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // pr2 is for fatal failure.
1352334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan    pr2 = new TestPartResult(TestPartResult::kFatalFailure,
1353334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan                             "foo/bar.cc",
1354760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian                             -1,  // This line number means "unknown"
1355760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian                             "Failure!");
13564b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13574b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Creates the TestResult objects.
13584b6829f0d28990dd645e16386eb226d0f10c8731shiqian    r0 = new TestResult();
13594b6829f0d28990dd645e16386eb226d0f10c8731shiqian    r1 = new TestResult();
13604b6829f0d28990dd645e16386eb226d0f10c8731shiqian    r2 = new TestResult();
13614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13624b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // In order to test TestResult, we need to modify its internal
136393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    // state, in particular the TestPartResult vector it holds.
136493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    // test_part_results() returns a const reference to this vector.
13654b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // We cast it to a non-const object s.t. it can be modified (yes,
13664b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // this is a hack).
136793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    TPRVector* results1 = const_cast<TPRVector*>(
1368b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan        &TestResultAccessor::test_part_results(*r1));
136993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    TPRVector* results2 = const_cast<TPRVector*>(
1370b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan        &TestResultAccessor::test_part_results(*r2));
13714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13724b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // r0 is an empty TestResult.
13734b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13744b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // r1 contains a single SUCCESS TestPartResult.
137593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    results1->push_back(*pr1);
13764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13774b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // r2 contains a SUCCESS, and a FAILURE.
137893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    results2->push_back(*pr1);
137993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    results2->push_back(*pr2);
13804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
13814b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
13834b6829f0d28990dd645e16386eb226d0f10c8731shiqian    delete pr1;
13844b6829f0d28990dd645e16386eb226d0f10c8731shiqian    delete pr2;
13854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
13864b6829f0d28990dd645e16386eb226d0f10c8731shiqian    delete r0;
13874b6829f0d28990dd645e16386eb226d0f10c8731shiqian    delete r1;
13884b6829f0d28990dd645e16386eb226d0f10c8731shiqian    delete r2;
13894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
13909644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
13919644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // Helper that compares two two TestPartResults.
1392449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  static void CompareTestPartResult(const TestPartResult& expected,
1393449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan                                    const TestPartResult& actual) {
1394449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_EQ(expected.type(), actual.type());
1395449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_STREQ(expected.file_name(), actual.file_name());
1396449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_EQ(expected.line_number(), actual.line_number());
1397449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_STREQ(expected.summary(), actual.summary());
1398449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_STREQ(expected.message(), actual.message());
1399449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_EQ(expected.passed(), actual.passed());
1400449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_EQ(expected.failed(), actual.failed());
1401449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed());
1402449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan    EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed());
14039644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  }
14044b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
14054b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1406b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan// Tests TestResult::total_part_count().
14074b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestResultTest, total_part_count) {
1408b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(0, r0->total_part_count());
1409b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(1, r1->total_part_count());
1410b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(2, r2->total_part_count());
14114b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
14124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
14139644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Tests TestResult::Passed().
14144b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestResultTest, Passed) {
14154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(r0->Passed());
14164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(r1->Passed());
14174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_FALSE(r2->Passed());
14184b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
14194b6829f0d28990dd645e16386eb226d0f10c8731shiqian
14209644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Tests TestResult::Failed().
14214b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestResultTest, Failed) {
14224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_FALSE(r0->Failed());
14234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_FALSE(r1->Failed());
14244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(r2->Failed());
14254b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
14264b6829f0d28990dd645e16386eb226d0f10c8731shiqian
14279644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Tests TestResult::GetTestPartResult().
1428449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan
1429449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wantypedef TestResultTest TestResultDeathTest;
1430449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan
1431449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wanTEST_F(TestResultDeathTest, GetTestPartResult) {
1432449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  CompareTestPartResult(*pr1, r2->GetTestPartResult(0));
1433449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  CompareTestPartResult(*pr2, r2->GetTestPartResult(1));
143493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), "");
143593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), "");
14369644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan}
14379644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
1438b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan// Tests TestResult has no properties when none are added.
14394b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) {
14404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestResult test_result;
1441b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(0, test_result.test_property_count());
14424b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
14434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1444b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan// Tests TestResult has the expected property when added.
14454b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) {
14464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestResult test_result;
14474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property("key_1", "1");
1448dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property);
1449b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(1, test_result.test_property_count());
1450449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& actual_property = test_result.GetTestProperty(0);
1451449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_1", actual_property.key());
1452449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("1", actual_property.value());
14534b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
14544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1455b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan// Tests TestResult has multiple properties when added.
14564b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) {
14574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestResult test_result;
14584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property_1("key_1", "1");
14594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property_2("key_2", "2");
1460dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
1461dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
1462b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(2, test_result.test_property_count());
1463449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
1464449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_1", actual_property_1.key());
1465449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("1", actual_property_1.value());
14664b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1467449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
1468449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_2", actual_property_2.key());
1469449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("2", actual_property_2.value());
14704b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
14714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1472b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan// Tests TestResult::RecordProperty() overrides values for duplicate keys.
14734b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) {
14744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestResult test_result;
14754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property_1_1("key_1", "1");
14764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property_2_1("key_2", "2");
14774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property_1_2("key_1", "12");
14784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestProperty property_2_2("key_2", "22");
1479dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_1);
1480dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_1);
1481dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_2);
1482dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_2);
14839644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
14849644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  ASSERT_EQ(2, test_result.test_property_count());
1485449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
1486449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_1", actual_property_1.key());
1487449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("12", actual_property_1.value());
1488b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan
1489449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
1490449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_2", actual_property_2.key());
1491449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("22", actual_property_2.value());
14929644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan}
14939644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
14949644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Tests TestResult::GetTestProperty().
1495dfbdf0bab51520595679a99710983daba6fc18ebvladlosevTEST(TestResultPropertyTest, GetTestProperty) {
14969644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  TestResult test_result;
14979644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  TestProperty property_1("key_1", "1");
14989644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  TestProperty property_2("key_2", "2");
14999644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  TestProperty property_3("key_3", "3");
1500dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
1501dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
1502dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  TestResultAccessor::RecordProperty(&test_result, "testcase", property_3);
15039644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
1504449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& fetched_property_1 = test_result.GetTestProperty(0);
1505449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& fetched_property_2 = test_result.GetTestProperty(1);
1506449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  const TestProperty& fetched_property_3 = test_result.GetTestProperty(2);
15079644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
1508449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_1", fetched_property_1.key());
1509449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("1", fetched_property_1.value());
15109644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
1511449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_2", fetched_property_2.key());
1512449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("2", fetched_property_2.value());
15139644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
1514449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("key_3", fetched_property_3.key());
1515449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan  EXPECT_STREQ("3", fetched_property_3.value());
15169644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
151793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), "");
151893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), "");
15199644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan}
15209644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
15214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that GTestFlagSaver works on Windows and Mac.
15224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1523760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass GTestFlagSaverTest : public Test {
15244b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
15254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Saves the Google Test flags such that we can restore them later, and
15264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // then sets them to their default values.  This will be called
15274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // before the first test in this test case is run.
15284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void SetUpTestCase() {
1529760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    saver_ = new GTestFlagSaver;
1530760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian
1531ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    GTEST_FLAG(also_run_disabled_tests) = false;
1532760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(break_on_failure) = false;
1533760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(catch_exceptions) = false;
153421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    GTEST_FLAG(death_test_use_fork) = false;
1535760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(color) = "auto";
1536760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(filter) = "";
1537760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(list_tests) = false;
1538760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(output) = "";
153973ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan    GTEST_FLAG(print_time) = true;
15409b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    GTEST_FLAG(random_seed) = 0;
1541760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(repeat) = 1;
15429b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    GTEST_FLAG(shuffle) = false;
1543ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
1544c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    GTEST_FLAG(stream_result_to) = "";
1545b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    GTEST_FLAG(throw_on_failure) = false;
15464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
15474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
15484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Restores the Google Test flags that the tests have modified.  This will
15494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // be called after the last test in this test case is run.
15504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void TearDownTestCase() {
15514b6829f0d28990dd645e16386eb226d0f10c8731shiqian    delete saver_;
15524b6829f0d28990dd645e16386eb226d0f10c8731shiqian    saver_ = NULL;
15534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
15544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
15554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Verifies that the Google Test flags have their default values, and then
15564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // modifies each of them.
15574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void VerifyAndModifyFlags() {
1558ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests));
1559760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    EXPECT_FALSE(GTEST_FLAG(break_on_failure));
1560760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    EXPECT_FALSE(GTEST_FLAG(catch_exceptions));
1561760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    EXPECT_STREQ("auto", GTEST_FLAG(color).c_str());
156221d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    EXPECT_FALSE(GTEST_FLAG(death_test_use_fork));
1563760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    EXPECT_STREQ("", GTEST_FLAG(filter).c_str());
1564760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    EXPECT_FALSE(GTEST_FLAG(list_tests));
1565760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    EXPECT_STREQ("", GTEST_FLAG(output).c_str());
156673ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan    EXPECT_TRUE(GTEST_FLAG(print_time));
15679b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    EXPECT_EQ(0, GTEST_FLAG(random_seed));
1568760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    EXPECT_EQ(1, GTEST_FLAG(repeat));
15699b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    EXPECT_FALSE(GTEST_FLAG(shuffle));
1570ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth));
1571c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    EXPECT_STREQ("", GTEST_FLAG(stream_result_to).c_str());
1572b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    EXPECT_FALSE(GTEST_FLAG(throw_on_failure));
1573760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian
1574ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    GTEST_FLAG(also_run_disabled_tests) = true;
1575760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(break_on_failure) = true;
1576760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(catch_exceptions) = true;
1577760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(color) = "no";
157821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    GTEST_FLAG(death_test_use_fork) = true;
1579760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(filter) = "abc";
1580760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(list_tests) = true;
1581760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(output) = "xml:foo.xml";
158273ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan    GTEST_FLAG(print_time) = false;
15839b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    GTEST_FLAG(random_seed) = 1;
1584760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    GTEST_FLAG(repeat) = 100;
15859b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    GTEST_FLAG(shuffle) = true;
1586ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_FLAG(stack_trace_depth) = 1;
1587c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    GTEST_FLAG(stream_result_to) = "localhost:1234";
1588b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    GTEST_FLAG(throw_on_failure) = true;
15894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
159093fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev
15914b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
15924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // For saving Google Test flags during this test case.
1593760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  static GTestFlagSaver* saver_;
15944b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
15954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1596760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianGTestFlagSaver* GTestFlagSaverTest::saver_ = NULL;
15974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
15984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test doesn't guarantee the order of tests.  The following two
15994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tests are designed to work regardless of their order.
16004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Modifies the Google Test flags in the test body.
16024b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(GTestFlagSaverTest, ModifyGTestFlags) {
16034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  VerifyAndModifyFlags();
16044b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
16054b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Verifies that the Google Test flags in the body of the previous test were
16074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// restored to their original values.
16084b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(GTestFlagSaverTest, VerifyGTestFlags) {
16094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  VerifyAndModifyFlags();
16104b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
16114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Sets an environment variable with the given name to the given
16134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// value.  If the value argument is "", unsets the environment
16144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// variable.  The caller must ensure that both arguments are not NULL.
16154b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic void SetEnv(const char* name, const char* value) {
1616fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if GTEST_OS_WINDOWS_MOBILE
16174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Environment variables are not supported on Windows CE.
16184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return;
1619673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
162098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // C++Builder's putenv only stores a pointer to its parameter; we have to
162198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // ensure that the string remains valid as long as it might be needed.
162298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // We use an std::map to do so.
162303c314931649a999b0cf5deb0a434a1009157416jgm@google.com  static std::map<std::string, std::string*> added_env;
162498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
162598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // Because putenv stores a pointer to the string buffer, we can't delete the
162698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // previous string (if present) until after it's replaced.
162703c314931649a999b0cf5deb0a434a1009157416jgm@google.com  std::string *prev_env = NULL;
162898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  if (added_env.find(name) != added_env.end()) {
162998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    prev_env = added_env[name];
163098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }
163103c314931649a999b0cf5deb0a434a1009157416jgm@google.com  added_env[name] = new std::string(
163203c314931649a999b0cf5deb0a434a1009157416jgm@google.com      (Message() << name << "=" << value).GetString());
1633673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev
1634673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // The standard signature of putenv accepts a 'char*' argument. Other
1635673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // implementations, like C++Builder's, accept a 'const char*'.
1636673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // We cast away the 'const' since that would work for both variants.
1637673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  putenv(const_cast<char*>(added_env[name]->c_str()));
163898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  delete prev_env;
16394cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#elif GTEST_OS_WINDOWS  // If we are on Windows proper.
1640760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  _putenv((Message() << name << "=" << value).GetString().c_str());
16414b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else
16424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  if (*value == '\0') {
16434b6829f0d28990dd645e16386eb226d0f10c8731shiqian    unsetenv(name);
16444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  } else {
16454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    setenv(name, value, 1);
16464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
1647fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif  // GTEST_OS_WINDOWS_MOBILE
16484b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
16494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1650fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if !GTEST_OS_WINDOWS_MOBILE
16514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Environment variables are not supported on Windows CE.
16524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1653760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianusing testing::internal::Int32FromGTestEnv;
16544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests Int32FromGTestEnv().
16564b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Int32FromGTestEnv() returns the default value when the
16584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// environment variable is not set.
16594b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) {
16604cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "");
16614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(10, Int32FromGTestEnv("temp", 10));
16624b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
16634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Int32FromGTestEnv() returns the default value when the
16654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// environment variable overflows as an Int32.
16664b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) {
16674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting 2 warnings)\n");
16684b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16694cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12345678987654321");
16704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(20, Int32FromGTestEnv("temp", 20));
16714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16724cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-12345678987654321");
16734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(30, Int32FromGTestEnv("temp", 30));
16744b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
16754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Int32FromGTestEnv() returns the default value when the
16774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// environment variable does not represent a valid decimal integer.
16784b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) {
16794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting 2 warnings)\n");
16804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16814cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "A1");
16824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(40, Int32FromGTestEnv("temp", 40));
16834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16844cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12X");
16854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(50, Int32FromGTestEnv("temp", 50));
16864b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
16874b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Int32FromGTestEnv() parses and returns the value of the
16894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// environment variable when it represents a valid decimal integer in
16904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the range of an Int32.
16914b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) {
16924cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "123");
16934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(123, Int32FromGTestEnv("temp", 0));
16944b6829f0d28990dd645e16386eb226d0f10c8731shiqian
16954cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-321");
16964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(-321, Int32FromGTestEnv("temp", 0));
16974b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
1698fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif  // !GTEST_OS_WINDOWS_MOBILE
16994b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17004b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ParseInt32Flag().
17014b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ParseInt32Flag() returns false and doesn't change the
17034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// output value when the flag has wrong format
17044b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) {
17054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Int32 value = 123;
17064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ParseInt32Flag("--a=100", "b", &value));
17074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(123, value);
17084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ParseInt32Flag("a=100", "a", &value));
17104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(123, value);
17114b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
17124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ParseInt32Flag() returns false and doesn't change the
17144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// output value when the flag overflows as an Int32.
17154b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) {
17164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting 2 warnings)\n");
17174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Int32 value = 123;
17194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ParseInt32Flag("--abc=12345678987654321", "abc", &value));
17204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(123, value);
17214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ParseInt32Flag("--abc=-12345678987654321", "abc", &value));
17234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(123, value);
17244b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
17254b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ParseInt32Flag() returns false and doesn't change the
17274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// output value when the flag does not represent a valid decimal
17284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// integer.
17294b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) {
17304b6829f0d28990dd645e16386eb226d0f10c8731shiqian  printf("(expecting 2 warnings)\n");
17314b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Int32 value = 123;
17334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ParseInt32Flag("--abc=A1", "abc", &value));
17344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(123, value);
17354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ParseInt32Flag("--abc=12X", "abc", &value));
17374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(123, value);
17384b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
17394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
17404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that ParseInt32Flag() parses the value of the flag and
17414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// returns true when the flag represents a valid decimal integer in
17424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the range of an Int32.
17434b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) {
17444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Int32 value = 123;
17454cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=456", "abc", &value));
17464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(456, value);
17474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
174898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=-789",
174998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                             "abc", &value));
17504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(-789, value);
17514b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
17524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1753905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that Int32FromEnvOrDie() parses the value of the var or
1754905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// returns the correct default.
1755c427f5e8ab231012d7663a0ee408f1225bac971azhanyong.wan// Environment variables are not supported on Windows CE.
1756fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if !GTEST_OS_WINDOWS_MOBILE
1757905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) {
17584cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
17594cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "123");
17604cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
17614cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "-123");
17624cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
1763905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1764fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif  // !GTEST_OS_WINDOWS_MOBILE
1765905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1766905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that Int32FromEnvOrDie() aborts with an error message
1767905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// if the variable is not an Int32.
1768905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) {
17694cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "xxx");
1770535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
1771449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
1772449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan      ".*");
1773905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1774905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1775905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that Int32FromEnvOrDie() aborts with an error message
1776905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// if the variable cannot be represnted by an Int32.
1777905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) {
17784cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "1234567891234567891234");
1779535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
1780449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
1781449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan      ".*");
1782905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1783905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1784905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that ShouldRunTestOnShard() selects all tests
1785905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// where there is 1 shard.
1786905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) {
1787905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0));
1788905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1));
1789905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2));
1790905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3));
1791905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4));
1792905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1793905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1794905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanclass ShouldShardTest : public testing::Test {
1795905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan protected:
1796905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  virtual void SetUp() {
17974cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan    index_var_ = GTEST_FLAG_PREFIX_UPPER_ "INDEX";
17984cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan    total_var_ = GTEST_FLAG_PREFIX_UPPER_ "TOTAL";
1799905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  }
1800905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1801905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  virtual void TearDown() {
1802905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    SetEnv(index_var_, "");
1803905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    SetEnv(total_var_, "");
1804905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  }
1805905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1806905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  const char* index_var_;
1807905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  const char* total_var_;
1808905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan};
1809905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1810905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that sharding is disabled if neither of the environment variables
1811905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// are set.
1812905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) {
1813905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "");
1814905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "");
1815905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1816905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
1817905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
1818905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1819905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1820905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that sharding is not enabled if total_shards  == 1.
1821905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) {
1822905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "0");
1823905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "1");
1824905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
1825905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
1826905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1827905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1828905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that sharding is enabled if total_shards > 1 and
1829905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// we are not in a death test subprocess.
1830c427f5e8ab231012d7663a0ee408f1225bac971azhanyong.wan// Environment variables are not supported on Windows CE.
1831fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if !GTEST_OS_WINDOWS_MOBILE
1832905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) {
1833905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "4");
1834905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "22");
1835905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
1836905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
1837905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1838905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "8");
1839905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "9");
1840905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
1841905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
1842905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1843905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "0");
1844905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "9");
1845905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
1846905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
1847905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1848fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif  // !GTEST_OS_WINDOWS_MOBILE
1849905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1850905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that we exit in error if the sharding values are not valid.
1851449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan
1852449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wantypedef ShouldShardTest ShouldShardDeathTest;
1853449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan
1854449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wanTEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) {
1855905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "4");
1856905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "4");
1857535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
1858905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1859905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "4");
1860905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "-2");
1861535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
1862905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1863905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "5");
1864905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "");
1865535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
1866905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1867905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(index_var_, "");
1868905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  SetEnv(total_var_, "5");
1869535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
1870905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1871905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1872905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Tests that ShouldRunTestOnShard is a partition when 5
1873905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// shards are used.
1874905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanTEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) {
1875905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  // Choose an arbitrary number of tests and shards.
1876905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  const int num_tests = 17;
1877905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  const int num_shards = 5;
1878905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1879905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  // Check partitioning: each test should be on exactly 1 shard.
1880905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  for (int test_id = 0; test_id < num_tests; test_id++) {
1881905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    int prev_selected_shard_index = -1;
1882905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    for (int shard_index = 0; shard_index < num_shards; shard_index++) {
1883905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan      if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) {
1884905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan        if (prev_selected_shard_index < 0) {
1885905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan          prev_selected_shard_index = shard_index;
1886905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan        } else {
1887905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan          ADD_FAILURE() << "Shard " << prev_selected_shard_index << " and "
1888905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan            << shard_index << " are both selected to run test " << test_id;
1889905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan        }
1890905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan      }
1891905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    }
1892905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  }
1893905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
1894905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  // Check balance: This is not required by the sharding protocol, but is a
1895905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  // desirable property for performance.
1896905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  for (int shard_index = 0; shard_index < num_shards; shard_index++) {
1897905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    int num_tests_on_shard = 0;
1898905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    for (int test_id = 0; test_id < num_tests; test_id++) {
1899905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan      num_tests_on_shard +=
1900905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan        ShouldRunTestOnShard(num_shards, shard_index, test_id);
1901905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    }
1902905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan    EXPECT_GE(num_tests_on_shard, num_tests / num_shards);
1903905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan  }
1904905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan}
1905905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan
19064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// For the same reason we are not explicitly testing everything in the
1907c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// Test class, there are no separate tests for the following classes
1908c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// (except for some trivial cases):
19094b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
19104b6829f0d28990dd645e16386eb226d0f10c8731shiqian//   TestCase, UnitTest, UnitTestResultPrinter.
19114b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
19124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Similarly, there are no separate tests for the following macros:
19134b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
19144b6829f0d28990dd645e16386eb226d0f10c8731shiqian//   TEST, TEST_F, RUN_ALL_TESTS
19154b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1916c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqianTEST(UnitTestTest, CanGetOriginalWorkingDir) {
1917c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian  ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL);
1918c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian  EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), "");
1919c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian}
1920c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian
19218883b42f2a78976dde09f31ca72806072e33bd5fvladlosevTEST(UnitTestTest, ReturnsPlausibleTimestamp) {
19228883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  EXPECT_LT(0, UnitTest::GetInstance()->start_timestamp());
19238883b42f2a78976dde09f31ca72806072e33bd5fvladlosev  EXPECT_LE(UnitTest::GetInstance()->start_timestamp(), GetTimeInMillis());
19248883b42f2a78976dde09f31ca72806072e33bd5fvladlosev}
19258883b42f2a78976dde09f31ca72806072e33bd5fvladlosev
1926dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// When a property using a reserved key is supplied to this function, it
1927dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// tests that a non-fatal failure is added, a fatal failure is not added,
1928dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// and that the property is not recorded.
1929dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid ExpectNonFatalFailureRecordingPropertyWithReservedKey(
1930dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    const TestResult& test_result, const char* key) {
1931dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_NONFATAL_FAILURE(Test::RecordProperty(key, "1"), "Reserved key");
1932dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ASSERT_EQ(0, test_result.test_property_count()) << "Property for key '" << key
1933dfbdf0bab51520595679a99710983daba6fc18ebvladlosev                                                  << "' recorded unexpectedly.";
1934dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
1935dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1936dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
1937dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    const char* key) {
1938dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  const TestInfo* test_info = UnitTest::GetInstance()->current_test_info();
1939dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ASSERT_TRUE(test_info != NULL);
1940dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKey(*test_info->result(),
1941dfbdf0bab51520595679a99710983daba6fc18ebvladlosev                                                        key);
1942dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
1943dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1944dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
1945dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    const char* key) {
1946dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
1947dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ASSERT_TRUE(test_case != NULL);
1948dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
1949dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      test_case->ad_hoc_test_result(), key);
1950dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
1951dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1952dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
1953dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    const char* key) {
1954dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
1955dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      UnitTest::GetInstance()->ad_hoc_test_result(), key);
1956dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
1957dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1958dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Tests that property recording functions in UnitTest outside of tests
1959dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// functions correcly.  Creating a separate instance of UnitTest ensures it
1960dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// is in a state similar to the UnitTest's singleton's between tests.
1961dfbdf0bab51520595679a99710983daba6fc18ebvladlosevclass UnitTestRecordPropertyTest :
1962dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    public testing::internal::UnitTestRecordPropertyTestHelper {
1963dfbdf0bab51520595679a99710983daba6fc18ebvladlosev public:
1964dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  static void SetUpTestCase() {
1965dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
1966dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "disabled");
1967dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
1968dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "errors");
1969dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
1970dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "failures");
1971dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
1972dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "name");
1973dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
1974dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "tests");
1975dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
1976dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "time");
1977dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1978dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    Test::RecordProperty("test_case_key_1", "1");
1979dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
1980dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ASSERT_TRUE(test_case != NULL);
1981dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1982dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ASSERT_EQ(1, test_case->ad_hoc_test_result().test_property_count());
1983dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    EXPECT_STREQ("test_case_key_1",
1984dfbdf0bab51520595679a99710983daba6fc18ebvladlosev                 test_case->ad_hoc_test_result().GetTestProperty(0).key());
1985dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    EXPECT_STREQ("1",
1986dfbdf0bab51520595679a99710983daba6fc18ebvladlosev                 test_case->ad_hoc_test_result().GetTestProperty(0).value());
1987dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  }
1988dfbdf0bab51520595679a99710983daba6fc18ebvladlosev};
1989dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1990dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Tests TestResult has the expected property when added.
1991dfbdf0bab51520595679a99710983daba6fc18ebvladlosevTEST_F(UnitTestRecordPropertyTest, OnePropertyFoundWhenAdded) {
1992dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordProperty("key_1", "1");
1993dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1994dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ASSERT_EQ(1, unit_test_.ad_hoc_test_result().test_property_count());
1995dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
1996dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("key_1",
1997dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
1998dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("1",
1999dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
2000dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
2001dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2002dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Tests TestResult has multiple properties when added.
2003dfbdf0bab51520595679a99710983daba6fc18ebvladlosevTEST_F(UnitTestRecordPropertyTest, MultiplePropertiesFoundWhenAdded) {
2004dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordProperty("key_1", "1");
2005dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordProperty("key_2", "2");
2006dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2007dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
2008dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2009dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("key_1",
2010dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
2011dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("1", unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
2012dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2013dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("key_2",
2014dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
2015dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("2", unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
2016dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
2017dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2018dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Tests TestResult::RecordProperty() overrides values for duplicate keys.
2019dfbdf0bab51520595679a99710983daba6fc18ebvladlosevTEST_F(UnitTestRecordPropertyTest, OverridesValuesForDuplicateKeys) {
2020dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordProperty("key_1", "1");
2021dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordProperty("key_2", "2");
2022dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordProperty("key_1", "12");
2023dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  UnitTestRecordProperty("key_2", "22");
2024dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2025dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
2026dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2027dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("key_1",
2028dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
2029dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("12",
2030dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
2031dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2032dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("key_2",
2033dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
2034dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_STREQ("22",
2035dfbdf0bab51520595679a99710983daba6fc18ebvladlosev               unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
2036dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
2037dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2038dfbdf0bab51520595679a99710983daba6fc18ebvladlosevTEST_F(UnitTestRecordPropertyTest,
2039dfbdf0bab51520595679a99710983daba6fc18ebvladlosev       AddFailureInsideTestsWhenUsingTestCaseReservedKeys) {
2040dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
2041dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      "name");
2042dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
2043dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      "value_param");
2044dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
2045dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      "type_param");
2046dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
2047dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      "status");
2048dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
2049dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      "time");
2050dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
2051dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      "classname");
2052dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
2053dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2054dfbdf0bab51520595679a99710983daba6fc18ebvladlosevTEST_F(UnitTestRecordPropertyTest,
2055dfbdf0bab51520595679a99710983daba6fc18ebvladlosev       AddRecordWithReservedKeysGeneratesCorrectPropertyList) {
2056dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  EXPECT_NONFATAL_FAILURE(
2057dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      Test::RecordProperty("name", "1"),
2058dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      "'classname', 'name', 'status', 'time', 'type_param', and 'value_param'"
2059dfbdf0bab51520595679a99710983daba6fc18ebvladlosev      " are reserved");
2060dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}
2061dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2062dfbdf0bab51520595679a99710983daba6fc18ebvladlosevclass UnitTestRecordPropertyTestEnvironment : public Environment {
2063dfbdf0bab51520595679a99710983daba6fc18ebvladlosev public:
2064dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  virtual void TearDown() {
2065dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2066dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "tests");
2067dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2068dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "failures");
2069dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2070dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "disabled");
2071dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2072dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "errors");
2073dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2074dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "name");
2075dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2076dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "timestamp");
2077dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2078dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "time");
2079dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
2080dfbdf0bab51520595679a99710983daba6fc18ebvladlosev        "random_seed");
2081dfbdf0bab51520595679a99710983daba6fc18ebvladlosev  }
2082dfbdf0bab51520595679a99710983daba6fc18ebvladlosev};
2083dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
2084dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// This will test property recording outside of any test or test case.
2085dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstatic Environment* record_property_env =
2086dfbdf0bab51520595679a99710983daba6fc18ebvladlosev    AddGlobalTestEnvironment(new UnitTestRecordPropertyTestEnvironment);
2087dfbdf0bab51520595679a99710983daba6fc18ebvladlosev
20884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This group of tests is for predicate assertions (ASSERT_PRED*, etc)
20894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// of various arities.  They do not attempt to be exhaustive.  Rather,
20904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// view them as smoke tests that can be easily reviewed and verified.
20914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A more complete set of tests for predicate assertions can be found
20924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in gtest_pred_impl_unittest.cc.
20934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
20944b6829f0d28990dd645e16386eb226d0f10c8731shiqian// First, some predicates and predicate-formatters needed by the tests.
20954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
20964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the argument is an even number.
20974b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool IsEven(int n) {
20984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return (n % 2) == 0;
20994b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
21004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A functor that returns true iff the argument is an even number.
21024b6829f0d28990dd645e16386eb226d0f10c8731shiqianstruct IsEvenFunctor {
21034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool operator()(int n) { return IsEven(n); }
21044b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
21054b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A predicate-formatter function that asserts the argument is an even
21074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// number.
2108760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianAssertionResult AssertIsEven(const char* expr, int n) {
21094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  if (IsEven(n)) {
2110760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    return AssertionSuccess();
21114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
21124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2113760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
21144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << expr << " evaluates to " << n << ", which is not even.";
2115760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  return AssertionFailure(msg);
21164b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
21174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2118fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// A predicate function that returns AssertionResult for use in
2119fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// EXPECT/ASSERT_TRUE/FALSE.
2120fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevAssertionResult ResultIsEven(int n) {
2121fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  if (IsEven(n))
2122fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev    return AssertionSuccess() << n << " is even";
2123fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  else
2124fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev    return AssertionFailure() << n << " is odd";
2125fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
2126fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
2127fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// A predicate function that returns AssertionResult but gives no
2128fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// explanation why it succeeds. Needed for testing that
2129fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// EXPECT/ASSERT_FALSE handles such functions correctly.
2130fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevAssertionResult ResultIsEvenNoExplanation(int n) {
2131fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  if (IsEven(n))
2132fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev    return AssertionSuccess();
2133fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  else
2134fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev    return AssertionFailure() << n << " is odd";
2135fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
2136fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
21374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A predicate-formatter functor that asserts the argument is an even
21384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// number.
21394b6829f0d28990dd645e16386eb226d0f10c8731shiqianstruct AssertIsEvenFunctor {
2140760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  AssertionResult operator()(const char* expr, int n) {
21414b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return AssertIsEven(expr, n);
21424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
21434b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
21444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the sum of the arguments is an even number.
21464b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool SumIsEven2(int n1, int n2) {
21474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return IsEven(n1 + n2);
21484b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
21494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A functor that returns true iff the sum of the arguments is an even
21514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// number.
21524b6829f0d28990dd645e16386eb226d0f10c8731shiqianstruct SumIsEven3Functor {
21534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool operator()(int n1, int n2, int n3) {
21544b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return IsEven(n1 + n2 + n3);
21554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
21564b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
21574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A predicate-formatter function that asserts the sum of the
21594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// arguments is an even number.
2160760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianAssertionResult AssertSumIsEven4(
2161760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    const char* e1, const char* e2, const char* e3, const char* e4,
2162760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    int n1, int n2, int n3, int n4) {
21634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int sum = n1 + n2 + n3 + n4;
21644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  if (IsEven(sum)) {
2165760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    return AssertionSuccess();
21664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
21674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2168760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
21694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << e1 << " + " << e2 << " + " << e3 << " + " << e4
21704b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << " (" << n1 << " + " << n2 << " + " << n3 << " + " << n4
21714b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << ") evaluates to " << sum << ", which is not even.";
2172760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  return AssertionFailure(msg);
21734b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
21744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A predicate-formatter functor that asserts the sum of the arguments
21764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// is an even number.
21774b6829f0d28990dd645e16386eb226d0f10c8731shiqianstruct AssertSumIsEven5Functor {
2178760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  AssertionResult operator()(
2179760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      const char* e1, const char* e2, const char* e3, const char* e4,
2180760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      const char* e5, int n1, int n2, int n3, int n4, int n5) {
21814b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const int sum = n1 + n2 + n3 + n4 + n5;
21824b6829f0d28990dd645e16386eb226d0f10c8731shiqian    if (IsEven(sum)) {
2183760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      return AssertionSuccess();
21844b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
21854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2186760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    Message msg;
21874b6829f0d28990dd645e16386eb226d0f10c8731shiqian    msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
21884b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << " ("
21894b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << n1 << " + " << n2 << " + " << n3 << " + " << n4 << " + " << n5
21904b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << ") evaluates to " << sum << ", which is not even.";
2191760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    return AssertionFailure(msg);
21924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
21934b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
21944b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests unary predicate assertions.
21974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
21984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests unary predicate assertions that don't use a custom formatter.
21994b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(Pred1Test, WithoutFormat) {
22004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Success cases.
22014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED1(IsEvenFunctor(), 2) << "This failure is UNEXPECTED!";
22024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED1(IsEven, 4);
22034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Failure cases.
22054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
22064b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_PRED1(IsEven, 5) << "This failure is expected.";
22074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "This failure is expected.");
22084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5),
22094b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "evaluates to false");
22104b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
22114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests unary predicate assertions that use a custom formatter.
22134b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(Pred1Test, WithFormat) {
22144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Success cases.
22154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED_FORMAT1(AssertIsEven, 2);
22164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4)
22174b6829f0d28990dd645e16386eb226d0f10c8731shiqian    << "This failure is UNEXPECTED!";
22184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Failure cases.
22204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int n = 5;
22214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n),
22224b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "n evaluates to 5, which is not even.");
22234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
22244b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_PRED_FORMAT1(AssertIsEven, 5) << "This failure is expected.";
22254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "This failure is expected.");
22264b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
22274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that unary predicate assertions evaluates their arguments
22294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// exactly once.
22304b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(Pred1Test, SingleEvaluationOnFailure) {
22314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success case.
22324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int n = 0;
22334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED1(IsEven, n++);
22344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n) << "The argument is not evaluated exactly once.";
22354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure case.
22374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
22384b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++)
22394b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << "This failure is expected.";
22404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "This failure is expected.");
22414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(2, n) << "The argument is not evaluated exactly once.";
22424b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
22434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests predicate assertions whose arity is >= 2.
22464b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests predicate assertions that don't use a custom formatter.
22484b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(PredTest, WithoutFormat) {
22494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Success cases.
22504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED2(SumIsEven2, 2, 4) << "This failure is UNEXPECTED!";
22514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8);
22524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Failure cases.
22544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int n1 = 1;
22554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int n2 = 2;
22564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
22574b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_PRED2(SumIsEven2, n1, n2) << "This failure is expected.";
22584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "This failure is expected.");
22594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
22604b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4);
22614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "evaluates to false");
22624b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
22634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests predicate assertions that use a custom formatter.
22654b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(PredTest, WithFormat) {
22664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Success cases.
22674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) <<
22684b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "This failure is UNEXPECTED!";
22694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10);
22704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Failure cases.
22724b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int n1 = 1;
22734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int n2 = 2;
22744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int n3 = 4;
22754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const int n4 = 6;
22764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
22774b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4);
22784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "evaluates to 13, which is not even.");
22794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
22804b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8)
22814b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << "This failure is expected.";
22824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "This failure is expected.");
22834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
22844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that predicate assertions evaluates their arguments
22864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// exactly once.
22874b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(PredTest, SingleEvaluationOnFailure) {
22884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success case.
22894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n1 = 0;
22904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n2 = 0;
22914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED2(SumIsEven2, n1++, n2++);
22924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
22934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
22944b6829f0d28990dd645e16386eb226d0f10c8731shiqian
22954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Another success case.
22964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  n1 = n2 = 0;
22974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n3 = 0;
22984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n4 = 0;
22994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n5 = 0;
23004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(),
23014b6829f0d28990dd645e16386eb226d0f10c8731shiqian                      n1++, n2++, n3++, n4++, n5++)
23024b6829f0d28990dd645e16386eb226d0f10c8731shiqian                        << "This failure is UNEXPECTED!";
23034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
23044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
23054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
23064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
23074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n5) << "Argument 5 is not evaluated exactly once.";
23084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure case.
23104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  n1 = n2 = n3 = 0;
23114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
23124b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++)
23134b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << "This failure is expected.";
23144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "This failure is expected.");
23154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
23164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
23174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
23184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Another failure case.
23204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  n1 = n2 = n3 = n4 = 0;
23214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
23224b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++);
23234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "evaluates to 1, which is not even.");
23244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
23254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
23264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
23274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
23284b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Some helper functions for testing using overloaded/template
23324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// functions with ASSERT_PREDn and EXPECT_PREDn.
23334b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23344b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool IsPositive(double x) {
23354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return x > 0;
23364b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23384b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename T>
23394b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool IsNegative(T x) {
23404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return x < 0;
23414b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23434b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename T1, typename T2>
23444b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool GreaterThan(T1 x1, T2 x2) {
23454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return x1 > x2;
23464b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that overloaded functions can be used in *_PRED* as long as
23494b6829f0d28990dd645e16386eb226d0f10c8731shiqian// their types are explicitly specified.
23504b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(PredicateAssertionTest, AcceptsOverloadedFunction) {
235198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // C++Builder requires C-style casts rather than static_cast.
235298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_PRED1((bool (*)(int))(IsPositive), 5);  // NOLINT
235398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0);  // NOLINT
23544b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23554b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23564b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that template functions can be used in *_PRED* as long as
23574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// their types are explicitly specified.
23584b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(PredicateAssertionTest, AcceptsTemplateFunction) {
23594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED1(IsNegative<int>, -5);
23604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Makes sure that we can handle templates with more than one
23614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // parameter.
23624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED2((GreaterThan<int, int>), 5, 0);
23634b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23644b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23654b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23664b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Some helper functions for testing using overloaded/template
23674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn.
23684b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2369b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wanAssertionResult IsPositiveFormat(const char* /* expr */, int n) {
2370760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  return n > 0 ? AssertionSuccess() :
2371760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      AssertionFailure(Message() << "Failure");
23724b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23734b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2374b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wanAssertionResult IsPositiveFormat(const char* /* expr */, double x) {
2375760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  return x > 0 ? AssertionSuccess() :
2376760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      AssertionFailure(Message() << "Failure");
23774b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23794b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename T>
2380b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wanAssertionResult IsNegativeFormat(const char* /* expr */, T x) {
2381760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  return x < 0 ? AssertionSuccess() :
2382760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      AssertionFailure(Message() << "Failure");
23834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23854b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename T1, typename T2>
2386b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wanAssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */,
2387760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian                             const T1& x1, const T2& x2) {
2388760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  return x1 == x2 ? AssertionSuccess() :
2389760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      AssertionFailure(Message() << "Failure");
23904b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23914b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that overloaded functions can be used in *_PRED_FORMAT*
2393b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan// without explicitly specifying their types.
23944b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) {
23954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED_FORMAT1(IsPositiveFormat, 5);
23964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0);
23974b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
23984b6829f0d28990dd645e16386eb226d0f10c8731shiqian
23994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that template functions can be used in *_PRED_FORMAT* without
24004b6829f0d28990dd645e16386eb226d0f10c8731shiqian// explicitly specifying their types.
24014b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) {
24024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED_FORMAT1(IsNegativeFormat, -5);
24034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3);
24044b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24054b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests string assertions.
24084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24094b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_STREQ with non-NULL arguments.
24104b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, ASSERT_STREQ) {
24114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char * const p1 = "good";
24124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ(p1, p1);
24134b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Let p2 have the same content as p1, but be at a different address.
24154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char p2[] = "good";
24164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ(p1, p2);
24174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STREQ("bad", "good"),
24194b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: \"bad\"");
24204b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_STREQ with NULL arguments.
24234b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, ASSERT_STREQ_Null) {
24244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ(static_cast<const char *>(NULL), NULL);
24254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, "non-null"),
24264b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "non-null");
24274b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_STREQ with NULL arguments.
24304b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, ASSERT_STREQ_Null2) {
24314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STREQ("non-null", NULL),
24324b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "non-null");
24334b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_STRNE.
24364b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, ASSERT_STRNE) {
24374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE("hi", "Hi");
24384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE("Hi", NULL);
24394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE(NULL, "Hi");
24404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE("", NULL);
24414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE(NULL, "");
24424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE("", "Hi");
24434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE("Hi", "");
24444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STRNE("Hi", "Hi"),
24454b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "\"Hi\" vs \"Hi\"");
24464b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_STRCASEEQ.
24494b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, ASSERT_STRCASEEQ) {
24504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASEEQ("hi", "Hi");
24514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL);
24524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASEEQ("", "");
24544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("Hi", "hi2"),
24554b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "(ignoring case)");
24564b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_STRCASENE.
24594b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, ASSERT_STRCASENE) {
24604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE("hi1", "Hi2");
24614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE("Hi", NULL);
24624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE(NULL, "Hi");
24634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE("", NULL);
24644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE(NULL, "");
24654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE("", "Hi");
24664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE("Hi", "");
24674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("Hi", "hi"),
24684b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "(ignoring case)");
24694b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests *_STREQ on wide strings.
24724b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, STREQ_Wide) {
24734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // NULL strings.
24744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL);
24754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Empty strings.
24774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ(L"", L"");
24784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Non-null vs NULL.
24804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"non-null", NULL),
24814b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "non-null");
24824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Equal strings.
24844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ(L"Hi", L"Hi");
24854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Unequal strings.
24874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc", L"Abc"),
24884b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Abc");
24894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
24904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Strings containing wide characters.
24914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc\x8119", L"abc\x8120"),
24924b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "abc");
24937a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
24947a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  // The streaming variation.
24957a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
24967a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com    EXPECT_STREQ(L"abc\x8119", L"abc\x8121") << "Expected failure";
24977a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  }, "Expected failure");
24984b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
24994b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25004b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests *_STRNE on wide strings.
25014b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StringAssertionTest, STRNE_Wide) {
25024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // NULL strings.
25034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
25044b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL);
25054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
25064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Empty strings.
25084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"", L""),
25094b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "L\"\"");
25104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Non-null vs NULL.
25124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE(L"non-null", NULL);
25134b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Equal strings.
25154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"Hi", L"Hi"),
25164b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "L\"Hi\"");
25174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Unequal strings.
25194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STRNE(L"abc", L"Abc");
25204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Strings containing wide characters.
25224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"abc\x8119", L"abc\x8119"),
25234b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "abc");
25247a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
25257a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  // The streaming variation.
25267a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_STRNE(L"abc\x8119", L"abc\x8120") << "This shouldn't happen";
25274b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
25284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests for ::testing::IsSubstring().
25304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsSubstring() returns the correct result when the input
25324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is const char*.
25334b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsSubstringTest, ReturnsCorrectResultForCString) {
25344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsSubstring("", "", NULL, "a"));
25354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsSubstring("", "", "b", NULL));
25364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsSubstring("", "", "needle", "haystack"));
25374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsSubstring("", "", static_cast<const char*>(NULL), NULL));
25394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsSubstring("", "", "needle", "two needles"));
25404b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
25414b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsSubstring() returns the correct result when the input
25434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is const wchar_t*.
25444b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsSubstringTest, ReturnsCorrectResultForWideCString) {
254598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FALSE(IsSubstring("", "", kNull, L"a"));
254698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FALSE(IsSubstring("", "", L"b", kNull));
25474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsSubstring("", "", L"needle", L"haystack"));
25484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsSubstring("", "", static_cast<const wchar_t*>(NULL), NULL));
25504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsSubstring("", "", L"needle", L"two needles"));
25514b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
25524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsSubstring() generates the correct message when the input
25544b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is const char*.
25554b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsSubstringTest, GeneratesCorrectMessageForCString) {
25564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("Value of: needle_expr\n"
25574b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "  Actual: \"needle\"\n"
25584b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Expected: a substring of haystack_expr\n"
25594b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Which is: \"haystack\"",
2560760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian               IsSubstring("needle_expr", "haystack_expr",
2561760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian                           "needle", "haystack").failure_message());
25624b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
25634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsSubstring returns the correct result when the input
25654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is ::std::string.
25664b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsSubstringTest, ReturnsCorrectResultsForStdString) {
2567760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  EXPECT_TRUE(IsSubstring("", "", std::string("hello"), "ahellob"));
2568760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  EXPECT_FALSE(IsSubstring("", "", "hello", std::string("world")));
25694b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
25704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25714b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_STD_WSTRING
25724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsSubstring returns the correct result when the input
25734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is ::std::wstring.
25744b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) {
25754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
25764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsSubstring("", "", L"needle", ::std::wstring(L"haystack")));
25774b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
25784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsSubstring() generates the correct message when the input
25804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is ::std::wstring.
25814b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsSubstringTest, GeneratesCorrectMessageForWstring) {
25824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("Value of: needle_expr\n"
25834b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "  Actual: L\"needle\"\n"
25844b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Expected: a substring of haystack_expr\n"
25854b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Which is: L\"haystack\"",
2586760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian               IsSubstring(
25874b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   "needle_expr", "haystack_expr",
25884b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   ::std::wstring(L"needle"), L"haystack").failure_message());
25894b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
25904b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25914b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_STD_WSTRING
25924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests for ::testing::IsNotSubstring().
25944b6829f0d28990dd645e16386eb226d0f10c8731shiqian
25954b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsNotSubstring() returns the correct result when the input
25964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is const char*.
25974b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsNotSubstringTest, ReturnsCorrectResultForCString) {
25984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsNotSubstring("", "", "needle", "haystack"));
25994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsNotSubstring("", "", "needle", "two needles"));
26004b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
26014b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsNotSubstring() returns the correct result when the input
26034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is const wchar_t*.
26044b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) {
26054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsNotSubstring("", "", L"needle", L"haystack"));
26064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsNotSubstring("", "", L"needle", L"two needles"));
26074b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
26084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26094b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsNotSubstring() generates the correct message when the input
26104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is const wchar_t*.
26114b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) {
26124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("Value of: needle_expr\n"
26134b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "  Actual: L\"needle\"\n"
26144b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Expected: not a substring of haystack_expr\n"
26154b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Which is: L\"two needles\"",
2616760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian               IsNotSubstring(
26174b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   "needle_expr", "haystack_expr",
26184b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   L"needle", L"two needles").failure_message());
26194b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
26204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsNotSubstring returns the correct result when the input
26224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is ::std::string.
26234b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) {
26244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(IsNotSubstring("", "", std::string("hello"), "ahellob"));
26254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsNotSubstring("", "", "hello", std::string("world")));
26264b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
26274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsNotSubstring() generates the correct message when the input
26294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is ::std::string.
26304b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) {
26314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("Value of: needle_expr\n"
26324b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "  Actual: \"needle\"\n"
26334b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Expected: not a substring of haystack_expr\n"
26344b6829f0d28990dd645e16386eb226d0f10c8731shiqian               "Which is: \"two needles\"",
2635760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian               IsNotSubstring(
26364b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   "needle_expr", "haystack_expr",
26374b6829f0d28990dd645e16386eb226d0f10c8731shiqian                   ::std::string("needle"), "two needles").failure_message());
26384b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
26394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26404b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_STD_WSTRING
26414b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that IsNotSubstring returns the correct result when the input
26434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// argument type is ::std::wstring.
26444b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) {
26454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(
26464b6829f0d28990dd645e16386eb226d0f10c8731shiqian      IsNotSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
26474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(IsNotSubstring("", "", L"needle", ::std::wstring(L"haystack")));
26484b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
26494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26504b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_STD_WSTRING
26514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests floating-point assertions.
26534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26544b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename RawType>
2655760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass FloatingPointTest : public Test {
26564b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
265798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // Pre-calculated numbers to be used by the tests.
265898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  struct TestValues {
265998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType close_to_positive_zero;
266098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType close_to_negative_zero;
266198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType further_from_negative_zero;
266298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
266398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType close_to_one;
266498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType further_from_one;
266598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
266698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType infinity;
266798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType close_to_infinity;
266898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType further_from_infinity;
266998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
267098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType nan1;
267198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    RawType nan2;
267298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  };
267398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
26744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  typedef typename testing::internal::FloatingPoint<RawType> Floating;
26754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  typedef typename Floating::Bits Bits;
26764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
26784b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const size_t max_ulps = Floating::kMaxUlps;
26794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26804b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // The bits that represent 0.0.
26814b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const Bits zero_bits = Floating(0).bits();
26824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26834b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Makes some numbers close to 0.0.
268498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.close_to_positive_zero = Floating::ReinterpretBits(
268598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan        zero_bits + max_ulps/2);
268698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.close_to_negative_zero = -Floating::ReinterpretBits(
26874b6829f0d28990dd645e16386eb226d0f10c8731shiqian        zero_bits + max_ulps - max_ulps/2);
268898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.further_from_negative_zero = -Floating::ReinterpretBits(
26894b6829f0d28990dd645e16386eb226d0f10c8731shiqian        zero_bits + max_ulps + 1 - max_ulps/2);
26904b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26914b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // The bits that represent 1.0.
26924b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const Bits one_bits = Floating(1).bits();
26934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26944b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Makes some numbers close to 1.0.
269598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps);
269698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.further_from_one = Floating::ReinterpretBits(
269798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan        one_bits + max_ulps + 1);
26984b6829f0d28990dd645e16386eb226d0f10c8731shiqian
26994b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // +infinity.
270098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.infinity = Floating::Infinity();
27014b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27024b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // The bits that represent +infinity.
270398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    const Bits infinity_bits = Floating(values_.infinity).bits();
27044b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27054b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Makes some numbers close to infinity.
270698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.close_to_infinity = Floating::ReinterpretBits(
270798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan        infinity_bits - max_ulps);
270898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.further_from_infinity = Floating::ReinterpretBits(
27094b6829f0d28990dd645e16386eb226d0f10c8731shiqian        infinity_bits - max_ulps - 1);
27104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
271198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    // Makes some NAN's.  Sets the most significant bit of the fraction so that
271298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    // our NaN's are quiet; trying to process a signaling NaN would raise an
271398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    // exception if our environment enables floating point exceptions.
271498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask
271598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 1);
271698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask
271798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 200);
27184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
27194b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void TestSize() {
27214b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(sizeof(RawType), sizeof(Bits));
27224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
27234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
272498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  static TestValues values_;
27254b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
27264b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27274b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename RawType>
272898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wantypename FloatingPointTest<RawType>::TestValues
272998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    FloatingPointTest<RawType>::values_;
27304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Instantiates FloatingPointTest for testing *_FLOAT_EQ.
27324b6829f0d28990dd645e16386eb226d0f10c8731shiqiantypedef FloatingPointTest<float> FloatTest;
27334b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the size of Float::Bits matches the size of float.
27354b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, Size) {
27364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestSize();
27374b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
27384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing with +0 and -0.
27404b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, Zeros) {
27414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FLOAT_EQ(0.0, -0.0);
27424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0),
27434b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "1.0");
27444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5),
27454b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "1.5");
27464b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
27474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing numbers close to 0.
27494b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
27504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This ensures that *_FLOAT_EQ handles the sign correctly and no
27514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// overflow occurs when comparing numbers whose absolute value is very
27524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// small.
27534b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, AlmostZeros) {
275498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // In C++Builder, names within local classes (such as used by
275598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
275698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // scoping class.  Use a static local alias as a workaround.
2757673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // We use the assignment syntax since some compilers, like Sun Studio,
2758673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // don't allow initializing references using construction syntax
2759673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // (parentheses).
2760673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  static const FloatTest::TestValues& v = this->values_;
276198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
276298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero);
276398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero);
276498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
27654b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
276798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    ASSERT_FLOAT_EQ(v.close_to_positive_zero,
276898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                    v.further_from_negative_zero);
276998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "v.further_from_negative_zero");
27704b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
27714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing numbers close to each other.
27734b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, SmallDiff) {
277498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FLOAT_EQ(1.0, values_.close_to_one);
277598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one),
277698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "values_.further_from_one");
27774b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
27784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing numbers far apart.
27804b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, LargeDiff) {
27814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0),
27824b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "3.0");
27834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
27844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
27854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing with infinity.
27864b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
27874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This ensures that no overflow occurs when comparing numbers whose
27884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// absolute value is very large.
27894b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, Infinity) {
279098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity);
279198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity);
27924cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_OS_SYMBIAN
2793e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Nokia's STLport crashes if we try to output infinity or NaN.
279498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity),
279598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "-values_.infinity");
27964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
279798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // This is interesting as the representations of infinity and nan1
27984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // are only 1 DLP apart.
279998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1),
280098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "values_.nan1");
28014cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_OS_SYMBIAN
28024b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
28034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that comparing with NAN always returns false.
28054b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, NaN) {
28064cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_OS_SYMBIAN
2807e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Nokia's STLport crashes if we try to output infinity or NaN.
280898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
280998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // In C++Builder, names within local classes (such as used by
281098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
281198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // scoping class.  Use a static local alias as a workaround.
2812673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // We use the assignment syntax since some compilers, like Sun Studio,
2813673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // don't allow initializing references using construction syntax
2814673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // (parentheses).
2815673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  static const FloatTest::TestValues& v = this->values_;
281698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
281798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1),
281898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "v.nan1");
281998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2),
282098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "v.nan2");
282198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1),
282298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "v.nan1");
282398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
282498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity),
282598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                       "v.infinity");
28264cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_OS_SYMBIAN
28274b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
28284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that *_FLOAT_EQ are reflexive.
28304b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, Reflexive) {
28314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FLOAT_EQ(0.0, 0.0);
28324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FLOAT_EQ(1.0, 1.0);
283398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  ASSERT_FLOAT_EQ(values_.infinity, values_.infinity);
28344b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
28354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that *_FLOAT_EQ are commutative.
28374b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, Commutative) {
283898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one).
283998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FLOAT_EQ(values_.close_to_one, 1.0);
28404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
284198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one).
284298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0),
28434b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "1.0");
28444b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
28454b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28464b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_NEAR.
28474b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, EXPECT_NEAR) {
28484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NEAR(-1.0f, -1.1f, 0.2f);
28494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NEAR(2.0f, 3.0f, 1.0f);
285065de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
285165de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                          "The difference between 1.0f and 1.5f is 0.5, "
285265de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                          "which exceeds 0.25f");
28534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // To work around a bug in gcc 2.95.0, there is intentionally no
28544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // space after the first comma in the previous line.
28554b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
28564b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_NEAR.
28584b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, ASSERT_NEAR) {
28594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_NEAR(-1.0f, -1.1f, 0.2f);
28604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_NEAR(2.0f, 3.0f, 1.0f);
286165de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
286265de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                       "The difference between 1.0f and 1.5f is 0.5, "
286365de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                       "which exceeds 0.25f");
28644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // To work around a bug in gcc 2.95.0, there is intentionally no
28654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // space after the first comma in the previous line.
28664b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
28674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the cases where FloatLE() should succeed.
28694b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, FloatLESucceeds) {
2870760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f);  // When val1 < val2,
2871760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f);  // val1 == val2,
28724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // or when val1 is greater than, but almost equals to, val2.
287498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f);
28754b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
28764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the cases where FloatLE() should fail.
28784b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FloatTest, FloatLEFails) {
28794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // When val1 is greater than val2 by a large margin,
2880760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f),
28814b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "(2.0f) <= (1.0f)");
28824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
28834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // or by a small yet non-negligible margin,
28844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
288598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f);
288698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "(values_.further_from_one) <= (1.0f)");
28874b6829f0d28990dd645e16386eb226d0f10c8731shiqian
288898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
2889e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Nokia's STLport crashes if we try to output infinity or NaN.
289098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // C++Builder gives bad results for ordered comparisons involving NaNs
289198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // due to compiler bugs.
28924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
289398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity);
289498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "(values_.nan1) <= (values_.infinity)");
28954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
289698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1);
289798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "(-values_.infinity) <= (values_.nan1)");
28984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
289998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1);
290098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "(values_.nan1) <= (values_.nan1)");
290198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
29024b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Instantiates FloatingPointTest for testing *_DOUBLE_EQ.
29054b6829f0d28990dd645e16386eb226d0f10c8731shiqiantypedef FloatingPointTest<double> DoubleTest;
29064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the size of Double::Bits matches the size of double.
29084b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, Size) {
29094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestSize();
29104b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing with +0 and -0.
29134b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, Zeros) {
29144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_DOUBLE_EQ(0.0, -0.0);
29154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0),
29164b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "1.0");
29174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0),
29184b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "1.0");
29194b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing numbers close to 0.
29224b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
29234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This ensures that *_DOUBLE_EQ handles the sign correctly and no
29244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// overflow occurs when comparing numbers whose absolute value is very
29254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// small.
29264b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, AlmostZeros) {
292798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // In C++Builder, names within local classes (such as used by
292898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
292998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // scoping class.  Use a static local alias as a workaround.
2930673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // We use the assignment syntax since some compilers, like Sun Studio,
2931673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // don't allow initializing references using construction syntax
2932673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // (parentheses).
2933673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  static const DoubleTest::TestValues& v = this->values_;
293498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
293598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero);
293698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero);
293798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
29384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
294098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    ASSERT_DOUBLE_EQ(v.close_to_positive_zero,
294198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                     v.further_from_negative_zero);
294298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "v.further_from_negative_zero");
29434b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing numbers close to each other.
29464b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, SmallDiff) {
294798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_DOUBLE_EQ(1.0, values_.close_to_one);
294898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one),
294998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "values_.further_from_one");
29504b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing numbers far apart.
29534b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, LargeDiff) {
29544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0),
29554b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "3.0");
29564b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests comparing with infinity.
29594b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
29604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This ensures that no overflow occurs when comparing numbers whose
29614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// absolute value is very large.
29624b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, Infinity) {
296398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity);
296498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity);
29654cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_OS_SYMBIAN
2966e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Nokia's STLport crashes if we try to output infinity or NaN.
296798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity),
296898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "-values_.infinity");
29694b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // This is interesting as the representations of infinity_ and nan1_
29714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // are only 1 DLP apart.
297298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1),
297398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "values_.nan1");
29744cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_OS_SYMBIAN
29754b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that comparing with NAN always returns false.
29784b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, NaN) {
29794cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_OS_SYMBIAN
298098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // In C++Builder, names within local classes (such as used by
298198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
298298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // scoping class.  Use a static local alias as a workaround.
2983673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // We use the assignment syntax since some compilers, like Sun Studio,
2984673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // don't allow initializing references using construction syntax
2985673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  // (parentheses).
2986673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev  static const DoubleTest::TestValues& v = this->values_;
298798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
2988e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Nokia's STLport crashes if we try to output infinity or NaN.
298998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1),
299098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "v.nan1");
299198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), "v.nan2");
299298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), "v.nan1");
299398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity),
299498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                       "v.infinity");
29954cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_OS_SYMBIAN
29964b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
29974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
29984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that *_DOUBLE_EQ are reflexive.
29994b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, Reflexive) {
30004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_DOUBLE_EQ(0.0, 0.0);
30014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_DOUBLE_EQ(1.0, 1.0);
30024cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if !GTEST_OS_SYMBIAN
3003e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Nokia's STLport crashes if we try to output infinity or NaN.
300498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity);
30054cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // !GTEST_OS_SYMBIAN
30064b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30074b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30084b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that *_DOUBLE_EQ are commutative.
30094b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, Commutative) {
301098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one).
301198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0);
30124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
301398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one).
301498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0),
301598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                          "1.0");
30164b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_NEAR.
30194b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, EXPECT_NEAR) {
30204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NEAR(-1.0, -1.1, 0.2);
30214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NEAR(2.0, 3.0, 1.0);
302265de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25),  // NOLINT
302365de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                          "The difference between 1.0 and 1.5 is 0.5, "
302465de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                          "which exceeds 0.25");
30254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // To work around a bug in gcc 2.95.0, there is intentionally no
30264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // space after the first comma in the previous statement.
30274b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_NEAR.
30304b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, ASSERT_NEAR) {
30314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_NEAR(-1.0, -1.1, 0.2);
30324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_NEAR(2.0, 3.0, 1.0);
303365de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25),  // NOLINT
303465de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                       "The difference between 1.0 and 1.5 is 0.5, "
303565de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan                       "which exceeds 0.25");
30364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // To work around a bug in gcc 2.95.0, there is intentionally no
30374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // space after the first comma in the previous statement.
30384b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the cases where DoubleLE() should succeed.
30414b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, DoubleLESucceeds) {
3042760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0);  // When val1 < val2,
3043760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0);  // val1 == val2,
30444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // or when val1 is greater than, but almost equals to, val2.
304698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0);
30474b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30494b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the cases where DoubleLE() should fail.
30504b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DoubleTest, DoubleLEFails) {
30514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // When val1 is greater than val2 by a large margin,
3052760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0),
30534b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "(2.0) <= (1.0)");
30544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // or by a small yet non-negligible margin,
30564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
305798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0);
305898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "(values_.further_from_one) <= (1.0)");
30594b6829f0d28990dd645e16386eb226d0f10c8731shiqian
306098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
3061e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  // Nokia's STLport crashes if we try to output infinity or NaN.
306298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // C++Builder gives bad results for ordered comparisons involving NaNs
306398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // due to compiler bugs.
30644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
306598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity);
306698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "(values_.nan1) <= (values_.infinity)");
30674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
306898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1);
306998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, " (-values_.infinity) <= (values_.nan1)");
30704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
307198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1);
307298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }, "(values_.nan1) <= (values_.nan1)");
307398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
30744b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Verifies that a test or test case whose name starts with DISABLED_ is
30784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// not run.
30794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A test whose name starts with DISABLED_.
30814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Should not run.
30824b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(DisabledTest, DISABLED_TestShouldNotRun) {
30834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "Unexpected failure: Disabled test should not be run.";
30844b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A test whose name does not start with DISABLED_.
30874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Should run.
30884b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(DisabledTest, NotDISABLED_TestShouldRun) {
30894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, 1);
30904b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30914b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A test case whose name starts with DISABLED_.
30934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Should not run.
30944b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(DISABLED_TestCase, TestShouldNotRun) {
30954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
30964b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
30974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
30984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A test case and test whose names start with DISABLED_.
30994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Should not run.
31004b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) {
31014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
31024b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
31034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
31044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Check that when all tests in a test case are disabled, SetupTestCase() and
31054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TearDownTestCase() are not called.
3106760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass DisabledTestsTest : public Test {
31074b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
31084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void SetUpTestCase() {
31094b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Unexpected failure: All tests disabled in test case. "
31104b6829f0d28990dd645e16386eb226d0f10c8731shiqian              "SetupTestCase() should not be called.";
31114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
31124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
31134b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void TearDownTestCase() {
31144b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Unexpected failure: All tests disabled in test case. "
31154b6829f0d28990dd645e16386eb226d0f10c8731shiqian              "TearDownTestCase() should not be called.";
31164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
31174b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
31184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
31194b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) {
31204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "Unexpected failure: Disabled test should not be run.";
31214b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
31224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
31234b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) {
31244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FAIL() << "Unexpected failure: Disabled test should not be run.";
31254b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
31264b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3127e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Tests that disabled typed tests aren't run.
3128e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
31294cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_TYPED_TEST
3130e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3131e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
3132e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypedTest : public Test {
3133e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
3134e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3135e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantypedef testing::Types<int, double> NumericTypes;
3136e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE(TypedTest, NumericTypes);
3137e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3138e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST(TypedTest, DISABLED_ShouldNotRun) {
3139e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  FAIL() << "Unexpected failure: Disabled typed test should not run.";
3140e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
3141e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3142e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
3143e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass DISABLED_TypedTest : public Test {
3144e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
3145e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3146e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes);
3147e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3148e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST(DISABLED_TypedTest, ShouldNotRun) {
3149e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  FAIL() << "Unexpected failure: Disabled typed test should not run.";
3150e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
3151e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3152e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#endif  // GTEST_HAS_TYPED_TEST
3153e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3154e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Tests that disabled type-parameterized tests aren't run.
3155e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
31564cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_TYPED_TEST_P
3157e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3158e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
3159e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypedTestP : public Test {
3160e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
3161e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3162e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE_P(TypedTestP);
3163e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3164e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) {
3165e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  FAIL() << "Unexpected failure: "
3166e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian         << "Disabled type-parameterized test should not run.";
3167e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
3168e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3169e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianREGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun);
3170e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3171e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianINSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes);
3172e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3173e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <typename T>
3174e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass DISABLED_TypedTestP : public Test {
3175e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian};
3176e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3177e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_CASE_P(DISABLED_TypedTestP);
3178e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3179e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) {
3180e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian  FAIL() << "Unexpected failure: "
3181e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian         << "Disabled type-parameterized test should not run.";
3182e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}
3183e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3184e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianREGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun);
3185e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3186e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianINSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes);
3187e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
3188e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#endif  // GTEST_HAS_TYPED_TEST_P
31894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
31904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that assertion macros evaluate their arguments exactly once.
31914b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3192760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass SingleEvaluationTest : public Test {
3193acd0f32c50622ace5eb0c62b38820981c1ecd1e9tsunanet public:  // Must be public and not protected due to a bug in g++ 3.4.2.
31944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // This helper function is needed by the FailedASSERT_STREQ test
319598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // below.  It's public to work around C++Builder's bug with scoping local
319698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // classes.
31974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void CompareAndIncrementCharPtrs() {
31984b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_STREQ(p1_++, p2_++);
31994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
32004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
320198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // This helper function is needed by the FailedASSERT_NE test below.  It's
320298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // public to work around C++Builder's bug with scoping local classes.
32034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void CompareAndIncrementInts() {
32044b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_NE(a_++, b_++);
32054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
32064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
320798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan protected:
320898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  SingleEvaluationTest() {
320998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    p1_ = s1_;
321098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    p2_ = s2_;
321198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    a_ = 0;
321298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan    b_ = 0;
321398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  }
321498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
32154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const char* const s1_;
32164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const char* const s2_;
32174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const char* p1_;
32184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const char* p2_;
32194b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int a_;
32214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int b_;
32224b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
32234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32244b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* const SingleEvaluationTest::s1_ = "01234";
32254b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* const SingleEvaluationTest::s2_ = "abcde";
32264b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* SingleEvaluationTest::p1_;
32274b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* SingleEvaluationTest::p2_;
32284b6829f0d28990dd645e16386eb226d0f10c8731shiqianint SingleEvaluationTest::a_;
32294b6829f0d28990dd645e16386eb226d0f10c8731shiqianint SingleEvaluationTest::b_;
32304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that when ASSERT_STREQ fails, it evaluates its arguments
32324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// exactly once.
32334b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(SingleEvaluationTest, FailedASSERT_STREQ) {
323498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(),
32354b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "p2_++");
32364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(s1_ + 1, p1_);
32374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(s2_ + 1, p2_);
32384b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
32394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that string assertion arguments are evaluated exactly once.
32414b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(SingleEvaluationTest, ASSERT_STR) {
32424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // successful EXPECT_STRNE
32434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STRNE(p1_++, p2_++);
32444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(s1_ + 1, p1_);
32454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(s2_ + 1, p2_);
32464b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // failed EXPECT_STRCASEEQ
32484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++),
32494b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "ignoring case");
32504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(s1_ + 2, p1_);
32514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(s2_ + 2, p2_);
32524b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
32534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32544b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that when ASSERT_NE fails, it evaluates its arguments exactly
32554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// once.
32564b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(SingleEvaluationTest, FailedASSERT_NE) {
325798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(),
325898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan                       "(a_++) != (b_++)");
32594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, a_);
32604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, b_);
32614b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
32624b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that assertion arguments are evaluated exactly once.
32644b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(SingleEvaluationTest, OtherCases) {
32654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // successful EXPECT_TRUE
32664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(0 == a_++);  // NOLINT
32674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, a_);
32684b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // failed EXPECT_TRUE
32704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), "-1 == a_++");
32714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(2, a_);
32724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // successful EXPECT_GT
32744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_GT(a_++, b_++);
32754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(3, a_);
32764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, b_);
32774b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // failed EXPECT_LT
32794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), "(a_++) < (b_++)");
32804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(4, a_);
32814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(2, b_);
32824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // successful ASSERT_TRUE
32844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(0 < a_++);  // NOLINT
32854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(5, a_);
32864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // successful ASSERT_GT
32884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_GT(a_++, b_++);
32894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(6, a_);
32904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(3, b_);
32914b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
32924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
32939204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#if GTEST_HAS_EXCEPTIONS
32949204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
32959204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianvoid ThrowAnInteger() {
32969204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  throw 1;
32979204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
32989204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
32999204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Tests that assertion arguments are evaluated exactly once.
33009204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST_F(SingleEvaluationTest, ExceptionTests) {
33019204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  // successful EXPECT_THROW
33029204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_THROW({  // NOLINT
33039204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    a_++;
33049204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    ThrowAnInteger();
33059204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  }, int);
33069204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_EQ(1, a_);
33079204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
33089204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  // failed EXPECT_THROW, throws different
33099204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_THROW({  // NOLINT
33109204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    a_++;
33119204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    ThrowAnInteger();
33129204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  }, bool), "throws a different type");
33139204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_EQ(2, a_);
33149204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
33159204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  // failed EXPECT_THROW, throws nothing
33169204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), "throws nothing");
33179204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_EQ(3, a_);
33189204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
33199204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  // successful EXPECT_NO_THROW
33209204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NO_THROW(a_++);
33219204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_EQ(4, a_);
33229204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
33239204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  // failed EXPECT_NO_THROW
33249204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({  // NOLINT
33259204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    a_++;
33269204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    ThrowAnInteger();
33279204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  }), "it throws");
33289204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_EQ(5, a_);
33299204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
33309204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  // successful EXPECT_ANY_THROW
33319204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_ANY_THROW({  // NOLINT
33329204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    a_++;
33339204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    ThrowAnInteger();
33349204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  });
33359204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_EQ(6, a_);
33369204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
33379204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  // failed EXPECT_ANY_THROW
33389204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), "it doesn't");
33399204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_EQ(7, a_);
33409204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
33419204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
33429204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#endif  // GTEST_HAS_EXCEPTIONS
33434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3344e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE.
3345e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianclass NoFatalFailureTest : public Test {
3346e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian protected:
3347e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  void Succeeds() {}
3348e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  void FailsNonFatal() {
3349e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ADD_FAILURE() << "some non-fatal failure";
3350e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
3351e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  void Fails() {
3352e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    FAIL() << "some fatal failure";
3353e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
3354e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
3355e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  void DoAssertNoFatalFailureOnFails() {
3356e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ASSERT_NO_FATAL_FAILURE(Fails());
3357e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ADD_FAILURE() << "shold not reach here.";
3358e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
3359e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
3360e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  void DoExpectNoFatalFailureOnFails() {
3361e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    EXPECT_NO_FATAL_FAILURE(Fails());
3362e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ADD_FAILURE() << "other failure";
3363e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
3364e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian};
3365e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
3366e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(NoFatalFailureTest, NoFailure) {
3367e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NO_FATAL_FAILURE(Succeeds());
3368e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  ASSERT_NO_FATAL_FAILURE(Succeeds());
3369e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
3370e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
3371e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(NoFatalFailureTest, NonFatalIsNoFailure) {
3372e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE(
3373e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      EXPECT_NO_FATAL_FAILURE(FailsNonFatal()),
3374e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      "some non-fatal failure");
3375e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_NONFATAL_FAILURE(
3376e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      ASSERT_NO_FATAL_FAILURE(FailsNonFatal()),
3377e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian      "some non-fatal failure");
3378e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
3379e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
3380e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) {
3381e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  TestPartResultArray gtest_failures;
3382e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  {
3383e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
3384e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    DoAssertNoFatalFailureOnFails();
3385e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
3386e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  ASSERT_EQ(2, gtest_failures.size());
3387334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan  EXPECT_EQ(TestPartResult::kFatalFailure,
3388e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            gtest_failures.GetTestPartResult(0).type());
3389334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan  EXPECT_EQ(TestPartResult::kFatalFailure,
3390e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            gtest_failures.GetTestPartResult(1).type());
3391e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
3392e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                      gtest_failures.GetTestPartResult(0).message());
3393e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
3394e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                      gtest_failures.GetTestPartResult(1).message());
3395e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
3396e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
3397e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) {
3398e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  TestPartResultArray gtest_failures;
3399e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  {
3400e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
3401e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    DoExpectNoFatalFailureOnFails();
3402e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
3403e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  ASSERT_EQ(3, gtest_failures.size());
3404334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan  EXPECT_EQ(TestPartResult::kFatalFailure,
3405e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            gtest_failures.GetTestPartResult(0).type());
3406334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan  EXPECT_EQ(TestPartResult::kNonFatalFailure,
3407e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            gtest_failures.GetTestPartResult(1).type());
3408334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan  EXPECT_EQ(TestPartResult::kNonFatalFailure,
3409e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            gtest_failures.GetTestPartResult(2).type());
3410e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
3411e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                      gtest_failures.GetTestPartResult(0).message());
3412e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
3413e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                      gtest_failures.GetTestPartResult(1).message());
3414e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_PRED_FORMAT2(testing::IsSubstring, "other failure",
3415e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                      gtest_failures.GetTestPartResult(2).message());
3416e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
3417e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
3418e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST_F(NoFatalFailureTest, MessageIsStreamable) {
3419e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  TestPartResultArray gtest_failures;
3420e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  {
3421e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
3422e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    EXPECT_NO_FATAL_FAILURE(FAIL() << "foo") << "my message";
3423e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  }
3424e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  ASSERT_EQ(2, gtest_failures.size());
3425334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan  EXPECT_EQ(TestPartResult::kNonFatalFailure,
3426e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            gtest_failures.GetTestPartResult(0).type());
3427334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan  EXPECT_EQ(TestPartResult::kNonFatalFailure,
3428e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            gtest_failures.GetTestPartResult(1).type());
3429e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_PRED_FORMAT2(testing::IsSubstring, "foo",
3430e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                      gtest_failures.GetTestPartResult(0).message());
3431e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  EXPECT_PRED_FORMAT2(testing::IsSubstring, "my message",
3432e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                      gtest_failures.GetTestPartResult(1).message());
3433e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
3434e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
34354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests non-string assertions.
34364b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3437d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comstd::string EditsToString(const std::vector<EditType>& edits) {
3438d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  std::string out;
3439d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  for (size_t i = 0; i < edits.size(); ++i) {
3440d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    static const char kEdits[] = " +-/";
3441d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    out.append(1, kEdits[edits[i]]);
3442d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  }
3443d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  return out;
3444d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}
3445d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com
3446d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comstd::vector<size_t> CharsToIndices(const std::string& str) {
3447d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  std::vector<size_t> out;
3448d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  for (size_t i = 0; i < str.size(); ++i) {
3449d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    out.push_back(str[i]);
3450d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  }
3451d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  return out;
3452d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}
3453d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com
3454d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comstd::vector<std::string> CharsToLines(const std::string& str) {
3455d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  std::vector<std::string> out;
3456d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  for (size_t i = 0; i < str.size(); ++i) {
3457d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    out.push_back(str.substr(i, 1));
3458d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  }
3459d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  return out;
3460d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}
3461d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com
3462d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comTEST(EditDistance, TestCases) {
3463d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  struct Case {
3464d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    int line;
3465d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    const char* left;
3466d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    const char* right;
3467d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    const char* expected_edits;
3468d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    const char* expected_diff;
3469d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  };
3470d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  static const Case kCases[] = {
3471d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      // No change.
3472d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "A", "A", " ", ""},
3473d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "ABCDE", "ABCDE", "     ", ""},
3474d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      // Simple adds.
3475d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "X", "XA", " +", "@@ +1,2 @@\n X\n+A\n"},
3476d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "X", "XABCD", " ++++", "@@ +1,5 @@\n X\n+A\n+B\n+C\n+D\n"},
3477d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      // Simple removes.
3478d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "XA", "X", " -", "@@ -1,2 @@\n X\n-A\n"},
3479d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "XABCD", "X", " ----", "@@ -1,5 @@\n X\n-A\n-B\n-C\n-D\n"},
3480d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      // Simple replaces.
3481d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "A", "a", "/", "@@ -1,1 +1,1 @@\n-A\n+a\n"},
3482d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "ABCD", "abcd", "////",
3483d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com       "@@ -1,4 +1,4 @@\n-A\n-B\n-C\n-D\n+a\n+b\n+c\n+d\n"},
3484d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      // Path finding.
3485d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "ABCDEFGH", "ABXEGH1", "  -/ -  +",
3486d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com       "@@ -1,8 +1,7 @@\n A\n B\n-C\n-D\n+X\n E\n-F\n G\n H\n+1\n"},
3487d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "AAAABCCCC", "ABABCDCDC", "- /   + / ",
3488d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com       "@@ -1,9 +1,9 @@\n-A\n A\n-A\n+B\n A\n B\n C\n+D\n C\n-C\n+D\n C\n"},
3489d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "ABCDE", "BCDCD", "-   +/",
3490d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com       "@@ -1,5 +1,5 @@\n-A\n B\n C\n D\n-E\n+C\n+D\n"},
3491d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {__LINE__, "ABCDEFGHIJKL", "BCDCDEFGJKLJK", "- ++     --   ++",
3492d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com       "@@ -1,4 +1,5 @@\n-A\n B\n+C\n+D\n C\n D\n"
3493d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com       "@@ -6,7 +7,7 @@\n F\n G\n-H\n-I\n J\n K\n L\n+J\n+K\n"},
3494d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      {}};
3495d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  for (const Case* c = kCases; c->left; ++c) {
3496d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    EXPECT_TRUE(c->expected_edits ==
3497d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com                EditsToString(CalculateOptimalEdits(CharsToIndices(c->left),
3498d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com                                                    CharsToIndices(c->right))))
3499d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com        << "Left <" << c->left << "> Right <" << c->right << "> Edits <"
3500d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com        << EditsToString(CalculateOptimalEdits(
3501d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com               CharsToIndices(c->left), CharsToIndices(c->right))) << ">";
3502d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com    EXPECT_TRUE(c->expected_diff == CreateUnifiedDiff(CharsToLines(c->left),
3503d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com                                                      CharsToLines(c->right)))
3504d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com        << "Left <" << c->left << "> Right <" << c->right << "> Diff <"
3505d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com        << CreateUnifiedDiff(CharsToLines(c->left), CharsToLines(c->right))
3506d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com        << ">";
3507d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  }
3508d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}
3509d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com
35104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EqFailure(), used for implementing *EQ* assertions.
35114b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, EqFailure) {
351203c314931649a999b0cf5deb0a434a1009157416jgm@google.com  const std::string foo_val("5"), bar_val("6");
351303c314931649a999b0cf5deb0a434a1009157416jgm@google.com  const std::string msg1(
35144b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EqFailure("foo", "bar", foo_val, bar_val, false)
35154b6829f0d28990dd645e16386eb226d0f10c8731shiqian      .failure_message());
35164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ(
35174b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Value of: bar\n"
35184b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "  Actual: 6\n"
35194b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Expected: foo\n"
35204b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Which is: 5",
35214b6829f0d28990dd645e16386eb226d0f10c8731shiqian      msg1.c_str());
35224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
352303c314931649a999b0cf5deb0a434a1009157416jgm@google.com  const std::string msg2(
35244b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EqFailure("foo", "6", foo_val, bar_val, false)
35254b6829f0d28990dd645e16386eb226d0f10c8731shiqian      .failure_message());
35264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ(
35274b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Value of: 6\n"
35284b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Expected: foo\n"
35294b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Which is: 5",
35304b6829f0d28990dd645e16386eb226d0f10c8731shiqian      msg2.c_str());
35314b6829f0d28990dd645e16386eb226d0f10c8731shiqian
353203c314931649a999b0cf5deb0a434a1009157416jgm@google.com  const std::string msg3(
35334b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EqFailure("5", "bar", foo_val, bar_val, false)
35344b6829f0d28990dd645e16386eb226d0f10c8731shiqian      .failure_message());
35354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ(
35364b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Value of: bar\n"
35374b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "  Actual: 6\n"
35384b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Expected: 5",
35394b6829f0d28990dd645e16386eb226d0f10c8731shiqian      msg3.c_str());
35404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
354103c314931649a999b0cf5deb0a434a1009157416jgm@google.com  const std::string msg4(
35424b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EqFailure("5", "6", foo_val, bar_val, false).failure_message());
35434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ(
35444b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Value of: 6\n"
35454b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Expected: 5",
35464b6829f0d28990dd645e16386eb226d0f10c8731shiqian      msg4.c_str());
35474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
354803c314931649a999b0cf5deb0a434a1009157416jgm@google.com  const std::string msg5(
35494b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EqFailure("foo", "bar",
355003c314931649a999b0cf5deb0a434a1009157416jgm@google.com                std::string("\"x\""), std::string("\"y\""),
35514b6829f0d28990dd645e16386eb226d0f10c8731shiqian                true).failure_message());
35524b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ(
35534b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Value of: bar\n"
35544b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "  Actual: \"y\"\n"
35554b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Expected: foo (ignoring case)\n"
35564b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Which is: \"x\"",
35574b6829f0d28990dd645e16386eb226d0f10c8731shiqian      msg5.c_str());
35584b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
35594b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3560d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comTEST(AssertionTest, EqFailureWithDiff) {
3561d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  const std::string left(
3562d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "1\\n2XXX\\n3\\n5\\n6\\n7\\n8\\n9\\n10\\n11\\n12XXX\\n13\\n14\\n15");
3563d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  const std::string right(
3564d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n11\\n12\\n13\\n14");
3565d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  const std::string msg1(
3566d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      EqFailure("left", "right", left, right, false).failure_message());
3567d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com  EXPECT_STREQ(
3568d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "Value of: right\n"
3569d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "  Actual: 1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n11\\n12\\n13\\n14\n"
3570d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "Expected: left\n"
3571d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "Which is: "
3572d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "1\\n2XXX\\n3\\n5\\n6\\n7\\n8\\n9\\n10\\n11\\n12XXX\\n13\\n14\\n15\n"
3573d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "With diff:\n@@ -1,5 +1,6 @@\n 1\n-2XXX\n+2\n 3\n+4\n 5\n 6\n"
3574d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      "@@ -7,8 +8,6 @@\n 8\n 9\n-10\n 11\n-12XXX\n+12\n 13\n 14\n-15\n",
3575d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com      msg1.c_str());
3576d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}
3577d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com
35784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests AppendUserMessage(), used for implementing the *EQ* macros.
35794b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, AppendUserMessage) {
358003c314931649a999b0cf5deb0a434a1009157416jgm@google.com  const std::string foo("foo");
35814b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3582760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
35834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("foo",
35844b6829f0d28990dd645e16386eb226d0f10c8731shiqian               AppendUserMessage(foo, msg).c_str());
35854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
35864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << "bar";
35874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("foo\nbar",
35884b6829f0d28990dd645e16386eb226d0f10c8731shiqian               AppendUserMessage(foo, msg).c_str());
35894b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
35904b6829f0d28990dd645e16386eb226d0f10c8731shiqian
359198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
359298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Silences warnings: "Condition is always true", "Unreachable code"
3593733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option push -w-ccc -w-rch
359498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
359598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
35964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_TRUE.
35974b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_TRUE) {
35984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(2 > 1);  // NOLINT
35994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1),
36004b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "2 < 1");
36014b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
36024b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3603fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult.
3604fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(AssertionTest, AssertTrueWithAssertionResult) {
3605fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  ASSERT_TRUE(ResultIsEven(2));
3606ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#ifndef __BORLANDC__
3607ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan  // ICE's in C++Builder.
3608fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)),
3609fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Value of: ResultIsEven(3)\n"
3610fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "  Actual: false (3 is odd)\n"
3611fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Expected: true");
3612d6b4941ba371a4de8b8ea6b69bf50741cbe97292vladlosev#endif
3613fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  ASSERT_TRUE(ResultIsEvenNoExplanation(2));
3614fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)),
3615fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Value of: ResultIsEvenNoExplanation(3)\n"
3616fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "  Actual: false (3 is odd)\n"
3617fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Expected: true");
3618fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
3619fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
36204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_FALSE.
36214b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_FALSE) {
36224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_FALSE(2 < 1);  // NOLINT
36234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1),
36244b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Value of: 2 > 1\n"
36254b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "  Actual: true\n"
36264b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: false");
36274b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
36284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3629fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult.
3630fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(AssertionTest, AssertFalseWithAssertionResult) {
3631fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  ASSERT_FALSE(ResultIsEven(3));
3632ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#ifndef __BORLANDC__
3633ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan  // ICE's in C++Builder.
3634fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)),
3635fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Value of: ResultIsEven(2)\n"
3636fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "  Actual: true (2 is even)\n"
3637fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Expected: false");
3638d6b4941ba371a4de8b8ea6b69bf50741cbe97292vladlosev#endif
3639fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  ASSERT_FALSE(ResultIsEvenNoExplanation(3));
3640fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)),
3641fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Value of: ResultIsEvenNoExplanation(2)\n"
3642fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "  Actual: true\n"
3643fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                       "Expected: false");
3644fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
3645fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
364698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
364798efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Restores warnings after previous "#pragma option push" supressed them
3648733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option pop
364998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
365098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
36514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using ASSERT_EQ on double values.  The purpose is to make
36524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// sure that the specialization we did for integer and anonymous enums
36534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// isn't used for double arguments.
36544b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, ASSERT_EQ_Double) {
36554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success.
36564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(5.6, 5.6);
36574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
36584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure.
36594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2),
36604b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "5.1");
36614b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
36624b6829f0d28990dd645e16386eb226d0f10c8731shiqian
36634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_EQ.
36644b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_EQ) {
36654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(5, 2 + 3);
36664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3),
36674b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Value of: 2*3\n"
36684b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "  Actual: 6\n"
36694b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: 5");
36704b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
36714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
36724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_EQ(NULL, pointer).
36735147b45584b1a782f016a59fdd251ce3810dc1c4vladlosev#if GTEST_CAN_COMPARE_NULL
36744b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_EQ_NULL) {
36754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success.
36764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* p = NULL;
36779644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // Some older GCC versions may issue a spurious waring in this or the next
36789644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // assertion statement. This warning should not be suppressed with
36799644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // static_cast since the test verifies the ability to use bare NULL as the
36809644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // expected parameter to the macro.
36814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(NULL, p);
36824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
36834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure.
36844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int n = 0;
36854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n),
36864b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Value of: &n\n");
36874b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
36885147b45584b1a782f016a59fdd251ce3810dc1c4vladlosev#endif  // GTEST_CAN_COMPARE_NULL
36894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
36904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_EQ(0, non_pointer).  Since the literal 0 can be
36914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// treated as a null pointer by the compiler, we need to make sure
36924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as
36934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// ASSERT_EQ(static_cast<void*>(NULL), non_pointer).
36944b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, ASSERT_EQ_0) {
36954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n = 0;
36964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
36974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success.
36984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(0, n);
36994b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure.
37014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6),
37024b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: 0");
37034b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37044b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_NE.
37064b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_NE) {
37074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_NE(6, 7);
37084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'),
37094b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: ('a') != ('a'), "
37104b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
37114b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_LE.
37144b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_LE) {
37154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_LE(2, 3);
37164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_LE(2, 2);
37174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0),
37184b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: (2) <= (0), actual: 2 vs 0");
37194b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_LT.
37224b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_LT) {
37234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_LT(2, 3);
37244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2),
37254b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: (2) < (2), actual: 2 vs 2");
37264b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_GE.
37294b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_GE) {
37304b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_GE(2, 1);
37314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_GE(2, 2);
37324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3),
37334b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: (2) >= (3), actual: 2 vs 3");
37344b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ASSERT_GT.
37374b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ASSERT_GT) {
37384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_GT(2, 1);
37394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2),
37404b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Expected: (2) > (2), actual: 2 vs 2");
37414b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37439204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#if GTEST_HAS_EXCEPTIONS
37449204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
3745ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wanvoid ThrowNothing() {}
3746ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan
37479204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Tests ASSERT_THROW.
37489204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(AssertionTest, ASSERT_THROW) {
37499204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  ASSERT_THROW(ThrowAnInteger(), int);
3750d6b4941ba371a4de8b8ea6b69bf50741cbe97292vladlosev
3751733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifndef __BORLANDC__
3752733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3753d6b4941ba371a4de8b8ea6b69bf50741cbe97292vladlosev  // ICE's in C++Builder 2007 and 2009.
3754ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_FATAL_FAILURE(
3755ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      ASSERT_THROW(ThrowAnInteger(), bool),
3756ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "Expected: ThrowAnInteger() throws an exception of type bool.\n"
3757ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "  Actual: it throws a different type.");
3758733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif
3759d6b4941ba371a4de8b8ea6b69bf50741cbe97292vladlosev
3760ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_FATAL_FAILURE(
3761ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      ASSERT_THROW(ThrowNothing(), bool),
3762ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "Expected: ThrowNothing() throws an exception of type bool.\n"
3763ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "  Actual: it throws nothing.");
37649204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
37659204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
37669204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Tests ASSERT_NO_THROW.
37679204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(AssertionTest, ASSERT_NO_THROW) {
3768ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  ASSERT_NO_THROW(ThrowNothing());
37699204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()),
3770ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan                       "Expected: ThrowAnInteger() doesn't throw an exception."
37719204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                       "\n  Actual: it throws.");
37729204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
37739204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
37749204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Tests ASSERT_ANY_THROW.
37759204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(AssertionTest, ASSERT_ANY_THROW) {
37769204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  ASSERT_ANY_THROW(ThrowAnInteger());
3777ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_FATAL_FAILURE(
3778ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      ASSERT_ANY_THROW(ThrowNothing()),
3779ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "Expected: ThrowNothing() throws an exception.\n"
3780ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "  Actual: it doesn't.");
37819204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
37829204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
37839204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#endif  // GTEST_HAS_EXCEPTIONS
37849204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
37854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Makes sure we deal with the precedence of <<.  This test should
37864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// compile.
37874b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, AssertPrecedence) {
37884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1 < 2, true);
37895e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan  bool false_value = false;
37905e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan  ASSERT_EQ(true && false_value, false);
37914b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A subroutine used by the following test.
37944b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestEq1(int x) {
37954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1, x);
37964b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
37974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
37984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests calling a test subroutine that's not part of a fixture.
37994b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, NonFixtureSubroutine) {
38004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(TestEq1(2),
38014b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Value of: x");
38024b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
38034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// An uncopyable class.
38054b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass Uncopyable {
38064b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
38077de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan  explicit Uncopyable(int a_value) : value_(a_value) {}
38084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int value() const { return value_; }
38104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool operator==(const Uncopyable& rhs) const {
38114b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return value() == rhs.value();
38124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
38134b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
38144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // This constructor deliberately has no implementation, as we don't
38154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // want this class to be copyable.
38164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Uncopyable(const Uncopyable&);  // NOLINT
38174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int value_;
38194b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
38204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38214b6829f0d28990dd645e16386eb226d0f10c8731shiqian::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) {
38224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << value.value();
38234b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
38244b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38254b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38264b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool IsPositiveUncopyable(const Uncopyable& x) {
38274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return x.value() > 0;
38284b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
38294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A subroutine used by the following test.
38314b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestAssertNonPositive() {
38324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Uncopyable y(-1);
38334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED1(IsPositiveUncopyable, y);
38344b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
38354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A subroutine used by the following test.
38364b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestAssertEqualsUncopyable() {
38374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Uncopyable x(5);
38384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Uncopyable y(-1);
38394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(x, y);
38404b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
38414b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that uncopyable objects can be used in assertions.
38434b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, AssertWorksWithUncopyableObject) {
38444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Uncopyable x(5);
38454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_PRED1(IsPositiveUncopyable, x);
38464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(x, x);
38474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(TestAssertNonPositive(),
38484b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
38494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(),
38504b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
38514b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
38524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that uncopyable objects can be used in expects.
38544b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, ExpectWorksWithUncopyableObject) {
38554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Uncopyable x(5);
38564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_PRED1(IsPositiveUncopyable, x);
38574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Uncopyable y(-1);
38584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y),
38594b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
38604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(x, x);
38614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y),
38624b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
38634b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
38644b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3865739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanenum NamedEnum {
3866739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  kE1 = 0,
386766d8d6b9c4e8af839780a7241e596eaee5ae1956zhanyong.wan  kE2 = 1
3868739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan};
3869739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan
3870739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST(AssertionTest, NamedEnum) {
3871739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_EQ(kE1, kE1);
3872739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_LT(kE1, kE2);
3873739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Which is: 0");
3874739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Actual: 1");
3875739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}
38764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The version of gcc used in XCode 2.2 has a bug and doesn't allow
3878efa2fc7fd8a71afd54841b780829ce57cc487938zhanyong.wan// anonymous enums in assertions.  Therefore the following test is not
3879efa2fc7fd8a71afd54841b780829ce57cc487938zhanyong.wan// done on Mac.
3880c2df1529d41617b516a4d89241940433b03f10aazhanyong.wan// Sun Studio and HP aCC also reject this code.
3881c2df1529d41617b516a4d89241940433b03f10aazhanyong.wan#if !GTEST_OS_MAC && !defined(__SUNPRO_CC) && !defined(__HP_aCC)
38824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
38834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using assertions with anonymous enums.
38844b6829f0d28990dd645e16386eb226d0f10c8731shiqianenum {
3885739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  kCaseA = -1,
3886733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3887733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_LINUX
3888733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
38894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // We want to test the case where the size of the anonymous enum is
38904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // larger than sizeof(int), to make sure our implementation of the
38914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // assertions doesn't truncate the enums.  However, MSVC
38924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // (incorrectly) doesn't allow an enum value to exceed the range of
38934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // an int, so this has to be conditionally compiled.
38944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  //
3895739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  // On Linux, kCaseB and kCaseA have the same value when truncated to
38964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // int size.  We want to test whether this will confuse the
38974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // assertions.
3898739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  kCaseB = testing::internal::kMaxBiggestInt,
3899733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3900733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else
3901733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3902739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  kCaseB = INT_MAX,
3903733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3904733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif  // GTEST_OS_LINUX
3905733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3906e5c597132926ef2742ea7d89076117b9ae22b117vladlosev  kCaseC = 42
39074b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
39084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39094b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionTest, AnonymousEnum) {
3910733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_LINUX
3911733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3912739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_EQ(static_cast<int>(kCaseA), static_cast<int>(kCaseB));
3913733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
3914733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif  // GTEST_OS_LINUX
39154b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3916739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_EQ(kCaseA, kCaseA);
3917739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_NE(kCaseA, kCaseB);
3918739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_LT(kCaseA, kCaseB);
3919739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_LE(kCaseA, kCaseB);
3920739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_GT(kCaseB, kCaseA);
3921739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_GE(kCaseA, kCaseA);
3922739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseB),
3923739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan                          "(kCaseA) >= (kCaseB)");
3924739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseC),
3925739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan                          "-1 vs 42");
3926739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan
3927739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  ASSERT_EQ(kCaseA, kCaseA);
3928739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  ASSERT_NE(kCaseA, kCaseB);
3929739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  ASSERT_LT(kCaseA, kCaseB);
3930739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  ASSERT_LE(kCaseA, kCaseB);
3931739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  ASSERT_GT(kCaseB, kCaseA);
3932739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  ASSERT_GE(kCaseA, kCaseA);
3933ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan
3934ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan# ifndef __BORLANDC__
3935ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan
3936ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan  // ICE's in C++Builder.
3937739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseB),
3938739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan                       "Value of: kCaseB");
3939739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
3940739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan                       "Actual: 42");
3941ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan# endif
3942ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan
3943739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
3944739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan                       "Which is: -1");
39454b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
39464b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3947673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev#endif  // !GTEST_OS_MAC && !defined(__SUNPRO_CC)
39484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39494cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS
39504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39514b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic HRESULT UnexpectedHRESULTFailure() {
39524b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return E_UNEXPECTED;
39534b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
39544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39554b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic HRESULT OkHRESULTSuccess() {
39564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return S_OK;
39574b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
39584b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39594b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic HRESULT FalseHRESULTSuccess() {
39604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return S_FALSE;
39614b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
39624b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// HRESULT assertion tests test both zero and non-zero
39644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// success codes as well as failure message for each.
39654b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
39664b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Windows CE doesn't support message texts.
39674b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) {
39684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_HRESULT_SUCCEEDED(S_OK);
39694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_HRESULT_SUCCEEDED(S_FALSE);
39704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
3972afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
3973afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "  Actual: 0x8000FFFF");
39744b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
39754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39764b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) {
39774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_HRESULT_SUCCEEDED(S_OK);
39784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_HRESULT_SUCCEEDED(S_FALSE);
39794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
3981afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
3982afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "  Actual: 0x8000FFFF");
39834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
39844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39854b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) {
39864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_HRESULT_FAILED(E_UNEXPECTED);
39874b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()),
3989afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "Expected: (OkHRESULTSuccess()) fails.\n"
39903b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com    "  Actual: 0x0");
39914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()),
3992afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "Expected: (FalseHRESULTSuccess()) fails.\n"
39933b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com    "  Actual: 0x1");
39944b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
39954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
39964b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) {
39974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_HRESULT_FAILED(E_UNEXPECTED);
39984b6829f0d28990dd645e16386eb226d0f10c8731shiqian
3999733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifndef __BORLANDC__
4000733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
400198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // ICE's in C++Builder 2007 and 2009.
40024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()),
4003afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "Expected: (OkHRESULTSuccess()) fails.\n"
40043b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com    "  Actual: 0x0");
4005733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif
4006733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
40074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()),
4008afebcbd73013bbaf27147b285ef24ffef2046ea6shiqian    "Expected: (FalseHRESULTSuccess()) fails.\n"
40093b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com    "  Actual: 0x1");
40104b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
40114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
40124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that streaming to the HRESULT macros works.
40134b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(HRESULTAssertionTest, Streaming) {
40144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
40154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
40164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
40174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
40184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
40194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(
40204b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
40214b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "expected failure");
40224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4023733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# ifndef __BORLANDC__
4024733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
402598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan  // ICE's in C++Builder 2007 and 2009.
40264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(
40274b6829f0d28990dd645e16386eb226d0f10c8731shiqian      ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
40284b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "expected failure");
4029733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif
40304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
40314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(
40324b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EXPECT_HRESULT_FAILED(S_OK) << "expected failure",
40334b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "expected failure");
40344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
40354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(
40364b6829f0d28990dd645e16386eb226d0f10c8731shiqian      ASSERT_HRESULT_FAILED(S_OK) << "expected failure",
40374b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "expected failure");
40384b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
40394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
40404cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // GTEST_OS_WINDOWS
40414b6829f0d28990dd645e16386eb226d0f10c8731shiqian
404298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
404398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Silences warnings: "Condition is always true", "Unreachable code"
4044733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option push -w-ccc -w-rch
404598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
404698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
40474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the assertion macros behave like single statements.
4048e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) {
4049f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
40504b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_TRUE(false) << "This should never be executed; "
40514b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "It's a compilation test only.";
40524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4053f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysTrue())
40544b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_FALSE(false);
40554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  else
40564e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
40574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4058f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
40594b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_LT(1, 3);
40604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4061f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
40624e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
40634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  else
40644b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_GT(3, 2) << "";
4065e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
40669204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
40679204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#if GTEST_HAS_EXCEPTIONS
4068e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// Tests that the compiler will not complain about unreachable code in the
4069e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros.
4070e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanTEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) {
4071e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  int n = 0;
4072e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
4073e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_THROW(throw 1, int);
4074e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), "");
4075e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), "");
4076e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_NO_THROW(n++);
4077e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), "");
4078e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_ANY_THROW(throw 1);
4079e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), "");
4080e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan}
4081e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan
4082e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {
4083f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
4084ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan    EXPECT_THROW(ThrowNothing(), bool);
40859204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
4086f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysTrue())
40879204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    EXPECT_THROW(ThrowAnInteger(), int);
40889204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  else
40894e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
40909204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
4091f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
40929204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    EXPECT_NO_THROW(ThrowAnInteger());
40939204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
4094f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysTrue())
4095ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan    EXPECT_NO_THROW(ThrowNothing());
40969204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  else
40974e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
40989204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
4099f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
4100ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan    EXPECT_ANY_THROW(ThrowNothing());
41019204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
4102f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysTrue())
41039204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    EXPECT_ANY_THROW(ThrowAnInteger());
41049204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  else
41054e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
4106e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian}
41079204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#endif  // GTEST_HAS_EXCEPTIONS
4108e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
4109e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) {
4110f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
4111e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    EXPECT_NO_FATAL_FAILURE(FAIL()) << "This should never be executed. "
4112e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian                                    << "It's a compilation test only.";
4113e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  else
41144e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
4115e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
4116f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
4117e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ASSERT_NO_FATAL_FAILURE(FAIL()) << "";
4118e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  else
41194e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
4120e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
4121f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysTrue())
4122e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    EXPECT_NO_FATAL_FAILURE(SUCCEED());
4123e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  else
41244e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
4125e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
4126f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  if (AlwaysFalse())
41274e7e2fcd7ac837bf81d8f120a9a30785d83b3897zhanyong.wan    ;  // NOLINT
4128e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian  else
4129e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    ASSERT_NO_FATAL_FAILURE(SUCCEED());
41304b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
41314b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the assertion macros work well with switch statements.
41334b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(AssertionSyntaxTest, WorksWithSwitch) {
41344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  switch (0) {
41354b6829f0d28990dd645e16386eb226d0f10c8731shiqian    case 1:
41364b6829f0d28990dd645e16386eb226d0f10c8731shiqian      break;
41374b6829f0d28990dd645e16386eb226d0f10c8731shiqian    default:
41384b6829f0d28990dd645e16386eb226d0f10c8731shiqian      ASSERT_TRUE(true);
41394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
41404b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  switch (0)
41424b6829f0d28990dd645e16386eb226d0f10c8731shiqian    case 0:
41434b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EXPECT_FALSE(false) << "EXPECT_FALSE failed in switch case";
41444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Binary assertions are implemented using a different code path
41464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // than the Boolean assertions.  Hence we test them separately.
41474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  switch (0) {
41484b6829f0d28990dd645e16386eb226d0f10c8731shiqian    case 1:
41494b6829f0d28990dd645e16386eb226d0f10c8731shiqian    default:
41504b6829f0d28990dd645e16386eb226d0f10c8731shiqian      ASSERT_EQ(1, 1) << "ASSERT_EQ failed in default switch handler";
41514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
41524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  switch (0)
41544b6829f0d28990dd645e16386eb226d0f10c8731shiqian    case 0:
41554b6829f0d28990dd645e16386eb226d0f10c8731shiqian      EXPECT_NE(1, 2);
41564b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
41574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41589204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#if GTEST_HAS_EXCEPTIONS
41599204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
41609204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianvoid ThrowAString() {
416103c314931649a999b0cf5deb0a434a1009157416jgm@google.com    throw "std::string";
41629204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
41639204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
41649204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Test that the exception assertion macros compile and work with const
41659204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// type qualifier.
41669204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(AssertionSyntaxTest, WorksWithConst) {
41679204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    ASSERT_THROW(ThrowAString(), const char*);
41689204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
41699204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian    EXPECT_THROW(ThrowAString(), const char*);
41709204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
41719204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
41729204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#endif  // GTEST_HAS_EXCEPTIONS
41739204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
41744b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace
41754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41764b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing {
41774b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Google Test tracks SUCCEED*.
41794b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SuccessfulAssertionTest, SUCCEED) {
41804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SUCCEED();
41814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SUCCEED() << "OK";
41821cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count());
41834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
41844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Google Test doesn't track successful EXPECT_*.
41864b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SuccessfulAssertionTest, EXPECT) {
41874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(true);
41881cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
41894b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
41904b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Google Test doesn't track successful EXPECT_STR*.
41924b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SuccessfulAssertionTest, EXPECT_STR) {
41934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("", "");
41941cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
41954b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
41964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
41974b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Google Test doesn't track successful ASSERT_*.
41984b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SuccessfulAssertionTest, ASSERT) {
41994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(true);
42001cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
42014b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
42024b6829f0d28990dd645e16386eb226d0f10c8731shiqian
42034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Google Test doesn't track successful ASSERT_STR*.
42044b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(SuccessfulAssertionTest, ASSERT_STR) {
42054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ("", "");
42061cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
42074b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
42084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
42094b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace testing
42104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
42114b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace {
42124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
42137a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests the message streaming variation of assertions.
42147a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42157a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, EXPECT) {
42167a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_EQ(1, 1) << "This should succeed.";
42177a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_NE(1, 1) << "Expected failure #1.",
42187a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Expected failure #1");
42197a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_LE(1, 2) << "This should succeed.";
42207a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_LT(1, 0) << "Expected failure #2.",
42217a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Expected failure #2.");
42227a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_GE(1, 0) << "This should succeed.";
42237a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_GT(1, 2) << "Expected failure #3.",
42247a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Expected failure #3.");
42257a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42267a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_STREQ("1", "1") << "This should succeed.";
42277a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("1", "1") << "Expected failure #4.",
42287a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Expected failure #4.");
42297a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_STRCASEEQ("a", "A") << "This should succeed.";
42307a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("a", "A") << "Expected failure #5.",
42317a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Expected failure #5.");
42327a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42337a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FLOAT_EQ(1, 1) << "This should succeed.";
42347a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1, 1.2) << "Expected failure #6.",
42357a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Expected failure #6.");
42367a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NEAR(1, 1.1, 0.2) << "This should succeed.";
42377a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42387a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42397a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, ASSERT) {
42407a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_EQ(1, 1) << "This should succeed.";
42417a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_NE(1, 2) << "This should succeed.";
42427a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_LE(1, 2) << "This should succeed.";
42437a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_LT(1, 2) << "This should succeed.";
42447a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_GE(1, 0) << "This should succeed.";
42457a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FATAL_FAILURE(ASSERT_GT(1, 2) << "Expected failure.",
42467a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                       "Expected failure.");
42477a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42487a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42497a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, ASSERT_STR) {
42507a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_STREQ("1", "1") << "This should succeed.";
42517a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_STRNE("1", "2") << "This should succeed.";
42527a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_STRCASEEQ("a", "A") << "This should succeed.";
42537a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("a", "A") << "Expected failure.",
42547a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                       "Expected failure.");
42557a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42567a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42577a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, ASSERT_FLOATING) {
42587a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_FLOAT_EQ(1, 1) << "This should succeed.";
42597a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_DOUBLE_EQ(1, 1) << "This should succeed.";
42607a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1,1.2, 0.1) << "Expect failure.",  // NOLINT
42617a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                       "Expect failure.");
42627a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  // To work around a bug in gcc 2.95.0, there is intentionally no
42637a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  // space after the first comma in the previous statement.
42647a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42657a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42667a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests using ASSERT_FALSE with a streamed message.
42677a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, ASSERT_FALSE) {
42687a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_FALSE(false) << "This shouldn't fail.";
42697a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FATAL_FAILURE({  // NOLINT
42707a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com    ASSERT_FALSE(true) << "Expected failure: " << 2 << " > " << 1
42717a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                       << " evaluates to " << true;
42727a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  }, "Expected failure");
42737a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42747a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42757a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests using FAIL with a streamed message.
42767a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, FAIL) {
42777a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FATAL_FAILURE(FAIL() << 0,
42787a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                       "0");
42797a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42807a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42817a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests using SUCCEED with a streamed message.
42827a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, SUCCEED) {
42837a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  SUCCEED() << "Success == " << 1;
42847a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42857a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42867a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests using ASSERT_TRUE with a streamed message.
42877a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, ASSERT_TRUE) {
42887a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_TRUE(true) << "This should succeed.";
42897a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ASSERT_TRUE(true) << true;
42907a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FATAL_FAILURE({  // NOLINT
42917a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com    ASSERT_TRUE(false) << static_cast<const char *>(NULL)
42927a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                       << static_cast<char *>(NULL);
42937a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  }, "(null)(null)");
42947a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
42957a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
42967a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com#if GTEST_OS_WINDOWS
42977a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests using wide strings in assertion messages.
42987a574c99ea1d474f8ec5f040deba54169120f063jgm@google.comTEST(AssertionWithMessageTest, WideStringMessage) {
42997a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
43007a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com    EXPECT_TRUE(false) << L"This failure is expected.\x8119";
43017a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  }, "This failure is expected.");
43027a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FATAL_FAILURE({  // NOLINT
43037a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com    ASSERT_EQ(1, 2) << "This failure is "
43047a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                    << L"expected too.\x8120";
43057a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  }, "This failure is expected too.");
43067a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com}
43077a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com#endif  // GTEST_OS_WINDOWS
43087a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com
43094b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_TRUE.
43104b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_TRUE) {
43117a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_TRUE(true) << "Intentional success";
43127a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #1.",
43137a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Intentional failure #1.");
43147a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #2.",
43157a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Intentional failure #2.");
43164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(2 > 1);  // NOLINT
43174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1),
43184b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: 2 < 1\n"
43194b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "  Actual: false\n"
43204b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: true");
43214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3),
43224b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "2 > 3");
43234b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
43244b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4325fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult.
4326fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(ExpectTest, ExpectTrueWithAssertionResult) {
4327fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_TRUE(ResultIsEven(2));
4328fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)),
4329fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Value of: ResultIsEven(3)\n"
4330fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "  Actual: false (3 is odd)\n"
4331fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Expected: true");
4332fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_TRUE(ResultIsEvenNoExplanation(2));
4333fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)),
4334fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Value of: ResultIsEvenNoExplanation(3)\n"
4335fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "  Actual: false (3 is odd)\n"
4336fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Expected: true");
4337fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
4338fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
43397a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com// Tests EXPECT_FALSE with a streamed message.
43404b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_FALSE) {
43414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(2 < 1);  // NOLINT
43427a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_FALSE(false) << "Intentional success";
43437a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #1.",
43447a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Intentional failure #1.");
43457a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #2.",
43467a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Intentional failure #2.");
43474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1),
43484b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: 2 > 1\n"
43494b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "  Actual: true\n"
43504b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: false");
43514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3),
43524b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "2 < 3");
43534b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
43544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4355fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult.
4356fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(ExpectTest, ExpectFalseWithAssertionResult) {
4357fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FALSE(ResultIsEven(3));
4358fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)),
4359fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Value of: ResultIsEven(2)\n"
4360fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "  Actual: true (2 is even)\n"
4361fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Expected: false");
4362fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FALSE(ResultIsEvenNoExplanation(3));
4363fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)),
4364fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Value of: ResultIsEvenNoExplanation(2)\n"
4365fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "  Actual: true\n"
4366fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev                          "Expected: false");
4367fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
4368fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
436998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
437098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Restores warnings after previous "#pragma option push" supressed them
4371733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option pop
437298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
437398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
43744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_EQ.
43754b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_EQ) {
43764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(5, 2 + 3);
43774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3),
43784b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: 2*3\n"
43794b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "  Actual: 6\n"
43804b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: 5");
43814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3),
43824b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "2 - 3");
43834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
43844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
43854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using EXPECT_EQ on double values.  The purpose is to make
43864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// sure that the specialization we did for integer and anonymous enums
43874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// isn't used for double arguments.
43884b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_EQ_Double) {
43894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success.
43904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(5.6, 5.6);
43914b6829f0d28990dd645e16386eb226d0f10c8731shiqian
43924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure.
43934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2),
43944b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "5.1");
43954b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
43964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
43975147b45584b1a782f016a59fdd251ce3810dc1c4vladlosev#if GTEST_CAN_COMPARE_NULL
43984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_EQ(NULL, pointer).
43994b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_EQ_NULL) {
44004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success.
44014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* p = NULL;
44025e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan  // Some older GCC versions may issue a spurious warning in this or the next
44039644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // assertion statement. This warning should not be suppressed with
44049644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // static_cast since the test verifies the ability to use bare NULL as the
44059644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // expected parameter to the macro.
44064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(NULL, p);
44074b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure.
44094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n = 0;
44104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n),
44114b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: &n\n");
44124b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
44135147b45584b1a782f016a59fdd251ce3810dc1c4vladlosev#endif  // GTEST_CAN_COMPARE_NULL
44144b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_EQ(0, non_pointer).  Since the literal 0 can be
44164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// treated as a null pointer by the compiler, we need to make sure
44174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as
44184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// EXPECT_EQ(static_cast<void*>(NULL), non_pointer).
44194b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_EQ_0) {
44204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n = 0;
44214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A success.
44234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(0, n);
44244b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // A failure.
44264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6),
44274b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: 0");
44284b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
44294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_NE.
44314b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_NE) {
44324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NE(6, 7);
44334b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'),
44354b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: ('a') != ('a'), "
44364b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
44374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2),
44384b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "2");
44394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* const p0 = NULL;
44404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0),
44414b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "p0");
44424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Only way to get the Nokia compiler to compile the cast
44434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // is to have a separate void* variable first. Putting
44444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // the two casts on the same line doesn't work, neither does
44454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // a direct C-style to char*.
44464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void* pv1 = (void*)0x1234;  // NOLINT
44474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* const p1 = reinterpret_cast<char*>(pv1);
44484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1),
44494b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "p1");
44504b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
44514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_LE.
44534b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_LE) {
44544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_LE(2, 3);
44554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_LE(2, 2);
44564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0),
44574b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: (2) <= (0), actual: 2 vs 0");
44584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9),
44594b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "(1.1) <= (0.9)");
44604b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
44614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_LT.
44634b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_LT) {
44644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_LT(2, 3);
44654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2),
44664b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: (2) < (2), actual: 2 vs 2");
44674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1),
44684b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "(2) < (1)");
44694b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
44704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_GE.
44724b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_GE) {
44734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_GE(2, 1);
44744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_GE(2, 2);
44754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3),
44764b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: (2) >= (3), actual: 2 vs 3");
44774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1),
44784b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "(0.9) >= (1.1)");
44794b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
44804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests EXPECT_GT.
44824b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, EXPECT_GT) {
44834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_GT(2, 1);
44844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2),
44854b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: (2) > (2), actual: 2 vs 2");
44864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3),
44874b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "(2) > (3)");
44884b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
44894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
44909204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#if GTEST_HAS_EXCEPTIONS
44919204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
44929204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Tests EXPECT_THROW.
44939204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(ExpectTest, EXPECT_THROW) {
44949204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_THROW(ThrowAnInteger(), int);
44959204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool),
4496ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan                          "Expected: ThrowAnInteger() throws an exception of "
44979204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                          "type bool.\n  Actual: it throws a different type.");
4498ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_NONFATAL_FAILURE(
4499ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      EXPECT_THROW(ThrowNothing(), bool),
4500ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "Expected: ThrowNothing() throws an exception of type bool.\n"
4501ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "  Actual: it throws nothing.");
45029204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
45039204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
45049204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Tests EXPECT_NO_THROW.
45059204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(ExpectTest, EXPECT_NO_THROW) {
4506ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_NO_THROW(ThrowNothing());
45079204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()),
4508ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan                          "Expected: ThrowAnInteger() doesn't throw an "
45099204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                          "exception.\n  Actual: it throws.");
45109204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
45119204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
45129204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian// Tests EXPECT_ANY_THROW.
45139204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(ExpectTest, EXPECT_ANY_THROW) {
45149204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_ANY_THROW(ThrowAnInteger());
4515ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_NONFATAL_FAILURE(
4516ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      EXPECT_ANY_THROW(ThrowNothing()),
4517ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "Expected: ThrowNothing() throws an exception.\n"
4518ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan      "  Actual: it doesn't.");
45199204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
45209204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
45219204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#endif  // GTEST_HAS_EXCEPTIONS
45229204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
45234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Make sure we deal with the precedence of <<.
45244b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ExpectTest, ExpectPrecedence) {
45254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1 < 2, true);
45264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false),
45274b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: true && false");
45284b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the StreamableToString() function.
45324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using StreamableToString() on a scalar.
45344b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableToStringTest, Scalar) {
45354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("5", StreamableToString(5).c_str());
45364b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using StreamableToString() on a non-char pointer.
45394b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableToStringTest, Pointer) {
45404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int n = 0;
45414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int* p = &n;
45424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STRNE("(null)", StreamableToString(p).c_str());
45434b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using StreamableToString() on a NULL non-char pointer.
45464b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableToStringTest, NullPointer) {
45474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int* p = NULL;
45484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
45494b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using StreamableToString() on a C string.
45524b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableToStringTest, CString) {
45534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("Foo", StreamableToString("Foo").c_str());
45544b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45554b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45564b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using StreamableToString() on a NULL C string.
45574b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableToStringTest, NullCString) {
45584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* p = NULL;
45594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
45604b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using streamable values as assertion messages.
45634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using std::string as an assertion message.
45654b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableTest, string) {
45664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const std::string str(
45674b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "This failure message is a std::string, and is expected.");
45684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL() << str,
45694b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       str.c_str());
45704b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that we can output strings containing embedded NULs.
45734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Limited to Linux because we can only do this with std::string's.
45744b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableTest, stringWithEmbeddedNUL) {
45754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const char char_array_with_nul[] =
45764b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "Here's a NUL\0 and some more string";
45774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const std::string string_with_nul(char_array_with_nul,
45784b6829f0d28990dd645e16386eb226d0f10c8731shiqian                                           sizeof(char_array_with_nul)
45794b6829f0d28990dd645e16386eb226d0f10c8731shiqian                                           - 1);  // drops the trailing NUL
45804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL() << string_with_nul,
45814b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Here's a NUL\\0 and some more string");
45824b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that we can output a NUL char.
45854b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableTest, NULChar) {
45864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
45874b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "A NUL" << '\0' << " and some more string";
45884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "A NUL\\0 and some more string");
45894b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45904b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using int as an assertion message.
45924b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableTest, int) {
45934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL() << 900913,
45944b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "900913");
45954b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
45964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
45974b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using NULL char pointer as an assertion message.
45984b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
45994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// In MSVC, streaming a NULL char * causes access violation.  Google Test
46004b6829f0d28990dd645e16386eb226d0f10c8731shiqian// implemented a workaround (substituting "(null)" for NULL).  This
46014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tests whether the workaround works.
46024b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableTest, NullCharPtr) {
46034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL),
46044b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "(null)");
46054b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that basic IO manipulators (endl, ends, and flush) can be
46084b6829f0d28990dd645e16386eb226d0f10c8731shiqian// streamed to testing::Message.
46094b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamableTest, BasicIoManip) {
46104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
46114b6829f0d28990dd645e16386eb226d0f10c8731shiqian    FAIL() << "Line 1." << std::endl
46124b6829f0d28990dd645e16386eb226d0f10c8731shiqian           << "A NUL char " << std::ends << std::flush << " in line 2.";
46134b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Line 1.\nA NUL char \\0 in line 2.");
46144b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46154b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the macros that haven't been covered so far.
46174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46184b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid AddFailureHelper(bool* aborted) {
46194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  *aborted = true;
46207a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com  ADD_FAILURE() << "Intentional failure.";
46214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  *aborted = false;
46224b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests ADD_FAILURE.
46254b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MacroTest, ADD_FAILURE) {
46264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool aborted = true;
46274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted),
46287a574c99ea1d474f8ec5f040deba54169120f063jgm@google.com                          "Intentional failure.");
46294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(aborted);
46304b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46314b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4632d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan// Tests ADD_FAILURE_AT.
4633d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wanTEST(MacroTest, ADD_FAILURE_AT) {
4634d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  // Verifies that ADD_FAILURE_AT does generate a nonfatal failure and
4635d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  // the failure message contains the user-streamed part.
4636d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42) << "Wrong!", "Wrong!");
4637d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan
4638d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  // Verifies that the user-streamed part is optional.
4639d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42), "Failed");
4640d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan
4641d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  // Unfortunately, we cannot verify that the failure message contains
4642d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  // the right file path and line number the same way, as
4643d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  // EXPECT_NONFATAL_FAILURE() doesn't get to see the file path and
4644d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan  // line number.  Instead, we do that in gtest_output_test_.cc.
4645d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan}
4646d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan
46474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests FAIL.
46484b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MacroTest, FAIL) {
46494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL(),
46504b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Failed");
46514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL() << "Intentional failure.",
46524b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Intentional failure.");
46534b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests SUCCEED
46564b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MacroTest, SUCCEED) {
46574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SUCCEED();
46584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SUCCEED() << "Explicit success.";
46594b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests for EXPECT_EQ() and ASSERT_EQ().
46624b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
46634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// These tests fail *intentionally*, s.t. the failure messages can be
46644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// generated and tested.
46654b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
46664b6829f0d28990dd645e16386eb226d0f10c8731shiqian// We have different tests for different argument types.
46674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using bool values in {EXPECT|ASSERT}_EQ.
46694b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, Bool) {
46704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(true,  true);
46715e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan  EXPECT_FATAL_FAILURE({
46725e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan      bool false_value = false;
46735e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan      ASSERT_EQ(false_value, true);
46745e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan    }, "Value of: true");
46754b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using int values in {EXPECT|ASSERT}_EQ.
46784b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, Int) {
46794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(32, 32);
46804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33),
46814b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "33");
46824b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using time_t values in {EXPECT|ASSERT}_EQ.
46854b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, Time_T) {
46864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(static_cast<time_t>(0),
46874b6829f0d28990dd645e16386eb226d0f10c8731shiqian            static_cast<time_t>(0));
46884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0),
46894b6829f0d28990dd645e16386eb226d0f10c8731shiqian                                 static_cast<time_t>(1234)),
46904b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "1234");
46914b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
46924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
46934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using char values in {EXPECT|ASSERT}_EQ.
46944b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, Char) {
46954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ('z', 'z');
46964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char ch = 'b';
46974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\0', ch),
46984b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "ch");
46994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch),
47004b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "ch");
47014b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
47024b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using wchar_t values in {EXPECT|ASSERT}_EQ.
47044b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, WideChar) {
47054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(L'b', L'b');
47064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\0', L'x'),
47084b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: L'x'\n"
47094b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "  Actual: L'x' (120, 0x78)\n"
47104b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Expected: L'\0'\n"
47114b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Which is: L'\0' (0, 0x0)");
47124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47134b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static wchar_t wchar;
47144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wchar = L'b';
47154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar),
47164b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "wchar");
4717b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  wchar = 0x8119;
4718b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<wchar_t>(0x8120), wchar),
47194b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Value of: wchar");
47204b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
47214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using ::std::string values in {EXPECT|ASSERT}_EQ.
47234b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, StdString) {
47244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a const char* to an std::string that has identical
47254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // content.
47264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ("Test", ::std::string("Test"));
47274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two identical std::strings.
47294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const ::std::string str1("A * in the middle");
47304b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const ::std::string str2(str1);
47314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(str1, str2);
47324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a const char* to an std::string that has different
47344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // content
47354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ("Test", ::std::string("test")),
4736f2ac1ec8018f164081b8c002bcfbd88a4b52f65ezhanyong.wan                          "\"test\"");
47374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares an std::string to a char* that has different content.
47394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* const p1 = const_cast<char*>("foo");
47404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string("bar"), p1),
47414b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "p1");
47424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two std::strings that have different contents, one of
47444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // which having a NUL character in the middle.  This should fail.
47454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static ::std::string str3(str1);
47464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  str3.at(2) = '\0';
47474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3),
47484b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "Value of: str3\n"
47494b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "  Actual: \"A \\0 in the middle\"");
47504b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
47514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47524b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_STD_WSTRING
47534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47544b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ.
47554b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, StdWideString) {
47564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two identical std::wstrings.
47574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const ::std::wstring wstr1(L"A * in the middle");
47584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const ::std::wstring wstr2(wstr1);
47594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(wstr1, wstr2);
47604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4761b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  // Compares an std::wstring to a const wchar_t* that has identical
4762b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  // content.
4763b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
4764b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  EXPECT_EQ(::std::wstring(kTestX8119), kTestX8119);
4765b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan
47664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares an std::wstring to a const wchar_t* that has different
47674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // content.
4768b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
47694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
4770b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan    EXPECT_EQ(::std::wstring(kTestX8119), kTestX8120);
4771b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  }, "kTestX8120");
47724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two std::wstrings that have different contents, one of
47744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // which having a NUL character in the middle.
47754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ::std::wstring wstr3(wstr1);
47764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wstr3.at(2) = L'\0';
47774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3),
47784b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "wstr3");
47794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a wchar_t* to an std::wstring that has different
47814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // content.
47824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
47834b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_EQ(const_cast<wchar_t*>(L"foo"), ::std::wstring(L"bar"));
47844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
47854b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
47864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47874b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_STD_WSTRING
47884b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47894b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_GLOBAL_STRING
47904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using ::string values in {EXPECT|ASSERT}_EQ.
47914b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, GlobalString) {
47924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a const char* to a ::string that has identical content.
47934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ("Test", ::string("Test"));
47944b6829f0d28990dd645e16386eb226d0f10c8731shiqian
47954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two identical ::strings.
47964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const ::string str1("A * in the middle");
47974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const ::string str2(str1);
47984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(str1, str2);
47994b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a ::string to a const char* that has different content.
48014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string("Test"), "test"),
48024b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "test");
48034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two ::strings that have different contents, one of which
48054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // having a NUL character in the middle.
48064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ::string str3(str1);
48074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  str3.at(2) = '\0';
48084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3),
48094b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "str3");
48104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a ::string to a char* that has different content.
48124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE({  // NOLINT
48134b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_EQ(::string("bar"), const_cast<char*>("foo"));
48144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "");
48154b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
48164b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48174b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_GLOBAL_STRING
48184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48194b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_GLOBAL_WSTRING
48204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using ::wstring values in {EXPECT|ASSERT}_EQ.
48224b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, GlobalWideString) {
48234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two identical ::wstrings.
48244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const ::wstring wstr1(L"A * in the middle");
48254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const ::wstring wstr2(wstr1);
48264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(wstr1, wstr2);
48274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
4828b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  // Compares a const wchar_t* to a ::wstring that has identical content.
4829b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
4830b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  ASSERT_EQ(kTestX8119, ::wstring(kTestX8119));
4831b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan
48324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a const wchar_t* to a ::wstring that has different
48334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // content.
4834b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
48354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE({  // NOLINT
4836b499e7bd16c3014d350967917dcdb85b19721af4zhanyong.wan    EXPECT_EQ(kTestX8120, ::wstring(kTestX8119));
48374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }, "Test\\x8119");
48384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares a wchar_t* to a ::wstring that has different content.
48404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wchar_t* const p1 = const_cast<wchar_t*>(L"foo");
48414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L"bar")),
48424b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "bar");
48434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Compares two ::wstrings that have different contents, one of which
48454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // having a NUL character in the middle.
48464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static ::wstring wstr3;
48474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wstr3 = wstr1;
48484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wstr3.at(2) = L'\0';
48494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3),
48504b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "wstr3");
48514b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
48524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48534b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_HAS_GLOBAL_WSTRING
48544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using char pointers in {EXPECT|ASSERT}_EQ.
48564b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, CharPointer) {
48574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* const p0 = NULL;
48584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Only way to get the Nokia compiler to compile the cast
48594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // is to have a separate void* variable first. Putting
48604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // the two casts on the same line doesn't work, neither does
48614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // a direct C-style to char*.
48624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void* pv1 = (void*)0x1234;  // NOLINT
48634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void* pv2 = (void*)0xABC0;  // NOLINT
48644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* const p1 = reinterpret_cast<char*>(pv1);
48654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* const p2 = reinterpret_cast<char*>(pv2);
48664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(p1, p1);
48674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
48694b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: p2");
48704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
48714b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "p2");
48724b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234),
48734b6829f0d28990dd645e16386eb226d0f10c8731shiqian                                 reinterpret_cast<char*>(0xABC0)),
48744b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "ABC0");
48754b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
48764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ.
48784b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, WideCharPointer) {
48794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wchar_t* const p0 = NULL;
48804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Only way to get the Nokia compiler to compile the cast
48814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // is to have a separate void* variable first. Putting
48824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // the two casts on the same line doesn't work, neither does
48834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // a direct C-style to char*.
48844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void* pv1 = (void*)0x1234;  // NOLINT
48854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void* pv2 = (void*)0xABC0;  // NOLINT
48864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1);
48874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2);
48884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(p0, p0);
48894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
48904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
48914b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "Value of: p2");
48924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
48934b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "p2");
48944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void* pv3 = (void*)0x1234;  // NOLINT
48954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  void* pv4 = (void*)0xABC0;  // NOLINT
48964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3);
48974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4);
48984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4),
48994b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "p4");
49004b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
49014b6829f0d28990dd645e16386eb226d0f10c8731shiqian
49024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests using other types of pointers in {EXPECT|ASSERT}_EQ.
49034b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(EqAssertionTest, OtherPointer) {
49044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(static_cast<const int*>(NULL),
49054b6829f0d28990dd645e16386eb226d0f10c8731shiqian            static_cast<const int*>(NULL));
49064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL),
49074b6829f0d28990dd645e16386eb226d0f10c8731shiqian                                 reinterpret_cast<const int*>(0x1234)),
49084b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "0x1234");
49094b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
49104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
491139dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan// A class that supports binary comparison operators but not streaming.
491239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wanclass UnprintableChar {
491339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan public:
491439dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  explicit UnprintableChar(char ch) : char_(ch) {}
491539dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan
491639dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  bool operator==(const UnprintableChar& rhs) const {
491739dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan    return char_ == rhs.char_;
491839dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  }
491939dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  bool operator!=(const UnprintableChar& rhs) const {
492039dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan    return char_ != rhs.char_;
492139dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  }
492239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  bool operator<(const UnprintableChar& rhs) const {
492339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan    return char_ < rhs.char_;
492439dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  }
492539dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  bool operator<=(const UnprintableChar& rhs) const {
492639dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan    return char_ <= rhs.char_;
492739dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  }
492839dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  bool operator>(const UnprintableChar& rhs) const {
492939dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan    return char_ > rhs.char_;
493039dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  }
493139dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  bool operator>=(const UnprintableChar& rhs) const {
493239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan    return char_ >= rhs.char_;
493339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  }
493439dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan
493539dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan private:
493639dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  char char_;
493739dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan};
493839dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan
493939dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan// Tests that ASSERT_EQ() and friends don't require the arguments to
494039dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan// be printable.
494139dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wanTEST(ComparisonAssertionTest, AcceptsUnprintableArgs) {
494239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  const UnprintableChar x('x'), y('y');
494339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  ASSERT_EQ(x, x);
494439dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_NE(x, y);
494539dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  ASSERT_LT(x, y);
494639dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_LE(x, y);
494739dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  ASSERT_GT(y, x);
494839dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_GE(x, x);
494939dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan
495039dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <78>");
495139dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <79>");
495239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_LT(y, y), "1-byte object <79>");
495339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <78>");
495439dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <79>");
495539dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan
495639dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  // Code tested by EXPECT_FATAL_FAILURE cannot reference local
495739dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  // variables, so we have to write UnprintableChar('x') instead of x.
4958ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#ifndef __BORLANDC__
4959ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan  // ICE's in C++Builder.
496039dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_NE(UnprintableChar('x'), UnprintableChar('x')),
496139dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan                       "1-byte object <78>");
496239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
496339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan                       "1-byte object <78>");
4964ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#endif
496539dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
496639dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan                       "1-byte object <79>");
496739dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
496839dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan                       "1-byte object <78>");
496939dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
497039dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan                       "1-byte object <79>");
497139dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan}
497239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan
49734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the FRIEND_TEST macro.
49744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
49754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This class has a private member we want to test.  We will test it
49764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// both in a TEST and in a TEST_F.
49774b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass Foo {
49784b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
49794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Foo() {}
49804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
49814b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
49824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int Bar() const { return 1; }
49834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
49844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Declares the friend tests that can access the private member
49854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Bar().
49864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FRIEND_TEST(FRIEND_TEST_Test, TEST);
49874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
49884b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
49894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
49904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the FRIEND_TEST declaration allows a TEST to access a
49914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class's private members.  This should compile.
49924b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(FRIEND_TEST_Test, TEST) {
49934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1, Foo().Bar());
49944b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
49954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
49964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The fixture needed to test using FRIEND_TEST with TEST_F.
4997760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass FRIEND_TEST_Test2 : public Test {
49984b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
49994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Foo foo;
50004b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
50014b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that the FRIEND_TEST declaration allows a TEST_F to access a
50034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class's private members.  This should compile.
50044b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(FRIEND_TEST_Test2, TEST_F) {
50054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1, foo.Bar());
50064b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
50074b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50084b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the life cycle of Test objects.
50094b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The test fixture for testing the life cycle of Test objects.
50114b6829f0d28990dd645e16386eb226d0f10c8731shiqian//
50124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This class counts the number of live test objects that uses this
50134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// fixture.
5014760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass TestLifeCycleTest : public Test {
50154b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
50164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Constructor.  Increments the number of test objects that uses
50174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // this fixture.
50184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestLifeCycleTest() { count_++; }
50194b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50204b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Destructor.  Decrements the number of test objects that uses this
50214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // fixture.
50224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ~TestLifeCycleTest() { count_--; }
50234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Returns the number of live test objects that uses this fixture.
50254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int count() const { return count_; }
50264b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50274b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
50284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int count_;
50294b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
50304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50314b6829f0d28990dd645e16386eb226d0f10c8731shiqianint TestLifeCycleTest::count_ = 0;
50324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the life cycle of test objects.
50344b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestLifeCycleTest, Test1) {
50354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // There should be only one test object in this test case that's
50364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // currently alive.
50374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1, count());
50384b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
50394b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the life cycle of test objects.
50414b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestLifeCycleTest, Test2) {
50424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // After Test1 is done and Test2 is started, there should still be
50434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // only one live test object, as the object for Test1 should've been
50444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // deleted.
50454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1, count());
50464b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
50474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
50484b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace
50494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5050fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Tests that the copy constructor works when it is NOT optimized away by
5051fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// the compiler.
5052fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) {
5053fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  // Checks that the copy constructor doesn't try to dereference NULL pointers
5054fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  // in the source object.
5055fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r1 = AssertionSuccess();
5056fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r2 = r1;
5057fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  // The following line is added to prevent the compiler from optimizing
5058fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  // away the constructor call.
5059fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  r1 << "abc";
5060fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5061fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r3 = r1;
5062fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_EQ(static_cast<bool>(r3), static_cast<bool>(r1));
5063fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("abc", r1.message());
5064fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
5065fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5066fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Tests that AssertionSuccess and AssertionFailure construct
5067fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// AssertionResult objects as expected.
5068fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(AssertionResultTest, ConstructionWorks) {
5069fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r1 = AssertionSuccess();
5070fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_TRUE(r1);
5071fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("", r1.message());
5072fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5073fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r2 = AssertionSuccess() << "abc";
5074fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_TRUE(r2);
5075fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("abc", r2.message());
5076fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5077fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r3 = AssertionFailure();
5078fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FALSE(r3);
5079fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("", r3.message());
5080fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5081fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r4 = AssertionFailure() << "def";
5082fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FALSE(r4);
5083fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("def", r4.message());
5084fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5085fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r5 = AssertionFailure(Message() << "ghi");
5086fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FALSE(r5);
5087fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("ghi", r5.message());
5088fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
5089fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
50901287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev// Tests that the negation flips the predicate result but keeps the message.
5091fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(AssertionResultTest, NegationWorks) {
5092fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r1 = AssertionSuccess() << "abc";
5093fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_FALSE(!r1);
5094fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("abc", (!r1).message());
5095fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5096fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r2 = AssertionFailure() << "def";
5097fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_TRUE(!r2);
5098fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("def", (!r2).message());
5099fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
5100fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5101fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevTEST(AssertionResultTest, StreamingWorks) {
5102fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AssertionResult r = AssertionSuccess();
5103fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  r << "abc" << 'd' << 0 << true;
5104fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  EXPECT_STREQ("abcd0true", r.message());
51051287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev}
51061287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev
51071287840af7b9efca823ad2fecb6d905f2c4a3acevladlosevTEST(AssertionResultTest, CanStreamOstreamManipulators) {
51081287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev  AssertionResult r = AssertionSuccess();
51091287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev  r << "Data" << std::endl << std::flush << std::ends << "Will be visible";
51101287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev  EXPECT_STREQ("Data\n\\0Will be visible", r.message());
5111fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev}
5112fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
5113f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com// The next test uses explicit conversion operators -- a C++11 feature.
5114f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#if GTEST_LANG_CXX11
5115f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com
5116f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comTEST(AssertionResultTest, ConstructibleFromContextuallyConvertibleToBool) {
5117f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  struct ExplicitlyConvertibleToBool {
5118f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com    explicit operator bool() const { return value; }
5119f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com    bool value;
5120f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  };
5121f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  ExplicitlyConvertibleToBool v1 = {false};
5122f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  ExplicitlyConvertibleToBool v2 = {true};
5123f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  EXPECT_FALSE(v1);
5124f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  EXPECT_TRUE(v2);
5125f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com}
5126f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com
5127f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#endif  // GTEST_LANG_CXX11
5128f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com
5129f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comstruct ConvertibleToAssertionResult {
5130f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  operator AssertionResult() const { return AssertionResult(true); }
5131f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com};
5132f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com
5133f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comTEST(AssertionResultTest, ConstructibleFromImplicitlyConvertible) {
5134f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  ConvertibleToAssertionResult obj;
5135f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  EXPECT_TRUE(obj);
5136f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com}
5137f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com
51384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests streaming a user type whose definition and operator << are
51394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// both in the global namespace.
51404b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass Base {
51414b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
51427de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan  explicit Base(int an_x) : x_(an_x) {}
51434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int x() const { return x_; }
51444b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:
51454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int x_;
51464b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
51474b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
51484b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const Base& val) {
51494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << val.x();
51504b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
51514b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
51524b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const Base* pointer) {
51534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << "(" << pointer->x() << ")";
51544b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
51554b6829f0d28990dd645e16386eb226d0f10c8731shiqian
51564b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) {
5157760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
51584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Base a(1);
51594b6829f0d28990dd645e16386eb226d0f10c8731shiqian
51604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << a << &a;  // Uses ::operator<<.
51614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("1(1)", msg.GetString().c_str());
51624b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
51634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
51644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests streaming a user type whose definition and operator<< are
51654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// both in an unnamed namespace.
51664b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace {
51674b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MyTypeInUnnamedNameSpace : public Base {
51684b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
51697de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan  explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {}
51704b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
51714b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
51724b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const MyTypeInUnnamedNameSpace& val) {
51734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << val.x();
51744b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
51754b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
51764b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const MyTypeInUnnamedNameSpace* pointer) {
51774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << "(" << pointer->x() << ")";
51784b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
51794b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace
51804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
51814b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) {
5182760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
51834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  MyTypeInUnnamedNameSpace a(1);
51844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
51854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << a << &a;  // Uses <unnamed_namespace>::operator<<.
51864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("1(1)", msg.GetString().c_str());
51874b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
51884b6829f0d28990dd645e16386eb226d0f10c8731shiqian
51894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests streaming a user type whose definition and operator<< are
51904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// both in a user namespace.
51914b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace namespace1 {
51924b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MyTypeInNameSpace1 : public Base {
51934b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
51947de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan  explicit MyTypeInNameSpace1(int an_x): Base(an_x) {}
51954b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
51964b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
51974b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const MyTypeInNameSpace1& val) {
51984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << val.x();
51994b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52004b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
52014b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const MyTypeInNameSpace1* pointer) {
52024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << "(" << pointer->x() << ")";
52034b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52044b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace namespace1
52054b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52064b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MessageTest, CanStreamUserTypeInUserNameSpace) {
5207760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
52084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  namespace1::MyTypeInNameSpace1 a(1);
52094b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << a << &a;  // Uses namespace1::operator<<.
52114b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("1(1)", msg.GetString().c_str());
52124b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52134b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests streaming a user type whose definition is in a user namespace
52154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// but whose operator<< is in the global namespace.
52164b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace namespace2 {
52174b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass MyTypeInNameSpace2 : public ::Base {
52184b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:
52197de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan  explicit MyTypeInNameSpace2(int an_x): Base(an_x) {}
52204b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
52214b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace namespace2
52224b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
52234b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const namespace2::MyTypeInNameSpace2& val) {
52244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << val.x();
52254b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52264b6829f0d28990dd645e16386eb226d0f10c8731shiqianstd::ostream& operator<<(std::ostream& os,
52274b6829f0d28990dd645e16386eb226d0f10c8731shiqian                         const namespace2::MyTypeInNameSpace2* pointer) {
52284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  return os << "(" << pointer->x() << ")";
52294b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52314b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) {
5232760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
52334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  namespace2::MyTypeInNameSpace2 a(1);
52344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << a << &a;  // Uses ::operator<<.
52364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("1(1)", msg.GetString().c_str());
52374b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests streaming NULL pointers to testing::Message.
52404b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MessageTest, NullPointers) {
5241760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message msg;
52424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  char* const p1 = NULL;
52434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  unsigned char* const p2 = NULL;
52444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  int* p3 = NULL;
52454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  double* p4 = NULL;
52464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool* p5 = NULL;
5247760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian  Message* p6 = NULL;
52484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  msg << p1 << p2 << p3 << p4 << p5 << p6;
52504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ("(null)(null)(null)(null)(null)(null)",
52514b6829f0d28990dd645e16386eb226d0f10c8731shiqian               msg.GetString().c_str());
52524b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52544b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests streaming wide strings to testing::Message.
52554b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(MessageTest, WideStrings) {
52564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Streams a NULL of type const wchar_t*.
52574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const wchar_t* const_wstr = NULL;
52584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("(null)",
52594b6829f0d28990dd645e16386eb226d0f10c8731shiqian               (Message() << const_wstr).GetString().c_str());
52604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Streams a NULL of type wchar_t*.
52624b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wchar_t* wstr = NULL;
52634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("(null)",
52644b6829f0d28990dd645e16386eb226d0f10c8731shiqian               (Message() << wstr).GetString().c_str());
52654b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Streams a non-NULL of type const wchar_t*.
52674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const_wstr = L"abc\x8119";
52684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("abc\xe8\x84\x99",
52694b6829f0d28990dd645e16386eb226d0f10c8731shiqian               (Message() << const_wstr).GetString().c_str());
52704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Streams a non-NULL of type wchar_t*.
52724b6829f0d28990dd645e16386eb226d0f10c8731shiqian  wstr = const_cast<wchar_t*>(const_wstr);
52734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("abc\xe8\x84\x99",
52744b6829f0d28990dd645e16386eb226d0f10c8731shiqian               (Message() << wstr).GetString().c_str());
52754b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
52764b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52774b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This line tests that we can define tests in the testing namespace.
52794b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing {
52804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests the TestInfo class.
52824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5283760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass TestInfoTest : public Test {
52844b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
5285b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  static const TestInfo* GetTestInfo(const char* test_name) {
5286b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan    const TestCase* const test_case = GetUnitTestImpl()->
5287b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan        GetTestCase("TestInfoTest", "", NULL, NULL);
5288b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan
5289b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan    for (int i = 0; i < test_case->total_test_count(); ++i) {
5290b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan      const TestInfo* const test_info = test_case->GetTestInfo(i);
5291b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan      if (strcmp(test_name, test_info->name()) == 0)
5292b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan        return test_info;
5293b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan    }
5294b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan    return NULL;
52954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
52964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
52974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const TestResult* GetTestResult(
5298760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian      const TestInfo* test_info) {
52994b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return test_info->result();
53004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
53014b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
53024b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests TestInfo::test_case_name() and TestInfo::name().
53044b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestInfoTest, Names) {
5305b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  const TestInfo* const test_info = GetTestInfo("Names");
53064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ("TestInfoTest", test_info->test_case_name());
53084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ("Names", test_info->name());
53094b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
53104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests TestInfo::result().
53124b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(TestInfoTest, result) {
5313b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  const TestInfo* const test_info = GetTestInfo("result");
53144b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Initially, there is no TestPartResult for this test.
5316b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
53174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // After the previous assertion, there is still none.
5319b7ec0f7b3b21338babc9a6ab5a593a40634a8062zhanyong.wan  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
53204b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
53214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests setting up and tearing down a test case.
53234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5324760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass SetUpTestCaseTest : public Test {
53254b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
53264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // This will be called once before the first test in this test case
53274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // is run.
53284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void SetUpTestCase() {
53294b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("Setting up the test case . . .\n");
53304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53314b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Initializes some shared resource.  In this simple example, we
53324b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // just create a C string.  More complex stuff can be done if
53334b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // desired.
53344b6829f0d28990dd645e16386eb226d0f10c8731shiqian    shared_resource_ = "123";
53354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53364b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Increments the number of test cases that have been set up.
53374b6829f0d28990dd645e16386eb226d0f10c8731shiqian    counter_++;
53384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53394b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // SetUpTestCase() should be called only once.
53404b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(1, counter_);
53414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
53424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // This will be called once after the last test in this test case is
53444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // run.
53454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void TearDownTestCase() {
53464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    printf("Tearing down the test case . . .\n");
53474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53484b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Decrements the number of test cases that have been set up.
53494b6829f0d28990dd645e16386eb226d0f10c8731shiqian    counter_--;
53504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53514b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // TearDownTestCase() should be called only once.
53524b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(0, counter_);
53534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53544b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Cleans up the shared resource.
53554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    shared_resource_ = NULL;
53564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
53574b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // This will be called before each test in this test case.
53594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
53604b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // SetUpTestCase() should be called only once, so counter_ should
53614b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // always be 1.
53624b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(1, counter_);
53634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
53644b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Number of test cases that have been set up.
53664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static int counter_;
53674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Some resource to be shared by all tests in this test case.
53694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static const char* shared_resource_;
53704b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
53714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53724b6829f0d28990dd645e16386eb226d0f10c8731shiqianint SetUpTestCaseTest::counter_ = 0;
53734b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* SetUpTestCaseTest::shared_resource_ = NULL;
53744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A test that uses the shared resource.
53764b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(SetUpTestCaseTest, Test1) {
53774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STRNE(NULL, shared_resource_);
53784b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
53794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Another test that uses the shared resource.
53814b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(SetUpTestCaseTest, Test2) {
53824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("123", shared_resource_);
53834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
53844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The InitGoogleTestTest test case tests testing::InitGoogleTest().
53864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
53874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The Flags struct stores a copy of all Google Test flags.
53884b6829f0d28990dd645e16386eb226d0f10c8731shiqianstruct Flags {
53894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Constructs a Flags struct where each flag has its default value.
5390ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  Flags() : also_run_disabled_tests(false),
5391ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian            break_on_failure(false),
53924b6829f0d28990dd645e16386eb226d0f10c8731shiqian            catch_exceptions(false),
539321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian            death_test_use_fork(false),
53944b6829f0d28990dd645e16386eb226d0f10c8731shiqian            filter(""),
53954b6829f0d28990dd645e16386eb226d0f10c8731shiqian            list_tests(false),
53964b6829f0d28990dd645e16386eb226d0f10c8731shiqian            output(""),
539773ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan            print_time(true),
53989b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan            random_seed(0),
5399b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan            repeat(1),
54009b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan            shuffle(false),
5401ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev            stack_trace_depth(kMaxStackTraceDepth),
5402c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan            stream_result_to(""),
5403b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan            throw_on_failure(false) {}
54044b6829f0d28990dd645e16386eb226d0f10c8731shiqian
54054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Factory methods.
54064b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5407ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  // Creates a Flags struct where the gtest_also_run_disabled_tests flag has
5408ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  // the given value.
5409ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) {
5410ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    Flags flags;
5411ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    flags.also_run_disabled_tests = also_run_disabled_tests;
5412ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    return flags;
5413ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  }
5414ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
54154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Creates a Flags struct where the gtest_break_on_failure flag has
54164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // the given value.
54174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static Flags BreakOnFailure(bool break_on_failure) {
54184b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Flags flags;
54194b6829f0d28990dd645e16386eb226d0f10c8731shiqian    flags.break_on_failure = break_on_failure;
54204b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return flags;
54214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
54224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
54234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Creates a Flags struct where the gtest_catch_exceptions flag has
54244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // the given value.
54254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static Flags CatchExceptions(bool catch_exceptions) {
54264b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Flags flags;
54274b6829f0d28990dd645e16386eb226d0f10c8731shiqian    flags.catch_exceptions = catch_exceptions;
54284b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return flags;
54294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
54304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
543121d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  // Creates a Flags struct where the gtest_death_test_use_fork flag has
543221d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  // the given value.
543321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  static Flags DeathTestUseFork(bool death_test_use_fork) {
543421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    Flags flags;
543521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    flags.death_test_use_fork = death_test_use_fork;
543621d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    return flags;
543721d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  }
543821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
54394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Creates a Flags struct where the gtest_filter flag has the given
54404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // value.
54414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static Flags Filter(const char* filter) {
54424b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Flags flags;
54434b6829f0d28990dd645e16386eb226d0f10c8731shiqian    flags.filter = filter;
54444b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return flags;
54454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
54464b6829f0d28990dd645e16386eb226d0f10c8731shiqian
54474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Creates a Flags struct where the gtest_list_tests flag has the
54484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // given value.
54494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static Flags ListTests(bool list_tests) {
54504b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Flags flags;
54514b6829f0d28990dd645e16386eb226d0f10c8731shiqian    flags.list_tests = list_tests;
54524b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return flags;
54534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
54544b6829f0d28990dd645e16386eb226d0f10c8731shiqian
54554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Creates a Flags struct where the gtest_output flag has the given
54564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // value.
54574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static Flags Output(const char* output) {
54584b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Flags flags;
54594b6829f0d28990dd645e16386eb226d0f10c8731shiqian    flags.output = output;
54604b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return flags;
54614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
54624b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5463d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  // Creates a Flags struct where the gtest_print_time flag has the given
5464d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  // value.
5465d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  static Flags PrintTime(bool print_time) {
5466d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    Flags flags;
5467d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    flags.print_time = print_time;
5468d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    return flags;
5469d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  }
5470d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
54719b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // Creates a Flags struct where the gtest_random_seed flag has
54729b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // the given value.
54739b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  static Flags RandomSeed(Int32 random_seed) {
54749b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    Flags flags;
54759b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    flags.random_seed = random_seed;
54769b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    return flags;
54779b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  }
54789b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
54794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Creates a Flags struct where the gtest_repeat flag has the given
54804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // value.
54814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static Flags Repeat(Int32 repeat) {
54824b6829f0d28990dd645e16386eb226d0f10c8731shiqian    Flags flags;
54834b6829f0d28990dd645e16386eb226d0f10c8731shiqian    flags.repeat = repeat;
54844b6829f0d28990dd645e16386eb226d0f10c8731shiqian    return flags;
54854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
54864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
54879b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // Creates a Flags struct where the gtest_shuffle flag has
54889b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  // the given value.
54899b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  static Flags Shuffle(bool shuffle) {
54909b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    Flags flags;
54919b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    flags.shuffle = shuffle;
54929b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    return flags;
54939b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  }
54949b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
5495ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has
5496ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  // the given value.
5497ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  static Flags StackTraceDepth(Int32 stack_trace_depth) {
5498ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    Flags flags;
5499ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    flags.stack_trace_depth = stack_trace_depth;
5500ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    return flags;
5501ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  }
5502ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
5503c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  // Creates a Flags struct where the GTEST_FLAG(stream_result_to) flag has
5504c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  // the given value.
5505c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  static Flags StreamResultTo(const char* stream_result_to) {
5506c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    Flags flags;
5507c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    flags.stream_result_to = stream_result_to;
5508c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    return flags;
5509c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  }
5510c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan
5511b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  // Creates a Flags struct where the gtest_throw_on_failure flag has
5512b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  // the given value.
5513b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  static Flags ThrowOnFailure(bool throw_on_failure) {
5514b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    Flags flags;
5515b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    flags.throw_on_failure = throw_on_failure;
5516b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    return flags;
5517b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  }
5518b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
55194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // These fields store the flag values.
5520ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian  bool also_run_disabled_tests;
55214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool break_on_failure;
55224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool catch_exceptions;
552321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  bool death_test_use_fork;
55244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* filter;
55254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  bool list_tests;
55264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* output;
5527d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  bool print_time;
55289b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  Int32 random_seed;
55294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Int32 repeat;
55309b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  bool shuffle;
5531ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  Int32 stack_trace_depth;
5532c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  const char* stream_result_to;
5533b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  bool throw_on_failure;
55344b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
55354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
55364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Fixture for testing InitGoogleTest().
5537760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass InitGoogleTestTest : public Test {
55384b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
55394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Clears the flags before each test.
55404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
5541ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    GTEST_FLAG(also_run_disabled_tests) = false;
55424b6829f0d28990dd645e16386eb226d0f10c8731shiqian    GTEST_FLAG(break_on_failure) = false;
55434b6829f0d28990dd645e16386eb226d0f10c8731shiqian    GTEST_FLAG(catch_exceptions) = false;
554421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    GTEST_FLAG(death_test_use_fork) = false;
55454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    GTEST_FLAG(filter) = "";
55464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    GTEST_FLAG(list_tests) = false;
55474b6829f0d28990dd645e16386eb226d0f10c8731shiqian    GTEST_FLAG(output) = "";
554873ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan    GTEST_FLAG(print_time) = true;
55499b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    GTEST_FLAG(random_seed) = 0;
55504b6829f0d28990dd645e16386eb226d0f10c8731shiqian    GTEST_FLAG(repeat) = 1;
55519b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    GTEST_FLAG(shuffle) = false;
5552ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
5553c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    GTEST_FLAG(stream_result_to) = "";
5554b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    GTEST_FLAG(throw_on_failure) = false;
55554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
55564b6829f0d28990dd645e16386eb226d0f10c8731shiqian
55574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Asserts that two narrow or wide string arrays are equal.
55584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  template <typename CharType>
55594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void AssertStringArrayEq(size_t size1, CharType** array1,
55604b6829f0d28990dd645e16386eb226d0f10c8731shiqian                                  size_t size2, CharType** array2) {
55614b6829f0d28990dd645e16386eb226d0f10c8731shiqian    ASSERT_EQ(size1, size2) << " Array sizes different.";
55624b6829f0d28990dd645e16386eb226d0f10c8731shiqian
55634b6829f0d28990dd645e16386eb226d0f10c8731shiqian    for (size_t i = 0; i != size1; i++) {
55644b6829f0d28990dd645e16386eb226d0f10c8731shiqian      ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i;
55654b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
55664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
55674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
55684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Verifies that the flag values match the expected values.
55694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void CheckFlags(const Flags& expected) {
5570ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    EXPECT_EQ(expected.also_run_disabled_tests,
5571ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian              GTEST_FLAG(also_run_disabled_tests));
55724b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure));
55734b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions));
557421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork));
55754b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str());
55764b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));
55774b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());
5578d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));
55799b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed));
55804b6829f0d28990dd645e16386eb226d0f10c8731shiqian    EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));
55819b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle));
5582ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth));
5583c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    EXPECT_STREQ(expected.stream_result_to,
5584c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan                 GTEST_FLAG(stream_result_to).c_str());
5585c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));
55864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
55874b6829f0d28990dd645e16386eb226d0f10c8731shiqian
55884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Parses a command line (specified by argc1 and argv1), then
55894b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // verifies that the flag values are expected and that the
55904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // recognized flags are removed from the command line.
55914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  template <typename CharType>
55924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void TestParsingFlags(int argc1, const CharType** argv1,
55934b6829f0d28990dd645e16386eb226d0f10c8731shiqian                               int argc2, const CharType** argv2,
5594ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev                               const Flags& expected, bool should_print_help) {
5595ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    const bool saved_help_flag = ::testing::internal::g_help_flag;
5596ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    ::testing::internal::g_help_flag = false;
5597ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
55985d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_STREAM_REDIRECTION
5599cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan    CaptureStdout();
56005d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#endif
5601cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan
56024b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Parses the command line.
5603f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev    internal::ParseGoogleTestFlagsOnly(&argc1, const_cast<CharType**>(argv1));
56044b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56055d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_STREAM_REDIRECTION
560603c314931649a999b0cf5deb0a434a1009157416jgm@google.com    const std::string captured_stdout = GetCapturedStdout();
56075d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#endif
5608cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan
56094b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Verifies the flag values.
56104b6829f0d28990dd645e16386eb226d0f10c8731shiqian    CheckFlags(expected);
56114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56124b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // Verifies that the recognized flags are removed from the command
56134b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // line.
56144b6829f0d28990dd645e16386eb226d0f10c8731shiqian    AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2);
5615ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
5616ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the
5617ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    // help message for the flags it recognizes.
5618ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag);
5619ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
56205d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_STREAM_REDIRECTION
5621cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan    const char* const expected_help_fragment =
5622cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan        "This program contains tests written using";
5623cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan    if (should_print_help) {
5624cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan      EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout);
5625cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan    } else {
5626cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan      EXPECT_PRED_FORMAT2(IsNotSubstring,
5627cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan                          expected_help_fragment, captured_stdout);
5628cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan    }
56295d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#endif  // GTEST_HAS_STREAM_REDIRECTION
5630ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
5631ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    ::testing::internal::g_help_flag = saved_help_flag;
56324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
56334b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // This macro wraps TestParsingFlags s.t. the user doesn't need
56354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // to specify the array sizes.
5636733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
5637ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev#define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \
56384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \
5639ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev                   sizeof(argv2)/sizeof(*argv2) - 1, argv2, \
5640ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev                   expected, should_print_help)
56414b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
56424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing an empty command line.
56444b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, Empty) {
56454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
56464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
56484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
56504b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
56524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5653ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
56544b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
56554b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56564b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing a command line that has no flag.
56574b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, NoFlag) {
56584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
56594b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
56604b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
56624b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
56644b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
56654b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56664b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
56674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5668ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
56694b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
56704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing a bad --gtest_filter flag.
56724b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, FilterBad) {
56734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
56744b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
56754b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_filter",
56764b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
56784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
56804b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
56814b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_filter",
56824b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56834b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
56844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5685ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), true);
56864b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
56874b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing an empty --gtest_filter flag.
56894b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, FilterEmpty) {
56904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
56914b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
56924b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_filter=",
56934b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
56954b6829f0d28990dd645e16386eb226d0f10c8731shiqian
56964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
56974b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
56984b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
56994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5701ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), false);
57024b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
57034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing a non-empty --gtest_filter flag.
57054b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, FilterNonEmpty) {
57064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
57074b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57084b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_filter=abc",
57094b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
57134b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57144b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57164b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5717ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("abc"), false);
57184b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
57194b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_break_on_failure.
57219b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST_F(InitGoogleTestTest, BreakOnFailureWithoutValue) {
57224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
57234b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57244b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_break_on_failure",
57254b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57264b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
57274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
57294b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57304b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5733ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
57344b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
57354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_break_on_failure=0.
57374b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, BreakOnFailureFalse_0) {
57384b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
57394b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57404b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_break_on_failure=0",
57414b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
57454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57474b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57484b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5749ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
57504b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
57514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_break_on_failure=f.
57534b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, BreakOnFailureFalse_f) {
57544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
57554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57564b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_break_on_failure=f",
57574b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57594b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
57614b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57624b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57644b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5765ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
57664b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
57674b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_break_on_failure=F.
57694b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, BreakOnFailureFalse_F) {
57704b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
57714b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57724b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_break_on_failure=F",
57734b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57744b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
57774b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57784b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5781ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
57824b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
57834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing a --gtest_break_on_failure flag that has a "true"
57854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// definition.
57864b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, BreakOnFailureTrue) {
57874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
57884b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57894b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_break_on_failure=1",
57904b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
57934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
57944b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
57954b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
57964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
57974b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5798ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
57994b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
58004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_catch_exceptions.
58024b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, CatchExceptions) {
58034b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
58044b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
58054b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_catch_exceptions",
58064b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
58074b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
58084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58094b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
58104b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
58114b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
58124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
58134b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5814ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false);
58154b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
58164b6829f0d28990dd645e16386eb226d0f10c8731shiqian
581721d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian// Tests parsing --gtest_death_test_use_fork.
581821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianTEST_F(InitGoogleTestTest, DeathTestUseFork) {
581921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  const char* argv[] = {
582021d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    "foo.exe",
582121d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    "--gtest_death_test_use_fork",
582221d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    NULL
582321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  };
582421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
582521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  const char* argv2[] = {
582621d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    "foo.exe",
582721d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian    NULL
582821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  };
582921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
5830ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false);
583121d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian}
583221d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
58334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests having the same flag twice with different values.  The
58344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// expected behavior is that the one coming last takes precedence.
58354b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, DuplicatedFlags) {
58364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
58374b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
58384b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_filter=a",
58394b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_filter=b",
58404b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
58414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
58424b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
58444b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
58454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
58464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
58474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5848ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("b"), false);
58494b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
58504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests having an unrecognized flag on the command line.
58524b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, UnrecognizedFlag) {
58534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
58544b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
58554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_break_on_failure",
58564b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "bar",  // Unrecognized by Google Test.
58574b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_filter=b",
58584b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
58594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
58604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
58624b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
58634b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "bar",
58644b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
58654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
58664b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Flags flags;
58684b6829f0d28990dd645e16386eb226d0f10c8731shiqian  flags.break_on_failure = true;
58694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  flags.filter = "b";
5870ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false);
58714b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
58724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests having a --gtest_list_tests flag
58744b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, ListTestsFlag) {
58754b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const char* argv[] = {
58764b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "foo.exe",
58774b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "--gtest_list_tests",
58784b6829f0d28990dd645e16386eb226d0f10c8731shiqian      NULL
58794b6829f0d28990dd645e16386eb226d0f10c8731shiqian    };
58804b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58814b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const char* argv2[] = {
58824b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "foo.exe",
58834b6829f0d28990dd645e16386eb226d0f10c8731shiqian      NULL
58844b6829f0d28990dd645e16386eb226d0f10c8731shiqian    };
58854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5886ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
58874b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
58884b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests having a --gtest_list_tests flag with a "true" value
58904b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, ListTestsTrue) {
58914b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const char* argv[] = {
58924b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "foo.exe",
58934b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "--gtest_list_tests=1",
58944b6829f0d28990dd645e16386eb226d0f10c8731shiqian      NULL
58954b6829f0d28990dd645e16386eb226d0f10c8731shiqian    };
58964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
58974b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const char* argv2[] = {
58984b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "foo.exe",
58994b6829f0d28990dd645e16386eb226d0f10c8731shiqian      NULL
59004b6829f0d28990dd645e16386eb226d0f10c8731shiqian    };
59014b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5902ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
59034b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
59044b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests having a --gtest_list_tests flag with a "false" value
59064b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, ListTestsFalse) {
59074b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const char* argv[] = {
59084b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "foo.exe",
59094b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "--gtest_list_tests=0",
59104b6829f0d28990dd645e16386eb226d0f10c8731shiqian      NULL
59114b6829f0d28990dd645e16386eb226d0f10c8731shiqian    };
59124b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59134b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const char* argv2[] = {
59144b6829f0d28990dd645e16386eb226d0f10c8731shiqian      "foo.exe",
59154b6829f0d28990dd645e16386eb226d0f10c8731shiqian      NULL
59164b6829f0d28990dd645e16386eb226d0f10c8731shiqian    };
59174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5918ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
59194b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
59204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_list_tests=f.
59224b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, ListTestsFalse_f) {
59234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
59244b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59254b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_list_tests=f",
59264b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59284b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59294b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
59304b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59314b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59334b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5934ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
59354b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
59364b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59379b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// Tests parsing --gtest_list_tests=F.
59384b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, ListTestsFalse_F) {
59394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
59404b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59414b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_list_tests=F",
59424b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59444b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
59464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59474b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5950ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
59514b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
59524b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_output (invalid).
59544b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, OutputEmpty) {
59554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
59564b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59574b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_output",
59584b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
59624b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59634b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_output",
59644b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59664b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5967ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true);
59684b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
59694b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_output=xml
59714b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, OutputXml) {
59724b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
59734b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59744b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_output=xml",
59754b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59774b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
59794b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59804b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5983ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml"), false);
59844b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
59854b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_output=xml:file
59874b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, OutputXmlFile) {
59884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
59894b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59904b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_output=xml:file",
59914b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59924b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
59944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
59954b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
59964b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
59974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
59984b6829f0d28990dd645e16386eb226d0f10c8731shiqian
5999ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml:file"), false);
60004b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
60014b6829f0d28990dd645e16386eb226d0f10c8731shiqian
60024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_output=xml:directory/path/
60034b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, OutputXmlDirectory) {
60044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
60054b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
60064b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_output=xml:directory/path/",
60074b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
60084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
60094b6829f0d28990dd645e16386eb226d0f10c8731shiqian
60104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
60114b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
60124b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
60134b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
60144b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6015ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2,
6016ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev                            Flags::Output("xml:directory/path/"), false);
60174b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
60184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6019d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian// Tests having a --gtest_print_time flag
6020d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqianTEST_F(InitGoogleTestTest, PrintTimeFlag) {
6021d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    const char* argv[] = {
6022d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "foo.exe",
6023d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "--gtest_print_time",
6024d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      NULL
6025d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    };
6026d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6027d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    const char* argv2[] = {
6028d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "foo.exe",
6029d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      NULL
6030d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    };
6031d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6032ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
6033d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian}
6034d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6035d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian// Tests having a --gtest_print_time flag with a "true" value
6036d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqianTEST_F(InitGoogleTestTest, PrintTimeTrue) {
6037d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    const char* argv[] = {
6038d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "foo.exe",
6039d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "--gtest_print_time=1",
6040d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      NULL
6041d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    };
6042d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6043d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    const char* argv2[] = {
6044d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "foo.exe",
6045d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      NULL
6046d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    };
6047d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6048ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
6049d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian}
6050d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6051d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian// Tests having a --gtest_print_time flag with a "false" value
6052d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqianTEST_F(InitGoogleTestTest, PrintTimeFalse) {
6053d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    const char* argv[] = {
6054d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "foo.exe",
6055d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "--gtest_print_time=0",
6056d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      NULL
6057d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    };
6058d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6059d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    const char* argv2[] = {
6060d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      "foo.exe",
6061d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian      NULL
6062d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    };
6063d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6064ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
6065d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian}
6066d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6067d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian// Tests parsing --gtest_print_time=f.
6068d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqianTEST_F(InitGoogleTestTest, PrintTimeFalse_f) {
6069d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  const char* argv[] = {
6070d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    "foo.exe",
6071d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    "--gtest_print_time=f",
6072d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    NULL
6073d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  };
6074d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6075d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  const char* argv2[] = {
6076d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    "foo.exe",
6077d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    NULL
6078d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  };
6079d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6080ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
6081d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian}
6082d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6083d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian// Tests parsing --gtest_print_time=F.
6084d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqianTEST_F(InitGoogleTestTest, PrintTimeFalse_F) {
6085d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  const char* argv[] = {
6086d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    "foo.exe",
6087d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    "--gtest_print_time=F",
6088d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    NULL
6089d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  };
6090d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6091d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  const char* argv2[] = {
6092d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    "foo.exe",
6093d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian    NULL
6094d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian  };
6095d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
6096ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
6097d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian}
6098d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian
60999b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// Tests parsing --gtest_random_seed=number
61009b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST_F(InitGoogleTestTest, RandomSeed) {
61019b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv[] = {
61029b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
61039b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "--gtest_random_seed=1000",
61049b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
61059b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  };
61069b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
61079b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv2[] = {
61089b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
61099b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
61109b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  };
61119b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
6112ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false);
61139b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
61149b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
61154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing --gtest_repeat=number
61164b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, Repeat) {
61174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv[] = {
61184b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
61194b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "--gtest_repeat=1000",
61204b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
61214b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
61224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
61234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const char* argv2[] = {
61244b6829f0d28990dd645e16386eb226d0f10c8731shiqian    "foo.exe",
61254b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
61264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
61274b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6128ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false);
61294b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
61304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6131ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian// Tests having a --gtest_also_run_disabled_tests flag
6132ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqianTEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFlag) {
6133ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    const char* argv[] = {
6134ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "foo.exe",
6135ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "--gtest_also_run_disabled_tests",
6136ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      NULL
6137ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    };
6138ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6139ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    const char* argv2[] = {
6140ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "foo.exe",
6141ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      NULL
6142ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    };
6143ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6144ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
6145ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev                              Flags::AlsoRunDisabledTests(true), false);
6146ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian}
6147ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6148ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian// Tests having a --gtest_also_run_disabled_tests flag with a "true" value
6149ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqianTEST_F(InitGoogleTestTest, AlsoRunDisabledTestsTrue) {
6150ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    const char* argv[] = {
6151ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "foo.exe",
6152ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "--gtest_also_run_disabled_tests=1",
6153ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      NULL
6154ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    };
6155ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6156ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    const char* argv2[] = {
6157ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "foo.exe",
6158ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      NULL
6159ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    };
6160ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6161ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
6162ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev                              Flags::AlsoRunDisabledTests(true), false);
6163ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian}
6164ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6165ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian// Tests having a --gtest_also_run_disabled_tests flag with a "false" value
6166ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqianTEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFalse) {
6167ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    const char* argv[] = {
6168ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "foo.exe",
6169ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "--gtest_also_run_disabled_tests=0",
6170ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      NULL
6171ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    };
6172ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6173ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    const char* argv2[] = {
6174ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      "foo.exe",
6175ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian      NULL
6176ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian    };
6177ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
6178ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
6179ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev                              Flags::AlsoRunDisabledTests(false), false);
6180ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian}
6181ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian
61829b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// Tests parsing --gtest_shuffle.
61839b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST_F(InitGoogleTestTest, ShuffleWithoutValue) {
61849b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv[] = {
61859b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
61869b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "--gtest_shuffle",
61879b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
61889b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan};
61899b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
61909b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv2[] = {
61919b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
61929b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
61939b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  };
61949b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
6195ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
61969b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
61979b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
61989b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// Tests parsing --gtest_shuffle=0.
61999b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST_F(InitGoogleTestTest, ShuffleFalse_0) {
62009b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv[] = {
62019b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
62029b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "--gtest_shuffle=0",
62039b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
62049b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  };
62059b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
62069b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv2[] = {
62079b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
62089b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
62099b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  };
62109b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
6211ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false);
62129b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
62139b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
62149b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// Tests parsing a --gtest_shuffle flag that has a "true"
62159b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// definition.
62169b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST_F(InitGoogleTestTest, ShuffleTrue) {
62179b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv[] = {
62189b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
62199b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "--gtest_shuffle=1",
62209b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
62219b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  };
62229b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
62239b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  const char* argv2[] = {
62249b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    "foo.exe",
62259b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan    NULL
62269b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan  };
62279b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan
6228ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
6229ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev}
6230ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
6231ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev// Tests parsing --gtest_stack_trace_depth=number.
6232ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosevTEST_F(InitGoogleTestTest, StackTraceDepth) {
6233ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  const char* argv[] = {
6234ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    "foo.exe",
6235ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    "--gtest_stack_trace_depth=5",
6236ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    NULL
6237ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  };
6238ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
6239ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  const char* argv2[] = {
6240ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    "foo.exe",
6241ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev    NULL
6242ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  };
6243ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev
6244ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false);
62459b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan}
6246b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6247c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wanTEST_F(InitGoogleTestTest, StreamResultTo) {
6248c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  const char* argv[] = {
6249c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    "foo.exe",
6250c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    "--gtest_stream_result_to=localhost:1234",
6251c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    NULL
6252c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  };
6253c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan
6254c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  const char* argv2[] = {
6255c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    "foo.exe",
6256c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan    NULL
6257c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  };
6258c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan
6259c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan  GTEST_TEST_PARSING_FLAGS_(
6260c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan      argv, argv2, Flags::StreamResultTo("localhost:1234"), false);
6261c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan}
6262c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan
6263b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan// Tests parsing --gtest_throw_on_failure.
62649b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTEST_F(InitGoogleTestTest, ThrowOnFailureWithoutValue) {
6265b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  const char* argv[] = {
6266b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "foo.exe",
6267b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "--gtest_throw_on_failure",
6268b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    NULL
6269b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan};
6270b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6271b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  const char* argv2[] = {
6272b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "foo.exe",
6273b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    NULL
6274b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  };
6275b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6276ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
6277b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan}
6278b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6279b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan// Tests parsing --gtest_throw_on_failure=0.
6280b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wanTEST_F(InitGoogleTestTest, ThrowOnFailureFalse_0) {
6281b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  const char* argv[] = {
6282b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "foo.exe",
6283b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "--gtest_throw_on_failure=0",
6284b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    NULL
6285b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  };
6286b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6287b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  const char* argv2[] = {
6288b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "foo.exe",
6289b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    NULL
6290b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  };
6291b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6292ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false);
6293b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan}
6294b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6295b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan// Tests parsing a --gtest_throw_on_failure flag that has a "true"
6296b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan// definition.
6297b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wanTEST_F(InitGoogleTestTest, ThrowOnFailureTrue) {
6298b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  const char* argv[] = {
6299b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "foo.exe",
6300b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "--gtest_throw_on_failure=1",
6301b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    NULL
6302b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  };
6303b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6304b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  const char* argv2[] = {
6305b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    "foo.exe",
6306b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan    NULL
6307b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan  };
6308b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
6309ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
6310b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan}
6311b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan
63124cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS
63134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests parsing wide strings.
63144b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(InitGoogleTestTest, WideStrings) {
63154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const wchar_t* argv[] = {
63164b6829f0d28990dd645e16386eb226d0f10c8731shiqian    L"foo.exe",
63174b6829f0d28990dd645e16386eb226d0f10c8731shiqian    L"--gtest_filter=Foo*",
63184b6829f0d28990dd645e16386eb226d0f10c8731shiqian    L"--gtest_list_tests=1",
63194b6829f0d28990dd645e16386eb226d0f10c8731shiqian    L"--gtest_break_on_failure",
63204b6829f0d28990dd645e16386eb226d0f10c8731shiqian    L"--non_gtest_flag",
63214b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
63224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
63234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const wchar_t* argv2[] = {
63254b6829f0d28990dd645e16386eb226d0f10c8731shiqian    L"foo.exe",
63264b6829f0d28990dd645e16386eb226d0f10c8731shiqian    L"--non_gtest_flag",
63274b6829f0d28990dd645e16386eb226d0f10c8731shiqian    NULL
63284b6829f0d28990dd645e16386eb226d0f10c8731shiqian  };
63294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63304b6829f0d28990dd645e16386eb226d0f10c8731shiqian  Flags expected_flags;
63314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  expected_flags.break_on_failure = true;
63324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  expected_flags.filter = "Foo*";
63334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  expected_flags.list_tests = true;
63344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
6335ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false);
63364b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
63374b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_OS_WINDOWS
63384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests current_test_info() in UnitTest.
63404b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass CurrentTestInfoTest : public Test {
63414b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
63424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Tests that current_test_info() returns NULL before the first test in
63434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // the test case is run.
63444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void SetUpTestCase() {
63454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    // There should be no tests running at this point.
63464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const TestInfo* test_info =
63474b6829f0d28990dd645e16386eb226d0f10c8731shiqian      UnitTest::GetInstance()->current_test_info();
63489644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    EXPECT_TRUE(test_info == NULL)
63494b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << "There should be no tests running at this point.";
63504b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
63514b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63524b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // Tests that current_test_info() returns NULL after the last test in
63534b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // the test case has run.
63544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  static void TearDownTestCase() {
63554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    const TestInfo* test_info =
63564b6829f0d28990dd645e16386eb226d0f10c8731shiqian      UnitTest::GetInstance()->current_test_info();
63579644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    EXPECT_TRUE(test_info == NULL)
63584b6829f0d28990dd645e16386eb226d0f10c8731shiqian        << "There should be no tests running at this point.";
63594b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
63604b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
63614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that current_test_info() returns TestInfo for currently running
63634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test by checking the expected test name against the actual one.
63644b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) {
63654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const TestInfo* test_info =
63664b6829f0d28990dd645e16386eb226d0f10c8731shiqian    UnitTest::GetInstance()->current_test_info();
63674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(NULL != test_info)
63684b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "There is a test running so we should have a valid TestInfo.";
63694b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
63704b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "Expected the name of the currently running test case.";
63714b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("WorksForFirstTestInATestCase", test_info->name())
63724b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "Expected the name of the currently running test.";
63734b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
63744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that current_test_info() returns TestInfo for currently running
63764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test by checking the expected test name against the actual one.  We
63774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// use this test to see that the TestInfo object actually changed from
63784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the previous invocation.
63794b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) {
63804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  const TestInfo* test_info =
63814b6829f0d28990dd645e16386eb226d0f10c8731shiqian    UnitTest::GetInstance()->current_test_info();
63824b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(NULL != test_info)
63834b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "There is a test running so we should have a valid TestInfo.";
63844b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
63854b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "Expected the name of the currently running test case.";
63864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("WorksForSecondTestInATestCase", test_info->name())
63874b6829f0d28990dd645e16386eb226d0f10c8731shiqian      << "Expected the name of the currently running test.";
63884b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
63894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63904b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace testing
63914b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// These two lines test that we can define tests in a namespace that
63934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// has the name "testing" and is nested in another namespace.
63944b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace my_namespace {
63954b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing {
63964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
63974b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Makes sure that TEST knows to use ::testing::Test instead of
63984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// ::my_namespace::testing::Test.
63994b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass Test {};
64004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Makes sure that an assertion knows to use ::testing::Message instead of
64024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// ::my_namespace::testing::Message.
64034b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass Message {};
64044b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Makes sure that an assertion knows to use
64064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// ::testing::AssertionResult instead of
64074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// ::my_namespace::testing::AssertionResult.
64084b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass AssertionResult {};
64094b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that an assertion that should succeed works as expected.
64114b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(NestedTestingNamespaceTest, Success) {
64124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, 1) << "This shouldn't fail.";
64134b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
64144b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that an assertion that should fail works as expected.
64164b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(NestedTestingNamespaceTest, Failure) {
64174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL() << "This failure is expected.",
64184b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "This failure is expected.");
64194b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
64204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64214b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace testing
64224b6829f0d28990dd645e16386eb226d0f10c8731shiqian}  // namespace my_namespace
64234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that one can call superclass SetUp and TearDown methods--
64254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// that is, that they are not private.
64264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// No tests are based on this fixture; the test "passes" if it compiles
64274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// successfully.
6428760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqianclass ProtectedFixtureMethodsTest : public Test {
64294b6829f0d28990dd645e16386eb226d0f10c8731shiqian protected:
64304b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void SetUp() {
6431760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    Test::SetUp();
64324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
64334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  virtual void TearDown() {
6434760af5c16f8af7d34b7ef75a0e4d0b18f023f3f3shiqian    Test::TearDown();
64354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  }
64364b6829f0d28990dd645e16386eb226d0f10c8731shiqian};
64374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// StreamingAssertionsTest tests the streaming versions of a representative
64394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// sample of assertions.
64404b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, Unconditional) {
64414b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SUCCEED() << "expected success";
64424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << "expected failure",
64434b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
64444b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(FAIL() << "expected failure",
64454b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
64464b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
64474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
644898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
644998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Silences warnings: "Condition is always true", "Unreachable code"
6450733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option push -w-ccc -w-rch
645198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
645298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
64534b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, Truth) {
64544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(true) << "unexpected failure";
64554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_TRUE(true) << "unexpected failure";
64564b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "expected failure",
64574b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
64584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << "expected failure",
64594b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
64604b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
64614b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64624b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, Truth2) {
64634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(false) << "unexpected failure";
64644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_FALSE(false) << "unexpected failure";
64654b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "expected failure",
64664b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
64674b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << "expected failure",
64684b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
64694b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
64704b6829f0d28990dd645e16386eb226d0f10c8731shiqian
647198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#ifdef __BORLANDC__
647298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan// Restores warnings after previous "#pragma option push" supressed them
6473733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# pragma option pop
647498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif
647598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan
64764b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, IntegerEquals) {
64774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_EQ(1, 1) << "unexpected failure";
64784b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_EQ(1, 1) << "unexpected failure";
64794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << "expected failure",
64804b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
64814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << "expected failure",
64824b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
64834b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
64844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64854b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, IntegerLessThan) {
64864b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_LT(1, 2) << "unexpected failure";
64874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_LT(1, 2) << "unexpected failure";
64884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << "expected failure",
64894b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
64904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << "expected failure",
64914b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
64924b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
64934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
64944b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, StringsEqual) {
64954b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STREQ("foo", "foo") << "unexpected failure";
64964b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STREQ("foo", "foo") << "unexpected failure";
64974b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ("foo", "bar") << "expected failure",
64984b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
64994b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STREQ("foo", "bar") << "expected failure",
65004b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
65014b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
65024b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65034b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, StringsNotEqual) {
65044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STRNE("foo", "bar") << "unexpected failure";
65054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRNE("foo", "bar") << "unexpected failure";
65064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("foo", "foo") << "expected failure",
65074b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
65084b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STRNE("foo", "foo") << "expected failure",
65094b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
65104b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
65114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65124b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, StringsEqualIgnoringCase) {
65134b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STRCASEEQ("foo", "FOO") << "unexpected failure";
65144b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASEEQ("foo", "FOO") << "unexpected failure";
65154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ("foo", "bar") << "expected failure",
65164b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
65174b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("foo", "bar") << "expected failure",
65184b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
65194b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
65204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65214b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) {
65224b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_STRCASENE("foo", "bar") << "unexpected failure";
65234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_STRCASENE("foo", "bar") << "unexpected failure";
65244b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("foo", "FOO") << "expected failure",
65254b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
65264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("bar", "BAR") << "expected failure",
65274b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
65284b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
65294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65304b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(StreamingAssertionsTest, FloatingPointEquals) {
65314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
65324b6829f0d28990dd645e16386eb226d0f10c8731shiqian  ASSERT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
65334b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << "expected failure",
65344b6829f0d28990dd645e16386eb226d0f10c8731shiqian                          "expected failure");
65354b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << "expected failure",
65364b6829f0d28990dd645e16386eb226d0f10c8731shiqian                       "expected failure");
65374b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
65384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65399204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#if GTEST_HAS_EXCEPTIONS
65409204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
65419204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(StreamingAssertionsTest, Throw) {
65429204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_THROW(ThrowAnInteger(), int) << "unexpected failure";
65439204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  ASSERT_THROW(ThrowAnInteger(), int) << "unexpected failure";
65449204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) <<
65459204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                          "expected failure", "expected failure");
65469204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) <<
65479204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                       "expected failure", "expected failure");
65489204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
65499204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
65509204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(StreamingAssertionsTest, NoThrow) {
6551ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_NO_THROW(ThrowNothing()) << "unexpected failure";
6552ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  ASSERT_NO_THROW(ThrowNothing()) << "unexpected failure";
65539204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) <<
65549204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                          "expected failure", "expected failure");
65559204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) <<
65569204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                       "expected failure", "expected failure");
65579204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
65589204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
65599204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqianTEST(StreamingAssertionsTest, AnyThrow) {
65609204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  EXPECT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
65619204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian  ASSERT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
6562ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) <<
65639204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                          "expected failure", "expected failure");
6564ac60cef37792a6cb7f3534d3f4e2c6d69ab4b5e6zhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) <<
65659204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian                       "expected failure", "expected failure");
65669204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian}
65679204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
65689204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian#endif  // GTEST_HAS_EXCEPTIONS
65699204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian
65704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tests that Google Test correctly decides whether to use colors in the output.
65714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65724b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) {
65734b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "yes";
65744b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65754b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm");  // TERM supports colors.
65764b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
65774b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
65784b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65794b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
65804b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
65814b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
65824b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
65834b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65844b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) {
65854b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
65864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65874b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "True";
65884b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
65894b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65904b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "t";
65914b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
65924b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65934b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "1";
65944b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
65954b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
65964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
65974b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) {
65984b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "no";
65994b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66004b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm");  // TERM supports colors.
66014b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66024b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
66034b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66044b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
66054b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66064b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
66074b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
66084b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66094b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) {
66104b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm");  // TERM supports colors.
66114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66124b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "F";
66134b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66144b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66154b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "0";
66164b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66174b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66184b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "unknown";
66194b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66204b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
66214b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66224b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) {
66234b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "auto";
66244b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66254b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm");  // TERM supports colors.
66264b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
66274b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));    // Stdout is a TTY.
66284b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
66294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66304b6829f0d28990dd645e16386eb226d0f10c8731shiqianTEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) {
66314b6829f0d28990dd645e16386eb226d0f10c8731shiqian  GTEST_FLAG(color) = "auto";
66324b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66334cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS
66344b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // On Windows, we ignore the TERM variable as it's usually not set.
66354b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66364b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "dumb");
66374b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66384b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66394b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "");
66404b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66414b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66424b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm");
66434b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66444b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else
66454b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // On non-Windows platforms, we rely on TERM to determine if the
66464b6829f0d28990dd645e16386eb226d0f10c8731shiqian  // terminal supports colors.
66474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66484b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
66494b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66504b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66514b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "emacs");  // TERM doesn't support colors.
66524b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66534b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66544b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "vt100");  // TERM doesn't support colors.
66554b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66564b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66574b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm-mono");  // TERM doesn't support colors.
66584b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
66594b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66604b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm");  // TERM supports colors.
66614b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66624b6829f0d28990dd645e16386eb226d0f10c8731shiqian
66634b6829f0d28990dd645e16386eb226d0f10c8731shiqian  SetEnv("TERM", "xterm-color");  // TERM supports colors.
66644b6829f0d28990dd645e16386eb226d0f10c8731shiqian  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
6665a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan
66669f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev  SetEnv("TERM", "xterm-256color");  // TERM supports colors.
66679f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66689f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev
66699f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev  SetEnv("TERM", "screen");  // TERM supports colors.
66709f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66719f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev
66724036e7d55c332d45cfb3f22ed682acce2b8390fdzhanyong.wan  SetEnv("TERM", "screen-256color");  // TERM supports colors.
66734036e7d55c332d45cfb3f22ed682acce2b8390fdzhanyong.wan  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66744036e7d55c332d45cfb3f22ed682acce2b8390fdzhanyong.wan
6675a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan  SetEnv("TERM", "linux");  // TERM supports colors.
6676a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66779f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev
66789f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev  SetEnv("TERM", "cygwin");  // TERM supports colors.
66799f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
66804b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif  // GTEST_OS_WINDOWS
66814b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
66824b6829f0d28990dd645e16386eb226d0f10c8731shiqian
668321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian// Verifies that StaticAssertTypeEq works in a namespace scope.
668421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
66855e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wanstatic bool dummy1 GTEST_ATTRIBUTE_UNUSED_ = StaticAssertTypeEq<bool, bool>();
66865e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wanstatic bool dummy2 GTEST_ATTRIBUTE_UNUSED_ =
66875e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan    StaticAssertTypeEq<const int, const int>();
668821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
668921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian// Verifies that StaticAssertTypeEq works in a class.
669021d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
669121d43d1a7e09d960b790d992f1bb4e92c70391d4shiqiantemplate <typename T>
669221d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianclass StaticAssertTypeEqTestHelper {
669321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian public:
669421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  StaticAssertTypeEqTestHelper() { StaticAssertTypeEq<bool, T>(); }
669521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian};
669621d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
669721d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianTEST(StaticAssertTypeEqTest, WorksInClass) {
669821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  StaticAssertTypeEqTestHelper<bool>();
669921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian}
670021d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
670121d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian// Verifies that StaticAssertTypeEq works inside a function.
670221d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
670321d43d1a7e09d960b790d992f1bb4e92c70391d4shiqiantypedef int IntAlias;
670421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
670521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqianTEST(StaticAssertTypeEqTest, CompilesForEqualTypes) {
670621d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  StaticAssertTypeEq<int, IntAlias>();
670721d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian  StaticAssertTypeEq<int*, IntAlias*>();
670821d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian}
670921d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian
6710f904a612d9444ab36c07a8e619c113432e046f49vladlosevTEST(GetCurrentOsStackTraceExceptTopTest, ReturnsTheStackTrace) {
6711f904a612d9444ab36c07a8e619c113432e046f49vladlosev  testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
6712f904a612d9444ab36c07a8e619c113432e046f49vladlosev
6713f904a612d9444ab36c07a8e619c113432e046f49vladlosev  // We don't have a stack walker in Google Test yet.
6714f904a612d9444ab36c07a8e619c113432e046f49vladlosev  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 0).c_str());
6715f904a612d9444ab36c07a8e619c113432e046f49vladlosev  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 1).c_str());
6716f904a612d9444ab36c07a8e619c113432e046f49vladlosev}
67171b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67181b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) {
67191b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_FALSE(HasNonfatalFailure());
67201b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67211b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67221b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanstatic void FailFatally() { FAIL(); }
67231b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67241b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) {
67251b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  FailFatally();
67261b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_nonfatal_failure = HasNonfatalFailure();
67271b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67281b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_FALSE(has_nonfatal_failure);
67291b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67301b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67311b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
67321b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ADD_FAILURE();
67331b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_nonfatal_failure = HasNonfatalFailure();
67341b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67351b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_TRUE(has_nonfatal_failure);
67361b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67371b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67381b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
67391b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  FailFatally();
67401b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ADD_FAILURE();
67411b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_nonfatal_failure = HasNonfatalFailure();
67421b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67431b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_TRUE(has_nonfatal_failure);
67441b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67451b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67461b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan// A wrapper for calling HasNonfatalFailure outside of a test body.
67471b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanstatic bool HasNonfatalFailureHelper() {
67481b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  return testing::Test::HasNonfatalFailure();
67491b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67501b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67511b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) {
67521b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_FALSE(HasNonfatalFailureHelper());
67531b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67541b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67551b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) {
67561b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ADD_FAILURE();
67571b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_nonfatal_failure = HasNonfatalFailureHelper();
67581b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67591b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_TRUE(has_nonfatal_failure);
67601b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67611b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67621b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) {
67631b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_FALSE(HasFailure());
67641b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67651b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67661b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) {
67671b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  FailFatally();
67681b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_failure = HasFailure();
67691b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67701b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_TRUE(has_failure);
67711b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67721b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67731b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
67741b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ADD_FAILURE();
67751b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_failure = HasFailure();
67761b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67771b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_TRUE(has_failure);
67781b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67791b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67801b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
67811b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  FailFatally();
67821b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ADD_FAILURE();
67831b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_failure = HasFailure();
67841b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67851b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_TRUE(has_failure);
67861b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67871b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67881b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan// A wrapper for calling HasFailure outside of a test body.
67891b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanstatic bool HasFailureHelper() { return testing::Test::HasFailure(); }
67901b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67911b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasFailureTest, WorksOutsideOfTestBody) {
67921b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_FALSE(HasFailureHelper());
67931b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
67941b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan
67951b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanTEST(HasFailureTest, WorksOutsideOfTestBody2) {
67961b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ADD_FAILURE();
67971b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  const bool has_failure = HasFailureHelper();
67981b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  ClearCurrentTestPartResults();
67991b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan  EXPECT_TRUE(has_failure);
68001b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan}
6801f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6802f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanclass TestListener : public EmptyTestEventListener {
6803f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan public:
6804f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {}
6805f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener(int* on_start_counter, bool* is_destroyed)
6806f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      : on_start_counter_(on_start_counter),
6807f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan        is_destroyed_(is_destroyed) {}
6808f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6809f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  virtual ~TestListener() {
6810f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    if (is_destroyed_)
6811f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      *is_destroyed_ = true;
6812f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
6813f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6814f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan protected:
68157dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
6816f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    if (on_start_counter_ != NULL)
6817f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      (*on_start_counter_)++;
6818f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
6819f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6820f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan private:
6821f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int* on_start_counter_;
6822f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool* is_destroyed_;
6823f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan};
6824f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6825f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests the constructor.
6826f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTEST(TestEventListenersTest, ConstructionWorks) {
6827f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListeners listeners;
6828f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6829f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL);
6830f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(listeners.default_result_printer() == NULL);
6831f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
6832f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
6833f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6834f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Tests that the TestEventListeners destructor deletes all the listeners it
6835f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// owns.
6836f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTEST(TestEventListenersTest, DestructionWorks) {
6837f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool default_result_printer_is_destroyed = false;
6838f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool default_xml_printer_is_destroyed = false;
6839f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool extra_listener_is_destroyed = false;
6840f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* default_result_printer = new TestListener(
6841f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      NULL, &default_result_printer_is_destroyed);
6842f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* default_xml_printer = new TestListener(
6843f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      NULL, &default_xml_printer_is_destroyed);
6844f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* extra_listener = new TestListener(
6845f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      NULL, &extra_listener_is_destroyed);
6846f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6847f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  {
6848f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListeners listeners;
6849f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners,
6850f6d087b78d230d875bf5d8281112662795044680zhanyong.wan                                                        default_result_printer);
6851f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners,
6852f6d087b78d230d875bf5d8281112662795044680zhanyong.wan                                                       default_xml_printer);
6853f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    listeners.Append(extra_listener);
6854f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
6855f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(default_result_printer_is_destroyed);
6856f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(default_xml_printer_is_destroyed);
6857f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(extra_listener_is_destroyed);
6858f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
6859f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6860f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Tests that a listener Append'ed to a TestEventListeners list starts
6861f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// receiving events.
6862f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTEST(TestEventListenersTest, Append) {
6863f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int on_start_counter = 0;
6864f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool is_destroyed = false;
6865f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
6866f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  {
6867f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListeners listeners;
6868f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    listeners.Append(listener);
6869f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
6870f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan        *UnitTest::GetInstance());
6871f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_EQ(1, on_start_counter);
6872f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
6873f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(is_destroyed);
6874f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
6875f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
68767dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// Tests that listeners receive events in the order they were appended to
68777dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// the list, except for *End requests, which must be received in the reverse
68787dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// order.
6879f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanclass SequenceTestingListener : public EmptyTestEventListener {
6880f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan public:
688103c314931649a999b0cf5deb0a434a1009157416jgm@google.com  SequenceTestingListener(std::vector<std::string>* vector, const char* id)
68827dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan      : vector_(vector), id_(id) {}
6883f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6884f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan protected:
68857dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
688693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    vector_->push_back(GetEventDescription("OnTestProgramStart"));
68877dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  }
68887dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
68897dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
689093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    vector_->push_back(GetEventDescription("OnTestProgramEnd"));
68917dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  }
68927dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
68937dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
68947dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan                                    int /*iteration*/) {
689593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    vector_->push_back(GetEventDescription("OnTestIterationStart"));
68967dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  }
68977dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
68987dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
68997dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan                                  int /*iteration*/) {
690093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan    vector_->push_back(GetEventDescription("OnTestIterationEnd"));
6901f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
6902f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6903f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan private:
690403c314931649a999b0cf5deb0a434a1009157416jgm@google.com  std::string GetEventDescription(const char* method) {
69057dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan    Message message;
69067dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan    message << id_ << "." << method;
69077dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan    return message.GetString();
69087dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  }
69097dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
691003c314931649a999b0cf5deb0a434a1009157416jgm@google.com  std::vector<std::string>* vector_;
69117dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  const char* const id_;
6912d586f9f13c5b5ba31bc00c305f3bf2a97d5874f8zhanyong.wan
6913d586f9f13c5b5ba31bc00c305f3bf2a97d5874f8zhanyong.wan  GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener);
6914f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan};
6915f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6916f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(EventListenerTest, AppendKeepsOrder) {
691703c314931649a999b0cf5deb0a434a1009157416jgm@google.com  std::vector<std::string> vec;
6918f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListeners listeners;
69197dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  listeners.Append(new SequenceTestingListener(&vec, "1st"));
69207dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  listeners.Append(new SequenceTestingListener(&vec, "2nd"));
69217dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan  listeners.Append(new SequenceTestingListener(&vec, "3rd"));
69227dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
6923f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
69247dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan      *UnitTest::GetInstance());
692593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ASSERT_EQ(3U, vec.size());
692693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("1st.OnTestProgramStart", vec[0].c_str());
692793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("2nd.OnTestProgramStart", vec[1].c_str());
692893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("3rd.OnTestProgramStart", vec[2].c_str());
69297dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
693093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  vec.clear();
6931f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd(
6932f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      *UnitTest::GetInstance());
693393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ASSERT_EQ(3U, vec.size());
693493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("3rd.OnTestProgramEnd", vec[0].c_str());
693593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("2nd.OnTestProgramEnd", vec[1].c_str());
693693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("1st.OnTestProgramEnd", vec[2].c_str());
69377dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
693893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  vec.clear();
6939f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart(
69407dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan      *UnitTest::GetInstance(), 0);
694193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ASSERT_EQ(3U, vec.size());
694293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("1st.OnTestIterationStart", vec[0].c_str());
694393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("2nd.OnTestIterationStart", vec[1].c_str());
694493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("3rd.OnTestIterationStart", vec[2].c_str());
69457dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan
694693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  vec.clear();
6947f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd(
69487dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan      *UnitTest::GetInstance(), 0);
694993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  ASSERT_EQ(3U, vec.size());
695093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("3rd.OnTestIterationEnd", vec[0].c_str());
695193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("2nd.OnTestIterationEnd", vec[1].c_str());
695293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan  EXPECT_STREQ("1st.OnTestIterationEnd", vec[2].c_str());
6953f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
6954f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6955f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Tests that a listener removed from a TestEventListeners list stops receiving
6956f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// events and is not deleted when the list is destroyed.
6957f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTEST(TestEventListenersTest, Release) {
6958f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int on_start_counter = 0;
6959f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool is_destroyed = false;
6960f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // Although Append passes the ownership of this object to the list,
6961f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // the following calls release it, and we need to delete it before the
6962f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // test ends.
6963f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
6964f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  {
6965f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListeners listeners;
6966f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    listeners.Append(listener);
6967f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_EQ(listener, listeners.Release(listener));
6968f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
6969f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan        *UnitTest::GetInstance());
6970f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_TRUE(listeners.Release(listener) == NULL);
6971f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
6972f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(0, on_start_counter);
6973f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_FALSE(is_destroyed);
6974f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  delete listener;
6975f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
6976f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6977f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests that no events are forwarded when event forwarding is disabled.
6978f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(EventListenerTest, SuppressEventForwarding) {
6979f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int on_start_counter = 0;
6980f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* listener = new TestListener(&on_start_counter, NULL);
6981f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6982f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListeners listeners;
6983f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  listeners.Append(listener);
6984f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
6985f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::SuppressEventForwarding(&listeners);
6986f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
6987f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
6988f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      *UnitTest::GetInstance());
6989f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(0, on_start_counter);
6990f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
6991f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
6992f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests that events generated by Google Test are not forwarded in
6993f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// death test subprocesses.
6994f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) {
6995d541f0259d2f6857df769f581363f84e8c4b2899zhanyong.wan  EXPECT_DEATH_IF_SUPPORTED({
6996f6d087b78d230d875bf5d8281112662795044680zhanyong.wan      GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled(
6997f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan          *GetUnitTestImpl()->listeners())) << "expected failure";},
6998f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      "expected failure");
6999f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
7000f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7001f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests that a listener installed via SetDefaultResultPrinter() starts
7002f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// receiving events and is returned via default_result_printer() and that
7003f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// the previous default_result_printer is removed from the list and deleted.
7004f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(EventListenerTest, default_result_printer) {
7005f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int on_start_counter = 0;
7006f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool is_destroyed = false;
7007f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
7008f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7009f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListeners listeners;
7010f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
7011f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7012f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(listener, listeners.default_result_printer());
7013f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7014f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
7015f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      *UnitTest::GetInstance());
7016f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7017f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(1, on_start_counter);
7018f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7019f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // Replacing default_result_printer with something else should remove it
7020f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // from the list and destroy it.
7021f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL);
7022f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7023f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(listeners.default_result_printer() == NULL);
7024f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(is_destroyed);
7025f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7026f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // After broadcasting an event the counter is still the same, indicating
7027f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // the listener is not in the list anymore.
7028f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
7029f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      *UnitTest::GetInstance());
7030f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(1, on_start_counter);
7031f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
7032f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7033f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests that the default_result_printer listener stops receiving events
7034f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// when removed via Release and that is not owned by the list anymore.
7035f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(EventListenerTest, RemovingDefaultResultPrinterWorks) {
7036f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int on_start_counter = 0;
7037f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool is_destroyed = false;
7038f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // Although Append passes the ownership of this object to the list,
7039f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // the following calls release it, and we need to delete it before the
7040f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // test ends.
7041f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
7042f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  {
7043f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListeners listeners;
7044f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
7045f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7046f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_EQ(listener, listeners.Release(listener));
7047f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_TRUE(listeners.default_result_printer() == NULL);
7048f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_FALSE(is_destroyed);
7049f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7050f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    // Broadcasting events now should not affect default_result_printer.
7051f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
7052f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan        *UnitTest::GetInstance());
7053f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_EQ(0, on_start_counter);
7054f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
7055f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // Destroying the list should not affect the listener now, too.
7056f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_FALSE(is_destroyed);
7057f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  delete listener;
7058f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
7059f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7060f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests that a listener installed via SetDefaultXmlGenerator() starts
7061f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// receiving events and is returned via default_xml_generator() and that
7062f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// the previous default_xml_generator is removed from the list and deleted.
7063f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(EventListenerTest, default_xml_generator) {
7064f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int on_start_counter = 0;
7065f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool is_destroyed = false;
7066f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
7067f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7068f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListeners listeners;
7069f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
7070f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7071f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(listener, listeners.default_xml_generator());
7072f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7073f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
7074f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      *UnitTest::GetInstance());
7075f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7076f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(1, on_start_counter);
7077f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7078f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // Replacing default_xml_generator with something else should remove it
7079f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // from the list and destroy it.
7080f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL);
7081f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7082f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
7083f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_TRUE(is_destroyed);
7084f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7085f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // After broadcasting an event the counter is still the same, indicating
7086f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // the listener is not in the list anymore.
7087f6d087b78d230d875bf5d8281112662795044680zhanyong.wan  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
7088f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan      *UnitTest::GetInstance());
7089f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_EQ(1, on_start_counter);
7090f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
7091f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7092f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Tests that the default_xml_generator listener stops receiving events
7093f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// when removed via Release and that is not owned by the list anymore.
7094f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanTEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) {
7095f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  int on_start_counter = 0;
7096f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  bool is_destroyed = false;
7097f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // Although Append passes the ownership of this object to the list,
7098f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // the following calls release it, and we need to delete it before the
7099f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // test ends.
7100f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
7101f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  {
7102f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListeners listeners;
7103f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
7104f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7105f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_EQ(listener, listeners.Release(listener));
7106f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_TRUE(listeners.default_xml_generator() == NULL);
7107f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_FALSE(is_destroyed);
7108f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan
7109f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    // Broadcasting events now should not affect default_xml_generator.
7110f6d087b78d230d875bf5d8281112662795044680zhanyong.wan    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
7111f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan        *UnitTest::GetInstance());
7112f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan    EXPECT_EQ(0, on_start_counter);
7113f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  }
7114f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  // Destroying the list should not affect the listener now, too.
7115f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  EXPECT_FALSE(is_destroyed);
7116f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan  delete listener;
7117f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan}
71181618bb491b881bc39faa3317ee8778847646226dzhanyong.wan
71191618bb491b881bc39faa3317ee8778847646226dzhanyong.wan// Sanity tests to ensure that the alternative, verbose spellings of
71201618bb491b881bc39faa3317ee8778847646226dzhanyong.wan// some of the macros work.  We don't test them thoroughly as that
71211618bb491b881bc39faa3317ee8778847646226dzhanyong.wan// would be quite involved.  Since their implementations are
71221618bb491b881bc39faa3317ee8778847646226dzhanyong.wan// straightforward, and they are rarely used, we'll just rely on the
71231618bb491b881bc39faa3317ee8778847646226dzhanyong.wan// users to tell us when they are broken.
71241618bb491b881bc39faa3317ee8778847646226dzhanyong.wanGTEST_TEST(AlternativeNameTest, Works) {  // GTEST_TEST is the same as TEST.
71251618bb491b881bc39faa3317ee8778847646226dzhanyong.wan  GTEST_SUCCEED() << "OK";  // GTEST_SUCCEED is the same as SUCCEED.
71261618bb491b881bc39faa3317ee8778847646226dzhanyong.wan
71271618bb491b881bc39faa3317ee8778847646226dzhanyong.wan  // GTEST_FAIL is the same as FAIL.
71281618bb491b881bc39faa3317ee8778847646226dzhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_FAIL() << "An expected failure",
71291618bb491b881bc39faa3317ee8778847646226dzhanyong.wan                       "An expected failure");
71300bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan
71310bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  // GTEST_ASSERT_XY is the same as ASSERT_XY.
71320bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan
71330bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_EQ(0, 0);
71340bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(0, 1) << "An expected failure",
71350bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71360bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(1, 0) << "An expected failure",
71370bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71380bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan
71390bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_NE(0, 1);
71400bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_NE(1, 0);
71410bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_NE(0, 0) << "An expected failure",
71420bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71430bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan
71440bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_LE(0, 0);
71450bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_LE(0, 1);
71460bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LE(1, 0) << "An expected failure",
71470bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71480bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan
71490bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_LT(0, 1);
71500bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(0, 0) << "An expected failure",
71510bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71520bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(1, 0) << "An expected failure",
71530bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71540bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan
71550bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_GE(0, 0);
71560bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_GE(1, 0);
71570bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GE(0, 1) << "An expected failure",
71580bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71590bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan
71600bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  GTEST_ASSERT_GT(1, 0);
71610bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(0, 1) << "An expected failure",
71620bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71630bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(1, 1) << "An expected failure",
71640bfb56317785c7960bedee9fda0bb879347e2121zhanyong.wan                       "An expected failure");
71651618bb491b881bc39faa3317ee8778847646226dzhanyong.wan}
7166678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7167678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests for internal utilities necessary for implementation of the universal
7168678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// printing.
7169678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// TODO(vladl@google.com): Find a better home for them.
7170678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7171678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanclass ConversionHelperBase {};
7172678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanclass ConversionHelperDerived : public ConversionHelperBase {};
7173678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7174678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that IsAProtocolMessage<T>::value is a compile-time constant.
7175678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(IsAProtocolMessageTest, ValueIsCompileTimeConstant) {
7176678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  GTEST_COMPILE_ASSERT_(IsAProtocolMessage<ProtocolMessage>::value,
7177678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan                        const_true);
7178678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  GTEST_COMPILE_ASSERT_(!IsAProtocolMessage<int>::value, const_false);
7179678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7180678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7181678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that IsAProtocolMessage<T>::value is true when T is
71825d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan// proto2::Message or a sub-class of it.
7183678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(IsAProtocolMessageTest, ValueIsTrueWhenTypeIsAProtocolMessage) {
7184678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(IsAProtocolMessage< ::proto2::Message>::value);
7185678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(IsAProtocolMessage<ProtocolMessage>::value);
7186678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7187678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7188678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that IsAProtocolMessage<T>::value is false when T is neither
7189678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// ProtocolMessage nor a sub-class of it.
7190678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(IsAProtocolMessageTest, ValueIsFalseWhenTypeIsNotAProtocolMessage) {
7191678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE(IsAProtocolMessage<int>::value);
7192678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE(IsAProtocolMessage<const ConversionHelperBase>::value);
7193678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7194678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7195678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that CompileAssertTypesEqual compiles when the type arguments are
7196678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// equal.
7197678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(CompileAssertTypesEqual, CompilesWhenTypesAreEqual) {
7198678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<void, void>();
7199678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<int*, int*>();
7200678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7201678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7202678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that RemoveReference does not affect non-reference types.
7203678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(RemoveReferenceTest, DoesNotAffectNonReferenceType) {
7204678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<int, RemoveReference<int>::type>();
7205678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<const char, RemoveReference<const char>::type>();
7206678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7207678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7208678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that RemoveReference removes reference from reference types.
7209678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(RemoveReferenceTest, RemovesReference) {
7210678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<int, RemoveReference<int&>::type>();
7211678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<const char, RemoveReference<const char&>::type>();
7212678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7213678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7214678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests GTEST_REMOVE_REFERENCE_.
7215678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7216678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T1, typename T2>
7217678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanvoid TestGTestRemoveReference() {
7218678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_(T2)>();
7219678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7220678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7221678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(RemoveReferenceTest, MacroVersion) {
7222678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestRemoveReference<int, int>();
7223678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestRemoveReference<const char, const char&>();
7224678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7225678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7226678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7227678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that RemoveConst does not affect non-const types.
7228678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(RemoveConstTest, DoesNotAffectNonConstType) {
7229678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<int, RemoveConst<int>::type>();
7230678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<char&, RemoveConst<char&>::type>();
7231678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7232678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7233678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that RemoveConst removes const from const types.
7234678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(RemoveConstTest, RemovesConst) {
7235678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<int, RemoveConst<const int>::type>();
7236678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<char[2], RemoveConst<const char[2]>::type>();
7237678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<char[2][3], RemoveConst<const char[2][3]>::type>();
7238678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7239678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7240678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests GTEST_REMOVE_CONST_.
7241678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7242678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T1, typename T2>
7243678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanvoid TestGTestRemoveConst() {
7244678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<T1, GTEST_REMOVE_CONST_(T2)>();
7245678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7246678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7247678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(RemoveConstTest, MacroVersion) {
7248678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestRemoveConst<int, int>();
7249678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestRemoveConst<double&, double&>();
7250678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestRemoveConst<char, const char>();
7251678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7252678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7253c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan// Tests GTEST_REMOVE_REFERENCE_AND_CONST_.
7254c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan
7255c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wantemplate <typename T1, typename T2>
7256c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wanvoid TestGTestRemoveReferenceAndConst() {
7257c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_AND_CONST_(T2)>();
7258c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan}
7259c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan
7260c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wanTEST(RemoveReferenceToConstTest, Works) {
7261c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan  TestGTestRemoveReferenceAndConst<int, int>();
7262c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan  TestGTestRemoveReferenceAndConst<double, double&>();
7263c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan  TestGTestRemoveReferenceAndConst<char, const char>();
7264c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan  TestGTestRemoveReferenceAndConst<char, const char&>();
7265c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan  TestGTestRemoveReferenceAndConst<const char*, const char*>();
7266c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan}
7267c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan
7268678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that AddReference does not affect reference types.
7269678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(AddReferenceTest, DoesNotAffectReferenceType) {
7270678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<int&, AddReference<int&>::type>();
7271678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<const char&, AddReference<const char&>::type>();
7272678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7273678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7274678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that AddReference adds reference to non-reference types.
7275678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(AddReferenceTest, AddsReference) {
7276678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<int&, AddReference<int>::type>();
7277678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<const char&, AddReference<const char>::type>();
7278678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7279678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7280678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests GTEST_ADD_REFERENCE_.
7281678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7282678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T1, typename T2>
7283678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanvoid TestGTestAddReference() {
7284678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<T1, GTEST_ADD_REFERENCE_(T2)>();
7285678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7286678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7287678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(AddReferenceTest, MacroVersion) {
7288678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestAddReference<int&, int>();
7289678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestAddReference<const char&, const char&>();
7290678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7291678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7292678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests GTEST_REFERENCE_TO_CONST_.
7293678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7294678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T1, typename T2>
7295678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanvoid TestGTestReferenceToConst() {
7296678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CompileAssertTypesEqual<T1, GTEST_REFERENCE_TO_CONST_(T2)>();
7297678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7298678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7299678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(GTestReferenceToConstTest, Works) {
7300678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestReferenceToConst<const char&, char>();
7301678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestReferenceToConst<const int&, const int>();
7302678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  TestGTestReferenceToConst<const double&, double>();
730303c314931649a999b0cf5deb0a434a1009157416jgm@google.com  TestGTestReferenceToConst<const std::string&, const std::string&>();
7304678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7305678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7306678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that ImplicitlyConvertible<T1, T2>::value is a compile-time constant.
7307678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ImplicitlyConvertibleTest, ValueIsCompileTimeConstant) {
7308678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  GTEST_COMPILE_ASSERT_((ImplicitlyConvertible<int, int>::value), const_true);
7309678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  GTEST_COMPILE_ASSERT_((!ImplicitlyConvertible<void*, int*>::value),
7310678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan                        const_false);
7311678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7312678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7313678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that ImplicitlyConvertible<T1, T2>::value is true when T1 can
7314678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// be implicitly converted to T2.
7315678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ImplicitlyConvertibleTest, ValueIsTrueWhenConvertible) {
7316678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE((ImplicitlyConvertible<int, double>::value));
7317678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE((ImplicitlyConvertible<double, int>::value));
7318678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE((ImplicitlyConvertible<int*, void*>::value));
7319678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE((ImplicitlyConvertible<int*, const int*>::value));
7320678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE((ImplicitlyConvertible<ConversionHelperDerived&,
7321678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan                                     const ConversionHelperBase&>::value));
7322678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE((ImplicitlyConvertible<const ConversionHelperBase,
7323678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan                                     ConversionHelperBase>::value));
7324678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7325678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7326678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests that ImplicitlyConvertible<T1, T2>::value is false when T1
7327678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// cannot be implicitly converted to T2.
7328678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ImplicitlyConvertibleTest, ValueIsFalseWhenNotConvertible) {
7329678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE((ImplicitlyConvertible<double, int*>::value));
7330678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE((ImplicitlyConvertible<void*, int*>::value));
7331678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE((ImplicitlyConvertible<const int*, int*>::value));
7332678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE((ImplicitlyConvertible<ConversionHelperBase&,
7333678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan                                      ConversionHelperDerived&>::value));
7334678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7335678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7336678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests IsContainerTest.
7337678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7338678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanclass NonContainer {};
7339678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7340678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(IsContainerTestTest, WorksForNonContainer) {
7341678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<int>(0)));
7342678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<char[5]>(0)));
7343678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<NonContainer>(0)));
7344678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7345678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7346678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(IsContainerTestTest, WorksForContainer) {
7347678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(sizeof(IsContainer),
7348678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan            sizeof(IsContainerTest<std::vector<bool> >(0)));
7349678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(sizeof(IsContainer),
7350678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan            sizeof(IsContainerTest<std::map<int, double> >(0)));
7351678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7352678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7353678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests ArrayEq().
7354678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7355678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ArrayEqTest, WorksForDegeneratedArrays) {
7356678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(5, 5L));
7357678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE(ArrayEq('a', 0));
7358678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7359678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7360678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ArrayEqTest, WorksForOneDimensionalArrays) {
736193fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  // Note that a and b are distinct but compatible types.
7362678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int a[] = { 0, 1 };
7363678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  long b[] = { 0, 1 };
7364678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, b));
7365678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, 2, b));
7366678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7367678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  b[0] = 2;
7368678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE(ArrayEq(a, b));
7369678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE(ArrayEq(a, 1, b));
7370678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7371678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7372678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ArrayEqTest, WorksForTwoDimensionalArrays) {
7373678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const char a[][3] = { "hi", "lo" };
7374678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const char b[][3] = { "hi", "lo" };
7375678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const char c[][3] = { "hi", "li" };
7376678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7377678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, b));
7378678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, 2, b));
7379678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7380678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE(ArrayEq(a, c));
7381678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_FALSE(ArrayEq(a, 2, c));
7382678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7383678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7384678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests ArrayAwareFind().
7385678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7386678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ArrayAwareFindTest, WorksForOneDimensionalArray) {
7387678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const char a[] = "hello";
7388678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(a + 4, ArrayAwareFind(a, a + 5, 'o'));
7389678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(a + 5, ArrayAwareFind(a, a + 5, 'x'));
7390678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7391678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7392678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(ArrayAwareFindTest, WorksForTwoDimensionalArray) {
7393678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  int a[][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
7394678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int b[2] = { 2, 3 };
7395678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(a + 1, ArrayAwareFind(a, a + 3, b));
7396678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7397678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int c[2] = { 6, 7 };
7398678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(a + 3, ArrayAwareFind(a, a + 3, c));
7399678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7400678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7401678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests CopyArray().
7402678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7403678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(CopyArrayTest, WorksForDegeneratedArrays) {
7404678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  int n = 0;
7405678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CopyArray('a', &n);
7406678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ('a', n);
7407678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7408678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7409678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(CopyArrayTest, WorksForOneDimensionalArrays) {
7410678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const char a[3] = "hi";
7411678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  int b[3];
7412ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
7413678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CopyArray(a, &b);
7414678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, b));
7415ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#endif
7416678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7417678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  int c[3];
7418678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CopyArray(a, 3, c);
7419678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, c));
7420678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7421678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7422678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(CopyArrayTest, WorksForTwoDimensionalArrays) {
7423678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int a[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
7424678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  int b[2][3];
7425ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
7426678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CopyArray(a, &b);
7427678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, b));
7428ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan#endif
7429678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7430678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  int c[2][3];
7431678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  CopyArray(a, 2, c);
7432678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(ArrayEq(a, c));
7433678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7434678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7435678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Tests NativeArray.
7436678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7437678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(NativeArrayTest, ConstructorFromArrayWorks) {
7438678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int a[3] = { 0, 1, 2 };
7439f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  NativeArray<int> na(a, 3, RelationToSourceReference());
7440678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(3U, na.size());
7441678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(a, na.begin());
7442678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7443678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7444678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(NativeArrayTest, CreatesAndDeletesCopyOfArrayWhenAskedTo) {
7445678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  typedef int Array[2];
7446678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  Array* a = new Array[1];
7447678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  (*a)[0] = 0;
7448678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  (*a)[1] = 1;
7449f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  NativeArray<int> na(*a, 2, RelationToSourceCopy());
7450678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_NE(*a, na.begin());
7451678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  delete[] a;
7452678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(0, na.begin()[0]);
7453678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(1, na.begin()[1]);
7454678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7455678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  // We rely on the heap checker to verify that na deletes the copy of
7456678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  // array.
7457678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7458678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7459678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(NativeArrayTest, TypeMembersAreCorrect) {
7460678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  StaticAssertTypeEq<char, NativeArray<char>::value_type>();
7461678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  StaticAssertTypeEq<int[2], NativeArray<int[2]>::value_type>();
7462678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7463678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  StaticAssertTypeEq<const char*, NativeArray<char>::const_iterator>();
7464678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  StaticAssertTypeEq<const bool(*)[2], NativeArray<bool[2]>::const_iterator>();
7465678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7466678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7467678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(NativeArrayTest, MethodsWork) {
7468678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int a[3] = { 0, 1, 2 };
7469f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  NativeArray<int> na(a, 3, RelationToSourceCopy());
7470678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  ASSERT_EQ(3U, na.size());
7471678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(3, na.end() - na.begin());
7472678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7473678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  NativeArray<int>::const_iterator it = na.begin();
7474678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(0, *it);
7475678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  ++it;
7476678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(1, *it);
7477678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  it++;
7478678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(2, *it);
7479678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  ++it;
7480678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(na.end(), it);
7481678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7482678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(na == na);
7483678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7484f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  NativeArray<int> na2(a, 3, RelationToSourceReference());
7485678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_TRUE(na == na2);
7486678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7487678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int b1[3] = { 0, 1, 1 };
7488678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const int b2[4] = { 0, 1, 2, 3 };
7489f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  EXPECT_FALSE(na == NativeArray<int>(b1, 3, RelationToSourceReference()));
7490f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  EXPECT_FALSE(na == NativeArray<int>(b2, 4, RelationToSourceCopy()));
7491678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
7492678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan
7493678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanTEST(NativeArrayTest, WorksForTwoDimensionalArray) {
7494678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  const char a[2][3] = { "hi", "lo" };
7495f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com  NativeArray<char[3]> na(a, 2, RelationToSourceReference());
7496678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  ASSERT_EQ(2U, na.size());
7497678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan  EXPECT_EQ(a, na.begin());
7498678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}
74999748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan
75009748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan// Tests SkipPrefix().
75019748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan
75029748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wanTEST(SkipPrefixTest, SkipsWhenPrefixMatches) {
75039748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  const char* const str = "hello";
75049748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan
75059748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  const char* p = str;
75069748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_TRUE(SkipPrefix("", &p));
75079748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_EQ(str, p);
75089748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan
75099748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  p = str;
75109748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_TRUE(SkipPrefix("hell", &p));
75119748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_EQ(str + 4, p);
75129748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan}
75139748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan
75149748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wanTEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) {
75159748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  const char* const str = "world";
75169748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan
75179748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  const char* p = str;
75189748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_FALSE(SkipPrefix("W", &p));
75199748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_EQ(str, p);
75209748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan
75219748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  p = str;
75229748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_FALSE(SkipPrefix("world!", &p));
75239748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan  EXPECT_EQ(str, p);
75249748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wan}
7525f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com
7526