#include <exception> #include <stdexcept> #include <string> #include "cppunit/cppunit_proxy.h" #if defined (STLPORT) && defined (_STLP_USE_NAMESPACES) /* * This test case purpose is to check that the exception handling * functions are correctly imported to the STLport namespace only * if they have a right behavior. * Otherwise they are not imported to report the problem as a compile * time error. */ // // TestCase class // class ExceptionTest : public CPPUNIT_NS::TestCase { CPPUNIT_TEST_SUITE(ExceptionTest); #if defined (STLPORT) && !defined (_STLP_USE_EXCEPTIONS) CPPUNIT_IGNORE; #endif CPPUNIT_TEST(what); #if defined (STLPORT) && defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT) CPPUNIT_IGNORE; #endif CPPUNIT_TEST(unexpected_except); #if defined (STLPORT) && defined (_STLP_USE_EXCEPTIONS) CPPUNIT_STOP_IGNORE; #endif #if defined (STLPORT) && defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) CPPUNIT_IGNORE; #endif CPPUNIT_TEST(uncaught_except); #if defined (STLPORT) && defined (_STLP_USE_EXCEPTIONS) CPPUNIT_STOP_IGNORE; #endif CPPUNIT_TEST(exception_emission); CPPUNIT_TEST_SUITE_END(); protected: void what(); void unexpected_except(); void uncaught_except(); void exception_emission(); }; CPPUNIT_TEST_SUITE_REGISTRATION(ExceptionTest); #if !defined (STLPORT) || !defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT) bool g_unexpected_called = false; void unexpected_hdl() { g_unexpected_called = true; throw std::bad_exception(); } struct special_except {}; void throw_func() { throw special_except(); } void throw_except_func() throw(std::exception) { throw_func(); } #endif void ExceptionTest::what() { try { throw std::runtime_error( std::string( "message" ) ); } catch ( std::runtime_error& err ) { CPPUNIT_CHECK( strcmp( err.what(), "message" ) == 0 ); } } void ExceptionTest::unexpected_except() { #if !defined (STLPORT) || !defined (_STLP_NO_UNEXPECTED_EXCEPT_SUPPORT) std::unexpected_handler hdl = &unexpected_hdl; std::set_unexpected(hdl); try { throw_except_func(); } catch (std::bad_exception const&) { CPPUNIT_ASSERT( true ); } catch (special_except) { CPPUNIT_ASSERT( false ); } CPPUNIT_ASSERT( g_unexpected_called ); #endif } #if !defined (STLPORT) || !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) struct UncaughtClassTest { UncaughtClassTest(int &res) : _res(res) {} ~UncaughtClassTest() { _res = std::uncaught_exception()?1:0; } int &_res; }; #endif void ExceptionTest::uncaught_except() { #if !defined (STLPORT) || !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) int uncaught_result = -1; { UncaughtClassTest test_inst(uncaught_result); CPPUNIT_ASSERT( uncaught_result == -1 ); } CPPUNIT_ASSERT( uncaught_result == 0 ); { try { uncaught_result = -1; UncaughtClassTest test_inst(uncaught_result); throw "exception"; } catch (...) { } } CPPUNIT_ASSERT( uncaught_result == 1 ); #endif } void ExceptionTest::exception_emission() { #if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) std::string foo = "foo"; try { throw std::runtime_error(foo); } catch (std::runtime_error const& e) { CPPUNIT_ASSERT( foo == e.what() ); std::runtime_error clone(""); clone = e; CPPUNIT_ASSERT(foo == clone.what() ); } catch (...) { CPPUNIT_ASSERT( false ); } try { throw std::runtime_error(foo); } catch (std::runtime_error e) { CPPUNIT_ASSERT( foo == e.what() ); std::runtime_error clone(""); clone = e; CPPUNIT_ASSERT(foo == clone.what() ); } catch (...) { CPPUNIT_ASSERT( false ); } std::string msg(512, 'a'); try { throw std::runtime_error(msg); } catch (std::runtime_error const& e) { CPPUNIT_ASSERT(msg == e.what() ); std::runtime_error clone(""); clone = e; CPPUNIT_ASSERT(msg == clone.what() ); } catch (...) { CPPUNIT_ASSERT( false ); } try { throw std::runtime_error(msg); } catch (std::runtime_error e) { CPPUNIT_ASSERT(msg == e.what() ); std::runtime_error clone(""); clone = e; CPPUNIT_ASSERT(msg == clone.what() ); } catch (...) { CPPUNIT_ASSERT( false ); } #endif } #endif