mirror of
https://github.com/boostorg/histogram.git
synced 2025-05-12 05:31:51 +00:00
131 lines
4.3 KiB
C++
131 lines
4.3 KiB
C++
// 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 <boost/test/unit_test.hpp>
|
|
#include <boost/test/test_tools.hpp>
|
|
#include <boost/histogram/axis.hpp>
|
|
#include <boost/histogram/axis_ostream_operators.hpp>
|
|
#include <boost/math/constants/constants.hpp>
|
|
#include <limits>
|
|
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<double>::infinity());
|
|
BOOST_CHECK_EQUAL(a[a.bins() + 1], std::numeric_limits<double>::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<double>::infinity()), 3);
|
|
BOOST_CHECK_EQUAL(a.index(-std::numeric_limits<double>::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<double>::infinity());
|
|
BOOST_CHECK_EQUAL(a[a.bins() + 1], std::numeric_limits<double>::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<axis_t> 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<axis_t> 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<axis_t>()));
|
|
BOOST_CHECK(axes == std::vector<axis_t>(axes));
|
|
}
|