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