1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2010, Google Inc.
2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// All rights reserved.
3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Redistribution and use in source and binary forms, with or without
5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// modification, are permitted provided that the following conditions are
6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// met:
7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Redistributions of source code must retain the above copyright
9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// notice, this list of conditions and the following disclaimer.
10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Redistributions in binary form must reproduce the above
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// in the documentation and/or other materials provided with the
13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// distribution.
14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// contributors may be used to endorse or promote products derived from
16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// this software without specific prior written permission.
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Author: vladl@google.com (Vlad Losev)
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests for Google Test itself. Tests in this file throw C++ or SEH
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/gtest.h"
36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <stdio.h>  // NOLINT
38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <stdlib.h>  // For exit().
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_SEH
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch# include <windows.h>
42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_EXCEPTIONS
45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch# include <exception>  // For set_terminate().
46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch# include <stdexcept>
47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif
48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::Test;
50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_SEH
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInConstructorTest : public Test {
54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }
56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}
59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInDestructorTest : public Test {
61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }
63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInSetUpTestCaseTest : public Test {
68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }
70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}
73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInTearDownTestCaseTest : public Test {
75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }
77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInSetUpTest : public Test {
82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }
84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}
87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass SehExceptionInTearDownTest : public Test {
89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }
91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(SehExceptionTest, ThrowsSehException) {
96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  RaiseException(42, 0, 0, NULL);
97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // GTEST_HAS_SEH
100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_EXCEPTIONS
102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInConstructorTest : public Test {
104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CxxExceptionInConstructorTest() {
106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Without this macro VC++ complains about unreachable code at the end of
107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // the constructor.
108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        throw std::runtime_error("Standard C++ exception"));
110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() {
113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInConstructorTest::TearDownTestCase() "
115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~CxxExceptionInConstructorTest() {
120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ADD_FAILURE() << "CxxExceptionInConstructorTest destructor "
121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                  << "called unexpectedly.";
122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void SetUp() {
125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() "
126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                  << "called unexpectedly.";
127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void TearDown() {
130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() "
131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                  << "called unexpectedly.";
132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {
136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ADD_FAILURE() << "CxxExceptionInConstructorTest test body "
137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                << "called unexpectedly.";
138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Exceptions in destructors are not supported in C++11.
141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if !defined(__GXX_EXPERIMENTAL_CXX0X__) &&  __cplusplus < 201103L
142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInDestructorTest : public Test {
143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() {
145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInDestructorTest::TearDownTestCase() "
147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~CxxExceptionInDestructorTest() {
152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        throw std::runtime_error("Standard C++ exception"));
154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // C++11 mode
159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInSetUpTestCaseTest : public Test {
161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CxxExceptionInSetUpTestCaseTest() {
163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTestCaseTest constructor "
165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void SetUpTestCase() {
169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    throw std::runtime_error("Standard C++ exception");
170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() {
173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() "
175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~CxxExceptionInSetUpTestCaseTest() {
180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTestCaseTest destructor "
182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void SetUp() {
186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTestCaseTest::SetUp() "
188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void TearDown() {
192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTestCaseTest::TearDown() "
194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {
199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  printf("%s",
200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         "CxxExceptionInSetUpTestCaseTest test body "
201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         "called as expected.\n");
202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInTearDownTestCaseTest : public Test {
205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() {
207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    throw std::runtime_error("Standard C++ exception");
208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInSetUpTest : public Test {
214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() {
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTest::TearDownTestCase() "
218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~CxxExceptionInSetUpTest() {
223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTest destructor "
225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); }
229f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
230f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void TearDown() {
231f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
232f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInSetUpTest::TearDown() "
233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {
238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ADD_FAILURE() << "CxxExceptionInSetUpTest test body "
239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                << "called unexpectedly.";
240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInTearDownTest : public Test {
243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() {
245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInTearDownTest::TearDownTestCase() "
247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~CxxExceptionInTearDownTest() {
252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInTearDownTest destructor "
254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void TearDown() {
258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    throw std::runtime_error("Standard C++ exception");
259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CxxExceptionInTestBodyTest : public Test {
265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  static void TearDownTestCase() {
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInTestBodyTest::TearDownTestCase() "
269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected:
273f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~CxxExceptionInTestBodyTest() {
274f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
275f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInTestBodyTest destructor "
276f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void TearDown() {
280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    printf("%s",
281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "CxxExceptionInTestBodyTest::TearDown() "
282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "called as expected.\n");
283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {
287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  throw std::runtime_error("Standard C++ exception");
288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(CxxExceptionTest, ThrowsNonStdCxxException) {
291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  throw "C-string";
292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// This terminate handler aborts the program using exit() rather than abort().
295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// ones.
297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid TerminateHandler() {
298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  fflush(NULL);
300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  exit(3);
301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // GTEST_HAS_EXCEPTIONS
304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint main(int argc, char** argv) {
306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_EXCEPTIONS
307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::set_terminate(&TerminateHandler);
308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif
309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  testing::InitGoogleTest(&argc, argv);
310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return RUN_ALL_TESTS();
311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
312