Home | History | Annotate | Download | only in unit
      1 #include <vector>
      2 #include <algorithm>
      3 #include <vector>
      4 #include <queue>
      5 
      6 #if 0 /* temporary: investigation of problem with swap */
      7 #include <iostream>
      8 #include <typeinfo>
      9 #endif
     10 
     11 #include "cppunit/cppunit_proxy.h"
     12 
     13 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
     14 using namespace std;
     15 #endif
     16 
     17 //
     18 // TestCase class
     19 //
     20 class SwapTest : public CPPUNIT_NS::TestCase
     21 {
     22   CPPUNIT_TEST_SUITE(SwapTest);
     23   CPPUNIT_TEST(swap1);
     24   CPPUNIT_TEST(swprnge1);
     25   CPPUNIT_TEST(swap_container_non_spec);
     26 #if defined (STLPORT) && \
     27    !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) && !defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
     28   CPPUNIT_IGNORE;
     29 #endif
     30   CPPUNIT_TEST(swap_container_spec);
     31   CPPUNIT_TEST_SUITE_END();
     32 
     33 protected:
     34   void swap1();
     35   void swprnge1();
     36   void swap_container_non_spec();
     37   void swap_container_spec();
     38 };
     39 
     40 CPPUNIT_TEST_SUITE_REGISTRATION(SwapTest);
     41 
     42 //
     43 // tests implementation
     44 //
     45 void SwapTest::swap1()
     46 {
     47   int a = 42;
     48   int b = 19;
     49   swap(a, b);
     50 
     51   CPPUNIT_ASSERT(a==19);
     52   CPPUNIT_ASSERT(b==42);
     53 }
     54 
     55 void SwapTest::swprnge1()
     56 {
     57   char word1[] = "World";
     58   char word2[] = "Hello";
     59   swap_ranges((char*)word1, (char*)word1 + ::strlen(word1), (char*)word2);
     60   CPPUNIT_ASSERT(!strcmp(word1, "Hello"));
     61   CPPUNIT_ASSERT(!strcmp(word2, "World"));
     62 }
     63 
     64 class Obj
     65 {
     66   public:
     67     Obj() :
     68         v( 0 )
     69       { }
     70     Obj( const Obj& ) :
     71         v( 1 )
     72       { }
     73 
     74     Obj& operator =( const Obj& )
     75       { v = 2; return *this; }
     76 
     77     int v;
     78 };
     79 
     80 /*
     81  * Following two tests check the corectness of specialization of swap():
     82  * for containers with container::swap method swap( a, b ) should
     83  * use a.swap( b ), but don't try to do this substitution for container
     84  * without swap method (in this case swap should be made via explicit members
     85  * exchange; this assume usage of temporary object)
     86  *
     87  */
     88 void SwapTest::swap_container_non_spec()
     89 {
     90   queue<Obj> v1;
     91   queue<Obj> v2;
     92 
     93   v1.push( Obj() );
     94   v1.back().v = -1;
     95   v1.push( Obj() );
     96   v1.back().v = -2;
     97 
     98   v2.push( Obj() );
     99   v2.back().v = 10;
    100   v2.push( Obj() );
    101   v2.back().v = 11;
    102   v2.push( Obj() );
    103   v2.back().v = 12;
    104 
    105   CPPUNIT_CHECK( v1.size() == 2 );
    106   CPPUNIT_CHECK( v2.size() == 3 );
    107 
    108   swap( v1, v2 ); // this shouldn't try make it as v1.swap( v2 ), no queue::swap method!
    109 
    110   CPPUNIT_CHECK( v1.size() == 3 );
    111   CPPUNIT_CHECK( v2.size() == 2 );
    112 
    113   // either copy constructor or assignment operator
    114   CPPUNIT_CHECK( v1.front().v == 1 || v1.front().v == 2 );
    115   CPPUNIT_CHECK( v1.back().v == 1 || v1.back().v == 2 );
    116   CPPUNIT_CHECK( v2.front().v == 1 || v2.front().v == 2 );
    117   CPPUNIT_CHECK( v2.back().v == 1 || v2.back().v == 2 );
    118 }
    119 
    120 void SwapTest::swap_container_spec()
    121 {
    122 #if 0 /* temporary: investigation of problem with swap */
    123   if ( typeid(/* _STLP_PRIV */ _SwapImplemented<vector<Obj> >::_Ret) == typeid(_STLP_PRIV __false_type) ) {
    124     cerr << "false type" << endl;
    125   } else if ( typeid(/* _STLP_PRIV */ _SwapImplemented<vector<Obj> >::_Ret) == typeid(_STLP_PRIV __true_type) ) {
    126     cerr << "true type" << endl;
    127   } else {
    128     cerr << "unknown type" << endl;
    129   }
    130 #endif /* end of temporary */
    131 #if !defined (STLPORT) || \
    132      defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
    133   vector<Obj> v1;
    134   vector<Obj> v2;
    135 
    136   v1.push_back( Obj() );
    137   v1.push_back( Obj() );
    138 
    139   v1[0].v = -1;
    140   v1[1].v = -2;
    141 
    142   v2.push_back( Obj() );
    143   v2.push_back( Obj() );
    144   v2.push_back( Obj() );
    145 
    146   v2[0].v = 10;
    147   v2[1].v = 11;
    148   v2[2].v = 12;
    149 
    150   CPPUNIT_CHECK( v1.size() == 2 );
    151   CPPUNIT_CHECK( v2.size() == 3 );
    152 
    153   swap( v1, v2 ); // this should has effect v1.swap( v2 )
    154 
    155   CPPUNIT_CHECK( v1.size() == 3 );
    156   CPPUNIT_CHECK( v2.size() == 2 );
    157 
    158   CPPUNIT_CHECK( v1[0].v == 10 );
    159   CPPUNIT_CHECK( v1[1].v == 11 );
    160   CPPUNIT_CHECK( v1[2].v == 12 );
    161 
    162   CPPUNIT_CHECK( v2[0].v == -1 );
    163   CPPUNIT_CHECK( v2[1].v == -2 );
    164 #endif
    165 }
    166