Home | History | Annotate | Download | only in unit
      1 #include <new>
      2 #include <vector>
      3 
      4 #include "cppunit/cppunit_proxy.h"
      5 
      6 #if defined (_STLP_USE_NAMESPACES)
      7 using namespace std;
      8 #endif
      9 
     10 //
     11 // TestCase class
     12 //
     13 class ConfigTest : public CPPUNIT_NS::TestCase
     14 {
     15   CPPUNIT_TEST_SUITE(ConfigTest);
     16 #if !defined (STLPORT)
     17   CPPUNIT_IGNORE;
     18 #endif
     19   CPPUNIT_TEST(placement_new_bug);
     20   CPPUNIT_TEST(endianess);
     21   CPPUNIT_TEST(template_function_partial_ordering);
     22 #if !defined (_STLP_USE_EXCEPTIONS)
     23   CPPUNIT_IGNORE;
     24 #endif
     25   CPPUNIT_TEST(new_throw_bad_alloc);
     26   CPPUNIT_TEST_SUITE_END();
     27 
     28   protected:
     29     void placement_new_bug();
     30     void endianess();
     31     void template_function_partial_ordering();
     32     void new_throw_bad_alloc();
     33 };
     34 
     35 CPPUNIT_TEST_SUITE_REGISTRATION(ConfigTest);
     36 
     37 void ConfigTest::placement_new_bug()
     38 {
     39 #if defined (STLPORT)
     40   int int_val = 1;
     41   int *pint;
     42   pint = new(&int_val) int();
     43   CPPUNIT_ASSERT( pint == &int_val );
     44 #  if defined (_STLP_DEF_CONST_PLCT_NEW_BUG)
     45   CPPUNIT_ASSERT( int_val != 0 );
     46 #  else
     47   CPPUNIT_ASSERT( int_val == 0 );
     48 #  endif
     49 #endif
     50 }
     51 
     52 void ConfigTest::endianess()
     53 {
     54 #if defined (STLPORT)
     55   int val = 0x01020304;
     56   char *ptr = (char*)(&val);
     57 #  if defined (_STLP_BIG_ENDIAN)
     58   //This test only work if sizeof(int) == 4, this is a known limitation
     59   //that will be handle the day we find a compiler for which it is false.
     60   CPPUNIT_ASSERT( *ptr == 0x01 ||
     61                   sizeof(int) > 4 && *ptr == 0x00 );
     62 #  elif defined (_STLP_LITTLE_ENDIAN)
     63   CPPUNIT_ASSERT( *ptr == 0x04 );
     64 #  endif
     65 #endif
     66 }
     67 
     68 void ConfigTest::template_function_partial_ordering()
     69 {
     70 #if defined (STLPORT)
     71   vector<int> vect1(10, 0);
     72   int* pvect1Front = &vect1.front();
     73   vector<int> vect2(10, 0);
     74   int* pvect2Front = &vect2.front();
     75 
     76   swap(vect1, vect2);
     77 
     78 #  if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
     79   CPPUNIT_ASSERT( pvect1Front == &vect2.front() );
     80   CPPUNIT_ASSERT( pvect2Front == &vect1.front() );
     81 #  else
     82   CPPUNIT_ASSERT( pvect1Front != &vect2.front() );
     83   CPPUNIT_ASSERT( pvect2Front != &vect1.front() );
     84 #  endif
     85 #endif
     86 }
     87 
     88 void ConfigTest::new_throw_bad_alloc()
     89 {
     90 #if defined (STLPORT) && defined (_STLP_USE_EXCEPTIONS)
     91   try
     92   {
     93   /* We try to exhaust heap memory. However, we don't actually use the
     94     largest possible size_t value bus slightly less in order to avoid
     95     triggering any overflows due to the allocator adding some more for
     96     its internal data structures. */
     97     size_t const huge_amount = size_t(-1) - 1024;
     98     void* pvoid = operator new (huge_amount);
     99 #if !defined (_STLP_NEW_DONT_THROW_BAD_ALLOC)
    100     // Allocation should have fail
    101     CPPUNIT_ASSERT( pvoid != 0 );
    102 #endif
    103     // Just in case it succeeds:
    104     operator delete(pvoid);
    105   }
    106   catch (const bad_alloc&)
    107   {
    108 #if defined (_STLP_NEW_DONT_THROW_BAD_ALLOC)
    109     // Looks like your compiler new operator finally throw bad_alloc, you can fix
    110     // configuration.
    111     CPPUNIT_FAIL;
    112 #endif
    113   }
    114   catch (...)
    115   {
    116     //We shouldn't be there:
    117     //Not bad_alloc exception thrown.
    118     CPPUNIT_FAIL;
    119   }
    120 #endif
    121 }
    122