1739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Copyright 2010, Google Inc. 2739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// All rights reserved. 3739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// 4739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Redistribution and use in source and binary forms, with or without 5739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// modification, are permitted provided that the following conditions are 6739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// met: 7739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// 8739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// * Redistributions of source code must retain the above copyright 9739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// notice, this list of conditions and the following disclaimer. 10739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// * Redistributions in binary form must reproduce the above 11739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// copyright notice, this list of conditions and the following disclaimer 12739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// in the documentation and/or other materials provided with the 13739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// distribution. 14739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// * Neither the name of Google Inc. nor the names of its 15739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// contributors may be used to endorse or promote products derived from 16739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// this software without specific prior written permission. 17739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// 18739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// 30739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Author: vladl@google.com (Vlad Losev) 31739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// 32739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Tests for Google Test itself. Tests in this file throw C++ or SEH 33739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// exceptions, and the output is verified by gtest_catch_exceptions_test.py. 34739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 352620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest.h" 36739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 37739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#include <stdio.h> // NOLINT 385d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#include <stdlib.h> // For exit(). 39739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 40739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#if GTEST_HAS_SEH 41733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <windows.h> 42739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif 43739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 44739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#if GTEST_HAS_EXCEPTIONS 45733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <exception> // For set_terminate(). 46733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <stdexcept> 47739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif 48739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 49739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanusing testing::Test; 50739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 51739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#if GTEST_HAS_SEH 52739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 53739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass SehExceptionInConstructorTest : public Test { 54739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 55739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); } 56739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 57739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 58739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {} 59739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 60739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass SehExceptionInDestructorTest : public Test { 61739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 62739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); } 63739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 64739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 65739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {} 66739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 67739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass SehExceptionInSetUpTestCaseTest : public Test { 68739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 69739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); } 70739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 71739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 72739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {} 73739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 74739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass SehExceptionInTearDownTestCaseTest : public Test { 75739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 76739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); } 77739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 78739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 79739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {} 80739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 81739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass SehExceptionInSetUpTest : public Test { 82739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 83739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void SetUp() { RaiseException(42, 0, 0, NULL); } 84739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 85739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 86739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {} 87739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 88739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass SehExceptionInTearDownTest : public Test { 89739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 90739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void TearDown() { RaiseException(42, 0, 0, NULL); } 91739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 92739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 93739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {} 94739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 95739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST(SehExceptionTest, ThrowsSehException) { 96739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan RaiseException(42, 0, 0, NULL); 97739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 98739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 99739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif // GTEST_HAS_SEH 100739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 101739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#if GTEST_HAS_EXCEPTIONS 102739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 103739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass CxxExceptionInConstructorTest : public Test { 104739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 105739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan CxxExceptionInConstructorTest() { 106739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // Without this macro VC++ complains about unreachable code at the end of 107739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // the constructor. 108739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_( 109739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan throw std::runtime_error("Standard C++ exception")); 110739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 111739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 112739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { 113739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 114739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInConstructorTest::TearDownTestCase() " 115739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 116739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 117739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 118739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 119739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ~CxxExceptionInConstructorTest() { 120739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ADD_FAILURE() << "CxxExceptionInConstructorTest destructor " 121739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan << "called unexpectedly."; 122739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 123739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 124739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void SetUp() { 125739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() " 126739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan << "called unexpectedly."; 127739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 128739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 129739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void TearDown() { 130739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() " 131739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan << "called unexpectedly."; 132739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 133739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 134739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 135739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) { 136739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ADD_FAILURE() << "CxxExceptionInConstructorTest test body " 137739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan << "called unexpectedly."; 138739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 139739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 140aa3c420019cb0215b00013cb94658a917ec4f712zhanyong.wan// Exceptions in destructors are not supported in C++11. 141aa3c420019cb0215b00013cb94658a917ec4f712zhanyong.wan#if !defined(__GXX_EXPERIMENTAL_CXX0X__) && __cplusplus < 201103L 142739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass CxxExceptionInDestructorTest : public Test { 143739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 144739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { 145739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 146739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInDestructorTest::TearDownTestCase() " 147739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 148739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 149739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 150739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 151739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ~CxxExceptionInDestructorTest() { 152739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_( 153739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan throw std::runtime_error("Standard C++ exception")); 154739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 155739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 156739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 157739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {} 158aa3c420019cb0215b00013cb94658a917ec4f712zhanyong.wan#endif // C++11 mode 159739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 160739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass CxxExceptionInSetUpTestCaseTest : public Test { 161739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 162739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan CxxExceptionInSetUpTestCaseTest() { 163739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 164739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTestCaseTest constructor " 165739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 166739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 167739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 168739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void SetUpTestCase() { 169739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan throw std::runtime_error("Standard C++ exception"); 170739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 171739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 172739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { 173739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 174739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() " 175739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 176739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 177739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 178739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 179739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ~CxxExceptionInSetUpTestCaseTest() { 180739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 181739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTestCaseTest destructor " 182739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 183739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 184739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 185739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void SetUp() { 186739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 187739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTestCaseTest::SetUp() " 188739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 189739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 190739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 191739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void TearDown() { 192739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 193739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTestCaseTest::TearDown() " 194739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 195739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 196739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 197739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 198739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) { 199739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 200739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTestCaseTest test body " 201739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 202739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 203739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 204739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass CxxExceptionInTearDownTestCaseTest : public Test { 205739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 206739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { 207739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan throw std::runtime_error("Standard C++ exception"); 208739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 209739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 210739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 211739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {} 212739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 213739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass CxxExceptionInSetUpTest : public Test { 214739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 215739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { 216739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 217739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTest::TearDownTestCase() " 218739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 219739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 220739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 221739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 222739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ~CxxExceptionInSetUpTest() { 223739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 224739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTest destructor " 225739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 226739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 227739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 228739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); } 229739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 230739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void TearDown() { 231739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 232739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInSetUpTest::TearDown() " 233739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 234739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 235739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 236739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 237739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) { 238739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ADD_FAILURE() << "CxxExceptionInSetUpTest test body " 239739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan << "called unexpectedly."; 240739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 241739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 242739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass CxxExceptionInTearDownTest : public Test { 243739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 244739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { 245739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 246739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInTearDownTest::TearDownTestCase() " 247739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 248739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 249739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 250739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 251739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ~CxxExceptionInTearDownTest() { 252739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 253739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInTearDownTest destructor " 254739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 255739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 256739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 257739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void TearDown() { 258739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan throw std::runtime_error("Standard C++ exception"); 259739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 260739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 261739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 262739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {} 263739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 264739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanclass CxxExceptionInTestBodyTest : public Test { 265739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan public: 266739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan static void TearDownTestCase() { 267739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 268739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInTestBodyTest::TearDownTestCase() " 269739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 270739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 271739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 272739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan protected: 273739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ~CxxExceptionInTestBodyTest() { 274739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 275739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInTestBodyTest destructor " 276739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 277739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 278739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 279739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan virtual void TearDown() { 280739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan printf("%s", 281739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "CxxExceptionInTestBodyTest::TearDown() " 282739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "called as expected.\n"); 283739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 284739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan}; 285739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 286739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) { 287739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan throw std::runtime_error("Standard C++ exception"); 288739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 289739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 290739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTEST(CxxExceptionTest, ThrowsNonStdCxxException) { 291739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan throw "C-string"; 292739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 293739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2945d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan// This terminate handler aborts the program using exit() rather than abort(). 2955d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan// This avoids showing pop-ups on Windows systems and core dumps on Unix-like 2965d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan// ones. 2975d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wanvoid TerminateHandler() { 2985d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program."); 2995d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan fflush(NULL); 3005d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan exit(3); 3015d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan} 3025d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan 303739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif // GTEST_HAS_EXCEPTIONS 304739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 305739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanint main(int argc, char** argv) { 3065d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_EXCEPTIONS 3075d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan std::set_terminate(&TerminateHandler); 308739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif 309739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan testing::InitGoogleTest(&argc, argv); 310739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return RUN_ALL_TESTS(); 311739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 312