#include "AlgorithmTest.h" #include <alib/algorithm> #include <alib/set> #include <alib/vector> #include <alib/list> CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( AlgorithmTest, "bits" ); CPPUNIT_TEST_SUITE_REGISTRATION( AlgorithmTest ); void AlgorithmTest::setUp() { } void AlgorithmTest::tearDown() { } void AlgorithmTest::testExclude() { { int array1[] = {1, 2, 3}; int array2[] = {2, 3, 4}; std::cout << sizeof(array1) / sizeof(int); CPPUNIT_ASSERT(ext::excludes(array1, array1 + sizeof(array1) / sizeof(int), array2, array2 + sizeof(array2) / sizeof(int)) == false); } { int array1[] = {1, 3, 5}; int array2[] = {2, 4, 6, 8}; CPPUNIT_ASSERT(ext::excludes(array1, array1 + sizeof(array1) / sizeof(int), array2, array2 + sizeof(array2) / sizeof(int)) == true); CPPUNIT_ASSERT(ext::excludes(array2, array2 + sizeof(array2) / sizeof(int), array1, array1 + sizeof(array1) / sizeof(int)) == true); } { int array1[] = {1, 3, 5, 8}; int array2[] = {2, 4, 6, 8}; CPPUNIT_ASSERT(ext::excludes(array1, array1 + sizeof(array1) / sizeof(int), array2, array2 + sizeof(array2) / sizeof(int)) == false); CPPUNIT_ASSERT(ext::excludes(array2, array2 + sizeof(array2) / sizeof(int), array1, array1 + sizeof(array1) / sizeof(int)) == false); } { int array1[] = {0}; int array2[] = {2, 4, 6, 8}; CPPUNIT_ASSERT(ext::excludes(array1, array1 + sizeof(array1) / sizeof(int), array2, array2 + sizeof(array2) / sizeof(int)) == true); CPPUNIT_ASSERT(ext::excludes(array2, array2 + sizeof(array2) / sizeof(int), array1, array1 + sizeof(array1) / sizeof(int)) == true); CPPUNIT_ASSERT(ext::excludes(array1, array1, array2, array2) == true); CPPUNIT_ASSERT(ext::excludes(array2, array2, array1, array1) == true); } } void AlgorithmTest::testTransform() { ext::set<int> in = {1, 2, 3, 4}; ext::set<long> ref = {2, 3, 4, 5}; /* std::function<long(const int&)> lamb = [](const int& elem) { return (long) elem + 1; }; ext::set<long> out = ext::transform<long>(in, lamb); //*/ ext::set<long> out = ext::transform<long>(in, [](const int& elem) { return (long) elem + 1; }); CPPUNIT_ASSERT(ref == out); } void AlgorithmTest::testFindRange ( ) { { std::string str = "abc<dee<fd<<>>>th>::rrr"; std::pair < std::string::iterator, std::string::iterator > range = ext::find_range ( str.begin ( ), str.end ( ), '<', '>' ); std::cerr << range.first - str.begin ( ) << std::endl; std::cerr << range.second - str.begin ( ) << std::endl; CPPUNIT_ASSERT ( range.first - str.begin ( ) == 3 ); CPPUNIT_ASSERT ( range.second - str.begin ( ) == 18 ); str.erase ( range.first, range.second ); std::cerr << str << std::endl; CPPUNIT_ASSERT ( str == "abc::rrr" ); } { std::string str = "aaa::abc<dee<fd<<>>>th>"; std::pair < std::string::iterator, std::string::iterator > range = ext::find_range ( str.begin ( ), str.end ( ), '<', '>' ); std::cerr << range.first - str.begin ( ) << std::endl; std::cerr << range.second - str.begin ( ) << std::endl; CPPUNIT_ASSERT ( range.first - str.begin ( ) == 8 ); CPPUNIT_ASSERT ( range.second - str.begin ( ) == 23 ); str.erase ( range.first, range.second ); std::cerr << str << std::endl; CPPUNIT_ASSERT ( str == "aaa::abc" ); } { std::string str = "<dee<fd<<>>>th>aaa"; std::pair < std::string::iterator, std::string::iterator > range = ext::find_range ( str.begin ( ), str.end ( ), '<', '>' ); std::cerr << range.first - str.begin ( ) << std::endl; std::cerr << range.second - str.begin ( ) << std::endl; CPPUNIT_ASSERT ( range.first - str.begin ( ) == 0 ); CPPUNIT_ASSERT ( range.second - str.begin ( ) == 15 ); str.erase ( range.first, range.second ); std::cerr << str << std::endl; CPPUNIT_ASSERT ( str == "aaa" ); } { std::string str = "<dee<fd<<>>>th>"; std::pair < std::string::iterator, std::string::iterator > range = ext::find_range ( str.begin ( ), str.end ( ), '<', '>' ); std::cerr << range.first - str.begin ( ) << std::endl; std::cerr << range.second - str.begin ( ) << std::endl; CPPUNIT_ASSERT ( range.first - str.begin ( ) == 0 ); CPPUNIT_ASSERT ( range.second - str.begin ( ) == 15 ); str.erase ( range.first, range.second ); std::cerr << str << std::endl; CPPUNIT_ASSERT ( str == "" ); } { std::string str = "<dee<fd<<>>>th"; std::pair < std::string::iterator, std::string::iterator > range = ext::find_range ( str.begin ( ), str.end ( ), '<', '>' ); std::cerr << range.first - str.begin ( ) << std::endl; std::cerr << range.second - str.begin ( ) << std::endl; CPPUNIT_ASSERT ( range.first - str.begin ( ) == 14 ); CPPUNIT_ASSERT ( range.second - str.begin ( ) == 14 ); } } void AlgorithmTest::testSymmetricDifference ( ) { ext::set < int > a { 1, 3, 5, 6, 7, 8, 9 }; ext::set < int > b { 1, 2, 3, 4, 5, 7, 8 }; ext::vector < int > a_b { 6, 9 }; ext::vector < int > b_a { 2, 4 }; ext::vector < int > a_b2; ext::vector < int > b_a2; ext::set_symmetric_difference ( a.begin ( ), a.end ( ), b.begin ( ), b.end ( ), std::back_inserter ( a_b2 ), std::back_inserter ( b_a2 ) ); CPPUNIT_ASSERT ( a_b == a_b2 ); CPPUNIT_ASSERT ( b_a == b_a2 ); } void AlgorithmTest::testRangeContainsIterator ( ) { std::list < int > test = { 1, 2, 3, 4, 5, 6 }; std::list < int > other = { 1, 2, 3, 4, 5, 6, 7 }; std::list < char > other2 = { 'a', 'b', 'c' }; std::list < int >::iterator iter = test.begin ( ); iter++; iter++; CPPUNIT_ASSERT ( ext::range_contains_iterator ( test.begin ( ), test.end ( ), iter ) ); CPPUNIT_ASSERT ( ! ext::range_contains_iterator ( other.begin ( ), other.end ( ), iter ) ); CPPUNIT_ASSERT ( ! ext::range_contains_iterator ( other2.begin ( ), other2.end ( ), iter ) ); }