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