genericopenlibs/cppstdlib/stl/test/unit/istmit_test.cpp
changeset 0 e4d67989cc36
child 18 47c74d1534e1
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 #include <algorithm>
       
     2 #if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
       
     3 #  include <sstream>
       
     4 #  include <functional>
       
     5 #  include <iterator>
       
     6 #  include <vector>
       
     7 #  include <string>
       
     8 #endif
       
     9 
       
    10 #include "cppunit/cppunit_proxy.h"
       
    11 
       
    12 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
       
    13 using namespace std;
       
    14 #endif
       
    15 
       
    16 //
       
    17 // TestCase class
       
    18 //
       
    19 class IStreamIteratorTest : public CPPUNIT_NS::TestCase
       
    20 {
       
    21   CPPUNIT_TEST_SUITE(IStreamIteratorTest);
       
    22 #if defined (STLPORT) && defined (_STLP_USE_NO_IOSTREAMS)
       
    23   CPPUNIT_IGNORE;
       
    24 #endif
       
    25   CPPUNIT_TEST(istmit1);
       
    26 #if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS)
       
    27   CPPUNIT_IGNORE;
       
    28 #endif
       
    29   CPPUNIT_TEST(copy_n_test);
       
    30   CPPUNIT_TEST_SUITE_END();
       
    31 
       
    32 protected:
       
    33   void istmit1();
       
    34   void copy_n_test();
       
    35 };
       
    36 
       
    37 CPPUNIT_TEST_SUITE_REGISTRATION(IStreamIteratorTest);
       
    38 
       
    39 #if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
       
    40 #  if !defined (STLPORT) || !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
       
    41 typedef istream_iterator<char> istream_char_ite;
       
    42 typedef istream_iterator<int> istream_int_ite;
       
    43 typedef istream_iterator<string> istream_string_ite;
       
    44 #  else
       
    45 typedef istream_iterator<char, ptrdiff_t> istream_char_ite;
       
    46 typedef istream_iterator<int, ptrdiff_t> istream_int_ite;
       
    47 typedef istream_iterator<string, ptrdiff_t> istream_string_ite;
       
    48 #  endif
       
    49 #endif
       
    50 
       
    51 //
       
    52 // tests implementation
       
    53 //
       
    54 void IStreamIteratorTest::istmit1()
       
    55 {
       
    56 #if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
       
    57   const char* buff = "MyString";
       
    58   istringstream istr(buff);
       
    59 
       
    60   char buffer[100];
       
    61   size_t i = 0;
       
    62   istr.unsetf(ios::skipws); // Disable white-space skipping.
       
    63   istream_char_ite s(istr), meos;
       
    64   while (!(s == meos)  &&
       
    65   //*TY 01/10/1999 - added end of stream check
       
    66   // NOTE operator!= should not be used here ifndef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
       
    67          (*s != '\n') &&
       
    68          (i < sizeof(buffer) / sizeof(buffer[0]))) {  //*TY 07/28/98 - added index check
       
    69     buffer[i++] = *s++;
       
    70   }
       
    71   buffer[i] = '\0'; // Null terminate buffer.
       
    72 
       
    73   CPPUNIT_ASSERT(!strcmp(buffer, buff));
       
    74 
       
    75   {
       
    76     istringstream empty_istr;
       
    77     CPPUNIT_ASSERT( istream_char_ite(empty_istr) == istream_char_ite() );
       
    78   }
       
    79 #endif
       
    80 }
       
    81 
       
    82 void IStreamIteratorTest::copy_n_test()
       
    83 {
       
    84 #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && !defined (_STLP_USE_NO_IOSTREAMS)
       
    85   //This test check that no character is lost while reading the istream
       
    86   //through a istream_iterator.
       
    87   {
       
    88     istringstream istr("aabbcd");
       
    89     string chars;
       
    90     istream_char_ite ite = copy_n(copy_n(istream_char_ite(istr),
       
    91                                          2, back_inserter(chars)).first,
       
    92                                   2, back_inserter(chars)).first;
       
    93     CPPUNIT_ASSERT( chars == "aabb" );
       
    94     copy_n(ite, 2, back_inserter(chars));
       
    95     CPPUNIT_ASSERT( chars == "aabbcd" );
       
    96   }
       
    97 
       
    98   {
       
    99     istringstream istr("11 22 AA BB 33 44 CC DD");
       
   100     vector<int> ints;
       
   101     vector<string> strings;
       
   102 
       
   103     copy_n(istream_int_ite(istr), 2, back_inserter(ints));
       
   104     CPPUNIT_ASSERT( ints.size() == 2 );
       
   105     CPPUNIT_ASSERT( ints[0] == 11 );
       
   106     CPPUNIT_ASSERT( ints[1] == 22 );
       
   107     ints.clear();
       
   108     istr.clear();
       
   109     copy_n(istream_string_ite(istr), 2, back_inserter(strings));
       
   110     CPPUNIT_ASSERT( strings.size() == 2 );
       
   111     CPPUNIT_ASSERT( strings[0] == "AA" );
       
   112     CPPUNIT_ASSERT( strings[1] == "BB" );
       
   113     strings.clear();
       
   114     istr.clear();
       
   115     /* The following code cannot work, '33' is extracted as a string
       
   116      * in the previous copy_n call, this value is returned in the pair
       
   117      * returned by copy_n but is lost as this istream_iterator is not used.
       
   118      * copy_n and istream_iterator can only be combined safely if:
       
   119      * - you always extract the same type of istream_iterator and you always reuse
       
   120      * the istream_iterator returned by copy_n (see previous test with "aabbcd")
       
   121      * - you extract different type of object and no object is convertible to an other
       
   122      * as in this current test when you extract int and string (when you extract ints
       
   123      * again it fails as int can be converted to strings.
       
   124      *
       
   125     copy_n(istream_int_ite(istr), 2, back_inserter(ints));
       
   126     CPPUNIT_ASSERT( ints.size() == 2 );
       
   127     CPPUNIT_ASSERT( ints[0] == 33 );
       
   128     CPPUNIT_ASSERT( ints[1] == 44 );
       
   129     istr.clear();
       
   130     copy_n(istream_string_ite(istr), 2, back_inserter(strings));
       
   131     CPPUNIT_ASSERT( strings.size() == 2 );
       
   132     CPPUNIT_ASSERT( strings[0] == "CC" );
       
   133     CPPUNIT_ASSERT( strings[1] == "DD" );
       
   134     */
       
   135   }
       
   136 
       
   137   {
       
   138     istringstream is("1 2 3 4 5 6 7 8 9 10");
       
   139     vector<int> ints;
       
   140     istream_iterator<int> itr(is);
       
   141     itr = copy_n(itr, 0, back_inserter(ints)).first;
       
   142     CPPUNIT_ASSERT( ints.empty() );
       
   143     itr = copy_n(itr, -1, back_inserter(ints)).first;
       
   144     CPPUNIT_ASSERT( ints.empty() );
       
   145     itr = copy_n(itr, 2, back_inserter(ints)).first;
       
   146     CPPUNIT_ASSERT( ints.size() == 2 );
       
   147     CPPUNIT_ASSERT( ints[0] == 1 );
       
   148     CPPUNIT_ASSERT( ints[1] == 2 );
       
   149     itr = copy_n(itr, 2, back_inserter(ints)).first;
       
   150     CPPUNIT_ASSERT( ints.size() == 4 );
       
   151     CPPUNIT_ASSERT( ints[2] == 3 );
       
   152     CPPUNIT_ASSERT( ints[3] == 4 );
       
   153     itr = copy_n(itr, 2, back_inserter(ints)).first;
       
   154     CPPUNIT_ASSERT( ints.size() == 6 );
       
   155     CPPUNIT_ASSERT( ints[4] == 5 );
       
   156     CPPUNIT_ASSERT( ints[5] == 6 );
       
   157   }
       
   158 #endif
       
   159 }