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