1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright 2010, Google Inc.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// All rights reserved.
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Redistribution and use in source and binary forms, with or without
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// modification, are permitted provided that the following conditions are
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// met:
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//     * Redistributions of source code must retain the above copyright
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// notice, this list of conditions and the following disclaimer.
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//     * Redistributions in binary form must reproduce the above
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// copyright notice, this list of conditions and the following disclaimer
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// in the documentation and/or other materials provided with the
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// distribution.
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//     * Neither the name of Google Inc. nor the names of its
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// contributors may be used to endorse or promote products derived from
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// this software without specific prior written permission.
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Author: vladl@google.com (Vlad Losev)
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Tests for Google Test itself. Tests in this file throw C++ or SEH
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/gtest.h"
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <stdio.h>  // NOLINT
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <stdlib.h>  // For exit().
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_SEH
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <windows.h>
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_EXCEPTIONS
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <exception>  // For set_terminate().
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <stdexcept>
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing testing::Test;
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_SEH
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInConstructorTest : public Test {
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
58731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInDestructorTest : public Test {
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
65731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInSetUpTestCaseTest : public Test {
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
72731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInTearDownTestCaseTest : public Test {
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
79731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInSetUpTest : public Test {
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
86731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass SehExceptionInTearDownTest : public Test {
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
93731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
95731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(SehExceptionTest, ThrowsSehException) {
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RaiseException(42, 0, 0, NULL);
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // GTEST_HAS_SEH
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_EXCEPTIONS
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInConstructorTest : public Test {
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CxxExceptionInConstructorTest() {
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Without this macro VC++ complains about unreachable code at the end of
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // the constructor.
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        throw std::runtime_error("Standard C++ exception"));
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() {
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInConstructorTest::TearDownTestCase() "
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~CxxExceptionInConstructorTest() {
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ADD_FAILURE() << "CxxExceptionInConstructorTest destructor "
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  << "called unexpectedly.";
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void SetUp() {
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() "
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  << "called unexpectedly.";
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TearDown() {
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() "
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  << "called unexpectedly.";
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
135731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ADD_FAILURE() << "CxxExceptionInConstructorTest test body "
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                << "called unexpectedly.";
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInDestructorTest : public Test {
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() {
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInDestructorTest::TearDownTestCase() "
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~CxxExceptionInDestructorTest() {
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        throw std::runtime_error("Standard C++ exception"));
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
155731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInSetUpTestCaseTest : public Test {
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CxxExceptionInSetUpTestCaseTest() {
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTestCaseTest constructor "
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void SetUpTestCase() {
166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    throw std::runtime_error("Standard C++ exception");
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() {
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() "
172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~CxxExceptionInSetUpTestCaseTest() {
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTestCaseTest destructor "
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void SetUp() {
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTestCaseTest::SetUp() "
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TearDown() {
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTestCaseTest::TearDown() "
191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
195731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  printf("%s",
197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         "CxxExceptionInSetUpTestCaseTest test body "
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         "called as expected.\n");
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInTearDownTestCaseTest : public Test {
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() {
204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    throw std::runtime_error("Standard C++ exception");
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
208731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInSetUpTest : public Test {
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() {
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTest::TearDownTestCase() "
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~CxxExceptionInSetUpTest() {
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTest destructor "
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); }
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TearDown() {
228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInSetUpTest::TearDown() "
230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
234731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {
235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ADD_FAILURE() << "CxxExceptionInSetUpTest test body "
236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                << "called unexpectedly.";
237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInTearDownTest : public Test {
240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() {
242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInTearDownTest::TearDownTestCase() "
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~CxxExceptionInTearDownTest() {
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInTearDownTest destructor "
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TearDown() {
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    throw std::runtime_error("Standard C++ exception");
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
259731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CxxExceptionInTestBodyTest : public Test {
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void TearDownTestCase() {
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInTestBodyTest::TearDownTestCase() "
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~CxxExceptionInTestBodyTest() {
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInTestBodyTest destructor "
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TearDown() {
277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    printf("%s",
278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "CxxExceptionInTestBodyTest::TearDown() "
279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "called as expected.\n");
280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
283731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {
284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  throw std::runtime_error("Standard C++ exception");
285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
287731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(CxxExceptionTest, ThrowsNonStdCxxException) {
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  throw "C-string";
289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This terminate handler aborts the program using exit() rather than abort().
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// ones.
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TerminateHandler() {
295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  fflush(NULL);
297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exit(3);
298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // GTEST_HAS_EXCEPTIONS
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickint main(int argc, char** argv) {
303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_EXCEPTIONS
304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::set_terminate(&TerminateHandler);
305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  testing::InitGoogleTest(&argc, argv);
307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return RUN_ALL_TESTS();
308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
309