os/ossrv/genericopenlibs/cppstdlib/stl/test/unit/adj_test.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
#include <vector>
sl@0
     2
#include <numeric>
sl@0
     3
#include <algorithm>
sl@0
     4
sl@0
     5
#include "cppunit/cppunit_proxy.h"
sl@0
     6
sl@0
     7
#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
sl@0
     8
using namespace std;
sl@0
     9
#endif
sl@0
    10
sl@0
    11
//
sl@0
    12
// TestCase class
sl@0
    13
//
sl@0
    14
class AdjTest : public CPPUNIT_NS::TestCase
sl@0
    15
{
sl@0
    16
  CPPUNIT_TEST_SUITE(AdjTest);
sl@0
    17
  CPPUNIT_TEST(adjfind0);
sl@0
    18
  CPPUNIT_TEST(adjfind1);
sl@0
    19
  CPPUNIT_TEST(adjfind2);
sl@0
    20
  CPPUNIT_TEST(adjdiff0);
sl@0
    21
  CPPUNIT_TEST(adjdiff1);
sl@0
    22
  CPPUNIT_TEST(adjdiff2);
sl@0
    23
  CPPUNIT_TEST_SUITE_END();
sl@0
    24
sl@0
    25
protected:
sl@0
    26
  void adjfind0();
sl@0
    27
  void adjfind1();
sl@0
    28
  void adjfind2();
sl@0
    29
  void adjdiff0();
sl@0
    30
  void adjdiff1();
sl@0
    31
  void adjdiff2();
sl@0
    32
  static int equal_length(const char* v1_, const char* v2_);
sl@0
    33
  static int mult(int a_, int b_);
sl@0
    34
};
sl@0
    35
sl@0
    36
CPPUNIT_TEST_SUITE_REGISTRATION(AdjTest);
sl@0
    37
sl@0
    38
//
sl@0
    39
// tests implementation
sl@0
    40
//
sl@0
    41
void AdjTest::adjfind0()
sl@0
    42
{
sl@0
    43
  int numbers1 [5] = { 1, 2, 4, 8, 16 };
sl@0
    44
  int numbers2 [5] = { 5, 3, 2, 1, 1 };
sl@0
    45
sl@0
    46
  int* location = adjacent_find((int*)numbers1, (int*)numbers1 + 5);
sl@0
    47
  CPPUNIT_ASSERT(location == numbers1 + 5); // no adj so loc should be _last
sl@0
    48
sl@0
    49
  location = adjacent_find((int*)numbers2, (int*)numbers2 + 5);
sl@0
    50
  CPPUNIT_ASSERT(location != numbers2 + 5); // adj location off should be 3 (first 1)
sl@0
    51
  CPPUNIT_ASSERT((location - numbers2)==3);
sl@0
    52
}
sl@0
    53
void AdjTest::adjfind1()
sl@0
    54
{
sl@0
    55
  typedef vector<int> IntVector;
sl@0
    56
  IntVector v(10);
sl@0
    57
  for (int i = 0; (size_t)i < v.size(); ++i)
sl@0
    58
    v[i] = i;
sl@0
    59
  IntVector::iterator location;
sl@0
    60
  location = adjacent_find(v.begin(), v.end());
sl@0
    61
  CPPUNIT_ASSERT(location == v.end());
sl@0
    62
  v[6] = 7;
sl@0
    63
  location = adjacent_find(v.begin(), v.end());
sl@0
    64
  CPPUNIT_ASSERT(location != v.end());
sl@0
    65
}
sl@0
    66
