1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2005, Google Inc. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// All rights reserved. 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Redistribution and use in source and binary forms, with or without 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// modification, are permitted provided that the following conditions are 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// met: 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Redistributions of source code must retain the above copyright 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// notice, this list of conditions and the following disclaimer. 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Redistributions in binary form must reproduce the above 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// copyright notice, this list of conditions and the following disclaimer 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in the documentation and/or other materials provided with the 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distribution. 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Neither the name of Google Inc. nor the names of its 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// contributors may be used to endorse or promote products derived from 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// this software without specific prior written permission. 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Author: wan@google.com (Zhanyong Wan) 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The Google C++ Testing Framework (Google Test) 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/gtest.h> 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/gtest-spi.h> 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <ctype.h> 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <math.h> 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdarg.h> 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdio.h> 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdlib.h> 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string.h> 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_LINUX 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(kenton@google.com): Use autoconf to detect availability of 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// gettimeofday(). 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_HAS_GETTIMEOFDAY 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <fcntl.h> 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <limits.h> 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sched.h> 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Declares vsnprintf(). This header is not available on Windows. 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <strings.h> 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/mman.h> 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/time.h> 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <unistd.h> 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string> 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <vector> 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(_WIN32_WCE) // We are on Windows CE. 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> // NOLINT 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(_WIN32) // We are on Windows proper. 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <io.h> // NOLINT 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/timeb.h> // NOLINT 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h> // NOLINT 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/stat.h> // NOLINT 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(__MINGW__) || defined(__MINGW32__) 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// MinGW has gettimeofday() but not _ftime64(). 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(kenton@google.com): Use autoconf to detect availability of 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// gettimeofday(). 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(kenton@google.com): There are other ways to get the time on 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// supports these. consider using them instead. 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_HAS_GETTIMEOFDAY 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/time.h> // NOLINT 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// cpplint thinks that the header is already included, so we want to 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// silence it. 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> // NOLINT 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Assume other platforms have gettimeofday(). 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(kenton@google.com): Use autoconf to detect availability of 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// gettimeofday(). 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_HAS_GETTIMEOFDAY 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// cpplint thinks that the header is already included, so we want to 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// silence it. 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/time.h> // NOLINT 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <unistd.h> // NOLINT 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Indicates that this translation unit is part of Google Test's 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// implementation. It must come before gtest-internal-inl.h is 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// included, or there will be a compiler error. This trick is to 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// prevent a user from accidentally including gtest-internal-inl.h in 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// his code. 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_IMPLEMENTATION 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "src/gtest-internal-inl.h" 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef GTEST_IMPLEMENTATION 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define fileno _fileno 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define isatty _isatty 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define vsnprintf _vsnprintf 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace testing { 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Constants. 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A test that matches this pattern is disabled and not run. 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const char kDisableTestPattern[] = "DISABLED_*"; 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A test filter that matches everything. 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const char kUniversalFilter[] = "*"; 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The default output file for XML output. 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const char kDefaultOutputFile[] = "test_detail.xml"; 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_bool( 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break_on_failure, 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::BoolFromGTestEnv("break_on_failure", false), 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "True iff a failed assertion should be a debugger break-point."); 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_bool( 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott catch_exceptions, 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::BoolFromGTestEnv("catch_exceptions", false), 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "True iff " GTEST_NAME 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " should catch exceptions and treat them as test failures."); 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_string( 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott color, 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StringFromGTestEnv("color", "auto"), 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Whether to use colors in the output. Valid values: yes, no, " 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "and auto. 'auto' means to use colors if the output is " 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "being sent to a terminal and the TERM environment variable " 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "is set to xterm or xterm-color."); 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_string( 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott filter, 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StringFromGTestEnv("filter", kUniversalFilter), 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "A colon-separated list of glob (not regex) patterns " 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "for filtering the tests to run, optionally followed by a " 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "'-' and a : separated list of negative patterns (tests to " 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "exclude). A test is run if it matches one of the positive " 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "patterns and does not match any of the negative patterns."); 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_bool(list_tests, false, 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "List all tests without running them."); 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_string( 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott output, 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StringFromGTestEnv("output", ""), 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "A format (currently must be \"xml\"), optionally followed " 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "by a colon and an output file name or directory. A directory " 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "is indicated by a trailing pathname separator. " 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "If a directory is specified, output files will be created " 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "within that directory, with file-names based on the test " 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "executable's name and, if necessary, made unique by adding " 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "digits."); 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_int32( 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott repeat, 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::Int32FromGTestEnv("repeat", 1), 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "How many times to repeat each test. Specify a negative number " 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "for repeating forever. Useful for shaking out flaky tests."); 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_int32( 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott stack_trace_depth, 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "The maximum number of stack frames to print when an " 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "assertion fails. The valid range is 0 through 100, inclusive."); 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_DEFINE_bool( 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott show_internal_stack_frames, false, 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "True iff " GTEST_NAME " should include internal stack frames when " 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "printing test failure stack traces."); 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// GTestIsInitialized() returns true iff the user has initialized 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test. Useful for catching the user mistake of not initializing 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test before calling RUN_ALL_TESTS(). 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A user must call testing::InitGoogleTest() to initialize Google 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test. g_parse_gtest_flags_called is set to true iff 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// InitGoogleTest() has been called. We don't protect this variable 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// under a mutex as it is only accessed in the main thread. 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool g_parse_gtest_flags_called = false; 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool GTestIsInitialized() { return g_parse_gtest_flags_called; } 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Iterates over a list of TestCases, keeping a running sum of the 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// results of calling a given int-returning method on each. 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the sum. 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int SumOverTestCaseList(const internal::List<TestCase*>& case_list, 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int (TestCase::*method)() const) { 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int sum = 0; 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestCase*>* node = case_list.Head(); 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott node != NULL; 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott node = node->next()) { 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sum += (node->element()->*method)(); 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return sum; 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the test case passed. 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool TestCasePassed(const TestCase* test_case) { 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_case->should_run() && test_case->Passed(); 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the test case failed. 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool TestCaseFailed(const TestCase* test_case) { 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_case->should_run() && test_case->Failed(); 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff test_case contains at least one test that should 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// run. 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool ShouldRunTestCase(const TestCase* test_case) { 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_case->should_run(); 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _WIN32_WCE 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Windows CE has no C library. The abort() function is used in 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// several places in Google Test. This implementation provides a reasonable 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// imitation of standard behaviour. 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void abort() { 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DebugBreak(); 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TerminateProcess(GetCurrentProcess(), 1); 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _WIN32_WCE 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// AssertHelper constructor. 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertHelper::AssertHelper(TestPartResultType type, const char* file, 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int line, const char* message) 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : type_(type), file_(file), line_(line), message_(message) { 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Message assignment, for assertion streaming support. 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid AssertHelper::operator=(const Message& message) const { 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTest::GetInstance()-> 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddTestPartResult(type_, file_, line_, 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AppendUserMessage(message_, message), 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTest::GetInstance()->impl() 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ->CurrentOsStackTraceExceptTop(1) 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Skips the stack frame for this function itself. 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ); // NOLINT 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Application pathname gotten in InitGoogleTest. 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString g_executable_path; 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the current application's name, removing directory path if that 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is present. 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottFilePath GetCurrentExecutableName() { 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath result; 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(_WIN32_WCE) || defined(_WIN32) 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result.Set(FilePath(g_executable_path).RemoveExtension("exe")); 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result.Set(FilePath(g_executable_path)); 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _WIN32_WCE || _WIN32 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result.RemoveDirectoryName(); 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Functions for processing the gtest_output flag. 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the output format, or "" for normal printed output. 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString UnitTestOptions::GetOutputFormat() { 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (gtest_output_flag == NULL) return String(""); 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const colon = strchr(gtest_output_flag, ':'); 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (colon == NULL) ? 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String(gtest_output_flag) : 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String(gtest_output_flag, colon - gtest_output_flag); 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the name of the requested output file, or the default if none 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// was explicitly specified. 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString UnitTestOptions::GetOutputFile() { 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (gtest_output_flag == NULL) 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String(""); 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const colon = strchr(gtest_output_flag, ':'); 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (colon == NULL) 298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String(kDefaultOutputFile); 299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::FilePath output_name(colon + 1); 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!output_name.IsDirectory()) 302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return output_name.ToString(); 303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::FilePath result(internal::FilePath::GenerateUniqueFileName( 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott output_name, internal::GetCurrentExecutableName(), 306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetOutputFormat().c_str())); 307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result.ToString(); 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the wildcard pattern matches the string. The 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// first ':' or '\0' character in pattern marks the end of it. 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This recursive algorithm isn't very efficient, but is clear and 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// works well enough for matching test names, which are short. 315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool UnitTestOptions::PatternMatchesString(const char *pattern, 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char *str) { 317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (*pattern) { 318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '\0': 319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case ':': // Either ':' or '\0' marks the end of the pattern. 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *str == '\0'; 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '?': // Matches any single character. 322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); 323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '*': // Matches any string (possibly empty) of characters. 324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || 325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PatternMatchesString(pattern + 1, str); 326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott default: // Non-special character. Matches itself. 327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *pattern == *str && 328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PatternMatchesString(pattern + 1, str + 1); 329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool UnitTestOptions::MatchesFilter(const String& name, const char* filter) { 333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char *cur_pattern = filter; 334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while (true) { 335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (PatternMatchesString(cur_pattern, name.c_str())) { 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Finds the next pattern in the filter. 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cur_pattern = strchr(cur_pattern, ':'); 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns if no more pattern can be found. 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (cur_pattern == NULL) { 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Skips the pattern separater (the ':' character). 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cur_pattern++; 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(keithray): move String function implementations to gtest-string.cc. 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the user-specified filter matches the test case 355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// name and the test name. 356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool UnitTestOptions::FilterMatchesTest(const String &test_case_name, 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String &test_name) { 358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String& full_name = String::Format("%s.%s", 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_name.c_str(), 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_name.c_str()); 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Split --gtest_filter at '-', if there is one, to separate into 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // positive filter and negative filter portions 364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const p = GTEST_FLAG(filter).c_str(); 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const dash = strchr(p, '-'); 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String positive; 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String negative; 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (dash == NULL) { 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott negative = String(""); 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott positive.Set(p, dash - p); // Everything up to the dash 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott negative = String(dash+1); // Everything after the dash 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (positive.empty()) { 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Treat '-test1' as the same as '*-test1' 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott positive = kUniversalFilter; 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A filter is a colon-separated list of patterns. It matches a 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // test if any pattern in it matches the test. 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (MatchesFilter(full_name, positive.c_str()) && 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott !MatchesFilter(full_name, negative.c_str())); 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the 388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This function is useful as an __except condition. 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Google Test should handle an exception if: 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 1. the user wants it to, AND 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 2. this is not a breakpoint exception. 394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (GTEST_FLAG(catch_exceptions) && 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exception_code != EXCEPTION_BREAKPOINT) ? 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXCEPTION_EXECUTE_HANDLER : 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXCEPTION_CONTINUE_SEARCH; 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The interface for printing the result of a UnitTest 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTestEventListenerInterface { 405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The d'tor is pure virtual as this is an abstract class. 407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~UnitTestEventListenerInterface() = 0; 408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called before the unit test starts. 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnUnitTestStart(const UnitTest*) {} 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called after the unit test ends. 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnUnitTestEnd(const UnitTest*) {} 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called before the test case starts. 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestCaseStart(const TestCase*) {} 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called after the test case ends. 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestCaseEnd(const TestCase*) {} 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called before the global set-up starts. 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalSetUpStart(const UnitTest*) {} 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called after the global set-up ends. 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalSetUpEnd(const UnitTest*) {} 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called before the global tear-down starts. 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalTearDownStart(const UnitTest*) {} 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called after the global tear-down ends. 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalTearDownEnd(const UnitTest*) {} 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called before the test starts. 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestStart(const TestInfo*) {} 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called after the test ends. 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestEnd(const TestInfo*) {} 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called after an assertion. 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnNewTestPartResult(const TestPartResult*) {} 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Constructs an empty TestPartResultArray. 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestPartResultArray::TestPartResultArray() 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : list_(new internal::List<TestPartResult>) { 446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Destructs a TestPartResultArray. 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestPartResultArray::~TestPartResultArray() { 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete list_; 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Appends a TestPartResult to the array. 454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestPartResultArray::Append(const TestPartResult& result) { 455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list_->PushBack(result); 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the TestPartResult at the given index (0-based). 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (index < 0 || index >= size()) { 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\nInvalid index (%d) into TestPartResultArray.\n", index); 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott abort(); 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::ListNode<TestPartResult>* p = list_->Head(); 466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < index; i++) { 467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p = p->next(); 468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return p->element(); 471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the number of TestPartResult objects in the array. 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestPartResultArray::size() const { 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return list_->size(); 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The c'tor sets this object as the test part result reporter used by 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test. The 'result' parameter specifies where to report the 480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// results. 481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultArray* result) 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : old_reporter_(UnitTest::GetInstance()->impl()-> 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_part_result_reporter()), 485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_(result) { 486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestImpl* const impl = UnitTest::GetInstance()->impl(); 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->set_test_part_result_reporter(this); 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The d'tor restores the test part result reporter used by Google Test 491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// before. 492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { 493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTest::GetInstance()->impl()-> 494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott set_test_part_result_reporter(old_reporter_); 495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Increments the test part result count and remembers the result. 498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This method is from the TestPartResultReporterInterface interface. 499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid ScopedFakeTestPartResultReporter::ReportTestPartResult( 500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResult& result) { 501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_->Append(result); 502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This predicate-formatter checks that 'results' contains a test part 507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// failure of the given type and that the failure message contains the 508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// given substring. 509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult HasOneFailure(const char* /* results_expr */, 510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* /* type_expr */, 511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* /* substr_expr */, 512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResultArray& results, 513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultType type, 514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* substr) { 515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String expected( 516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott type == TPRT_FATAL_FAILURE ? "1 fatal failure" : 517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "1 non-fatal failure"); 518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (results.size() != 1) { 520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: " << expected << "\n" 521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " Actual: " << results.size() << " failures"; 522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < results.size(); i++) { 523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "\n" << results.GetTestPartResult(i); 524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResult& r = results.GetTestPartResult(0); 529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (r.type() != type) { 530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: " << expected << "\n" 531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " Actual:\n" 532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << r; 533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (strstr(r.message(), substr) == NULL) { 537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: " << expected << " containing \"" 538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << substr << "\"\n" 539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " Actual:\n" 540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << r; 541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The constructor of SingleFailureChecker remembers where to look up 548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// test part results, what type of failure we expect, and what 549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// substring the failure message should contain. 550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSingleFailureChecker:: SingleFailureChecker( 551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResultArray* results, 552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultType type, 553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* substr) 554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : results_(results), 555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott type_(type), 556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott substr_(substr) {} 557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The destructor of SingleFailureChecker verifies that the given 559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestPartResultArray contains exactly one failure that has the given 560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// type and contains the given substring. If that's not the case, a 561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// non-fatal failure will be generated. 562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSingleFailureChecker::~SingleFailureChecker() { 563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_.c_str()); 564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Reports a test part result. 567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTestImpl::ReportTestPartResult(const TestPartResult& result) { 568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott current_test_result()->AddTestPartResult(result); 569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer()->OnNewTestPartResult(&result); 570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the current test part result reporter. 573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestPartResultReporterInterface* UnitTestImpl::test_part_result_reporter() { 574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_part_result_reporter_; 575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Sets the current test part result reporter. 578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTestImpl::set_test_part_result_reporter( 579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultReporterInterface* reporter) { 580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_part_result_reporter_ = reporter; 581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of successful test cases. 584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::successful_test_case_count() const { 585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_cases_.CountIf(TestCasePassed); 586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of failed test cases. 589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::failed_test_case_count() const { 590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_cases_.CountIf(TestCaseFailed); 591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of all test cases. 594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::total_test_case_count() const { 595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_cases_.size(); 596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of all test cases that contain at least one test 599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// that should run. 600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::test_case_to_run_count() const { 601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_cases_.CountIf(ShouldRunTestCase); 602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of successful tests. 605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::successful_test_count() const { 606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count); 607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of failed tests. 610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::failed_test_count() const { 611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count); 612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of disabled tests. 615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::disabled_test_count() const { 616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count); 617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of all tests. 620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::total_test_count() const { 621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SumOverTestCaseList(test_cases_, &TestCase::total_test_count); 622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of tests that should run. 625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::test_to_run_count() const { 626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count); 627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the current OS stack trace as a String. 630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The maximum number of stack frames to be included is specified by 632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the gtest_stack_trace_depth flag. The skip_count parameter 633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// specifies the number of top frames to be skipped, which doesn't 634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// count against the number of frames to be included. 635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For example, if Foo() calls Bar(), which in turn calls 637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// CurrentOsStackTraceExceptTop(1), Foo() will be included in the 638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// trace but Bar() and CurrentOsStackTraceExceptTop() won't. 639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { 640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (void)skip_count; 641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String(""); 642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic TimeInMillis GetTimeInMillis() { 645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _WIN32_WCE // We are on Windows CE 646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Difference between 1970-01-01 and 1601-01-01 in miliseconds. 647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // http://analogous.blogspot.com/2005/04/epoch.html 648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TimeInMillis kJavaEpochToWinFileTimeDelta = 11644473600000UL; 649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const DWORD kTenthMicrosInMilliSecond = 10000; 650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SYSTEMTIME now_systime; 652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FILETIME now_filetime; 653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULARGE_INTEGER now_int64; 654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(kenton@google.com): Shouldn't this just use 655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // GetSystemTimeAsFileTime()? 656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetSystemTime(&now_systime); 657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (SystemTimeToFileTime(&now_systime, &now_filetime)) { 658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott now_int64.LowPart = now_filetime.dwLowDateTime; 659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott now_int64.HighPart = now_filetime.dwHighDateTime; 660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - 661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kJavaEpochToWinFileTimeDelta; 662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return now_int64.QuadPart; 663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(_WIN32) && !defined(GTEST_HAS_GETTIMEOFDAY) 666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __timeb64 now; 667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _MSC_VER 668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // (deprecated function) there. 670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(kenton@google.com): Use GetTickCount()? Or use 671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // SystemTimeToFileTime() 672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(push) // Saves the current warning state. 673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(disable:4996) // Temporarily disables warning 4996. 674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott _ftime64(&now); 675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(pop) // Restores the warning state. 676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott _ftime64(&now); 678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _MSC_VER 679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm; 680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(GTEST_HAS_GETTIMEOFDAY) 681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval now; 682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott gettimeofday(&now, NULL); 683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000; 684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#error "Don't know how to get the current time on your system." 686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Utilities 690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class String 692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the input enclosed in double quotes if it's not NULL; 694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// otherwise returns "(null)". For example, "\"Hello\"" is returned 695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// for input "Hello". 696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is useful for printing a C string in the syntax of a literal. 698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Known issue: escape sequences are not handled yet. 700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString String::ShowCStringQuoted(const char* c_str) { 701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return c_str ? String::Format("\"%s\"", c_str) : String("(null)"); 702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copies at most length characters from str into a newly-allocated 705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// piece of memory of size length+1. The memory is allocated with new[]. 706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A terminating null byte is written to the memory, and a pointer to it 707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is returned. If str is NULL, NULL is returned. 708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic char* CloneString(const char* str, size_t length) { 709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (str == NULL) { 710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return NULL; 711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char* const clone = new char[length + 1]; 713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // MSVC 8 deprecates strncpy(), so we want to suppress warning 714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 4996 (deprecated function) there. 715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS // We are on Windows. 716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(push) // Saves the current warning state. 717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(disable:4996) // Temporarily disables warning 4996. 718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott strncpy(clone, str, length); 719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(pop) // Restores the warning state. 720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else // We are on Linux or Mac OS. 721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott strncpy(clone, str, length); 722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott clone[length] = '\0'; 724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return clone; 725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Clones a 0-terminated C string, allocating memory using new. The 729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// caller is responsible for deleting[] the return value. Returns the 730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// cloned string, or NULL if the input is NULL. 731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char * String::CloneCString(const char* c_str) { 732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (c_str == NULL) ? 733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NULL : CloneString(c_str, strlen(c_str)); 734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Compares two C strings. Returns true iff they have the same content. 737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unlike strcmp(), this function can handle NULL argument(s). A NULL 739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// C string is considered different to any non-NULL C string, 740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// including the empty string. 741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool String::CStringEquals(const char * lhs, const char * rhs) { 742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ( lhs == NULL ) return rhs == NULL; 743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ( rhs == NULL ) return false; 745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return strcmp(lhs, rhs) == 0; 747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts an array of wide chars to a narrow string using the UTF-8 752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// encoding, and streams the result to the given Message object. 753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t len, 754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message* msg) { 755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i != len; i++) { 756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(wan): consider allowing a testing::String object to 757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // contain '\0'. This will make it behave more like std::string, 758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // and will allow ToUtf8String() to return the correct encoding 759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // for '\0' s.t. we can get rid of the conditional here (and in 760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // several other places). 761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (wstr[i]) { 762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *msg << internal::ToUtf8String(wstr[i]); 763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *msg << '\0'; 765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_WSTRING 774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts the given wide string to a narrow string using the UTF-8 775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// encoding, and streams the result to this Message object. 776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottMessage& Message::operator <<(const ::std::wstring& wstr) { 777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); 778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *this; 779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_WSTRING 781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_GLOBAL_WSTRING 783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts the given wide string to a narrow string using the UTF-8 784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// encoding, and streams the result to this Message object. 785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottMessage& Message::operator <<(const ::wstring& wstr) { 786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); 787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *this; 788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_GLOBAL_WSTRING 790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Formats a value to be used in a failure message. 794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For a char value, we print it as a C++ char literal and as an 796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// unsigned integer (both in decimal and in hexadecimal). 797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString FormatForFailureMessage(char ch) { 798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const unsigned int ch_as_uint = ch; 799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A String object cannot contain '\0', so we print "\\0" when ch is 800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // '\0'. 801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String::Format("'%s' (%u, 0x%X)", 802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ch ? String::Format("%c", ch).c_str() : "\\0", 803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ch_as_uint, ch_as_uint); 804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For a wchar_t value, we print it as a C++ wchar_t literal and as an 807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// unsigned integer (both in decimal and in hexidecimal). 808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString FormatForFailureMessage(wchar_t wchar) { 809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The C++ standard doesn't specify the exact size of the wchar_t 810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // type. It just says that it shall have the same size as another 811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // integral type, called its underlying type. 812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Therefore, in order to print a wchar_t value in the numeric form, 814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // we first convert it to the largest integral type (UInt64) and 815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // then print the converted value. 816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We use streaming to print the value as "%llu" doesn't work 818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // correctly with MSVC 7.1. 819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const UInt64 wchar_as_uint64 = wchar; 820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A String object cannot contain '\0', so we print "\\0" when wchar is 822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // L'\0'. 823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "L'" << (wchar ? ToUtf8String(wchar).c_str() : "\\0") << "' (" 824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << wchar_as_uint64 << ", 0x" << ::std::setbase(16) 825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << wchar_as_uint64 << ")"; 826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return msg.GetString(); 827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// AssertionResult constructor. 832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult::AssertionResult(const internal::String& failure_message) 833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : failure_message_(failure_message) { 834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Makes a successful assertion result. 838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult AssertionSuccess() { 839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionResult(); 840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Makes a failed assertion result with the given failure message. 844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult AssertionFailure(const Message& message) { 845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionResult(message.GetString()); 846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Constructs and returns the message for an equality assertion 851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. 852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The first four parameters are the expressions used in the assertion 854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// and their values, as strings. For example, for ASSERT_EQ(foo, bar) 855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// where foo is 5 and bar is 6, we have: 856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// expected_expression: "foo" 858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// actual_expression: "bar" 859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// expected_value: "5" 860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// actual_value: "6" 861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The ignoring_case parameter is true iff the assertion is a 863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will 864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// be inserted into the message. 865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult EqFailure(const char* expected_expression, 866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual_expression, 867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String& expected_value, 868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String& actual_value, 869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool ignoring_case) { 870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Value of: " << actual_expression; 872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (actual_value != actual_expression) { 873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "\n Actual: " << actual_value; 874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "\nExpected: " << expected_expression; 877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ignoring_case) { 878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << " (ignoring case)"; 879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (expected_value != expected_expression) { 881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "\nWhich is: " << expected_value; 882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper function for implementing ASSERT_NEAR. 889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult DoubleNearPredFormat(const char* expr1, 890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expr2, 891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* abs_error_expr, 892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double val1, 893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double val2, 894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double abs_error) { 895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const double diff = fabs(val1 - val2); 896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (diff <= abs_error) return AssertionSuccess(); 897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(wan): do not print the value of an expression if it's 899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // already a literal. 900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "The difference between " << expr1 << " and " << expr2 902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" 903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << expr1 << " evaluates to " << val1 << ",\n" 904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << expr2 << " evaluates to " << val2 << ", and\n" 905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << abs_error_expr << " evaluates to " << abs_error << "."; 906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper template for implementing FloatLE() and DoubleLE(). 911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename RawType> 912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult FloatingPointLE(const char* expr1, 913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expr2, 914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RawType val1, 915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RawType val2) { 916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns success if val1 is less than val2, 917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (val1 < val2) { 918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // or if val1 is almost equal to val2. 922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const FloatingPoint<RawType> lhs(val1), rhs(val2); 923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (lhs.AlmostEquals(rhs)) { 924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Note that the above two checks will both fail if either val1 or 928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // val2 is NaN, as the IEEE floating-point standard requires that 929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // any predicate involving a NaN must return false. 930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StrStream val1_ss; 932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) 933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << val1; 934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StrStream val2_ss; 936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) 937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << val2; 938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" 941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " Actual: " << StrStreamToString(&val1_ss) << " vs " 942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << StrStreamToString(&val2_ss); 943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Asserts that val1 is less than, or almost equal to, val2. Fails 950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// otherwise. In particular, it fails if either val1 or val2 is NaN. 951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult FloatLE(const char* expr1, const char* expr2, 952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott float val1, float val2) { 953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return internal::FloatingPointLE<float>(expr1, expr2, val1, val2); 954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Asserts that val1 is less than, or almost equal to, val2. Fails 957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// otherwise. In particular, it fails if either val1 or val2 is NaN. 958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult DoubleLE(const char* expr1, const char* expr2, 959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott double val1, double val2) { 960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return internal::FloatingPointLE<double>(expr1, expr2, val1, val2); 961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The helper function for {ASSERT|EXPECT}_EQ with int or enum 966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// arguments. 967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelperEQ(const char* expected_expression, 968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual_expression, 969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BiggestInt expected, 970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BiggestInt actual) { 971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (expected == actual) { 972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return EqFailure(expected_expression, 976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott actual_expression, 977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FormatForComparisonFailureMessage(expected, actual), 978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FormatForComparisonFailureMessage(actual, expected), 979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false); 980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A macro for implementing the helper functions needed to implement 983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here 984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// just to avoid copy-and-paste of similar code. 985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_IMPL_CMP_HELPER(op_name, op)\ 986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ 987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BiggestInt val1, BiggestInt val2) {\ 988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (val1 op val2) {\ 989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess();\ 990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else {\ 991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg;\ 992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: (" << expr1 << ") " #op " (" << expr2\ 993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ 994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " vs " << FormatForComparisonFailureMessage(val2, val1);\ 995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg);\ 996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }\ 997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implements the helper function for {ASSERT|EXPECT}_NE with int or 1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// enum arguments. 1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_IMPL_CMP_HELPER(NE, !=) 1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implements the helper function for {ASSERT|EXPECT}_LE with int or 1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// enum arguments. 1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_IMPL_CMP_HELPER(LE, <=) 1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implements the helper function for {ASSERT|EXPECT}_LT with int or 1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// enum arguments. 1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_IMPL_CMP_HELPER(LT, < ) 1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implements the helper function for {ASSERT|EXPECT}_GE with int or 1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// enum arguments. 1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_IMPL_CMP_HELPER(GE, >=) 1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implements the helper function for {ASSERT|EXPECT}_GT with int or 1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// enum arguments. 1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_IMPL_CMP_HELPER(GT, > ) 1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef GTEST_IMPL_CMP_HELPER 1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The helper function for {ASSERT|EXPECT}_STREQ. 1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelperSTREQ(const char* expected_expression, 1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual_expression, 1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected, 1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual) { 1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (String::CStringEquals(expected, actual)) { 1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return EqFailure(expected_expression, 1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott actual_expression, 1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::ShowCStringQuoted(expected), 1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::ShowCStringQuoted(actual), 1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false); 1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The helper function for {ASSERT|EXPECT}_STRCASEEQ. 1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, 1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual_expression, 1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected, 1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual) { 1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (String::CaseInsensitiveCStringEquals(expected, actual)) { 1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return EqFailure(expected_expression, 1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott actual_expression, 1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::ShowCStringQuoted(expected), 1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::ShowCStringQuoted(actual), 1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott true); 1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The helper function for {ASSERT|EXPECT}_STRNE. 1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelperSTRNE(const char* s1_expression, 1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* s2_expression, 1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* s1, 1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* s2) { 1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!String::CStringEquals(s1, s2)) { 1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: (" << s1_expression << ") != (" 1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << s2_expression << "), actual: \"" 1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << s1 << "\" vs \"" << s2 << "\""; 1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The helper function for {ASSERT|EXPECT}_STRCASENE. 1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelperSTRCASENE(const char* s1_expression, 1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* s2_expression, 1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* s1, 1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* s2) { 1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!String::CaseInsensitiveCStringEquals(s1, s2)) { 1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: (" << s1_expression << ") != (" 1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << s2_expression << ") (ignoring case), actual: \"" 1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << s1 << "\" vs \"" << s2 << "\""; 1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper functions for implementing IsSubString() and IsNotSubstring(). 1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This group of overloaded functions return true iff needle is a 1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// substring of haystack. NULL is considered a substring of itself 1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// only. 1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool IsSubstringPred(const char* needle, const char* haystack) { 1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (needle == NULL || haystack == NULL) 1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return needle == haystack; 1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return strstr(haystack, needle) != NULL; 1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { 1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (needle == NULL || haystack == NULL) 1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return needle == haystack; 1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return wcsstr(haystack, needle) != NULL; 1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// StringType here can be either ::std::string or ::std::wstring. 1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename StringType> 1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool IsSubstringPred(const StringType& needle, 1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const StringType& haystack) { 1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return haystack.find(needle) != StringType::npos; 1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This function implements either IsSubstring() or IsNotSubstring(), 1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// depending on the value of the expected_to_be_substring parameter. 1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// StringType here can be const char*, const wchar_t*, ::std::string, 1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// or ::std::wstring. 1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename StringType> 1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsSubstringImpl( 1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool expected_to_be_substring, 1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const StringType& needle, const StringType& haystack) { 1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (IsSubstringPred(needle, haystack) == expected_to_be_substring) 1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool is_wide_string = sizeof(needle[0]) > 1; 1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; 1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure( 1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message() 1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "Value of: " << needle_expr << "\n" 1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " Actual: " << begin_string_quote << needle << "\"\n" 1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "Expected: " << (expected_to_be_substring ? "" : "not ") 1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "a substring of " << haystack_expr << "\n" 1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "Which is: " << begin_string_quote << haystack << "\""); 1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 1136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// IsSubstring() and IsNotSubstring() check whether needle is a 1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// substring of haystack (NULL is considered a substring of itself 1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// only), and return an appropriate error message when they fail. 1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsSubstring( 1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle, const char* haystack) { 1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsSubstring( 1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const wchar_t* needle, const wchar_t* haystack) { 1150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsNotSubstring( 1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle, const char* haystack) { 1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsNotSubstring( 1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const wchar_t* needle, const wchar_t* haystack) { 1162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_STRING 1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsSubstring( 1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const ::std::string& needle, const ::std::string& haystack) { 1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsNotSubstring( 1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const ::std::string& needle, const ::std::string& haystack) { 1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_STRING 1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_WSTRING 1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsSubstring( 1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const ::std::wstring& needle, const ::std::wstring& haystack) { 1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsNotSubstring( 1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* needle_expr, const char* haystack_expr, 1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const ::std::wstring& needle, const ::std::wstring& haystack) { 1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_WSTRING 1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper function for IsHRESULT{SuccessFailure} predicates 1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult HRESULTFailureHelper(const char* expr, 1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* expected, 1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott long hr) { // NOLINT 1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _WIN32_WCE 1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Windows CE doesn't support FormatMessage. 1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char error_text[] = ""; 1206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Looks up the human-readable system message for the HRESULT code 1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // and since we're not passing any params to FormatMessage, we don't 1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // want inserts expanded. 1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | 1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FORMAT_MESSAGE_IGNORE_INSERTS; 1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const DWORD kBufSize = 4096; // String::Format can't exceed this length. 1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the system's human readable message string for this HRESULT. 1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char error_text[kBufSize] = { '\0' }; 1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DWORD message_length = ::FormatMessageA(kFlags, 1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, // no source, we're asking system 1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott hr, // the error 1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0, // no line width restrictions 1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott error_text, // output buffer 1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kBufSize, // buf size 1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NULL); // no arguments for inserts 1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Trims tailing white space (FormatMessage leaves a trailing cr-lf) 1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (; message_length && isspace(error_text[message_length - 1]); 1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --message_length) { 1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott error_text[message_length - 1] = '\0'; 1226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _WIN32_WCE 1228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String error_hex(String::Format("0x%08X ", hr)); 1230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: " << expr << " " << expected << ".\n" 1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " Actual: " << error_hex << error_text << "\n"; 1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ::testing::AssertionFailure(msg); 1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 1238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT 1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (SUCCEEDED(hr)) { 1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return HRESULTFailureHelper(expr, "succeeds", hr); 1244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT 1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (FAILED(hr)) { 1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return HRESULTFailureHelper(expr, "fails", hr); 1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Utility functions for encoding Unicode text (wide strings) in 1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// UTF-8. 1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8 1259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// like this: 1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Code-point length Encoding 1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 0 - 7 bits 0xxxxxxx 1263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 8 - 11 bits 110xxxxx 10xxxxxx 1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx 1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The maximum code-point a one-byte UTF-8 sequence can represent. 1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1; 1269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The maximum code-point a two-byte UTF-8 sequence can represent. 1271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1; 1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The maximum code-point a three-byte UTF-8 sequence can represent. 1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1; 1275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The maximum code-point a four-byte UTF-8 sequence can represent. 1277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1; 1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Chops off the n lowest bits from a bit pattern. Returns the n 1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// lowest bits. As a side effect, the original bit pattern will be 1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// shifted to the right by n bits. 1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline UInt32 ChopLowBits(UInt32* bits, int n) { 1283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1); 1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *bits >>= n; 1285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return low_bits; 1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts a Unicode code-point to its UTF-8 encoding. 1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString ToUtf8String(wchar_t wchar) { 1290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char str[5] = {}; // Initializes str to all '\0' characters. 1291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UInt32 code = static_cast<UInt32>(wchar); 1293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (code <= kMaxCodePoint1) { 1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[0] = static_cast<char>(code); // 0xxxxxxx 1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else if (code <= kMaxCodePoint2) { 1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[1] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx 1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[0] = static_cast<char>(0xC0 | code); // 110xxxxx 1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else if (code <= kMaxCodePoint3) { 1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[2] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx 1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[1] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx 1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[0] = static_cast<char>(0xE0 | code); // 1110xxxx 1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else if (code <= kMaxCodePoint4) { 1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[3] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx 1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[2] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx 1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[1] = static_cast<char>(0x80 | ChopLowBits(&code, 6)); // 10xxxxxx 1306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott str[0] = static_cast<char>(0xF0 | code); // 11110xxx 1307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String::Format("(Invalid Unicode 0x%llX)", 1309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static_cast<UInt64>(wchar)); 1310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String(str); 1313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts a wide C string to a String using the UTF-8 encoding. 1316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// NULL will be converted to "(null)". 1317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString String::ShowWideCString(const wchar_t * wide_c_str) { 1318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (wide_c_str == NULL) return String("(null)"); 1319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StrStream ss; 1321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while (*wide_c_str) { 1322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ss << internal::ToUtf8String(*wide_c_str++); 1323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return internal::StrStreamToString(&ss); 1326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Similar to ShowWideCString(), except that this function encloses 1329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the converted string in double quotes. 1330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString String::ShowWideCStringQuoted(const wchar_t* wide_c_str) { 1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (wide_c_str == NULL) return String("(null)"); 1332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String::Format("L\"%s\"", 1334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::ShowWideCString(wide_c_str).c_str()); 1335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Compares two wide C strings. Returns true iff they have the same 1338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// content. 1339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unlike wcscmp(), this function can handle NULL argument(s). A NULL 1341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// C string is considered different to any non-NULL C string, 1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// including the empty string. 1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { 1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (lhs == NULL) return rhs == NULL; 1345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rhs == NULL) return false; 1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return wcscmp(lhs, rhs) == 0; 1349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper function for *_STREQ on wide strings. 1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelperSTREQ(const char* expected_expression, 1353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual_expression, 1354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const wchar_t* expected, 1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const wchar_t* actual) { 1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (String::WideCStringEquals(expected, actual)) { 1357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return EqFailure(expected_expression, 1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott actual_expression, 1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::ShowWideCStringQuoted(expected), 1363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::ShowWideCStringQuoted(actual), 1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott false); 1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper function for *_STRNE on wide strings. 1368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult CmpHelperSTRNE(const char* s1_expression, 1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* s2_expression, 1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const wchar_t* s1, 1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const wchar_t* s2) { 1372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!String::WideCStringEquals(s1, s2)) { 1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionSuccess(); 1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 1377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "Expected: (" << s1_expression << ") != (" 1378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << s2_expression << "), actual: " 1379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << String::ShowWideCStringQuoted(s1) 1380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " vs " << String::ShowWideCStringQuoted(s2); 1381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return AssertionFailure(msg); 1382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Compares two C strings, ignoring case. Returns true iff they have 1385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the same content. 1386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unlike strcasecmp(), this function can handle NULL argument(s). A 1388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// NULL C string is considered different to any non-NULL C string, 1389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// including the empty string. 1390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { 1391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ( lhs == NULL ) return rhs == NULL; 1392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ( rhs == NULL ) return false; 1394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 1396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return _stricmp(lhs, rhs) == 0; 1397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else // GTEST_OS_WINDOWS 1398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return strcasecmp(lhs, rhs) == 0; 1399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 1400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Constructs a String by copying a given number of chars from a 1403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// buffer. E.g. String("hello", 3) will create the string "hel". 1404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString::String(const char * buffer, size_t len) { 1405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char * const temp = new char[ len + 1 ]; 1406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memcpy(temp, buffer, len); 1407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott temp[ len ] = '\0'; 1408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c_str_ = temp; 1409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Compares this with another String. 1412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 1413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// if this is greater than rhs. 1414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint String::Compare(const String & rhs) const { 1415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ( c_str_ == NULL ) { 1416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rhs.c_str_ == NULL ? 0 : -1; // NULL < anything except NULL 1417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rhs.c_str_ == NULL ? 1 : strcmp(c_str_, rhs.c_str_); 1420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff this String ends with the given suffix. *Any* 1423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// String is considered to end with a NULL or empty suffix. 1424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool String::EndsWith(const char* suffix) const { 1425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (suffix == NULL || CStringEquals(suffix, "")) return true; 1426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c_str_ == NULL) return false; 1428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const size_t this_len = strlen(c_str_); 1430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const size_t suffix_len = strlen(suffix); 1431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (this_len >= suffix_len) && 1432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CStringEquals(c_str_ + this_len - suffix_len, suffix); 1433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff this String ends with the given suffix, ignoring case. 1436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Any String is considered to end with a NULL or empty suffix. 1437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool String::EndsWithCaseInsensitive(const char* suffix) const { 1438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (suffix == NULL || CStringEquals(suffix, "")) return true; 1439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c_str_ == NULL) return false; 1441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const size_t this_len = strlen(c_str_); 1443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const size_t suffix_len = strlen(suffix); 1444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (this_len >= suffix_len) && 1445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CaseInsensitiveCStringEquals(c_str_ + this_len - suffix_len, suffix); 1446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Sets the 0-terminated C string this String object represents. The 1449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// old string in this object is deleted, and this object will own a 1450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// clone of the input string. This function copies only up to length 1451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// bytes (plus a terminating null byte), or until the first null byte, 1452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// whichever comes first. 1453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This function works even when the c_str parameter has the same 1455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// value as that of the c_str_ field. 1456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid String::Set(const char * c_str, size_t length) { 1457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Makes sure this works when c_str == c_str_ 1458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const temp = CloneString(c_str, length); 1459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete[] c_str_; 1460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c_str_ = temp; 1461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Assigns a C string to this object. Self-assignment works. 1464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst String& String::operator=(const char* c_str) { 1465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Makes sure this works when c_str == c_str_ 1466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (c_str != c_str_) { 1467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete[] c_str_; 1468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott c_str_ = CloneCString(c_str); 1469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *this; 1471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Formats a list of arguments to a String, using the same format 1474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// spec string as for printf. 1475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We do not use the StringPrintf class as it is not universally 1477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// available. 1478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The result is limited to 4096 characters (including the tailing 0). 1480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If 4096 characters are not enough to format the input, 1481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "<buffer exceeded>" is returned. 1482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString String::Format(const char * format, ...) { 1483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott va_list args; 1484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott va_start(args, format); 1485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buffer[4096]; 1487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // MSVC 8 deprecates vsnprintf(), so we want to suppress warning 1488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 4996 (deprecated function) there. 1489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS // We are on Windows. 1490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(push) // Saves the current warning state. 1491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(disable:4996) // Temporarily disables warning 4996. 1492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int size = 1493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vsnprintf(buffer, sizeof(buffer)/sizeof(buffer[0]) - 1, format, args); 1494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(pop) // Restores the warning state. 1495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else // We are on Linux or Mac OS. 1496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int size = 1497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vsnprintf(buffer, sizeof(buffer)/sizeof(buffer[0]) - 1, format, args); 1498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 1499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott va_end(args); 1500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String(size >= 0 ? buffer : "<buffer exceeded>"); 1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts the buffer in a StrStream to a String, converting NUL 1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// bytes to "\\0" along the way. 1506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString StrStreamToString(StrStream* ss) { 1507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_STRING 1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const ::std::string& str = ss->str(); 1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const start = str.c_str(); 1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const end = start + str.length(); 1511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const start = ss->str(); 1513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const end = start + ss->pcount(); 1514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_STRING 1515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We need to use a helper StrStream to do this transformation 1517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // because String doesn't support push_back(). 1518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StrStream helper; 1519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const char* ch = start; ch != end; ++ch) { 1520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*ch == '\0') { 1521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott helper << "\\0"; // Replaces NUL with "\\0"; 1522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott helper.put(*ch); 1524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_STRING 1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String(helper.str().c_str()); 1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String str(helper.str(), helper.pcount()); 1531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott helper.freeze(false); 1532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ss->freeze(false); 1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return str; 1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_STRING 1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Appends the user-supplied message to the Google-Test-generated message. 1538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString AppendUserMessage(const String& gtest_msg, 1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Message& user_msg) { 1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Appends the user message if it's non-empty. 1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String user_msg_string = user_msg.GetString(); 1542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (user_msg_string.empty()) { 1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return gtest_msg; 1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << gtest_msg << "\n" << user_msg_string; 1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return msg.GetString(); 1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 1553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Prints a TestPartResult object. 1555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) { 1556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return os << result.file_name() << ":" 1557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << result.line_number() << ": " 1558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << (result.type() == TPRT_SUCCESS ? "Success" : 1559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result.type() == TPRT_FATAL_FAILURE ? "Fatal failure" : 1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Non-fatal failure") << ":\n" 1561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << result.message() << std::endl; 1562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class TestResult 1566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates an empty TestResult. 1568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestResult::TestResult() 1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : death_test_count_(0), 1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott elapsed_time_(0) { 1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// D'tor. 1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestResult::~TestResult() { 1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Adds a test part result to the list. 1578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) { 1579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_part_results_.PushBack(test_part_result); 1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Adds a test property to the list. If a property with the same key as the 1583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// supplied property is already represented, the value of this test_property 1584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// replaces the old value for that key. 1585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestResult::RecordProperty(const TestProperty& test_property) { 1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!ValidateTestProperty(test_property)) { 1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 1588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MutexLock lock(&test_properites_mutex_); 1590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ListNode<TestProperty>* const node_with_matching_key = 1591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_properties_.FindIf(TestPropertyKeyIs(test_property.key())); 1592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (node_with_matching_key == NULL) { 1593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_properties_.PushBack(test_property); 1594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 1595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestProperty& property_with_matching_key = node_with_matching_key->element(); 1597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott property_with_matching_key.SetValue(test_property.value()); 1598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Adds a failure if the key is a reserved attribute of Google Test testcase tags. 1601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true if the property is valid. 1602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool TestResult::ValidateTestProperty(const TestProperty& test_property) { 1603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String key(test_property.key()); 1604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (key == "name" || key == "status" || key == "time" || key == "classname") { 1605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ADD_FAILURE() 1606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "Reserved key used in RecordProperty(): " 1607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << key 1608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " ('name', 'status', 'time', and 'classname' are reserved by " 1609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << GTEST_NAME << ")"; 1610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 1611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 1613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Clears the object. 1616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestResult::Clear() { 1617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_part_results_.Clear(); 1618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_properties_.Clear(); 1619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott death_test_count_ = 0; 1620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott elapsed_time_ = 0; 1621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the test part passed. 1624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool TestPartPassed(const TestPartResult & result) { 1625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result.passed(); 1626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of successful test parts. 1629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestResult::successful_part_count() const { 1630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_part_results_.CountIf(TestPartPassed); 1631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the test part failed. 1634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool TestPartFailed(const TestPartResult & result) { 1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result.failed(); 1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of failed test parts. 1639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestResult::failed_part_count() const { 1640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_part_results_.CountIf(TestPartFailed); 1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the test part fatally failed. 1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic bool TestPartFatallyFailed(const TestPartResult & result) { 1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result.fatally_failed(); 1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the test fatally failed. 1649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool TestResult::HasFatalFailure() const { 1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_part_results_.CountIf(TestPartFatallyFailed) > 0; 1651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of all test parts. This is the sum of the number 1654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// of successful test parts and the number of failed test parts. 1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestResult::total_part_count() const { 1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_part_results_.size(); 1657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class Test 1662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates a Test object. 1664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The c'tor saves the values of all Google Test flags. 1666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTest::Test() 1667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : gtest_flag_saver_(new internal::GTestFlagSaver) { 1668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The d'tor restores the values of all Google Test flags. 1671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTest::~Test() { 1672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete gtest_flag_saver_; 1673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Sets up the test fixture. 1676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A sub-class may override this. 1678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid Test::SetUp() { 1679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tears down the test fixture. 1682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A sub-class may override this. 1684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid Test::TearDown() { 1685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Allows user supplied key value pairs to be recorded for later output. 1688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid Test::RecordProperty(const char* key, const char* value) { 1689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value); 1690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Allows user supplied key value pairs to be recorded for later output. 1693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid Test::RecordProperty(const char* key, int value) { 1694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message value_message; 1695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value_message << value; 1696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RecordProperty(key, value_message.GetString().c_str()); 1697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 1700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We are on Windows. 1701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Adds an "exception thrown" fatal failure to the current test. 1703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void AddExceptionThrownFailure(DWORD exception_code, 1704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* location) { 1705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message message; 1706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott message << "Exception thrown with code 0x" << std::setbase(16) << 1707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exception_code << std::setbase(10) << " in " << location << "."; 1708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTest* const unit_test = UnitTest::GetInstance(); 1710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott unit_test->AddTestPartResult( 1711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TPRT_FATAL_FAILURE, 1712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static_cast<const char *>(NULL), 1713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We have no info about the source file where the exception 1714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // occurred. 1715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott -1, // We have no info on which line caused the exception. 1716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott message.GetString(), 1717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::String("")); 1718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 1721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test requires all tests in the same test case to use the same test 1723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// fixture class. This function checks if the current test has the 1724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// same fixture class as the first test in the current test case. If 1725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// yes, it returns true; otherwise it generates a Google Test failure and 1726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// returns false. 1727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool Test::HasSameFixtureClass() { 1728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 1729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestCase* const test_case = impl->current_test_case(); 1730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Info about the first test in the current test case. 1732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TestInfoImpl* const first_test_info = 1733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->test_info_list().Head()->element()->impl(); 1734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TypeId first_fixture_id = first_test_info->fixture_class_id(); 1735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const first_test_name = first_test_info->name(); 1736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Info about the current test. 1738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TestInfoImpl* const this_test_info = 1739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->current_test_info()->impl(); 1740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TypeId this_fixture_id = this_test_info->fixture_class_id(); 1741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const this_test_name = this_test_info->name(); 1742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (this_fixture_id != first_fixture_id) { 1744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Is the first test defined using TEST? 1745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool first_is_TEST = first_fixture_id == internal::GetTypeId<Test>(); 1746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Is this test defined using TEST? 1747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool this_is_TEST = this_fixture_id == internal::GetTypeId<Test>(); 1748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (first_is_TEST || this_is_TEST) { 1750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The user mixed TEST and TEST_F in this test case - we'll tell 1751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // him/her how to fix it. 1752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the name of the TEST and the name of the TEST_F. Note 1754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // that first_is_TEST and this_is_TEST cannot both be true, as 1755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the fixture IDs are different for the two tests. 1756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const TEST_name = 1757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott first_is_TEST ? first_test_name : this_test_name; 1758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const TEST_F_name = 1759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott first_is_TEST ? this_test_name : first_test_name; 1760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ADD_FAILURE() 1762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "All tests in the same test case must use the same test fixture\n" 1763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "class, so mixing TEST_F and TEST in the same test case is\n" 1764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "illegal. In test case " << this_test_info->test_case_name() 1765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << ",\n" 1766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "test " << TEST_F_name << " is defined using TEST_F but\n" 1767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "test " << TEST_name << " is defined using TEST. You probably\n" 1768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "want to change the TEST to TEST_F or move it to another test\n" 1769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "case."; 1770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The user defined two fixture classes with the same name in 1772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // two namespaces - we'll tell him/her how to fix it. 1773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ADD_FAILURE() 1774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "All tests in the same test case must use the same test fixture\n" 1775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "class. However, in test case " 1776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << this_test_info->test_case_name() << ",\n" 1777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "you defined test " << first_test_name 1778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << " and test " << this_test_name << "\n" 1779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "using two different test fixture classes. This can happen if\n" 1780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "the two classes are from different namespaces or translation\n" 1781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "units and have the same name. You should probably rename one\n" 1782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "of the classes to put the tests into different test cases."; 1783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 1785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 1788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Runs the test and updates the test result. 1791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid Test::Run() { 1792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!HasSameFixtureClass()) return; 1793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 1795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 1796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We are on Windows. 1797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 1798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __try { 1799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetUp(); 1800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } __except(internal::UnitTestOptions::GTestShouldProcessSEH( 1801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetExceptionCode())) { 1802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddExceptionThrownFailure(GetExceptionCode(), "SetUp()"); 1803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We will run the test only if SetUp() had no fatal failure. 1806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!HasFatalFailure()) { 1807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 1808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __try { 1809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestBody(); 1810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } __except(internal::UnitTestOptions::GTestShouldProcessSEH( 1811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetExceptionCode())) { 1812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddExceptionThrownFailure(GetExceptionCode(), "the test body"); 1813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // However, we want to clean up as much as possible. Hence we will 1817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // always call TearDown(), even if SetUp() or the test body has 1818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // failed. 1819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 1820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __try { 1821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TearDown(); 1822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } __except(internal::UnitTestOptions::GTestShouldProcessSEH( 1823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetExceptionCode())) { 1824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddExceptionThrownFailure(GetExceptionCode(), "TearDown()"); 1825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else // We are on Linux or Mac - exceptions are disabled. 1828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 1829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetUp(); 1830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We will run the test only if SetUp() was successful. 1832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!HasFatalFailure()) { 1833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 1834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestBody(); 1835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // However, we want to clean up as much as possible. Hence we will 1838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // always call TearDown(), even if SetUp() or the test body has 1839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // failed. 1840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 1841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TearDown(); 1842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 1843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff the current test has a fatal failure. 1847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool Test::HasFatalFailure() { 1848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); 1849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class TestInfo 1852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Constructs a TestInfo object. 1854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestInfo::TestInfo(const char* test_case_name, 1855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* name, 1856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::TypeId fixture_class_id, 1857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestMaker maker) { 1858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_ = new internal::TestInfoImpl(this, test_case_name, name, 1859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fixture_class_id, maker); 1860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Destructs a TestInfo object. 1863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestInfo::~TestInfo() { 1864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete impl_; 1865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates a TestInfo object and registers it with the UnitTest 1868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// singleton; returns the created object. 1869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Arguments: 1871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// test_case_name: name of the test case 1873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// name: name of the test 1874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// set_up_tc: pointer to the function that sets up the test case 1875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// tear_down_tc: pointer to the function that tears down the test case 1876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// maker: pointer to the function that creates a test object 1877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestInfo* TestInfo::MakeAndRegisterInstance( 1878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* test_case_name, 1879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* name, 1880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::TypeId fixture_class_id, 1881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test::SetUpTestCaseFunc set_up_tc, 1882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test::TearDownTestCaseFunc tear_down_tc, 1883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestMaker maker) { 1884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestInfo* const test_info = 1885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott new TestInfo(test_case_name, name, fixture_class_id, maker); 1886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); 1887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_info; 1888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the test case name. 1891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char* TestInfo::test_case_name() const { 1892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->test_case_name(); 1893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the test name. 1896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char* TestInfo::name() const { 1897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->name(); 1898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true if this test should run. 1901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool TestInfo::should_run() const { return impl_->should_run(); } 1902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the result of the test. 1904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst internal::TestResult* TestInfo::result() const { return impl_->result(); } 1905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Increments the number of death tests encountered in this test so 1907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// far. 1908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestInfo::increment_death_test_count() { 1909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->result()->increment_death_test_count(); 1910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 1913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A predicate that checks the test name of a TestInfo against a known 1915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// value. 1916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is used for implementation of the TestCase class only. We put 1918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// it in the anonymous namespace to prevent polluting the outer 1919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace. 1920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 1921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestNameIs is copyable. 1922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestNameIs { 1923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 1924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Constructor. 1925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 1926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TestNameIs has NO default constructor. 1927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit TestNameIs(const char* name) 1928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : name_(name) {} 1929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff the test name of test_info matches name_. 1931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool operator()(const TestInfo * test_info) const { 1932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_info && internal::String(test_info->name()).Compare(name_) == 0; 1933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 1936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::String name_; 1937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 1938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 1940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Finds and returns a TestInfo with the given name. If one doesn't 1942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// exist, returns NULL. 1943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestInfo * TestCase::GetTestInfo(const char* test_name) { 1944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Can we find a TestInfo with the given name? 1945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::ListNode<TestInfo *> * const node = test_info_list_->FindIf( 1946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestNameIs(test_name)); 1947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the TestInfo found. 1949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return node ? node->element() : NULL; 1950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 1953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates the test object, runs it, records its result, and then 1955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// deletes it. 1956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestInfoImpl::Run() { 1957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!should_run_) return; 1958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tells UnitTest where to store test result. 1960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestImpl* const impl = internal::GetUnitTestImpl(); 1961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->set_current_test_info(parent_); 1962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Notifies the unit test event listener that a test is about to 1964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // start. 1965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestEventListenerInterface* const result_printer = 1966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->result_printer(); 1967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer->OnTestStart(parent_); 1968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TimeInMillis start = GetTimeInMillis(); 1970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 1972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 1973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We are on Windows. 1974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test* test = NULL; 1975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __try { 1977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Creates the test object. 1978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test = (*maker_)(); 1979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } __except(internal::UnitTestOptions::GTestShouldProcessSEH( 1980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetExceptionCode())) { 1981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddExceptionThrownFailure(GetExceptionCode(), 1982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "the test fixture's constructor"); 1983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 1984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else // We are on Linux or Mac OS - exceptions are disabled. 1986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(wan): If test->Run() throws, test won't be deleted. This is 1988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // not a problem now as we don't use exceptions. If we were to 1989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // enable exceptions, we should revise the following to be 1990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // exception-safe. 1991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Creates the test object. 1993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test* test = (*maker_)(); 1994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 1995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Runs the test only if the constructor of the test fixture didn't 1997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // generate a fatal failure. 1998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!Test::HasFatalFailure()) { 1999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test->Run(); 2000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes the test object. 2003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 2004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete test; 2005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test = NULL; 2006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_.set_elapsed_time(GetTimeInMillis() - start); 2008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Notifies the unit test event listener that a test has just finished. 2010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer->OnTestEnd(parent_); 2011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tells UnitTest to stop associating assertion results to this 2013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // test. 2014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->set_current_test_info(NULL); 2015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 2018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class TestCase 2020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of successful tests in this test case. 2022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestCase::successful_test_count() const { 2023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_info_list_->CountIf(TestPassed); 2024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of failed tests in this test case. 2027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestCase::failed_test_count() const { 2028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_info_list_->CountIf(TestFailed); 2029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestCase::disabled_test_count() const { 2032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_info_list_->CountIf(TestDisabled); 2033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Get the number of tests in this test case that should run. 2036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestCase::test_to_run_count() const { 2037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_info_list_->CountIf(ShouldRunTest); 2038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the number of all tests. 2041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TestCase::total_test_count() const { 2042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_info_list_->size(); 2043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates a TestCase with the given name. 2046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Arguments: 2048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// name: name of the test case 2050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// set_up_tc: pointer to the function that sets up the test case 2051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// tear_down_tc: pointer to the function that tears down the test case 2052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestCase::TestCase(const char* name, 2053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test::SetUpTestCaseFunc set_up_tc, 2054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test::TearDownTestCaseFunc tear_down_tc) 2055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : name_(name), 2056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott set_up_tc_(set_up_tc), 2057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tear_down_tc_(tear_down_tc), 2058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott should_run_(false), 2059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott elapsed_time_(0) { 2060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_list_ = new internal::List<TestInfo *>; 2061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Destructor of TestCase. 2064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestCase::~TestCase() { 2065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes every Test in the collection. 2066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_list_->ForEach(internal::Delete<TestInfo>); 2067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Then deletes the Test collection. 2069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete test_info_list_; 2070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_list_ = NULL; 2071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Adds a test to this test case. Will delete the test upon 2074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// destruction of the TestCase object. 2075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestCase::AddTestInfo(TestInfo * test_info) { 2076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_list_->PushBack(test_info); 2077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Runs every test in this TestCase. 2080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestCase::Run() { 2081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!should_run_) return; 2082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 2084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->set_current_test_case(this); 2085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestEventListenerInterface * const result_printer = 2087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->result_printer(); 2088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer->OnTestCaseStart(this); 2090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 2091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott set_up_tc_(); 2092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TimeInMillis start = internal::GetTimeInMillis(); 2094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_list_->ForEach(internal::TestInfoImpl::RunTest); 2095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott elapsed_time_ = internal::GetTimeInMillis() - start; 2096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->os_stack_trace_getter()->UponLeavingGTest(); 2098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tear_down_tc_(); 2099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer->OnTestCaseEnd(this); 2100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->set_current_test_case(NULL); 2101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Clears the results of all tests in this test case. 2104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid TestCase::ClearResult() { 2105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_list_->ForEach(internal::TestInfoImpl::ClearTestResult); 2106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class UnitTestEventListenerInterface 2110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The virtual d'tor. 2112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTestEventListenerInterface::~UnitTestEventListenerInterface() { 2113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A result printer that never prints anything. Used in the child process 2116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// of an exec-style death test to avoid needless output clutter. 2117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass NullUnitTestResultPrinter : public UnitTestEventListenerInterface {}; 2118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Formats a countable noun. Depending on its quantity, either the 2120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// singular form or the plural form is used. e.g. 2121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// FormatCountableNoun(1, "formula", "formuli") returns "1 formula". 2123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// FormatCountableNoun(5, "book", "books") returns "5 books". 2124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic internal::String FormatCountableNoun(int count, 2125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char * singular_form, 2126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char * plural_form) { 2127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return internal::String::Format("%d %s", count, 2128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott count == 1 ? singular_form : plural_form); 2129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Formats the count of tests. 2132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic internal::String FormatTestCount(int test_count) { 2133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return FormatCountableNoun(test_count, "test", "tests"); 2134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Formats the count of test cases. 2137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic internal::String FormatTestCaseCount(int test_case_count) { 2138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return FormatCountableNoun(test_case_count, "test case", "test cases"); 2139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts a TestPartResultType enum to human-friendly string 2142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// representation. Both TPRT_NONFATAL_FAILURE and TPRT_FATAL_FAILURE 2143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// are translated to "Failure", as the user usually doesn't care about 2144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the difference between the two when viewing the test result. 2145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const char * TestPartResultTypeToString(TestPartResultType type) { 2146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (type) { 2147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case TPRT_SUCCESS: 2148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return "Success"; 2149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case TPRT_NONFATAL_FAILURE: 2151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case TPRT_FATAL_FAILURE: 2152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return "Failure"; 2153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return "Unknown result type"; 2156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Prints a TestPartResult. 2159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void PrintTestPartResult( 2160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResult & test_part_result) { 2161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char * const file_name = test_part_result.file_name(); 2162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s", file_name == NULL ? "unknown file" : file_name); 2164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_part_result.line_number() >= 0) { 2165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf(":%d", test_part_result.line_number()); 2166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf(": %s\n", TestPartResultTypeToString(test_part_result.type())); 2168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s\n", test_part_result.message()); 2169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class PrettyUnitTestResultPrinter 2173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 2175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum GTestColor { 2177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COLOR_RED, 2178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COLOR_GREEN, 2179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COLOR_YELLOW 2180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 2181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _WIN32 2183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the character attribute for the given color. 2185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottWORD GetColorAttribute(GTestColor color) { 2186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (color) { 2187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case COLOR_RED: return FOREGROUND_RED; 2188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case COLOR_GREEN: return FOREGROUND_GREEN; 2189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; 2190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 2192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the ANSI color code for the given color. 2197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char* GetAnsiColorCode(GTestColor color) { 2198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (color) { 2199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case COLOR_RED: return "1"; 2200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case COLOR_GREEN: return "2"; 2201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case COLOR_YELLOW: return "3"; 2202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 2203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return NULL; 2204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _WIN32 2207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns true iff Google Test should use colors in the output. 2209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool ShouldUseColor(bool stdout_is_tty) { 2210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const gtest_color = GTEST_FLAG(color).c_str(); 2211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { 2213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _WIN32 2214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // On Windows the TERM variable is usually not set, but the 2215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // console there does support colors. 2216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return stdout_is_tty; 2217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // On non-Windows platforms, we rely on the TERM variable. 2219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const term = GetEnv("TERM"); 2220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool term_supports_color = 2221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::CStringEquals(term, "xterm") || 2222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::CStringEquals(term, "xterm-color") || 2223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::CStringEquals(term, "cygwin"); 2224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return stdout_is_tty && term_supports_color; 2225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _WIN32 2226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || 2229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::CaseInsensitiveCStringEquals(gtest_color, "true") || 2230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::CaseInsensitiveCStringEquals(gtest_color, "t") || 2231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String::CStringEquals(gtest_color, "1"); 2232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We take "yes", "true", "t", and "1" as meaning "yes". If the 2233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // value is neither one of these nor "auto", we treat it as "no" to 2234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // be conservative. 2235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helpers for printing colored strings to stdout. Note that on Windows, we 2238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// cannot simply emit special characters and have the terminal change colors. 2239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This routine must actually emit the characters rather than return a string 2240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// that would be colored when printed, as can be done on Linux. 2241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid ColoredPrintf(GTestColor color, const char* fmt, ...) { 2242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott va_list args; 2243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott va_start(args, fmt); 2244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const bool use_color = ShouldUseColor(isatty(fileno(stdout)) != 0); 2246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The '!= 0' comparison is necessary to satisfy MSVC 7.1. 2247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!use_color) { 2249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vprintf(fmt, args); 2250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott va_end(args); 2251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 2252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _WIN32 2255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); 2256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the current text color. 2258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CONSOLE_SCREEN_BUFFER_INFO buffer_info; 2259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); 2260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const WORD old_color_attrs = buffer_info.wAttributes; 2261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetConsoleTextAttribute(stdout_handle, 2263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetColorAttribute(color) | FOREGROUND_INTENSITY); 2264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vprintf(fmt, args); 2265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Restores the text color. 2267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetConsoleTextAttribute(stdout_handle, old_color_attrs); 2268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\033[0;3%sm", GetAnsiColorCode(color)); 2270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vprintf(fmt, args); 2271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\033[m"); // Resets the terminal to default. 2272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _WIN32 2273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott va_end(args); 2274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 2277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing internal::ColoredPrintf; 2279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing internal::COLOR_RED; 2280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing internal::COLOR_GREEN; 2281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing internal::COLOR_YELLOW; 2282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class implements the UnitTestEventListenerInterface interface. 2284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Class PrettyUnitTestResultPrinter is copyable. 2286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass PrettyUnitTestResultPrinter : public UnitTestEventListenerInterface { 2287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 2288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PrettyUnitTestResultPrinter() {} 2289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void PrintTestName(const char * test_case, const char * test) { 2290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s.%s", test_case, test); 2291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The following methods override what's in the 2294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // UnitTestEventListenerInterface class. 2295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnUnitTestStart(const UnitTest * unit_test); 2296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalSetUpStart(const UnitTest*); 2297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestCaseStart(const TestCase * test_case); 2298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestStart(const TestInfo * test_info); 2299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnNewTestPartResult(const TestPartResult * result); 2300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestEnd(const TestInfo * test_info); 2301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalTearDownStart(const UnitTest*); 2302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnUnitTestEnd(const UnitTest * unit_test); 2303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 2305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::String test_case_name_; 2306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 2307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Called before the unit test starts. 2309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnUnitTestStart( 2310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const UnitTest * unit_test) { 2311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char * const filter = GTEST_FLAG(filter).c_str(); 2312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Prints the filter if it's not *. This reminds the user that some 2314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // tests may be skipped. 2315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!internal::String::CStringEquals(filter, kUniversalFilter)) { 2316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_YELLOW, 2317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Note: %s filter = %s\n", GTEST_NAME, filter); 2318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::UnitTestImpl* const impl = unit_test->impl(); 2321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[==========] "); 2322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Running %s from %s.\n", 2323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FormatTestCount(impl->test_to_run_count()).c_str(), 2324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FormatTestCaseCount(impl->test_case_to_run_count()).c_str()); 2325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnGlobalSetUpStart(const UnitTest*) { 2329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[----------] "); 2330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Global test environment set-up.\n"); 2331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnTestCaseStart( 2335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestCase * test_case) { 2336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_name_ = test_case->name(); 2337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::String counts = 2338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FormatCountableNoun(test_case->test_to_run_count(), "test", "tests"); 2339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[----------] "); 2340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s from %s\n", counts.c_str(), test_case_name_.c_str()); 2341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo * test_info) { 2345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[ RUN ] "); 2346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PrintTestName(test_case_name_.c_str(), test_info->name()); 2347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\n"); 2348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo * test_info) { 2352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_info->result()->Passed()) { 2353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[ OK ] "); 2354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 2355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_RED, "[ FAILED ] "); 2356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PrintTestName(test_case_name_.c_str(), test_info->name()); 2358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\n"); 2359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Called after an assertion failure. 2363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnNewTestPartResult( 2364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResult * result) { 2365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If the test part succeeded, we don't need to do anything. 2366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (result->type() == TPRT_SUCCESS) 2367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 2368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Print failure message from the assertion (e.g. expected this and got that). 2370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PrintTestPartResult(*result); 2371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnGlobalTearDownStart(const UnitTest*) { 2375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[----------] "); 2376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Global test environment tear-down\n"); 2377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 2381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Internal helper for printing the list of failed tests. 2383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void PrintFailedTestsPretty(const UnitTestImpl* impl) { 2384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int failed_test_count = impl->failed_test_count(); 2385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (failed_test_count == 0) { 2386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 2387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestCase*>* node = impl->test_cases()->Head(); 2390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott node != NULL; node = node->next()) { 2391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestCase* const tc = node->element(); 2392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!tc->should_run() || (tc->failed_test_count() == 0)) { 2393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott continue; 2394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestInfo*>* tinode = 2396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tc->test_info_list().Head(); 2397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tinode != NULL; tinode = tinode->next()) { 2398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestInfo* const ti = tinode->element(); 2399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!tc->ShouldRunTest(ti) || tc->TestPassed(ti)) { 2400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott continue; 2401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_RED, "[ FAILED ] "); 2403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s.%s\n", ti->test_case_name(), ti->name()); 2404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 2409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid PrettyUnitTestResultPrinter::OnUnitTestEnd( 2411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const UnitTest * unit_test) { 2412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::UnitTestImpl* const impl = unit_test->impl(); 2413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[==========] "); 2415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s from %s ran.\n", 2416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FormatTestCount(impl->test_to_run_count()).c_str(), 2417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FormatTestCaseCount(impl->test_case_to_run_count()).c_str()); 2418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); 2419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s.\n", FormatTestCount(impl->successful_test_count()).c_str()); 2420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int num_failures = impl->failed_test_count(); 2422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!impl->Passed()) { 2423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int failed_test_count = impl->failed_test_count(); 2424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_RED, "[ FAILED ] "); 2425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); 2426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::PrintFailedTestsPretty(impl); 2427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\n%2d FAILED %s\n", num_failures, 2428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott num_failures == 1 ? "TEST" : "TESTS"); 2429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int num_disabled = impl->disabled_test_count(); 2432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (num_disabled) { 2433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!num_failures) { 2434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\n"); // Add a spacer if no FAILURE banner is displayed. 2435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ColoredPrintf(COLOR_YELLOW, 2437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " YOU HAVE %d DISABLED %s\n\n", 2438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott num_disabled, 2439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott num_disabled == 1 ? "TEST" : "TESTS"); 2440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Ensure that Google Test output is printed before, e.g., heapchecker output. 2442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// End PrettyUnitTestResultPrinter 2446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class UnitTestEventsRepeater 2448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class forwards events to other event listeners. 2450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTestEventsRepeater : public UnitTestEventListenerInterface { 2451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 2452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef internal::List<UnitTestEventListenerInterface *> Listeners; 2453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef internal::ListNode<UnitTestEventListenerInterface *> ListenersNode; 2454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestEventsRepeater() {} 2455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~UnitTestEventsRepeater(); 2456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void AddListener(UnitTestEventListenerInterface *listener); 2457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnUnitTestStart(const UnitTest* unit_test); 2459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnUnitTestEnd(const UnitTest* unit_test); 2460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalSetUpStart(const UnitTest* unit_test); 2461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalSetUpEnd(const UnitTest* unit_test); 2462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalTearDownStart(const UnitTest* unit_test); 2463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnGlobalTearDownEnd(const UnitTest* unit_test); 2464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestCaseStart(const TestCase* test_case); 2465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestCaseEnd(const TestCase* test_case); 2466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestStart(const TestInfo* test_info); 2467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnTestEnd(const TestInfo* test_info); 2468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnNewTestPartResult(const TestPartResult* result); 2469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 2471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Listeners listeners_; 2472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_DISALLOW_COPY_AND_ASSIGN(UnitTestEventsRepeater); 2474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 2475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTestEventsRepeater::~UnitTestEventsRepeater() { 2477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (ListenersNode* listener = listeners_.Head(); 2478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott listener != NULL; 2479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott listener = listener->next()) { 2480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete listener->element(); 2481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTestEventsRepeater::AddListener( 2485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestEventListenerInterface *listener) { 2486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott listeners_.PushBack(listener); 2487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Since the methods are identical, use a macro to reduce boilerplate. 2490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This defines a member that repeats the call to all listeners. 2491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_REPEATER_METHOD(Name, Type) \ 2492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTestEventsRepeater::Name(const Type* parameter) { \ 2493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (ListenersNode* listener = listeners_.Head(); \ 2494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott listener != NULL; \ 2495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott listener = listener->next()) { \ 2496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott listener->element()->Name(parameter); \ 2497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } \ 2498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnUnitTestStart, UnitTest) 2501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnUnitTestEnd, UnitTest) 2502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnGlobalSetUpStart, UnitTest) 2503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnGlobalSetUpEnd, UnitTest) 2504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnGlobalTearDownStart, UnitTest) 2505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnGlobalTearDownEnd, UnitTest) 2506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnTestCaseStart, TestCase) 2507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnTestCaseEnd, TestCase) 2508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnTestStart, TestInfo) 2509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnTestEnd, TestInfo) 2510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_REPEATER_METHOD(OnNewTestPartResult, TestPartResult) 2511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef GTEST_REPEATER_METHOD 2513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// End PrettyUnitTestResultPrinter 2515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class generates an XML output file. 2517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass XmlUnitTestResultPrinter : public UnitTestEventListenerInterface { 2518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 2519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit XmlUnitTestResultPrinter(const char* output_file); 2520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnUnitTestEnd(const UnitTest* unit_test); 2522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 2524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Is c a whitespace character that is normalized to a space character 2525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // when it appears in an XML attribute value? 2526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static bool IsNormalizableWhitespace(char c) { 2527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return c == 0x9 || c == 0xA || c == 0xD; 2528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // May c appear in a well-formed XML document? 2531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static bool IsValidXmlCharacter(char c) { 2532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return IsNormalizableWhitespace(c) || c >= 0x20; 2533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns an XML-escaped copy of the input string str. If 2536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // is_attribute is true, the text is meant to appear as an attribute 2537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // value, and normalizable whitespace is preserved by replacing it 2538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // with character references. 2539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static internal::String EscapeXml(const char* str, 2540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_attribute); 2541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Convenience wrapper around EscapeXml when str is an attribute value. 2543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static internal::String EscapeXmlAttribute(const char* str) { 2544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return EscapeXml(str, true); 2545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Convenience wrapper around EscapeXml when str is not an attribute value. 2548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static internal::String EscapeXmlText(const char* str) { 2549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return EscapeXml(str, false); 2550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Prints an XML representation of a TestInfo object. 2553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void PrintXmlTestInfo(FILE* out, 2554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* test_case_name, 2555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestInfo* test_info); 2556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Prints an XML representation of a TestCase object 2558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void PrintXmlTestCase(FILE* out, const TestCase* test_case); 2559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Prints an XML summary of unit_test to output stream out. 2561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void PrintXmlUnitTest(FILE* out, const UnitTest* unit_test); 2562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Produces a string representing the test properties in a result as space 2564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // delimited XML attributes based on the property key="value" pairs. 2565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // When the String is not empty, it includes a space at the beginning, 2566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // to delimit this attribute from prior attributes. 2567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static internal::String TestPropertiesAsXmlAttributes( 2568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TestResult* result); 2569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The output file. 2571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::String output_file_; 2572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_DISALLOW_COPY_AND_ASSIGN(XmlUnitTestResultPrinter); 2574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 2575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates a new XmlUnitTestResultPrinter. 2577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) 2578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : output_file_(output_file) { 2579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (output_file_.c_str() == NULL || output_file_.empty()) { 2580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "XML output file may not be null\n"); 2581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stderr); 2582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(EXIT_FAILURE); 2583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Called after the unit test ends. 2587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid XmlUnitTestResultPrinter::OnUnitTestEnd(const UnitTest* unit_test) { 2588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FILE* xmlout = NULL; 2589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::FilePath output_file(output_file_); 2590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::FilePath output_dir(output_file.RemoveFileName()); 2591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (output_dir.CreateDirectoriesRecursively()) { 2593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // MSVC 8 deprecates fopen(), so we want to suppress warning 4996 2594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // (deprecated function) there. 2595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 2596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We are on Windows. 2597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(push) // Saves the current warning state. 2598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(disable:4996) // Temporarily disables warning 4996. 2599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xmlout = fopen(output_file_.c_str(), "w"); 2600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#pragma warning(pop) // Restores the warning state. 2601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else // We are on Linux or Mac OS. 2602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott xmlout = fopen(output_file_.c_str(), "w"); 2603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 2604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (xmlout == NULL) { 2606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(wan): report the reason of the failure. 2607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 2608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We don't do it for now as: 2609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 2610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 1. There is no urgent need for it. 2611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 2. It's a bit involved to make the errno variable thread-safe on 2612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // all three operating systems (Linux, Windows, and Mac OS). 2613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 3. To interpret the meaning of errno in a thread-safe way, 2614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // we need the strerror_r() function, which is not available on 2615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Windows. 2616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, 2617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Unable to open file \"%s\"\n", 2618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott output_file_.c_str()); 2619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stderr); 2620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(EXIT_FAILURE); 2621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PrintXmlUnitTest(xmlout, unit_test); 2623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fclose(xmlout); 2624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns an XML-escaped copy of the input string str. If is_attribute 2627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is true, the text is meant to appear as an attribute value, and 2628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// normalizable whitespace is preserved by replacing it with character 2629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// references. 2630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Invalid XML characters in str, if any, are stripped from the output. 2632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// It is expected that most, if not all, of the text processed by this 2633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// module will consist of ordinary English text. 2634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If this module is ever modified to produce version 1.1 XML output, 2635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// most invalid characters can be retained using character references. 2636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(wan): It might be nice to have a minimally invasive, human-readable 2637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// escaping scheme for invalid characters, rather than dropping them. 2638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinternal::String XmlUnitTestResultPrinter::EscapeXml(const char* str, 2639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_attribute) { 2640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message m; 2641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (str != NULL) { 2643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const char* src = str; *src; ++src) { 2644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (*src) { 2645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '<': 2646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << "<"; 2647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '>': 2649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << ">"; 2650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '&': 2652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << "&"; 2653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '\'': 2655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (is_attribute) 2656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << "'"; 2657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << '\''; 2659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case '"': 2661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (is_attribute) 2662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << """; 2663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << '"'; 2665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott default: 2667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (IsValidXmlCharacter(*src)) { 2668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (is_attribute && IsNormalizableWhitespace(*src)) 2669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << internal::String::Format("&#x%02X;", unsigned(*src)); 2670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott m << *src; 2672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 2674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return m.GetString(); 2679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The following routines generate an XML representation of a UnitTest 2683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// object. 2684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is how Google Test concepts map to the DTD: 2686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// <testsuite name="AllTests"> <-- corresponds to a UnitTest object 2688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// <testsuite name="testcase-name"> <-- corresponds to a TestCase object 2689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// <testcase name="test-name"> <-- corresponds to a TestInfo object 2690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// <failure message="..." /> 2691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// <failure message="..." /> <-- individual assertion failures 2692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// <failure message="..." /> 2693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// </testcase> 2694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// </testsuite> 2695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// </testsuite> 2696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Prints an XML representation of a TestInfo object. 2698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(wan): There is also value in printing properties with the plain printer. 2699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid XmlUnitTestResultPrinter::PrintXmlTestInfo(FILE* out, 2700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* test_case_name, 2701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestInfo* test_info) { 2702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TestResult * const result = test_info->result(); 2703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::List<TestPartResult> &results = result->test_part_results(); 2704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, 2705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " <testcase name=\"%s\" status=\"%s\" time=\"%s\" " 2706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "classname=\"%s\"%s", 2707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EscapeXmlAttribute(test_info->name()).c_str(), 2708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info->should_run() ? "run" : "notrun", 2709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StreamableToString(result->elapsed_time()).c_str(), 2710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EscapeXmlAttribute(test_case_name).c_str(), 2711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPropertiesAsXmlAttributes(result).c_str()); 2712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int failures = 0; 2714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestPartResult>* part_node = results.Head(); 2715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott part_node != NULL; 2716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott part_node = part_node->next()) { 2717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResult& part = part_node->element(); 2718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (part.failed()) { 2719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::String message = 2720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::String::Format("%s:%d\n%s", part.file_name(), 2721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott part.line_number(), part.message()); 2722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (++failures == 1) 2723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, ">\n"); 2724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, 2725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " <failure message=\"%s\" type=\"\"/>\n", 2726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EscapeXmlAttribute(message.c_str()).c_str()); 2727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (failures == 0) 2731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, " />\n"); 2732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 2733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, " </testcase>\n"); 2734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Prints an XML representation of a TestCase object 2737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out, 2738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestCase* test_case) { 2739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, 2740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" " 2741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "disabled=\"%d\" ", 2742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EscapeXmlAttribute(test_case->name()).c_str(), 2743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->total_test_count(), 2744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->failed_test_count(), 2745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->disabled_test_count()); 2746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, 2747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "errors=\"0\" time=\"%s\">\n", 2748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StreamableToString(test_case->elapsed_time()).c_str()); 2749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestInfo*>* info_node = 2750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->test_info_list().Head(); 2751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott info_node != NULL; 2752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott info_node = info_node->next()) { 2753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PrintXmlTestInfo(out, test_case->name(), info_node->element()); 2754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, " </testsuite>\n"); 2756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Prints an XML summary of unit_test to output stream out. 2759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out, 2760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const UnitTest* unit_test) { 2761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::UnitTestImpl* const impl = unit_test->impl(); 2762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); 2763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, 2764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "<testsuite tests=\"%d\" failures=\"%d\" disabled=\"%d\" " 2765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "errors=\"0\" time=\"%s\" ", 2766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->total_test_count(), 2767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->failed_test_count(), 2768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->disabled_test_count(), 2769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::StreamableToString(impl->elapsed_time()).c_str()); 2770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, "name=\"AllTests\">\n"); 2771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestCase*>* case_node = 2772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl->test_cases()->Head(); 2773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case_node != NULL; 2774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case_node = case_node->next()) { 2775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PrintXmlTestCase(out, case_node->element()); 2776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(out, "</testsuite>\n"); 2778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Produces a string representing the test properties in a result as space 2781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// delimited XML attributes based on the property key="value" pairs. 2782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinternal::String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( 2783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TestResult* result) { 2784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott using internal::TestProperty; 2785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message attributes; 2786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::List<TestProperty>& properties = result->test_properties(); 2787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestProperty>* property_node = 2788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott properties.Head(); 2789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott property_node != NULL; 2790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott property_node = property_node->next()) { 2791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestProperty& property = property_node->element(); 2792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott attributes << " " << property.key() << "=" 2793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << "\"" << EscapeXmlAttribute(property.value()) << "\""; 2794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return attributes.GetString(); 2796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// End XmlUnitTestResultPrinter 2799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 2801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Class ScopedTrace 2803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Pushes the given source file location and message onto a per-thread 2805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// trace stack maintained by Google Test. 2806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < UnitTest::mutex_ 2807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottScopedTrace::ScopedTrace(const char* file, int line, const Message& message) { 2808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TraceInfo trace; 2809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott trace.file = file; 2810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott trace.line = line; 2811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott trace.message = message.GetString(); 2812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTest::GetInstance()->PushGTestTrace(trace); 2814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Pops the info pushed by the c'tor. 2817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < UnitTest::mutex_ 2818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottScopedTrace::~ScopedTrace() { 2819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTest::GetInstance()->PopGTestTrace(); 2820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class OsStackTraceGetter 2824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the current OS stack trace as a String. Parameters: 2826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// max_depth - the maximum number of stack frames to be included 2828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in the trace. 2829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// skip_count - the number of top frames to be skipped; doesn't count 2830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// against max_depth. 2831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < mutex_ 2833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We use "L < mutex_" to denote that the function may acquire mutex_. 2834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString OsStackTraceGetter::CurrentStackTrace(int, int) { 2835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return String(""); 2836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < mutex_ 2839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid OsStackTraceGetter::UponLeavingGTest() { 2840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char* const 2843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottOsStackTraceGetter::kElidedFramesMarker = 2844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "... " GTEST_NAME " internal frames ..."; 2845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 2847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class UnitTest 2849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets the singleton UnitTest object. The first time this method is 2851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// called, a UnitTest object is constructed and returned. Consecutive 2852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// calls will return the same object. 2853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We don't protect this under mutex_ as a user is not supposed to 2855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// call this before main() starts, from which point on the return 2856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// value will never change. 2857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTest * UnitTest::GetInstance() { 2858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // When compiled with MSVC 7.1 in optimized mode, destroying the 2859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // UnitTest object upon exiting the program messes up the exit code, 2860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // causing successful tests to appear failed. We have to use a 2861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // different implementation in this case to bypass the compiler bug. 2862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This implementation makes the compiler happy, at the cost of 2863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // leaking the UnitTest object. 2864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if _MSC_VER == 1310 && !defined(_DEBUG) // MSVC 7.1 and optimized build. 2865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static UnitTest* const instance = new UnitTest; 2866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return instance; 2867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static UnitTest instance; 2869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return &instance; 2870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _MSC_VER==1310 && !defined(_DEBUG) 2871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Registers and returns a global test environment. When a test 2874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// program is run, all global test environments will be set-up in the 2875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// order they were registered. After all tests in the program have 2876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// finished, all global test environments will be torn-down in the 2877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// *reverse* order they were registered. 2878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The UnitTest object takes ownership of the given environment. 2880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We don't protect this under mutex_, as we only support calling it 2882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// from the main thread. 2883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottEnvironment* UnitTest::AddEnvironment(Environment* env) { 2884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (env == NULL) { 2885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return NULL; 2886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->environments()->PushBack(env); 2889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->environments_in_reverse_order()->PushFront(env); 2890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return env; 2891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Adds a TestPartResult to the current TestResult object. All Google Test 2894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call 2895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// this to report their results. The user code should use the 2896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// assertion macros instead of calling this directly. 2897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < mutex_ 2898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTest::AddTestPartResult(TestPartResultType result_type, 2899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* file_name, 2900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int line_number, 2901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::String& message, 2902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::String& os_stack_trace) { 2903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Message msg; 2904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << message; 2905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::MutexLock lock(&mutex_); 2907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (impl_->gtest_trace_stack()->size() > 0) { 2908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "\n" << GTEST_NAME << " trace:"; 2909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (internal::ListNode<internal::TraceInfo>* node = 2911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->gtest_trace_stack()->Head(); 2912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott node != NULL; 2913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott node = node->next()) { 2914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TraceInfo& trace = node->element(); 2915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "\n" << trace.file << ":" << trace.line << ": " << trace.message; 2916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) { 2920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg << "\nStack trace:\n" << os_stack_trace; 2921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResult result = 2924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResult(result_type, file_name, line_number, 2925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg.GetString().c_str()); 2926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->test_part_result_reporter()->ReportTestPartResult(result); 2927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If this is a failure and the user wants the debugger to break on 2929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // failures ... 2930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (result_type != TPRT_SUCCESS && GTEST_FLAG(break_on_failure)) { 2931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ... then we generate a seg fault. 2932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *static_cast<int*>(NULL) = 1; 2933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates and adds a property to the current TestResult. If a property matching 2937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the supplied value already exists, updates its value instead. 2938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTest::RecordPropertyForCurrentTest(const char* key, 2939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* value) { 2940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const internal::TestProperty test_property(key, value); 2941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->current_test_result()->RecordProperty(test_property); 2942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Runs all tests in this UnitTest object and prints the result. 2945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns 0 if successful, or 1 otherwise. 2946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 2947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We don't protect this under mutex_, as we only support calling it 2948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// from the main thread. 2949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTest::Run() { 2950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 2951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(_WIN32_WCE) 2953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // SetErrorMode doesn't exist on CE. 2954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (GTEST_FLAG(catch_exceptions)) { 2955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The user wants Google Test to catch exceptions thrown by the tests. 2956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This lets fatal errors be handled by us, instead of causing pop-ups. 2958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | 2959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 2960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // _WIN32_WCE 2962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __try { 2964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->RunAllTests(); 2965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } __except(internal::UnitTestOptions::GTestShouldProcessSEH( 2966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GetExceptionCode())) { 2967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Exception thrown with code 0x%x.\nFAIL\n", GetExceptionCode()); 2968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 2969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 1; 2970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 2971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 2973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We are on Linux or Mac OS. There is no exception of any kind. 2974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->RunAllTests(); 2976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 2977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the TestCase object for the test that's currently running, 2980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// or NULL if no test is running. 2981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < mutex_ 2982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst TestCase* UnitTest::current_test_case() const { 2983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::MutexLock lock(&mutex_); 2984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->current_test_case(); 2985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the TestInfo object for the test that's currently running, 2988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// or NULL if no test is running. 2989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < mutex_ 2990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst TestInfo* UnitTest::current_test_info() const { 2991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::MutexLock lock(&mutex_); 2992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return impl_->current_test_info(); 2993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Creates an empty UnitTest. 2996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTest::UnitTest() { 2997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_ = new internal::UnitTestImpl(this); 2998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 2999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Destructor of UnitTest. 3001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTest::~UnitTest() { 3002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete impl_; 3003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Pushes a trace defined by SCOPED_TRACE() on to the per-thread 3006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test trace stack. 3007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < mutex_ 3008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace) { 3009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::MutexLock lock(&mutex_); 3010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->gtest_trace_stack()->PushFront(trace); 3011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Pops a trace from the per-thread Google Test trace stack. 3014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// L < mutex_ 3015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTest::PopGTestTrace() { 3016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::MutexLock lock(&mutex_); 3017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott impl_->gtest_trace_stack()->PopFront(NULL); 3018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 3021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTestImpl::UnitTestImpl(UnitTest* parent) 3023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : parent_(parent), 3024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_cases_(), 3025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott last_death_test_case_(NULL), 3026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott current_test_case_(NULL), 3027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott current_test_info_(NULL), 3028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ad_hoc_test_result_(), 3029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer_(NULL), 3030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott os_stack_trace_getter_(NULL), 3031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST 3032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott elapsed_time_(0), 3033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal_run_death_test_flag_(NULL), 3034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott death_test_factory_(new DefaultDeathTestFactory) { 3035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 3036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott elapsed_time_(0) { 3037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_DEATH_TEST 3038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We do the assignment here instead of in the initializer list, as 3039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // doing that latter causes MSVC to issue a warning about using 3040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 'this' in initializers. 3041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_part_result_reporter_ = this; 3042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTestImpl::~UnitTestImpl() { 3045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes every TestCase. 3046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_cases_.ForEach(internal::Delete<TestCase>); 3047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes every Environment. 3049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott environments_.ForEach(internal::Delete<Environment>); 3050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes the current test result printer. 3052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete result_printer_; 3053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete os_stack_trace_getter_; 3055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A predicate that checks the name of a TestCase against a known 3058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// value. 3059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is used for implementation of the UnitTest class only. We put 3061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// it in the anonymous namespace to prevent polluting the outer 3062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace. 3063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestCaseNameIs is copyable. 3065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestCaseNameIs { 3066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 3067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Constructor. 3068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit TestCaseNameIs(const String& name) 3069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : name_(name) {} 3070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff the name of test_case matches name_. 3072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool operator()(const TestCase* test_case) const { 3073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0; 3074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 3077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String name_; 3078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 3079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Finds and returns a TestCase with the given name. If one doesn't 3081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// exist, creates one and returns it. 3082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Arguments: 3084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// test_case_name: name of the test case 3086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// set_up_tc: pointer to the function that sets up the test case 3087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// tear_down_tc: pointer to the function that tears down the test case 3088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestCase* UnitTestImpl::GetTestCase(const char* test_case_name, 3089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test::SetUpTestCaseFunc set_up_tc, 3090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Test::TearDownTestCaseFunc tear_down_tc) { 3091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Can we find a TestCase with the given name? 3092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::ListNode<TestCase*>* node = test_cases_.FindIf( 3093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCaseNameIs(test_case_name)); 3094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (node == NULL) { 3096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // No. Let's create one. 3097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCase* const test_case = 3098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott new TestCase(test_case_name, set_up_tc, tear_down_tc); 3099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Is this a death test case? 3101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (String(test_case_name).EndsWith("DeathTest")) { 3102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Yes. Inserts the test case after the last death test case 3103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // defined so far. 3104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott node = test_cases_.InsertAfter(last_death_test_case_, test_case); 3105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott last_death_test_case_ = node; 3106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 3107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // No. Appends to the end of the list. 3108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_cases_.PushBack(test_case); 3109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott node = test_cases_.Last(); 3110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the TestCase found. 3114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return node->element(); 3115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helpers for setting up / tearing down the given environment. They 3118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// are for use in the List::ForEach() method. 3119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void SetUpEnvironment(Environment* env) { env->SetUp(); } 3120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TearDownEnvironment(Environment* env) { env->TearDown(); } 3121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Runs all tests in this UnitTest object, prints the result, and 3123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// returns 0 if all tests are successful, or 1 otherwise. If any 3124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// exception is thrown during a test on Windows, this test is 3125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// considered to be failed, but the rest of the tests will still be 3126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// run. (We disable exceptions on Linux and Mac OS X, so the issue 3127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// doesn't apply there.) 3128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::RunAllTests() { 3129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Makes sure InitGoogleTest() was called. 3130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!GTestIsInitialized()) { 3131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s", 3132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\nThis test program did NOT call ::testing::InitGoogleTest " 3133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "before calling RUN_ALL_TESTS(). Please fix it.\n"); 3134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 1; 3135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Lists all the tests and exits if the --gtest_list_tests 3138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // flag was specified. 3139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (GTEST_FLAG(list_tests)) { 3140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ListAllTests(); 3141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 3142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // True iff we are in a subprocess for running a thread-safe-style 3145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // death test. 3146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool in_subprocess_for_death_test = false; 3147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST 3149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); 3150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL); 3151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_DEATH_TEST 3152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestEventListenerInterface * const printer = result_printer(); 3154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Compares the full test names with the filter to decide which 3156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // tests to run. 3157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool has_tests_to_run = FilterTests() > 0; 3158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // True iff at least one test has failed. 3159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool failed = false; 3160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // How many times to repeat the tests? We don't want to repeat them 3162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // when we are inside the subprocess of a death test. 3163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); 3164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Repeats forever if the repeat count is negative. 3165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool forever = repeat < 0; 3166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; forever || i != repeat; i++) { 3167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (repeat != 1) { 3168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("\nRepeating all tests (iteration %d) . . .\n\n", i + 1); 3169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tells the unit test event listener that the tests are about to 3172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // start. 3173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printer->OnUnitTestStart(parent_); 3174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TimeInMillis start = GetTimeInMillis(); 3176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Runs each test case if there is at least one test to run. 3178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (has_tests_to_run) { 3179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Sets up all environments beforehand. 3180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printer->OnGlobalSetUpStart(parent_); 3181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott environments_.ForEach(SetUpEnvironment); 3182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printer->OnGlobalSetUpEnd(parent_); 3183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Runs the tests only if there was no fatal failure during global 3185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // set-up. 3186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!Test::HasFatalFailure()) { 3187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_cases_.ForEach(TestCase::RunTestCase); 3188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tears down all environments in reverse order afterwards. 3191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printer->OnGlobalTearDownStart(parent_); 3192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott environments_in_reverse_order_.ForEach(TearDownEnvironment); 3193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printer->OnGlobalTearDownEnd(parent_); 3194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott elapsed_time_ = GetTimeInMillis() - start; 3197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Tells the unit test event listener that the tests have just 3199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // finished. 3200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printer->OnUnitTestEnd(parent_); 3201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the result and clears it. 3203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!Passed()) { 3204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott failed = true; 3205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ClearResult(); 3207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns 0 if all tests passed, or 1 other wise. 3210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return failed ? 1 : 0; 3211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Compares the name of each test with the user-specified filter to 3214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// decide whether the test should be run, then records the result in 3215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// each TestCase and TestInfo object. 3216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the number of tests that should run. 3217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint UnitTestImpl::FilterTests() { 3218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int num_runnable_tests = 0; 3219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestCase *> *test_case_node = 3220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_cases_.Head(); 3221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_node != NULL; 3222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_node = test_case_node->next()) { 3223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCase * const test_case = test_case_node->element(); 3224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String &test_case_name = test_case->name(); 3225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->set_should_run(false); 3226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestInfo *> *test_info_node = 3228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->test_info_list().Head(); 3229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_node != NULL; 3230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_node = test_info_node->next()) { 3231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestInfo * const test_info = test_info_node->element(); 3232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String test_name(test_info->name()); 3233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A test is disabled if test case name or test name matches 3234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // kDisableTestPattern. 3235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool is_disabled = 3236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestOptions::PatternMatchesString(kDisableTestPattern, 3237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_name.c_str()) || 3238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestOptions::PatternMatchesString(kDisableTestPattern, 3239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_name.c_str()); 3240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info->impl()->set_is_disabled(is_disabled); 3241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const bool should_run = !is_disabled && 3243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestOptions::FilterMatchesTest(test_case_name, 3244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_name); 3245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info->impl()->set_should_run(should_run); 3246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->set_should_run(test_case->should_run() || should_run); 3247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (should_run) { 3248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott num_runnable_tests++; 3249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return num_runnable_tests; 3253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Lists all tests by name. 3256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTestImpl::ListAllTests() { 3257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestCase*>* test_case_node = test_cases_.Head(); 3258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_node != NULL; 3259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_node = test_case_node->next()) { 3260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestCase* const test_case = test_case_node->element(); 3261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Prints the test case name following by an indented list of test nodes. 3263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("%s.\n", test_case->name()); 3264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const internal::ListNode<TestInfo*>* test_info_node = 3266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case->test_info_list().Head(); 3267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_node != NULL; 3268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_info_node = test_info_node->next()) { 3269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestInfo* const test_info = test_info_node->element(); 3270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf(" %s\n", test_info->name()); 3272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 3275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Sets the unit test result printer. 3278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Does nothing if the input and the current printer object are the 3280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// same; otherwise, deletes the old printer object and makes the 3281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// input the current printer. 3282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTestImpl::set_result_printer( 3283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestEventListenerInterface* result_printer) { 3284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (result_printer_ != result_printer) { 3285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete result_printer_; 3286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer_ = result_printer; 3287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the current unit test result printer if it is not NULL; 3291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// otherwise, creates an appropriate result printer, makes it the 3292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// current printer, and returns it. 3293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnitTestEventListenerInterface* UnitTestImpl::result_printer() { 3294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (result_printer_ != NULL) { 3295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result_printer_; 3296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST 3299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (internal_run_death_test_flag_.get() != NULL) { 3300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer_ = new NullUnitTestResultPrinter; 3301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result_printer_; 3302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_DEATH_TEST 3304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UnitTestEventsRepeater *repeater = new UnitTestEventsRepeater; 3306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String& output_format = internal::UnitTestOptions::GetOutputFormat(); 3307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (output_format == "xml") { 3308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott repeater->AddListener(new XmlUnitTestResultPrinter( 3309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::UnitTestOptions::GetOutputFile().c_str())); 3310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else if (output_format != "") { 3311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("WARNING: unrecognized output format \"%s\" ignored.\n", 3312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott output_format.c_str()); 3313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fflush(stdout); 3314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott repeater->AddListener(new PrettyUnitTestResultPrinter); 3316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result_printer_ = repeater; 3317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result_printer_; 3318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Sets the OS stack trace getter. 3321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Does nothing if the input and the current OS stack trace getter are 3323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the same; otherwise, deletes the old getter and makes the input the 3324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// current getter. 3325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnitTestImpl::set_os_stack_trace_getter( 3326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott OsStackTraceGetterInterface* getter) { 3327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (os_stack_trace_getter_ != getter) { 3328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete os_stack_trace_getter_; 3329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott os_stack_trace_getter_ = getter; 3330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the current OS stack trace getter if it is not NULL; 3334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// otherwise, creates an OsStackTraceGetter, makes it the current 3335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// getter, and returns it. 3336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { 3337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (os_stack_trace_getter_ == NULL) { 3338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott os_stack_trace_getter_ = new OsStackTraceGetter; 3339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return os_stack_trace_getter_; 3342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the TestResult for the test that's currently running, or 3345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the TestResult for the ad hoc test if no test is running. 3346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinternal::TestResult* UnitTestImpl::current_test_result() { 3347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return current_test_info_ ? 3348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott current_test_info_->impl()->result() : &ad_hoc_test_result_; 3349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestInfoImpl constructor. 3352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestInfoImpl::TestInfoImpl(TestInfo* parent, 3353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* test_case_name, 3354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* name, 3355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TypeId fixture_class_id, 3356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestMaker maker) : 3357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parent_(parent), 3358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_name_(String(test_case_name)), 3359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott name_(String(name)), 3360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fixture_class_id_(fixture_class_id), 3361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott should_run_(false), 3362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott is_disabled_(false), 3363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott maker_(maker) { 3364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestInfoImpl destructor. 3367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTestInfoImpl::~TestInfoImpl() { 3368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 3371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 3373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Parses a string as a command line flag. The string should have 3375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the format "--flag=value". When def_optional is true, the "=value" 3376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// part can be omitted. 3377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the value of the flag, or NULL if the parsing failed. 3379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char* ParseFlagValue(const char* str, 3380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* flag, 3381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool def_optional) { 3382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // str and flag must not be NULL. 3383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (str == NULL || flag == NULL) return NULL; 3384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The flag must start with "--" followed by GTEST_FLAG_PREFIX. 3386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX, flag); 3387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const size_t flag_len = flag_str.GetLength(); 3388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; 3389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Skips the flag name. 3391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* flag_end = str + flag_len; 3392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // When def_optional is true, it's OK to not have a "=value" part. 3394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (def_optional && (flag_end[0] == '\0')) { 3395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return flag_end; 3396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If def_optional is true and there are more characters after the 3399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // flag name, or if def_optional is false, there must be a '=' after 3400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the flag name. 3401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (flag_end[0] != '=') return NULL; 3402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the string after "=". 3404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return flag_end + 1; 3405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Parses a string for a bool flag, in the form of either 3408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "--flag=value" or "--flag". 3409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// In the former case, the value is taken as true as long as it does 3411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// not start with '0', 'f', or 'F'. 3412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// In the latter case, the value is taken as true. 3414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// On success, stores the value of the flag in *value, and returns 3416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// true. On failure, returns false without changing *value. 3417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool ParseBoolFlag(const char* str, const char* flag, bool* value) { 3418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the value of the flag as a string. 3419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const value_str = ParseFlagValue(str, flag, true); 3420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Aborts if the parsing failed. 3422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (value_str == NULL) return false; 3423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Converts the string value to a bool. 3425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); 3426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 3427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Parses a string for an Int32 flag, in the form of 3430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "--flag=value". 3431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// On success, stores the value of the flag in *value, and returns 3433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// true. On failure, returns false without changing *value. 3434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool ParseInt32Flag(const char* str, const char* flag, Int32* value) { 3435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the value of the flag as a string. 3436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const value_str = ParseFlagValue(str, flag, false); 3437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Aborts if the parsing failed. 3439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (value_str == NULL) return false; 3440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Sets *value to the value of the flag. 3442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ParseInt32(Message() << "The value of flag --" << flag, 3443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value_str, value); 3444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Parses a string for a string flag, in the form of 3447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "--flag=value". 3448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// On success, stores the value of the flag in *value, and returns 3450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// true. On failure, returns false without changing *value. 3451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool ParseStringFlag(const char* str, const char* flag, String* value) { 3452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the value of the flag as a string. 3453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const value_str = ParseFlagValue(str, flag, false); 3454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Aborts if the parsing failed. 3456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (value_str == NULL) return false; 3457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Sets *value to the value of the flag. 3459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *value = value_str; 3460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 3461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The internal implementation of InitGoogleTest(). 3464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The type parameter CharType can be instantiated to either char or 3466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// wchar_t. 3467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename CharType> 3468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InitGoogleTestImpl(int* argc, CharType** argv) { 3469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott g_parse_gtest_flags_called = true; 3470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*argc <= 0) return; 3471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST 3473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott g_argvs.clear(); 3474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i != *argc; i++) { 3475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott g_argvs.push_back(StreamableToString(argv[i])); 3476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_DEATH_TEST 3478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 1; i != *argc; i++) { 3480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String arg_string = StreamableToString(argv[i]); 3481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* const arg = arg_string.c_str(); 3482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott using internal::ParseBoolFlag; 3484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott using internal::ParseInt32Flag; 3485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott using internal::ParseStringFlag; 3486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Do we see a Google Test flag? 3488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ParseBoolFlag(arg, kBreakOnFailureFlag, 3489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >EST_FLAG(break_on_failure)) || 3490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseBoolFlag(arg, kCatchExceptionsFlag, 3491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >EST_FLAG(catch_exceptions)) || 3492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || 3493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseStringFlag(arg, kDeathTestStyleFlag, 3494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >EST_FLAG(death_test_style)) || 3495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || 3496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseStringFlag(arg, kInternalRunDeathTestFlag, 3497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >EST_FLAG(internal_run_death_test)) || 3498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || 3499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || 3500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) 3501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ) { 3502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Yes. Shift the remainder of the argv list left by one. Note 3503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // that argv has (*argc + 1) elements, the last one always being 3504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // NULL. The following loop moves the trailing NULL element as 3505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // well. 3506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int j = i; j != *argc; j++) { 3507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott argv[j] = argv[j + 1]; 3508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Decrements the argument count. 3511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (*argc)--; 3512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We also need to decrement the iterator as we just removed 3514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // an element. 3515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i--; 3516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 3518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 3521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Initializes Google Test. This must be called before calling 3523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// RUN_ALL_TESTS(). In particular, it parses a command line for the 3524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// flags that Google Test recognizes. Whenever a Google Test flag is 3525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// seen, it is removed from argv, and *argc is decremented. 3526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 3527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// No value is returned. Instead, the Google Test flag variables are 3528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// updated. 3529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InitGoogleTest(int* argc, char** argv) { 3530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::g_executable_path = argv[0]; 3531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::InitGoogleTestImpl(argc, argv); 3532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This overloaded version can be used in Windows programs compiled in 3535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// UNICODE mode. 3536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 3537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InitGoogleTest(int* argc, wchar_t** argv) { 3538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // g_executable_path uses normal characters rather than wide chars, so call 3539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // StreamableToString to convert argv[0] to normal characters (utf8 encoding). 3540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::g_executable_path = internal::StreamableToString(argv[0]); 3541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::InitGoogleTestImpl(argc, argv); 3542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 3543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 3544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace testing 3546