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