#include <list> #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) # include <slist> #endif #include <deque> #include <vector> #include <algorithm> #include <functional> #include <map> #include <string> #include "cppunit/cppunit_proxy.h" #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) using namespace std; #endif // // TestCase class // class AlgTest : public CPPUNIT_NS::TestCase { CPPUNIT_TEST_SUITE(AlgTest); CPPUNIT_TEST(min_max); CPPUNIT_TEST(count_test); CPPUNIT_TEST(sort_test); CPPUNIT_TEST(search_n_test); CPPUNIT_TEST(find_first_of_test); CPPUNIT_TEST(find_first_of_nsc_test); CPPUNIT_TEST_SUITE_END(); protected: void min_max(); void count_test(); void sort_test(); void search_n_test(); void find_first_of_test(); void find_first_of_nsc_test(); }; CPPUNIT_TEST_SUITE_REGISTRATION(AlgTest); // // tests implementation // void AlgTest::min_max() { int i = min(4, 7); CPPUNIT_ASSERT( i == 4 ); char c = max('a', 'z'); CPPUNIT_ASSERT( c == 'z' ); #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) c = min('a', 'z', greater<char>()); CPPUNIT_ASSERT( c == 'z' ); i = max(4, 7, greater<int>()); CPPUNIT_ASSERT( i == 4 ); #endif } void AlgTest::count_test() { { int i[] = { 1, 4, 2, 8, 2, 2 }; int n = count(i, i + 6, 2); CPPUNIT_ASSERT(n==3); #if defined (STLPORT) && !defined (_STLP_NO_ANACHRONISMS) n = 0; count(i, i + 6, 2, n); CPPUNIT_ASSERT(n==3); #endif } { vector<int> i; i.push_back(1); i.push_back(4); i.push_back(2); i.push_back(8); i.push_back(2); i.push_back(2); int n = count(i.begin(), i.end(), 2); CPPUNIT_ASSERT(n==3); #if defined (STLPORT) && !defined (_STLP_NO_ANACHRONISMS) n = 0; count(i.begin(), i.end(), 2, n); CPPUNIT_ASSERT(n==3); #endif } } void AlgTest::sort_test() { { vector<int> years; years.push_back(1962); years.push_back(1992); years.push_back(2001); years.push_back(1999); sort(years.begin(), years.end()); CPPUNIT_ASSERT(years[0]==1962); CPPUNIT_ASSERT(years[1]==1992); CPPUNIT_ASSERT(years[2]==1999); CPPUNIT_ASSERT(years[3]==2001); } { deque<int> years; years.push_back(1962); years.push_back(1992); years.push_back(2001); years.push_back(1999); sort(years.begin(), years.end()); // <-- changed! CPPUNIT_ASSERT(years[0]==1962); CPPUNIT_ASSERT(years[1]==1992); CPPUNIT_ASSERT(years[2]==1999); CPPUNIT_ASSERT(years[3]==2001); } } #define ARRAY_SIZE(arr) sizeof(arr) / sizeof(arr[0]) void AlgTest::search_n_test() { int ints[] = {0, 1, 2, 3, 3, 4, 4, 4, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}; #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) //search_n //Forward iterator { slist<int> slint(ints, ints + ARRAY_SIZE(ints)); slist<int>::iterator slit = search_n(slint.begin(), slint.end(), 2, 2); CPPUNIT_ASSERT( slit != slint.end() ); CPPUNIT_ASSERT( *(slit++) == 2 ); CPPUNIT_ASSERT( *slit == 2 ); } #endif //Bidirectionnal iterator { list<int> lint(ints, ints + ARRAY_SIZE(ints)); list<int>::iterator lit = search_n(lint.begin(), lint.end(), 3, 3); CPPUNIT_ASSERT( lit != lint.end() ); CPPUNIT_ASSERT( *(lit++) == 3 ); CPPUNIT_ASSERT( *(lit++) == 3 ); CPPUNIT_ASSERT( *lit == 3 ); } //Random access iterator { deque<int> dint(ints, ints + ARRAY_SIZE(ints)); deque<int>::iterator dit = search_n(dint.begin(), dint.end(), 4, 4); CPPUNIT_ASSERT( dit != dint.end() ); CPPUNIT_ASSERT( *(dit++) == 4 ); CPPUNIT_ASSERT( *(dit++) == 4 ); CPPUNIT_ASSERT( *(dit++) == 4 ); CPPUNIT_ASSERT( *dit == 4 ); } #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) //search_n with predicate //Forward iterator { slist<int> slint(ints, ints + ARRAY_SIZE(ints)); slist<int>::iterator slit = search_n(slint.begin(), slint.end(), 2, 1, greater<int>()); CPPUNIT_ASSERT( slit != slint.end() ); CPPUNIT_ASSERT( *(slit++) > 1 ); CPPUNIT_ASSERT( *slit > 2 ); } #endif //Bidirectionnal iterator { list<int> lint(ints, ints + ARRAY_SIZE(ints)); list<int>::iterator lit = search_n(lint.begin(), lint.end(), 3, 2, greater<int>()); CPPUNIT_ASSERT( lit != lint.end() ); CPPUNIT_ASSERT( *(lit++) > 2 ); CPPUNIT_ASSERT( *(lit++) > 2 ); CPPUNIT_ASSERT( *lit > 2 ); } //Random access iterator { deque<int> dint(ints, ints + ARRAY_SIZE(ints)); deque<int>::iterator dit = search_n(dint.begin(), dint.end(), 4, 3, greater<int>()); CPPUNIT_ASSERT( dit != dint.end() ); CPPUNIT_ASSERT( *(dit++) > 3 ); CPPUNIT_ASSERT( *(dit++) > 3 ); CPPUNIT_ASSERT( *(dit++) > 3 ); CPPUNIT_ASSERT( *dit > 3 ); } // test for bug reported by Jim Xochellis { int array[] = {0, 0, 1, 0, 1, 1}; int* array_end = array + sizeof(array) / sizeof(*array); CPPUNIT_ASSERT(search_n(array, array_end, 3, 1) == array_end); } // test for bug with counter == 1, reported by Timmie Smith { int array[] = {0, 1, 2, 3, 4, 5}; int* array_end = array + sizeof(array) / sizeof(*array); CPPUNIT_ASSERT( search_n(array, array_end, 1, 1, equal_to<int>() ) == &array[1] ); } } struct MyIntComparable { MyIntComparable(int val) : _val(val) {} bool operator == (const MyIntComparable& other) const { return _val == other._val; } private: int _val; }; void AlgTest::find_first_of_test() { #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) slist<int> intsl; intsl.push_front(1); intsl.push_front(2); { vector<int> intv; intv.push_back(0); intv.push_back(1); intv.push_back(2); intv.push_back(3); vector<int>::iterator first; first = find_first_of(intv.begin(), intv.end(), intsl.begin(), intsl.end()); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == 1 ); } { vector<int> intv; intv.push_back(3); intv.push_back(2); intv.push_back(1); intv.push_back(0); vector<int>::iterator first; first = find_first_of(intv.begin(), intv.end(), intsl.begin(), intsl.end()); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == 2 ); } #endif list<int> intl; intl.push_front(1); intl.push_front(2); { vector<int> intv; intv.push_back(0); intv.push_back(1); intv.push_back(2); intv.push_back(3); vector<int>::iterator first; first = find_first_of(intv.begin(), intv.end(), intl.begin(), intl.end()); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == 1 ); } { vector<int> intv; intv.push_back(3); intv.push_back(2); intv.push_back(1); intv.push_back(0); vector<int>::iterator first; first = find_first_of(intv.begin(), intv.end(), intl.begin(), intl.end()); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == 2 ); } { char chars[] = {1, 2}; vector<int> intv; intv.push_back(0); intv.push_back(1); intv.push_back(2); intv.push_back(3); vector<int>::iterator first; first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars)); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == 1 ); } { unsigned char chars[] = {1, 2, 255}; vector<int> intv; intv.push_back(-10); intv.push_back(1029); intv.push_back(255); intv.push_back(4); vector<int>::iterator first; first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars)); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == 255 ); } { signed char chars[] = {93, 2, -101, 13}; vector<int> intv; intv.push_back(-10); intv.push_back(1029); intv.push_back(-2035); intv.push_back(-101); intv.push_back(4); vector<int>::iterator first; first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars)); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == -101 ); } { char chars[] = {1, 2}; vector<MyIntComparable> intv; intv.push_back(0); intv.push_back(1); intv.push_back(2); intv.push_back(3); vector<MyIntComparable>::iterator first; first = find_first_of(intv.begin(), intv.end(), chars, chars + sizeof(chars)); CPPUNIT_ASSERT( first != intv.end() ); CPPUNIT_ASSERT( *first == 1 ); } } typedef pair<int, string> Pair; struct ValueFinder : public binary_function<const Pair&, const string&, bool> { bool operator () ( const Pair &p, const string& value ) const { return p.second == value; } }; void AlgTest::find_first_of_nsc_test() { // Non-symmetrical comparator map<int, string> m; vector<string> values; m[1] = "one"; m[4] = "four"; m[10] = "ten"; m[20] = "twenty"; values.push_back( "four" ); values.push_back( "ten" ); map<int, string>::iterator i = find_first_of(m.begin(), m.end(), values.begin(), values.end(), ValueFinder()); CPPUNIT_ASSERT( i != m.end() ); CPPUNIT_ASSERT( i->first == 4 || i->first == 10 ); CPPUNIT_ASSERT( i->second == "four" || i->second == "ten" ); }