4 #include "cppunit/cppunit_proxy.h"
6 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
13 class EqualTest
: public CPPUNIT_NS::TestCase
15 CPPUNIT_TEST_SUITE(EqualTest
);
16 CPPUNIT_TEST(equal_range0
);
17 CPPUNIT_TEST(equal_range1
);
18 CPPUNIT_TEST(equal_range2
);
22 CPPUNIT_TEST(equalto
);
23 CPPUNIT_TEST_SUITE_END();
33 static bool values_squared(int a_
, int b_
);
36 CPPUNIT_TEST_SUITE_REGISTRATION(EqualTest
);
39 // tests implementation
41 void EqualTest::equal_range0()
43 int numbers
[10] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3 };
44 pair
<int*, int*> range
= equal_range((int*)numbers
, (int*)numbers
+ 10, 2);
45 CPPUNIT_ASSERT( (range
.first
- numbers
) == 4 );
46 CPPUNIT_ASSERT( (range
.second
- numbers
) == 8 );
49 void EqualTest::equal_range1()
51 typedef vector
<int> IntVec
;
53 for (int i
= 0; (size_t)i
< v
.size(); ++i
)
56 pair
<IntVec::iterator
, IntVec::iterator
> range
= equal_range(v
.begin(), v
.end(), 2);
57 CPPUNIT_ASSERT( (range
.first
- v
.begin()) == 6 );
58 CPPUNIT_ASSERT( (range
.second
- v
.begin()) == 9 );
59 for (; range
.first
!= range
.second
; ++range
.first
)
60 CPPUNIT_ASSERT( *range
.first
== 2 );
62 range
= equal_range(v
.begin(), v
.end(), 4);
63 CPPUNIT_ASSERT( range
.first
== range
.second
);
64 CPPUNIT_ASSERT( range
.first
== v
.end() );
72 Test(int val
) : value(val
) {}
75 bool operator == (int i
) const
76 { return value
== i
; }
79 bool operator < (const Test
& v1
, int v2
)
80 { return v1
.value
< v2
; }
82 bool operator < (int v1
, const Test
& v2
)
83 { return v1
< v2
.value
; }
85 #if defined (_MSC_VER) && !defined (STLPORT)
86 bool operator < (const Test
& v1
, const Test
& v2
)
87 { return v1
.value
< v2
.value
; }
90 void EqualTest::equal_range2()
92 char chars
[] = "aabbccddggghhklllmqqqqssyyzz";
94 const unsigned count
= sizeof(chars
) - 1;
95 pair
<char*, char*> range
= equal_range((char*)chars
, (char*)chars
+ count
, 'q', less
<char>());
96 CPPUNIT_ASSERT( (range
.first
- chars
) == 18 );
97 CPPUNIT_ASSERT( (range
.second
- chars
) == 22 );
98 for (; range
.first
!= range
.second
; ++range
.first
)
99 CPPUNIT_ASSERT( *range
.first
== 'q' );
101 range
= equal_range((char*)chars
, (char*)chars
+ count
, 'm', less
<char>());
102 CPPUNIT_ASSERT( (range
.second
- range
.first
) == 1 );
103 CPPUNIT_ASSERT( *range
.first
== 'm' );
106 vector
<Test
>::iterator it
;
107 pair
<vector
<Test
>::iterator
, vector
<Test
>::iterator
> p
;
109 for (int i
= 0; i
< 10; ++i
) {
113 it
= upper_bound(tv
.begin(), tv
.end(), 5);
114 CPPUNIT_ASSERT( it
!= tv
.end() );
115 CPPUNIT_ASSERT( *it
== 6 );
117 it
= lower_bound(tv
.begin(), tv
.end(), 5);
118 CPPUNIT_ASSERT( it
!= tv
.end() );
119 CPPUNIT_ASSERT( *it
== 5 );
121 p
= equal_range(tv
.begin(), tv
.end(), 5);
122 CPPUNIT_ASSERT( p
.first
!= p
.second
);
123 CPPUNIT_ASSERT( p
.first
!= tv
.end() );
124 CPPUNIT_ASSERT( p
.second
!= tv
.end() );
125 CPPUNIT_ASSERT( *p
.first
== 5 );
126 CPPUNIT_ASSERT( *p
.second
== 6 );
129 void EqualTest::equal0()
131 int numbers1
[5] = { 1, 2, 3, 4, 5 };
132 int numbers2
[5] = { 1, 2, 4, 8, 16 };
133 int numbers3
[2] = { 1, 2 };
135 CPPUNIT_ASSERT( !equal(numbers1
, numbers1
+ 5, numbers2
) );
136 CPPUNIT_ASSERT( equal(numbers3
, numbers3
+ 2, numbers1
) );
139 void EqualTest::equal1()
142 for (int i
= 0; (size_t)i
< v1
.size(); ++i
)
145 CPPUNIT_ASSERT( !equal(v1
.begin(), v1
.end(), v2
.begin()) );
147 copy(v1
.begin(), v1
.end(), v2
.begin());
148 CPPUNIT_ASSERT( equal(v1
.begin(), v1
.end(), v2
.begin()) )
151 void EqualTest::equal2()
155 for (int i
= 0; (size_t)i
< v1
.size(); ++i
) {
159 CPPUNIT_ASSERT( equal(v1
.begin(), v1
.end(), v2
.begin(), values_squared
) );
162 void EqualTest::equalto()
164 int input1
[4] = { 1, 7, 2, 2 };
165 int input2
[4] = { 1, 6, 2, 3 };
168 transform((int*)input1
, (int*)input1
+ 4, (int*)input2
, (int*)output
, equal_to
<int>());
169 CPPUNIT_ASSERT( output
[0] == 1 );
170 CPPUNIT_ASSERT( output
[1] == 0 );
171 CPPUNIT_ASSERT( output
[2] == 1 );
172 CPPUNIT_ASSERT( output
[3] == 0 );
175 bool EqualTest::values_squared(int a_
, int b_
)
177 return (a_
* a_
== b_
);