mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-28 18:42:26 +00:00
234 lines
4.4 KiB
C++
234 lines
4.4 KiB
C++
//
|
|
// ArrayTest.cpp
|
|
//
|
|
// $Id: //poco/svn/Foundation/testsuite/src/ArrayTest.cpp#2 $
|
|
//
|
|
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#include "ArrayTest.h"
|
|
#include "CppUnit/TestCaller.h"
|
|
#include "CppUnit/TestSuite.h"
|
|
#include "Poco/Array.h"
|
|
#include <vector>
|
|
#include <algorithm>
|
|
#include <functional>
|
|
|
|
ArrayTest::ArrayTest(const std::string& name): CppUnit::TestCase(name)
|
|
{
|
|
}
|
|
|
|
|
|
ArrayTest::~ArrayTest()
|
|
{
|
|
}
|
|
|
|
struct Element
|
|
{
|
|
int _data;
|
|
};
|
|
|
|
void ArrayTest::testConstruction()
|
|
{
|
|
|
|
// fundamental type
|
|
typedef Poco::Array<float,6> FloatArray;
|
|
FloatArray a = { { 42.f } };
|
|
|
|
for (unsigned i=1; i<a.size(); ++i) {
|
|
a[i] = a[i-1]+1.f;
|
|
}
|
|
|
|
// copy constructor and assignment operator
|
|
FloatArray b(a);
|
|
FloatArray c;
|
|
c = a;
|
|
assert (a==b && a==c);
|
|
|
|
typedef Poco::Array<double,6> DArray;
|
|
typedef Poco::Array<int,6> IArray;
|
|
IArray ia = {{1, 2, 3, 4, 5, 6 }};
|
|
DArray da;
|
|
da = ia;
|
|
da.assign(42);
|
|
|
|
// user-defined type
|
|
typedef Poco::Array<Element,10> ElementArray;
|
|
ElementArray g;
|
|
|
|
for (unsigned i=0; i<g.size(); ++i) {
|
|
g[i]._data = i;
|
|
}
|
|
|
|
for (unsigned i=0; i<g.size(); ++i) {
|
|
assert(g[i]._data == i);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void ArrayTest::testOperations()
|
|
{
|
|
const int SIZE = 6;
|
|
typedef Poco::Array<int,SIZE> Array;
|
|
Array a = { { 1 } };
|
|
|
|
// use some common STL container operations
|
|
assert(a.size() == SIZE);
|
|
assert(a.max_size() == SIZE);
|
|
assert(a.empty() == false);
|
|
assert(a.front() == a[0]);
|
|
assert(a.back() == a[a.size()-1]);
|
|
//assert(a.data() == &a[0]);
|
|
|
|
// assign
|
|
a.assign(100);
|
|
for(int i = 0; i<a.size(); i++){
|
|
assert(a[i] == 100);
|
|
}
|
|
|
|
// swap
|
|
Array b;
|
|
b.assign(10);
|
|
for(int i=0; i<SIZE; i++){
|
|
assert(a[i] == 100);
|
|
assert(b[i] == 10);
|
|
}
|
|
a.swap(b);
|
|
for(int i=0; i<SIZE; i++){
|
|
assert(a[i] == 10);
|
|
assert(b[i] == 100);
|
|
}
|
|
|
|
}
|
|
|
|
void ArrayTest::testContainer()
|
|
{
|
|
const int SIZE = 2;
|
|
typedef Poco::Array<int,SIZE> Array;
|
|
Array a = {{1, 2}};
|
|
assert(a[0] == 1);
|
|
assert(a[1] == 2);
|
|
|
|
typedef std::vector<Array> ArrayVec;
|
|
ArrayVec container;
|
|
container.push_back(a);
|
|
container.push_back(a);
|
|
|
|
assert(container[0][0] == 1);
|
|
assert(container[0][1] == 2);
|
|
assert(container[1][0] == 1);
|
|
assert(container[1][1] == 2);
|
|
}
|
|
|
|
void ArrayTest::testIterator()
|
|
{
|
|
// create array of four seasons
|
|
Poco::Array<std::string,4> seasons = {
|
|
{ "spring", "summer", "autumn", "winter" }
|
|
};
|
|
|
|
// copy and change order
|
|
Poco::Array<std::string,4> org = seasons;
|
|
for (size_t i=seasons.size()-1; i>0; --i) {
|
|
swap(seasons.at(i),seasons.at((i+1)%seasons.size()));
|
|
}
|
|
|
|
// try swap()
|
|
swap(seasons,org);
|
|
|
|
// try reverse iterators
|
|
for (Poco::Array<std::string,4>::reverse_iterator pos
|
|
=seasons.rbegin(); pos<seasons.rend(); ++pos) {
|
|
}
|
|
}
|
|
|
|
void ArrayTest::testAlgorithm()
|
|
{
|
|
// create and initialize array
|
|
const int SIZE = 10;
|
|
typedef Poco::Array<int,SIZE> IArray;
|
|
IArray a = { { 1, 2, 3, 4, 5 } };
|
|
IArray b(a);
|
|
|
|
// modify elements directly
|
|
for (unsigned i=0; i<b.size(); ++i) {
|
|
++b[i];
|
|
}
|
|
|
|
// try iterators
|
|
for (IArray::iterator pos =b.begin(); pos<b.end(); ++pos) {
|
|
--(*pos);
|
|
}
|
|
|
|
for (unsigned i=0; i<a.size(); ++i) {
|
|
assert(a[i] == b[i]);
|
|
}
|
|
|
|
// change order using an STL algorithm
|
|
std::reverse(a.begin(),a.end());
|
|
|
|
for (unsigned i=0; i<a.size(); ++i) {
|
|
assert(a[SIZE-i-1] == b[i]);
|
|
}
|
|
|
|
std::reverse(a.begin(),a.end());
|
|
|
|
// negate elements using STL framework
|
|
std::transform( a.begin(),a.end(), // source
|
|
a.begin(), // destination
|
|
std::negate<int>()); // operation
|
|
|
|
for (unsigned i=0; i<a.size(); ++i) {
|
|
assert(a[i] == -b[i]);
|
|
}
|
|
|
|
}
|
|
|
|
void ArrayTest::testMultiLevelArray()
|
|
{
|
|
const int SIZE = 2;
|
|
typedef Poco::Array<int,SIZE> IArray;
|
|
typedef Poco::Array<IArray,SIZE> MultiArray;
|
|
|
|
MultiArray a;
|
|
a[0][0] = 1;
|
|
a[0][1] = 2;
|
|
a[1][0] = 3;
|
|
a[1][1] = 4;
|
|
|
|
MultiArray b = a;
|
|
assert(b[0][0] == 1);
|
|
assert(b[0][1] == 2);
|
|
assert(b[1][0] == 3);
|
|
assert(b[1][1] == 4);
|
|
}
|
|
|
|
void ArrayTest::setUp()
|
|
{
|
|
}
|
|
|
|
|
|
void ArrayTest::tearDown()
|
|
{
|
|
}
|
|
|
|
|
|
CppUnit::Test* ArrayTest::suite()
|
|
{
|
|
CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("ArrayTest");
|
|
|
|
CppUnit_addTest(pSuite, ArrayTest, testConstruction);
|
|
CppUnit_addTest(pSuite, ArrayTest, testOperations);
|
|
CppUnit_addTest(pSuite, ArrayTest, testContainer);
|
|
CppUnit_addTest(pSuite, ArrayTest, testIterator);
|
|
CppUnit_addTest(pSuite, ArrayTest, testAlgorithm);
|
|
CppUnit_addTest(pSuite, ArrayTest, testMultiLevelArray);
|
|
|
|
return pSuite;
|
|
}
|