summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/range/test/irange.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/boost/libs/range/test/irange.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/boost/libs/range/test/irange.cpp b/src/boost/libs/range/test/irange.cpp
new file mode 100644
index 00000000..7e1a5644
--- /dev/null
+++ b/src/boost/libs/range/test/irange.cpp
@@ -0,0 +1,191 @@
+// Boost.Range library
+//
+// Copyright Neil Groves 2010. Use, modification and
+// distribution is subject to 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)
+//
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#include <boost/range/irange.hpp>
+#include <boost/range/algorithm_ext.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/test/test_tools.hpp>
+#include <boost/test/unit_test.hpp>
+#include <vector>
+
+namespace boost
+{
+ // Test an integer range with a step size of 1.
+ template<typename Integer>
+ void test_irange_impl(Integer last)
+ {
+ std::vector<Integer> reference;
+ for (Integer i = static_cast<Integer>(0); i < last; ++i)
+ {
+ reference.push_back(i);
+ }
+
+ std::vector<Integer> test;
+ boost::push_back(test, boost::irange(last));
+
+ BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(),
+ reference.begin(), reference.end() );
+ }
+
+ // Test an integer range with a step size of 1.
+ template<typename Integer>
+ void test_irange_impl(Integer first, Integer last)
+ {
+ std::vector<Integer> reference;
+ for (Integer i = first; i < last; ++i)
+ {
+ reference.push_back(i);
+ }
+
+ std::vector<Integer> test;
+ boost::push_back(test, boost::irange(first, last));
+
+ BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(),
+ reference.begin(), reference.end() );
+ }
+
+ // Test an integer range with a runtime specified step size.
+ template<typename Integer, typename IntegerInput>
+ void test_irange_impl(IntegerInput first, IntegerInput last, int step)
+ {
+ BOOST_ASSERT( step != 0 );
+
+ // Skip tests that have negative values if the type is
+ // unsigned
+ if ((static_cast<IntegerInput>(static_cast<Integer>(first)) != first)
+ || (static_cast<IntegerInput>(static_cast<Integer>(last)) != last))
+ return;
+
+ std::vector<Integer> reference;
+
+ const std::ptrdiff_t first_p = static_cast<std::ptrdiff_t>(first);
+ const std::ptrdiff_t last_p = static_cast<std::ptrdiff_t>(last);
+ const std::ptrdiff_t step_p = static_cast<std::ptrdiff_t>(step);
+ for (std::ptrdiff_t current_value = first_p;
+ step_p >= 0 ? current_value < last_p : current_value > last_p;
+ current_value += step_p)
+ reference.push_back(current_value);
+
+ std::vector<Integer> test;
+ boost::push_back(test, boost::irange(first, last, step));
+
+ BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(),
+ reference.begin(), reference.end() );
+ }
+
+ // Test driver function that for an integer range [first, last)
+ // drives the test implementation through various integer
+ // types.
+ void test_irange(int last)
+ {
+ test_irange_impl<signed char>(last);
+ test_irange_impl<unsigned char>(last);
+ test_irange_impl<signed short>(last);
+ test_irange_impl<unsigned short>(last);
+ test_irange_impl<signed int>(last);
+ test_irange_impl<unsigned int>(last);
+ test_irange_impl<signed long>(last);
+ test_irange_impl<unsigned long>(last);
+ }
+
+
+ // Test driver function that for an integer range [first, last)
+ // drives the test implementation through various integer
+ // types.
+ void test_irange(int first, int last)
+ {
+ test_irange_impl<signed char>(first,last);
+ test_irange_impl<unsigned char>(first, last);
+ test_irange_impl<signed short>(first, last);
+ test_irange_impl<unsigned short>(first, last);
+ test_irange_impl<signed int>(first, last);
+ test_irange_impl<unsigned int>(first, last);
+ test_irange_impl<signed long>(first, last);
+ test_irange_impl<unsigned long>(first, last);
+ }
+
+ // Test driver function that for an integer range [first, last)
+ // drives the test implementation through various integer
+ // types step_size items at a time.
+ void test_irange(int first, int last, int step_size)
+ {
+ BOOST_ASSERT( step_size != 0 );
+ test_irange_impl<signed char>(first, last, step_size);
+ test_irange_impl<unsigned char>(first, last, step_size);
+ test_irange_impl<signed short>(first, last, step_size);
+ test_irange_impl<unsigned short>(first, last, step_size);
+ test_irange_impl<signed int>(first, last, step_size);
+ test_irange_impl<unsigned int>(first, last, step_size);
+ test_irange_impl<signed long>(first, last, step_size);
+ test_irange_impl<unsigned long>(first, last, step_size);
+ }
+
+ // Implementation of the unit test for the integer range
+ // function.
+ // This starts the test drivers to drive a set of integer types
+ // for a combination of range values chosen to exercise a large
+ // number of implementation branches.
+ void irange_unit_test()
+ {
+ // Test the single-step version of irange(last)
+ test_irange(0);
+ test_irange(1);
+ test_irange(10);
+
+ // Test the single-step version of irange(first, last)
+ test_irange(0, 0);
+ test_irange(0, 1);
+ test_irange(0, 10);
+ test_irange(1, 1);
+ test_irange(1, 2);
+ test_irange(1, 11);
+
+ // Test the n-step version of irange(first, last, step-size)
+ test_irange(0, 0, 1);
+ test_irange(0, 0, -1);
+ test_irange(0, 10, 1);
+ test_irange(10, 0, -1);
+ test_irange(0, 2, 2);
+ test_irange(2, 0, -2);
+ test_irange(0, 9, 2);
+ test_irange(9, 0, -2);
+ test_irange(-9, 0, 2);
+ test_irange(-9, 9, 2);
+ test_irange(9, -9, -2);
+ test_irange(10, 20, 5);
+ test_irange(20, 10, -5);
+
+ test_irange(0, 0, 3);
+ test_irange(0, 1, 3);
+ test_irange(0, 2, 3);
+ test_irange(0, 3, 3);
+ test_irange(0, 4, 3);
+ test_irange(0, 10, 3);
+
+ test_irange(0, 0, -3);
+ test_irange(0, -1, -3);
+ test_irange(0, -2, -3);
+ test_irange(0, -3, -3);
+ test_irange(0, -4, -3);
+ test_irange(0, -10, -3);
+ }
+} // namespace boost
+
+boost::unit_test::test_suite*
+init_unit_test_suite(int argc, char* argv[])
+{
+ boost::unit_test::test_suite* test
+ = BOOST_TEST_SUITE( "RangeTestSuite.irange" );
+
+ test->add(BOOST_TEST_CASE( &boost::irange_unit_test ));
+
+ return test;
+}