exception_test.cpp revision e46c9386c4f79aa40185f79a19fc5b2a7ef528b3
19de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#include <exception> 29de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#include <stdexcept> 39de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#include <string> 49de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 59de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#include "cppunit/cppunit_proxy.h" 69de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 79de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if defined (STLPORT) && defined (_STLP_USE_NAMESPACES) 89de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson/* 99de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * This test case purpose is to check that the exception handling 109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * functions are correctly imported to the STLport namespace only 119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * if they have a right behavior. 129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Otherwise they are not imported to report the problem as a compile 139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * time error. 149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson */ 159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson// 179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson// TestCase class 189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson// 19ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonclass ExceptionTest : public CPPUNIT_NS::TestCase 205307b6d112c825e70dc30aea1c878f4e965127e2Hugo Hudson{ 215307b6d112c825e70dc30aea1c878f4e965127e2Hugo Hudson CPPUNIT_TEST_SUITE(ExceptionTest); 229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if defined (STLPORT) && !defined (_STLP_USE_EXCEPTIONS) 239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_IGNORE; 249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#endif 259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_TEST(what); 269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if defined (STLPORT) && defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT) 279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_IGNORE; 289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#endif 299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_TEST(unexpected_except); 309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if defined (STLPORT) && defined (_STLP_USE_EXCEPTIONS) 319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_STOP_IGNORE; 32ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson#endif 3340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson#if defined (STLPORT) && defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) 34ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson CPPUNIT_IGNORE; 359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#endif 369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_TEST(uncaught_except); 379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if defined (STLPORT) && defined (_STLP_USE_EXCEPTIONS) 389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_STOP_IGNORE; 39ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudson#endif 40ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudson CPPUNIT_TEST(exception_emission); 419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_TEST_SUITE_END(); 42ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudson 43ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudsonprotected: 44ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudson void what(); 45ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudson void unexpected_except(); 469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson void uncaught_except(); 479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson void exception_emission(); 489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson}; 499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo HudsonCPPUNIT_TEST_SUITE_REGISTRATION(ExceptionTest); 519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if !defined (STLPORT) || !defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT) 539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonbool g_unexpected_called = false; 549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonvoid unexpected_hdl() { 559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson g_unexpected_called = true; 569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw std::bad_exception(); 579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson} 589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonstruct special_except {}; 609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonvoid throw_func() { 619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw special_except(); 629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson} 639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonvoid throw_except_func() throw(std::exception) { 659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw_func(); 669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson} 679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#endif 689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonvoid ExceptionTest::what() 709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson{ 719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw std::runtime_error( std::string( "message" ) ); 739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson catch ( std::runtime_error& err ) { 759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_CHECK( strcmp( err.what(), "message" ) == 0 ); 769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson} 789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonvoid ExceptionTest::unexpected_except() 809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson{ 819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if !defined (STLPORT) || !defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT) 829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson std::unexpected_handler hdl = &unexpected_hdl; 839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson std::set_unexpected(hdl); 849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw_except_func(); 879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 88ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudson catch (std::bad_exception const&) { 89ba73a086722c0eb6dd33e4de0764ae1f45d8d895Hugo Hudson CPPUNIT_ASSERT( true ); 909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson catch (special_except) { 929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( false ); 939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( g_unexpected_called ); 959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#endif 969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson} 979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if !defined (STLPORT) || !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) 999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonstruct UncaughtClassTest 1009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson{ 1019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson UncaughtClassTest(int &res) : _res(res) 1029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson {} 1039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson ~UncaughtClassTest() { 1059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson _res = std::uncaught_exception()?1:0; 1069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int &_res; 1099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson}; 1109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#endif 1119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonvoid ExceptionTest::uncaught_except() 1139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson{ 1149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if !defined (STLPORT) || !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) 1159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int uncaught_result = -1; 1169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson { 1179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson UncaughtClassTest test_inst(uncaught_result); 1189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( uncaught_result == -1 ); 1199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( uncaught_result == 0 ); 1219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson { 1239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 1249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson uncaught_result = -1; 1259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson UncaughtClassTest test_inst(uncaught_result); 1269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw "exception"; 1279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson catch (...) { 1299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( uncaught_result == 1 ); 1329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#endif 1339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson} 1349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonvoid ExceptionTest::exception_emission() 1369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson{ 1379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 1389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson std::string foo = "foo"; 1399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 1409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw std::runtime_error(foo); 1419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson catch (std::runtime_error const& e) { 1439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( foo == e.what() ); 1449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson std::runtime_error clone(""); 1459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson clone = e; 1469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT(foo == clone.what() ); 1479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson catch (...) { 1499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( false ); 15040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 15140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 15240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 15340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw std::runtime_error(foo); 15440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 15540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson catch (std::runtime_error e) { 15640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson CPPUNIT_ASSERT( foo == e.what() ); 15740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson std::runtime_error clone(""); 15840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson clone = e; 15940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson CPPUNIT_ASSERT(foo == clone.what() ); 16040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 16140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson catch (...) { 16240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson CPPUNIT_ASSERT( false ); 16340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 16440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 16540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson std::string msg(512, 'a'); 16640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 16740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw std::runtime_error(msg); 16840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 16940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson catch (std::runtime_error const& e) { 17040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson CPPUNIT_ASSERT(msg == e.what() ); 17140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson std::runtime_error clone(""); 17240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson clone = e; 17340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson CPPUNIT_ASSERT(msg == clone.what() ); 17440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 17540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson catch (...) { 17640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson CPPUNIT_ASSERT( false ); 17740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 17840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 17940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 18040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw std::runtime_error(msg); 18140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 1829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson catch (std::runtime_error e) { 1839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT(msg == e.what() ); 1849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson std::runtime_error clone(""); 185ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson clone = e; 186ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson CPPUNIT_ASSERT(msg == clone.what() ); 18740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 188ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson catch (...) { 1899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson CPPUNIT_ASSERT( false ); 190ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 19140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson#endif 192ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson} 193ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson#endif 1949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson