1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/genericopenlibs/cppstdlib/stl/test/unit/equal_test.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,169 @@
1.4 +#include <vector>
1.5 +#include <algorithm>
1.6 +#include <functional>
1.7 +#include "cppunit/cppunit_proxy.h"
1.8 +
1.9 +#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
1.10 +using namespace std;
1.11 +#endif
1.12 +
1.13 +//
1.14 +// TestCase class
1.15 +//
1.16 +class EqualTest : public CPPUNIT_NS::TestCase
1.17 +{
1.18 + CPPUNIT_TEST_SUITE(EqualTest);
1.19 + CPPUNIT_TEST(equal_range0);
1.20 + CPPUNIT_TEST(equal_range1);
1.21 + CPPUNIT_TEST(equal_range2);
1.22 + CPPUNIT_TEST(equal0);
1.23 + CPPUNIT_TEST(equal1);
1.24 + CPPUNIT_TEST(equal2);
1.25 + CPPUNIT_TEST(equalto);
1.26 + CPPUNIT_TEST_SUITE_END();
1.27 +
1.28 +protected:
1.29 + void equal_range0();
1.30 + void equal_range1();
1.31 + void equal_range2();
1.32 + void equal0();
1.33 + void equal1();
1.34 + void equal2();
1.35 + void equalto();
1.36 + static bool values_squared(int a_, int b_);
1.37 +};
1.38 +
1.39 +CPPUNIT_TEST_SUITE_REGISTRATION(EqualTest);
1.40 +
1.41 +//
1.42 +// tests implementation
1.43 +//
1.44 +void EqualTest::equal_range0()
1.45 +{
1.46 + int numbers[10] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3 };
1.47 + pair<int*, int*> range = equal_range((int*)numbers, (int*)numbers + 10, 2);
1.48 + CPPUNIT_ASSERT( (range.first - numbers) == 4 );
1.49 + CPPUNIT_ASSERT( (range.second - numbers) == 8 );
1.50 +}
1.51 +
1.52 +void EqualTest::equal_range1()
1.53 +{
1.54 + typedef vector <int> IntVec;
1.55 + IntVec v(10);
1.56 + for (int i = 0; (size_t)i < v.size(); ++i)
1.57 + v[i] = i / 3;
1.58 +
1.59 + pair<IntVec::iterator, IntVec::iterator> range = equal_range(v.begin(), v.end(), 2);
1.60 + CPPUNIT_ASSERT( (range.first - v.begin()) == 6 );
1.61 + CPPUNIT_ASSERT( (range.second - v.begin()) == 9 );
1.62 + for (; range.first != range.second; ++range.first)
1.63 + CPPUNIT_ASSERT( *range.first == 2 );
1.64 +
1.65 + range = equal_range(v.begin(), v.end(), 4);
1.66 + CPPUNIT_ASSERT( range.first == range.second );
1.67 + CPPUNIT_ASSERT( range.first == v.end() );
1.68 +}
1.69 +
1.70 +struct Test {
1.71 + Test(int val) : value(val) {}
1.72 + int value;
1.73 +
1.74 + bool operator == (int i) const
1.75 + { return value == i; }
1.76 +};
1.77 +
1.78 +bool operator < (const Test& v1, int v2)
1.79 +{ return v1.value < v2; }
1.80 +
1.81 +bool operator < (int v1, const Test& v2)
1.82 +{ return v1 < v2.value; }
1.83 +
1.84 +void EqualTest::equal_range2()
1.85 +{
1.86 + char chars[] = "aabbccddggghhklllmqqqqssyyzz";
1.87 +
1.88 + const unsigned count = sizeof(chars) - 1;
1.89 + pair<char*, char*> range = equal_range((char*)chars, (char*)chars + count, 'q', less<char>());
1.90 + CPPUNIT_ASSERT( (range.first - chars) == 18 );
1.91 + CPPUNIT_ASSERT( (range.second - chars) == 22 );
1.92 + for (; range.first != range.second; ++range.first)
1.93 + CPPUNIT_ASSERT( *range.first == 'q' );
1.94 +
1.95 + range = equal_range((char*)chars, (char*)chars + count, 'm', less<char>());
1.96 + CPPUNIT_ASSERT( (range.second - range.first) == 1 );
1.97 + CPPUNIT_ASSERT( *range.first == 'm' );
1.98 +
1.99 + vector<Test> tv;
1.100 + vector<Test>::iterator it;
1.101 + pair<vector<Test>::iterator, vector<Test>::iterator> p;
1.102 +
1.103 + for (int i = 0; i < 10; ++i) {
1.104 + tv.push_back(i);
1.105 + }
1.106 +
1.107 + it = upper_bound(tv.begin(), tv.end(), 5);
1.108 + CPPUNIT_ASSERT( it != tv.end() );
1.109 + CPPUNIT_ASSERT( *it == 6 );
1.110 +
1.111 + it = lower_bound(tv.begin(), tv.end(), 5);
1.112 + CPPUNIT_ASSERT( it != tv.end() );
1.113 + CPPUNIT_ASSERT( *it == 5 );
1.114 +
1.115 + p = equal_range(tv.begin(), tv.end(), 5);
1.116 + CPPUNIT_ASSERT( p.first != p.second );
1.117 + CPPUNIT_ASSERT( p.first != tv.end() );
1.118 + CPPUNIT_ASSERT( p.second != tv.end() );
1.119 + CPPUNIT_ASSERT( *p.first == 5 );
1.120 + CPPUNIT_ASSERT( *p.second == 6 );
1.121 +}
1.122 +
1.123 +void EqualTest::equal0()
1.124 +{
1.125 + int numbers1[5] = { 1, 2, 3, 4, 5 };
1.126 + int numbers2[5] = { 1, 2, 4, 8, 16 };
1.127 + int numbers3[2] = { 1, 2 };
1.128 +
1.129 + CPPUNIT_ASSERT( !equal(numbers1, numbers1 + 5, numbers2) );
1.130 + CPPUNIT_ASSERT( equal(numbers3, numbers3 + 2, numbers1) );
1.131 +}
1.132 +
1.133 +void EqualTest::equal1()
1.134 +{
1.135 + vector <int> v1(10);
1.136 + for (int i = 0; (size_t)i < v1.size(); ++i)
1.137 + v1[i] = i;
1.138 + vector <int> v2(10);
1.139 + CPPUNIT_ASSERT( !equal(v1.begin(), v1.end(), v2.begin()) );
1.140 +
1.141 + copy(v1.begin(), v1.end(), v2.begin());
1.142 + CPPUNIT_ASSERT( equal(v1.begin(), v1.end(), v2.begin()) )
1.143 +}
1.144 +
1.145 +void EqualTest::equal2()
1.146 +{
1.147 + vector <int> v1(10);
1.148 + vector <int> v2(10);
1.149 + for (int i = 0; (size_t)i < v1.size(); ++i) {
1.150 + v1[i] = i;
1.151 + v2[i] = i * i;
1.152 + }
1.153 + CPPUNIT_ASSERT( equal(v1.begin(), v1.end(), v2.begin(), values_squared) );
1.154 +}
1.155 +
1.156 +void EqualTest::equalto()
1.157 +{
1.158 + int input1 [4] = { 1, 7, 2, 2 };
1.159 + int input2 [4] = { 1, 6, 2, 3 };
1.160 +
1.161 + int output [4];
1.162 + transform((int*)input1, (int*)input1 + 4, (int*)input2, (int*)output, equal_to<int>());
1.163 + CPPUNIT_ASSERT( output[0] == 1 );
1.164 + CPPUNIT_ASSERT( output[1] == 0 );
1.165 + CPPUNIT_ASSERT( output[2] == 1 );
1.166 + CPPUNIT_ASSERT( output[3] == 0 );
1.167 +}
1.168 +
1.169 +bool EqualTest::values_squared(int a_, int b_)
1.170 +{
1.171 + return (a_ * a_ == b_);
1.172 +}