mirror of
https://github.com/reactos/reactos.git
synced 2025-02-28 19:32:59 +00:00
159 lines
5 KiB
C++
159 lines
5 KiB
C++
#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
|
|
}
|