diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cppstdlib/stl/test/unit/partition_test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cppstdlib/stl/test/unit/partition_test.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include + +#include "cppunit/cppunit_proxy.h" + +#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) +using namespace std; +#endif + +// +// TestCase class +// +class PartitionTest : public CPPUNIT_NS::TestCase +{ + CPPUNIT_TEST_SUITE(PartitionTest); + CPPUNIT_TEST(ptition0); + CPPUNIT_TEST(ptition1); + CPPUNIT_TEST(stblptn0); + CPPUNIT_TEST(stblptn1); + CPPUNIT_TEST_SUITE_END(); + +protected: + void ptition0(); + void ptition1(); + void stblptn0(); + void stblptn1(); + + struct less_n { + less_n(int limit, size_t &nb_calls) + : _limit(limit), _nb_calls(nb_calls) {} + + bool operator() (int a_) const { + ++_nb_calls; + return a_ < _limit; + } + + int _limit; + size_t &_nb_calls; + + private: + //explicitely defined as private to avoid warnings: + less_n& operator = (less_n const&); + }; +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(PartitionTest); + +// +// tests implementation +// +void PartitionTest::stblptn0() +{ + int numbers[6] = { 10, 5, 11, 20, 6, -2 }; + + size_t nb_pred_calls = 0; + stable_partition((int*)numbers, (int*)numbers + 6, less_n(10, nb_pred_calls)); + // 5 6 -2 10 11 20 + CPPUNIT_ASSERT(numbers[0]==5); + CPPUNIT_ASSERT(numbers[1]==6); + CPPUNIT_ASSERT(numbers[2]==-2); + CPPUNIT_ASSERT(numbers[3]==10); + CPPUNIT_ASSERT(numbers[4]==11); + CPPUNIT_ASSERT(numbers[5]==20); + + //Complexity check: + CPPUNIT_ASSERT( nb_pred_calls == sizeof(numbers) / sizeof(numbers[0]) ); +} +void PartitionTest::stblptn1() +{ + //5 5 2 10 0 12 5 0 0 19 + //5 5 2 10 0 5 0 0 12 19 + int numbers[] = { 5, 5, 2, 10, 0, 12, 5, 0, 0, 19 }; + vector v1(numbers, numbers+10); + + size_t nb_pred_calls = 0; + stable_partition(v1.begin(), v1.end(), less_n(11, nb_pred_calls)); + + CPPUNIT_ASSERT(v1[0]==5); + CPPUNIT_ASSERT(v1[1]==5); + CPPUNIT_ASSERT(v1[2]==2); + CPPUNIT_ASSERT(v1[3]==10); + CPPUNIT_ASSERT(v1[4]==0); + CPPUNIT_ASSERT(v1[5]==5); + CPPUNIT_ASSERT(v1[6]==0); + CPPUNIT_ASSERT(v1[7]==0); + CPPUNIT_ASSERT(v1[8]==12); + CPPUNIT_ASSERT(v1[9]==19); + CPPUNIT_ASSERT( nb_pred_calls == v1.size() ); +} +void PartitionTest::ptition0() +{ + int numbers[6] = { 6, 12, 3, 10, 1, 20 }; + size_t nb_pred_calls = 0; + // 6 1 3 10 12 20 + partition((int*)numbers, (int*)numbers + 6, less_n(10, nb_pred_calls)); + CPPUNIT_ASSERT(numbers[0]==6); + CPPUNIT_ASSERT(numbers[1]==1); + CPPUNIT_ASSERT(numbers[2]==3); + CPPUNIT_ASSERT(numbers[3]==10); + CPPUNIT_ASSERT(numbers[4]==12); + CPPUNIT_ASSERT(numbers[5]==20); + + CPPUNIT_ASSERT( nb_pred_calls == sizeof(numbers) / sizeof(numbers[0]) ); +} +void PartitionTest::ptition1() +{ + // 19 3 11 14 10 19 8 17 9 6 + // 6 3 9 8 10 19 14 17 11 19 + + int numbers[10] ={ 19, 3, 11, 14, 10, 19, 8, 17, 9, 6 }; + + vector v1(numbers, numbers+10); + size_t nb_pred_calls = 0; + partition(v1.begin(), v1.end(), less_n(11, nb_pred_calls)); + + CPPUNIT_ASSERT(v1[0]==6); + CPPUNIT_ASSERT(v1[1]==3); + CPPUNIT_ASSERT(v1[2]==9); + CPPUNIT_ASSERT(v1[3]==8); + CPPUNIT_ASSERT(v1[4]==10); + CPPUNIT_ASSERT(v1[5]==19); + CPPUNIT_ASSERT(v1[6]==14); + CPPUNIT_ASSERT(v1[7]==17); + CPPUNIT_ASSERT(v1[8]==11); + CPPUNIT_ASSERT(v1[9]==19); + CPPUNIT_ASSERT( nb_pred_calls == v1.size() ); +}