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