diff --git a/test/apply_permutation_test.cpp b/test/apply_permutation_test.cpp new file mode 100644 index 0000000..4716520 --- /dev/null +++ b/test/apply_permutation_test.cpp @@ -0,0 +1,122 @@ +/* + Copyright (c) Alexander Zaitsev , 2017 + + Distributed under the Boost Software License, Version 1.0. (See + accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt) + + See http://www.boost.org/ for latest version. +*/ + +#include +#include +#include +#include +#include + +#include + +#define BOOST_TEST_MAIN + +#include + +namespace ba = boost::algorithm; + + +void test_apply_permutation() +{ + //Empty + { + std::vector vec, order, result; + ba::apply_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //1 element + { + std::vector vec{1}, order{0}, result{1}; + ba::apply_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //2 elements, no changes + { + std::vector vec{1, 2}, order{0, 1}, result{1, 2}; + ba::apply_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //2 elements, changed + { + std::vector vec{1, 2}, order{1, 0}, result{2, 1}; + ba::apply_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //Multiple elements, no changes + { + std::vector vec{1, 2, 3, 4, 5}, order{0, 1, 2, 3, 4}, result{1, 2, 3, 4, 5}; + ba::apply_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //Multiple elements, changed + { + std::vector vec{1, 2, 3, 4, 5}, order{4, 3, 2, 1, 0}, result{5, 4, 3, 2, 1}; + ba::apply_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //Just test range interface + { + std::vector vec{1, 2, 3, 4, 5}, order{0, 1, 2, 3, 4}, result{1, 2, 3, 4, 5}; + ba::apply_permutation(vec, order); + BOOST_CHECK(vec == result); + } +} + +void test_apply_reverse_permutation() +{ + //Empty + { + std::vector vec, order, result; + ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //1 element + { + std::vector vec{1}, order{0}, result{1}; + ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //2 elements, no changes + { + std::vector vec{1, 2}, order{0, 1}, result{1, 2}; + ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //2 elements, changed + { + std::vector vec{1, 2}, order{1, 0}, result{2, 1}; + ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //Multiple elements, no changes + { + std::vector vec{1, 2, 3, 4, 5}, order{0, 1, 2, 3, 4}, result{1, 2, 3, 4, 5}; + ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //Multiple elements, changed + { + std::vector vec{1, 2, 3, 4, 5}, order{4, 3, 2, 1, 0}, result{5, 4, 3, 2, 1}; + ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin()); + BOOST_CHECK(vec == result); + } + //Just test range interface + { + std::vector vec{1, 2, 3, 4, 5}, order{0, 1, 2, 3, 4}, result{1, 2, 3, 4, 5}; + ba::apply_reverse_permutation(vec, order); + BOOST_CHECK(vec == result); + } +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + test_apply_permutation(); + test_apply_reverse_permutation(); +}