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)
13using namespace std;
14#endif
15
16//
17// TestCase class
18//
19class 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
32protected:
33  void istmit1();
34  void copy_n_test();
35};
36
37CPPUNIT_TEST_SUITE_REGISTRATION(IStreamIteratorTest);
38
39#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
40#  if !defined (STLPORT) || !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
41typedef istream_iterator<char> istream_char_ite;
42typedef istream_iterator<int> istream_int_ite;
43typedef istream_iterator<string> istream_string_ite;
44#  else
45typedef istream_iterator<char, ptrdiff_t> istream_char_ite;
46typedef istream_iterator<int, ptrdiff_t> istream_int_ite;
47typedef istream_iterator<string, ptrdiff_t> istream_string_ite;
48#  endif
49#endif
50
51//
52// tests implementation
53//
54void 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
82void 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