mirror of
https://github.com/boostorg/histogram.git
synced 2025-05-10 07:14:05 +00:00
131 lines
5.0 KiB
C++
131 lines
5.0 KiB
C++
// Copyright 2015-2017 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)
|
|
|
|
#include <boost/core/lightweight_test.hpp>
|
|
#include <boost/core/lightweight_test_trait.hpp>
|
|
#include <boost/histogram/axis/category.hpp>
|
|
#include <boost/histogram/axis/integer.hpp>
|
|
#include <boost/histogram/axis/ostream_operators.hpp>
|
|
#include <boost/histogram/axis/regular.hpp>
|
|
#include <boost/histogram/axis/variable.hpp>
|
|
#include <boost/histogram/detail/axes.hpp>
|
|
#include <boost/histogram/detail/cat.hpp>
|
|
#include <boost/histogram/detail/is_set.hpp>
|
|
#include <tuple>
|
|
#include <vector>
|
|
#include "utility_meta.hpp"
|
|
|
|
using namespace boost::histogram;
|
|
|
|
int main() {
|
|
BOOST_TEST_EQ(detail::cat("foo", 1, "bar"), "foo1bar");
|
|
|
|
// sequence equality
|
|
{
|
|
enum { A, B, C };
|
|
std::vector<axis::variant<axis::regular<>, axis::variable<>, axis::category<>,
|
|
axis::integer<>>>
|
|
std_vector1 = {axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1},
|
|
axis::category<>{A, B, C}};
|
|
|
|
std::vector<axis::variant<axis::regular<>, axis::variable<>, axis::category<>>>
|
|
std_vector2 = {axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1},
|
|
axis::category<>{{A, B, C}}};
|
|
|
|
std::vector<axis::variant<axis::regular<>, axis::variable<>>> std_vector3 = {
|
|
axis::variable<>{-1, 0, 1}, axis::regular<>{2, -1, 1}};
|
|
|
|
std::vector<axis::variant<axis::variable<>, axis::regular<>>> std_vector4 = {
|
|
axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1}};
|
|
|
|
BOOST_TEST(detail::axes_equal(std_vector1, std_vector2));
|
|
BOOST_TEST_NOT(detail::axes_equal(std_vector2, std_vector3));
|
|
BOOST_TEST_NOT(detail::axes_equal(std_vector3, std_vector4));
|
|
|
|
auto tuple1 = std::make_tuple(axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1},
|
|
axis::category<>{{A, B, C}});
|
|
|
|
auto tuple2 = std::make_tuple(axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1},
|
|
axis::category<>{{A, B}});
|
|
|
|
auto tuple3 = std::make_tuple(axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1});
|
|
|
|
BOOST_TEST(detail::axes_equal(std_vector1, tuple1));
|
|
BOOST_TEST(detail::axes_equal(tuple1, std_vector1));
|
|
BOOST_TEST_NOT(detail::axes_equal(tuple1, tuple2));
|
|
BOOST_TEST_NOT(detail::axes_equal(tuple2, tuple3));
|
|
BOOST_TEST_NOT(detail::axes_equal(std_vector3, tuple3));
|
|
}
|
|
|
|
// axes_size
|
|
{
|
|
std::tuple<int, int> a;
|
|
std::vector<int> b(3);
|
|
std::array<int, 4> c;
|
|
BOOST_TEST_EQ(detail::axes_size(a), 2);
|
|
BOOST_TEST_EQ(detail::axes_size(b), 3);
|
|
BOOST_TEST_EQ(detail::axes_size(c), 4);
|
|
}
|
|
|
|
// sequence assign
|
|
{
|
|
enum { A, B, C, D };
|
|
std::vector<axis::variant<axis::regular<>, axis::variable<>, axis::category<>,
|
|
axis::integer<>>>
|
|
std_vector1 = {axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1},
|
|
axis::category<>{A, B, C}};
|
|
|
|
std::vector<axis::variant<axis::regular<>, axis::variable<>, axis::category<>>>
|
|
std_vector2 = {axis::regular<>{2, -2, 2}, axis::variable<>{-2, 0, 2},
|
|
axis::category<>{A, B}};
|
|
|
|
detail::axes_assign(std_vector2, std_vector1);
|
|
BOOST_TEST(detail::axes_equal(std_vector2, std_vector1));
|
|
|
|
auto tuple1 = std::make_tuple(axis::regular<>{2, -3, 3}, axis::variable<>{-3, 0, 3},
|
|
axis::category<>{A, B, C, D});
|
|
|
|
detail::axes_assign(tuple1, std_vector1);
|
|
BOOST_TEST(detail::axes_equal(tuple1, std_vector1));
|
|
|
|
decltype(std_vector1) std_vector3;
|
|
BOOST_TEST_NOT(detail::axes_equal(std_vector3, tuple1));
|
|
detail::axes_assign(std_vector3, tuple1);
|
|
BOOST_TEST(detail::axes_equal(std_vector3, tuple1));
|
|
|
|
auto tuple2 = std::make_tuple(axis::regular<>{2, -1, 1}, axis::variable<>{-1, 0, 1},
|
|
axis::category<>{A, B});
|
|
|
|
detail::axes_assign(tuple2, tuple1);
|
|
BOOST_TEST(detail::axes_equal(tuple2, tuple1));
|
|
}
|
|
|
|
// make_sub_axes
|
|
{
|
|
using boost::mp11::mp_list;
|
|
axis::integer<> a0(0, 1), a1(1, 2), a2(2, 3);
|
|
auto axes = std::make_tuple(a0, a1, a2);
|
|
BOOST_TEST_EQ(detail::make_sub_axes(axes, i0()), std::make_tuple(a0));
|
|
BOOST_TEST_EQ(detail::make_sub_axes(axes, i1()), std::make_tuple(a1));
|
|
BOOST_TEST_EQ(detail::make_sub_axes(axes, i2()), std::make_tuple(a2));
|
|
BOOST_TEST_EQ(detail::make_sub_axes(axes, i0(), i1()), std::make_tuple(a0, a1));
|
|
BOOST_TEST_EQ(detail::make_sub_axes(axes, i0(), i2()), std::make_tuple(a0, a2));
|
|
BOOST_TEST_EQ(detail::make_sub_axes(axes, i1(), i2()), std::make_tuple(a1, a2));
|
|
BOOST_TEST_EQ(detail::make_sub_axes(axes, i0(), i1(), i2()),
|
|
std::make_tuple(a0, a1, a2));
|
|
}
|
|
|
|
// is_set
|
|
{
|
|
std::vector<int> v({3, 1, 2});
|
|
BOOST_TEST(detail::is_set(v.begin(), v.end()));
|
|
v = {3, 1, 2, 1};
|
|
BOOST_TEST_NOT(detail::is_set(v.begin(), v.end()));
|
|
}
|
|
|
|
return boost::report_errors();
|
|
}
|