// 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 #include namespace boost { // 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(Integer first, Integer last, int step) { BOOST_ASSERT( step != 0 ); std::vector reference; if (step > 0) { for (Integer i = first; i < last; i += step) reference.push_back(i); } else { for (Integer i = first; i > last; i += step) reference.push_back(i); } 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 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 ); BOOST_ASSERT( (last - first) % 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(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(10, 20, 5); test_irange(20, 10, -5); } } // 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; }