os/ossrv/genericopenlibs/cppstdlib/stl/test/unit/equal_test.cpp
changeset 0 bde4ae8d615e
     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 +}