genericopenlibs/cppstdlib/stl/test/unit/istmit_test.cpp
changeset 0 e4d67989cc36
child 18 47c74d1534e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cppstdlib/stl/test/unit/istmit_test.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,159 @@
+#include <algorithm>
+#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
+#  include <sstream>
+#  include <functional>
+#  include <iterator>
+#  include <vector>
+#  include <string>
+#endif
+
+#include "cppunit/cppunit_proxy.h"
+
+#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
+using namespace std;
+#endif
+
+//
+// TestCase class
+//
+class IStreamIteratorTest : public CPPUNIT_NS::TestCase
+{
+  CPPUNIT_TEST_SUITE(IStreamIteratorTest);
+#if defined (STLPORT) && defined (_STLP_USE_NO_IOSTREAMS)
+  CPPUNIT_IGNORE;
+#endif
+  CPPUNIT_TEST(istmit1);
+#if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS)
+  CPPUNIT_IGNORE;
+#endif
+  CPPUNIT_TEST(copy_n_test);
+  CPPUNIT_TEST_SUITE_END();
+
+protected:
+  void istmit1();
+  void copy_n_test();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(IStreamIteratorTest);
+
+#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
+#  if !defined (STLPORT) || !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
+typedef istream_iterator<char> istream_char_ite;
+typedef istream_iterator<int> istream_int_ite;
+typedef istream_iterator<string> istream_string_ite;
+#  else
+typedef istream_iterator<char, ptrdiff_t> istream_char_ite;
+typedef istream_iterator<int, ptrdiff_t> istream_int_ite;
+typedef istream_iterator<string, ptrdiff_t> istream_string_ite;
+#  endif
+#endif
+
+//
+// tests implementation
+//
+void IStreamIteratorTest::istmit1()
+{
+#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
+  const char* buff = "MyString";
+  istringstream istr(buff);
+
+  char buffer[100];
+  size_t i = 0;
+  istr.unsetf(ios::skipws); // Disable white-space skipping.
+  istream_char_ite s(istr), meos;
+  while (!(s == meos)  &&
+  //*TY 01/10/1999 - added end of stream check
+  // NOTE operator!= should not be used here ifndef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+         (*s != '\n') &&
+         (i < sizeof(buffer) / sizeof(buffer[0]))) {  //*TY 07/28/98 - added index check
+    buffer[i++] = *s++;
+  }
+  buffer[i] = '\0'; // Null terminate buffer.
+
+  CPPUNIT_ASSERT(!strcmp(buffer, buff));
+
+  {
+    istringstream empty_istr;
+    CPPUNIT_ASSERT( istream_char_ite(empty_istr) == istream_char_ite() );
+  }
+#endif
+}
+
+void IStreamIteratorTest::copy_n_test()
+{
+#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && !defined (_STLP_USE_NO_IOSTREAMS)
+  //This test check that no character is lost while reading the istream
+  //through a istream_iterator.
+  {
+    istringstream istr("aabbcd");
+    string chars;
+    istream_char_ite ite = copy_n(copy_n(istream_char_ite(istr),
+                                         2, back_inserter(chars)).first,
+                                  2, back_inserter(chars)).first;
+    CPPUNIT_ASSERT( chars == "aabb" );
+    copy_n(ite, 2, back_inserter(chars));
+    CPPUNIT_ASSERT( chars == "aabbcd" );
+  }
+
+  {
+    istringstream istr("11 22 AA BB 33 44 CC DD");
+    vector<int> ints;
+    vector<string> strings;
+
+    copy_n(istream_int_ite(istr), 2, back_inserter(ints));
+    CPPUNIT_ASSERT( ints.size() == 2 );
+    CPPUNIT_ASSERT( ints[0] == 11 );
+    CPPUNIT_ASSERT( ints[1] == 22 );
+    ints.clear();
+    istr.clear();
+    copy_n(istream_string_ite(istr), 2, back_inserter(strings));
+    CPPUNIT_ASSERT( strings.size() == 2 );
+    CPPUNIT_ASSERT( strings[0] == "AA" );
+    CPPUNIT_ASSERT( strings[1] == "BB" );
+    strings.clear();
+    istr.clear();
+    /* The following code cannot work, '33' is extracted as a string
+     * in the previous copy_n call, this value is returned in the pair
+     * returned by copy_n but is lost as this istream_iterator is not used.
+     * copy_n and istream_iterator can only be combined safely if:
+     * - you always extract the same type of istream_iterator and you always reuse
+     * the istream_iterator returned by copy_n (see previous test with "aabbcd")
+     * - you extract different type of object and no object is convertible to an other
+     * as in this current test when you extract int and string (when you extract ints
+     * again it fails as int can be converted to strings.
+     *
+    copy_n(istream_int_ite(istr), 2, back_inserter(ints));
+    CPPUNIT_ASSERT( ints.size() == 2 );
+    CPPUNIT_ASSERT( ints[0] == 33 );
+    CPPUNIT_ASSERT( ints[1] == 44 );
+    istr.clear();
+    copy_n(istream_string_ite(istr), 2, back_inserter(strings));
+    CPPUNIT_ASSERT( strings.size() == 2 );
+    CPPUNIT_ASSERT( strings[0] == "CC" );
+    CPPUNIT_ASSERT( strings[1] == "DD" );
+    */
+  }
+
+  {
+    istringstream is("1 2 3 4 5 6 7 8 9 10");
+    vector<int> ints;
+    istream_iterator<int> itr(is);
+    itr = copy_n(itr, 0, back_inserter(ints)).first;
+    CPPUNIT_ASSERT( ints.empty() );
+    itr = copy_n(itr, -1, back_inserter(ints)).first;
+    CPPUNIT_ASSERT( ints.empty() );
+    itr = copy_n(itr, 2, back_inserter(ints)).first;
+    CPPUNIT_ASSERT( ints.size() == 2 );
+    CPPUNIT_ASSERT( ints[0] == 1 );
+    CPPUNIT_ASSERT( ints[1] == 2 );
+    itr = copy_n(itr, 2, back_inserter(ints)).first;
+    CPPUNIT_ASSERT( ints.size() == 4 );
+    CPPUNIT_ASSERT( ints[2] == 3 );
+    CPPUNIT_ASSERT( ints[3] == 4 );
+    itr = copy_n(itr, 2, back_inserter(ints)).first;
+    CPPUNIT_ASSERT( ints.size() == 6 );
+    CPPUNIT_ASSERT( ints[4] == 5 );
+    CPPUNIT_ASSERT( ints[5] == 6 );
+  }
+#endif
+}