void AdjTest::adjfind2()
sl@0
    67
{
sl@0
    68
  typedef vector <char*> CStrVector;
sl@0
    69
sl@0
    70
  char* names[] = { "Brett", "Graham", "Jack", "Mike", "Todd" };
sl@0
    71
sl@0
    72
  const int nameCount = sizeof(names)/sizeof(names[0]);
sl@0
    73
  CStrVector v(nameCount);
sl@0
    74
  for(int i = 0; i < nameCount; i++)
sl@0
    75
    v[i] = names[i];
sl@0
    76
  CStrVector::iterator location;
sl@0
    77
  location = adjacent_find(v.begin(), v.end(), equal_length);
sl@0
    78
sl@0
    79
  CPPUNIT_ASSERT(location != v.end());
sl@0
    80
}
sl@0
    81
int AdjTest::equal_length(const char* v1_, const char* v2_)
sl@0
    82
{
sl@0
    83
  return ::strlen(v1_) == ::strlen(v2_);
sl@0
    84
}
sl@0
    85
void AdjTest::adjdiff0()
sl@0
    86
{
sl@0
    87
  int numbers[5] = { 1, 2, 4, 8, 16 };
sl@0
    88
  int difference[5];
sl@0
    89
  adjacent_difference(numbers, numbers + 5, (int*)difference);
sl@0
    90
  CPPUNIT_ASSERT(difference[0]==1);
sl@0
    91
  CPPUNIT_ASSERT(difference[1]==1);
sl@0
    92
  CPPUNIT_ASSERT(difference[2]==2);
sl@0
    93
  CPPUNIT_ASSERT(difference[3]==4);
sl@0
    94
  CPPUNIT_ASSERT(difference[4]==8);
sl@0
    95
}
sl@0
    96
void AdjTest::adjdiff1()
sl@0
    97
{
sl@0
    98
  vector <int> v(10);
sl@0
    99
  for(int i = 0; (size_t)i < v.size(); ++i)
sl@0
   100
    v[i] = i * i;
sl@0
   101
  vector<int> result(v.size());
sl@0
   102
  adjacent_difference(v.begin(), v.end(), result.begin());
sl@0
   103
  CPPUNIT_ASSERT(result[0]==0)
sl@0
   104
  CPPUNIT_ASSERT(result[1]==1)
sl@0
   105
  CPPUNIT_ASSERT(result[2]==3)
sl@0
   106
  CPPUNIT_ASSERT(result[3]==5)
sl@0
   107
  CPPUNIT_ASSERT(result[4]==7)
sl@0
   108
  CPPUNIT_ASSERT(result[5]==9)
sl@0
   109
  CPPUNIT_ASSERT(result[6]==11)
sl@0
   110
  CPPUNIT_ASSERT(result[7]==13)
sl@0
   111
  CPPUNIT_ASSERT(result[8]==15)
sl@0
   112
  CPPUNIT_ASSERT(result[9]==17)
sl@0
   113
}
sl@0
   114
void AdjTest::adjdiff2()
sl@0
   115
{
sl@0
   116
  vector <int> v(10);
sl@0
   117
  for (int i = 0; (size_t)i < v.size(); ++i)
sl@0
   118
    v[i] = i + 1;
sl@0
   119
  vector <int> result(v.size());
sl@0
   120
  adjacent_difference(v.begin(), v.end(), result.begin(), mult);
sl@0
   121
  CPPUNIT_ASSERT(result[0]==1)
sl@0
   122
  CPPUNIT_ASSERT(result[1]==2)
sl@0
   123
  CPPUNIT_ASSERT(result[2]==6)
sl@0
   124
  CPPUNIT_ASSERT(result[3]==12)
sl@0
   125
  CPPUNIT_ASSERT(result[4]==20)
sl@0
   126
  CPPUNIT_ASSERT(result[5]==30)
sl@0
   127
  CPPUNIT_ASSERT(result[6]==42)
sl@0
   128
  CPPUNIT_ASSERT(result[7]==56)
sl@0
   129
  CPPUNIT_ASSERT(result[8]==72)
sl@0
   130
  CPPUNIT_ASSERT(result[9]==90)
sl@0
   131
}
sl@0
   132
int AdjTest::mult(int a_, int b_)
sl@0
   133
{
sl@0
   134
  return a_ * b_;
sl@0
   135
}