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