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 } 160