// 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 #include #include #include #include #include #include namespace boost { // Test an integer range with a step size of 1. template void test_irange_impl(Integer last) { std::vector reference; for (Integer i = static_cast(0); i < last; ++i) { reference.push_back(i); } std::vector 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 void test_irange_impl(Integer first, Integer last) { std::vector reference; for (Integer i = first; i < last; ++i) { reference.push_back(i); } std::vector 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 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(static_cast(first)) != first) || (static_cast(static_cast(last)) != last)) return; std::vector reference; const std::ptrdiff_t first_p = static_cast(first); const std::ptrdiff_t last_p = static_cast(last); const std::ptrdiff_t step_p = static_cast(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 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(last); test_irange_impl(last); test_irange_impl(last); test_irange_impl(last); test_irange_impl(last); test_irange_impl(last); test_irange_impl(last); test_irange_impl(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(first,last); test_irange_impl(first, last); test_irange_impl(first, last); test_irange_impl(first, last); test_irange_impl(first, last); test_irange_impl(first, last); test_irange_impl(first, last); test_irange_impl(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(first, last, step_size); test_irange_impl(first, last, step_size); test_irange_impl(first, last, step_size); test_irange_impl(first, last, step_size); test_irange_impl(first, last, step_size); test_irange_impl(first, last, step_size); test_irange_impl(first, last, step_size); test_irange_impl(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; }