// Copyright 2015-2016 Hans Dembinski // // 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) #define BOOST_TEST_MODULE axis_test #include #include #include #include #include #include using namespace boost::histogram; // only test things not already covered by python_test_suite BOOST_AUTO_TEST_CASE(regular_axis_operators) { regular_axis a{3, -1, 1}; BOOST_CHECK_EQUAL(a[-1], -std::numeric_limits::infinity()); BOOST_CHECK_EQUAL(a[a.bins() + 1], std::numeric_limits::infinity()); regular_axis b; BOOST_CHECK_NE(a, b); b = a; BOOST_CHECK_EQUAL(a, b); b = b; BOOST_CHECK_EQUAL(a, b); BOOST_CHECK_EQUAL(a.index(-10.), -1); BOOST_CHECK_EQUAL(a.index(-1.1), -1); BOOST_CHECK_EQUAL(a.index(-1.0), 0); BOOST_CHECK_EQUAL(a.index(0.0), 1); BOOST_CHECK_EQUAL(a.index(0.99), 2); BOOST_CHECK_EQUAL(a.index(1.0), 3); BOOST_CHECK_EQUAL(a.index(10.), 3); BOOST_CHECK_EQUAL(a.index(std::numeric_limits::infinity()), 3); BOOST_CHECK_EQUAL(a.index(-std::numeric_limits::infinity()), -1); } BOOST_AUTO_TEST_CASE(polar_axis_operators) { using namespace boost::math::double_constants; polar_axis a{4}; BOOST_CHECK_EQUAL(a[-1], a[a.bins() - 1] - two_pi); polar_axis b; BOOST_CHECK_NE(a, b); b = a; BOOST_CHECK_EQUAL(a, b); b = b; BOOST_CHECK_EQUAL(a, b); BOOST_CHECK_EQUAL(a.index(-1.0 * two_pi), 0); BOOST_CHECK_EQUAL(a.index(0.0), 0); BOOST_CHECK_EQUAL(a.index(0.25 * two_pi), 1); BOOST_CHECK_EQUAL(a.index(0.5 * two_pi), 2); BOOST_CHECK_EQUAL(a.index(0.75 * two_pi), 3); BOOST_CHECK_EQUAL(a.index(1.00 * two_pi), 0); } BOOST_AUTO_TEST_CASE(variable_axis_operators) { variable_axis a{-1, 0, 1}; BOOST_CHECK_EQUAL(a[-1], -std::numeric_limits::infinity()); BOOST_CHECK_EQUAL(a[a.bins() + 1], std::numeric_limits::infinity()); variable_axis b; BOOST_CHECK_NE(a, b); b = a; BOOST_CHECK_EQUAL(a, b); b = b; BOOST_CHECK_EQUAL(a, b); BOOST_CHECK_EQUAL(a.index(-10.), -1); BOOST_CHECK_EQUAL(a.index(-1.), 0); BOOST_CHECK_EQUAL(a.index(0.), 1); BOOST_CHECK_EQUAL(a.index(1.), 2); BOOST_CHECK_EQUAL(a.index(10.), 2); } BOOST_AUTO_TEST_CASE(category_axis_operators) { category_axis a{"A", "B", "C"}; category_axis b; BOOST_CHECK_NE(a, b); b = a; BOOST_CHECK_EQUAL(a, b); b = b; BOOST_CHECK_EQUAL(a, b); BOOST_CHECK_EQUAL(a.index(0.0), 0); BOOST_CHECK_EQUAL(a.index(1.0), 1); BOOST_CHECK_EQUAL(a.index(2.0), 2); } BOOST_AUTO_TEST_CASE(integer_axis_operators) { integer_axis a{-1, 1}; integer_axis b; BOOST_CHECK_NE(a, b); b = a; BOOST_CHECK_EQUAL(a, b); b = b; BOOST_CHECK_EQUAL(a, b); BOOST_CHECK_EQUAL(a.index(-10), -1); BOOST_CHECK_EQUAL(a.index(-2), -1); BOOST_CHECK_EQUAL(a.index(-1), 0); BOOST_CHECK_EQUAL(a.index(0), 1); BOOST_CHECK_EQUAL(a.index(1), 2); BOOST_CHECK_EQUAL(a.index(2), 3); BOOST_CHECK_EQUAL(a.index(10), 3); } BOOST_AUTO_TEST_CASE(axis_t_streamable) { std::vector axes; axes.push_back(regular_axis{2, -1, 1, std::string{"regular"}, false}); axes.push_back(polar_axis{4, 0.1, std::string{"polar"}}); axes.push_back(variable_axis{{-1, 0, 1}, std::string{"variable"}, false}); axes.push_back(category_axis{"A", "B", "C"}); axes.push_back(integer_axis{-1, 1, std::string{"integer"}, false}); std::ostringstream os; for(const auto& a : axes) os << a; BOOST_CHECK(!os.str().empty()); } BOOST_AUTO_TEST_CASE(axis_t_equal_comparable) { std::vector axes; axes.push_back(regular_axis{2, -1, 1}); axes.push_back(polar_axis{4}); axes.push_back(variable_axis{-1, 0, 1}); axes.push_back(category_axis{"A", "B", "C"}); axes.push_back(integer_axis{-1, 1}); for (const auto& a : axes) { BOOST_CHECK(!(a == axis_t())); BOOST_CHECK_EQUAL(a, a); } BOOST_CHECK(!(axes == std::vector())); BOOST_CHECK(axes == std::vector(axes)); }