diff -r e20de85af2ee -r ce057bb09d0b genericopenlibs/cppstdlib/stl/test/unit/istmit_test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cppstdlib/stl/test/unit/istmit_test.cpp Fri Jun 04 16:20:51 2010 +0100 @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include +#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS) +# include +# include +# include +# include +# include +#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 istream_char_ite; +typedef istream_iterator istream_int_ite; +typedef istream_iterator istream_string_ite; +# else +typedef istream_iterator istream_char_ite; +typedef istream_iterator istream_int_ite; +typedef istream_iterator 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 ints; + vector 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 ints; + istream_iterator 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 +}