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