[CMAKE]
[reactos.git] / lib / 3rdparty / stlport / test / unit / exception_test.cpp
1 #include <exception>
2 #include <stdexcept>
3 #include <string>
4
5 #include "cppunit/cppunit_proxy.h"
6
7 #if defined (STLPORT) && defined (_STLP_USE_NAMESPACES)
8 /*
9 * This test case purpose is to check that the exception handling
10 * functions are correctly imported to the STLport namespace only
11 * if they have a right behavior.
12 * Otherwise they are not imported to report the problem as a compile
13 * time error.
14 */
15
16 //
17 // TestCase class
18 //
19 class ExceptionTest : public CPPUNIT_NS::TestCase
20 {
21 CPPUNIT_TEST_SUITE(ExceptionTest);
22 #if defined (STLPORT) && !defined (_STLP_USE_EXCEPTIONS)
23 CPPUNIT_IGNORE;
24 #endif
25 CPPUNIT_TEST(what);
26 #if defined (STLPORT) && defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT)
27 CPPUNIT_IGNORE;
28 #endif
29 CPPUNIT_TEST(unexpected_except);
30 #if defined (STLPORT) && defined (_STLP_USE_EXCEPTIONS)
31 CPPUNIT_STOP_IGNORE;
32 #endif
33 #if defined (STLPORT) && defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT)
34 CPPUNIT_IGNORE;
35 #endif
36 CPPUNIT_TEST(uncaught_except);
37 #if defined (STLPORT) && defined (_STLP_USE_EXCEPTIONS)
38 CPPUNIT_STOP_IGNORE;
39 #endif
40 CPPUNIT_TEST(exception_emission);
41 CPPUNIT_TEST_SUITE_END();
42
43 protected:
44 void what();
45 void unexpected_except();
46 void uncaught_except();
47 void exception_emission();
48 };
49
50 CPPUNIT_TEST_SUITE_REGISTRATION(ExceptionTest);
51
52 #if !defined (STLPORT) || !defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT)
53 bool g_unexpected_called = false;
54 void unexpected_hdl() {
55 g_unexpected_called = true;
56 throw std::bad_exception();
57 }
58
59 struct special_except {};
60 void throw_func() {
61 throw special_except();
62 }
63
64 void throw_except_func() throw(std::exception) {
65 throw_func();
66 }
67 #endif
68
69 void ExceptionTest::what()
70 {
71 try {
72 throw std::runtime_error( std::string( "message" ) );
73 }
74 catch ( std::runtime_error& err ) {
75 CPPUNIT_CHECK( strcmp( err.what(), "message" ) == 0 );
76 }
77 }
78
79 void ExceptionTest::unexpected_except()
80 {
81 #if !defined (STLPORT) || !defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT)
82 std::unexpected_handler hdl = &unexpected_hdl;
83 std::set_unexpected(hdl);
84
85 try {
86 throw_except_func();
87 }
88 catch (std::bad_exception const&) {
89 CPPUNIT_ASSERT( true );
90 }
91 catch (special_except) {
92 CPPUNIT_ASSERT( false );
93 }
94 CPPUNIT_ASSERT( g_unexpected_called );
95 #endif
96 }
97
98 #if !defined (STLPORT) || !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT)
99 struct UncaughtClassTest
100 {
101 UncaughtClassTest(int &res) : _res(res)
102 {}
103
104 ~UncaughtClassTest() {
105 _res = std::uncaught_exception()?1:0;
106 }
107
108 int &_res;
109 };
110 #endif
111
112 void ExceptionTest::uncaught_except()
113 {
114 #if !defined (STLPORT) || !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT)
115 int uncaught_result = -1;
116 {
117 UncaughtClassTest test_inst(uncaught_result);
118 CPPUNIT_ASSERT( uncaught_result == -1 );
119 }
120 CPPUNIT_ASSERT( uncaught_result == 0 );
121
122 {
123 try {
124 uncaught_result = -1;
125 UncaughtClassTest test_inst(uncaught_result);
126 throw "exception";
127 }
128 catch (...) {
129 }
130 }
131 CPPUNIT_ASSERT( uncaught_result == 1 );
132 #endif
133 }
134
135 void ExceptionTest::exception_emission()
136 {
137 #if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
138 std::string foo = "foo";
139 try {
140 throw std::runtime_error(foo);
141 }
142 catch (std::runtime_error const& e) {
143 CPPUNIT_ASSERT( foo == e.what() );
144 std::runtime_error clone("");
145 clone = e;
146 CPPUNIT_ASSERT(foo == clone.what() );
147 }
148 catch (...) {
149 CPPUNIT_ASSERT( false );
150 }
151
152 try {
153 throw std::runtime_error(foo);
154 }
155 catch (std::runtime_error e) {
156 CPPUNIT_ASSERT( foo == e.what() );
157 std::runtime_error clone("");
158 clone = e;
159 CPPUNIT_ASSERT(foo == clone.what() );
160 }
161 catch (...) {
162 CPPUNIT_ASSERT( false );
163 }
164
165 std::string msg(512, 'a');
166 try {
167 throw std::runtime_error(msg);
168 }
169 catch (std::runtime_error const& e) {
170 CPPUNIT_ASSERT(msg == e.what() );
171 std::runtime_error clone("");
172 clone = e;
173 CPPUNIT_ASSERT(msg == clone.what() );
174 }
175 catch (...) {
176 CPPUNIT_ASSERT( false );
177 }
178
179 try {
180 throw std::runtime_error(msg);
181 }
182 catch (std::runtime_error e) {
183 CPPUNIT_ASSERT(msg == e.what() );
184 std::runtime_error clone("");
185 clone = e;
186 CPPUNIT_ASSERT(msg == clone.what() );
187 }
188 catch (...) {
189 CPPUNIT_ASSERT( false );
190 }
191 #endif
192 }
193 #endif