1 // Copyright 2015-2017 Hans Dembinski
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt
5 // or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7 #include <boost/core/lightweight_test.hpp>
8 #include <boost/histogram/axis/integer.hpp>
9 #include <boost/histogram/axis/ostream.hpp>
10 #include <boost/histogram/axis/regular.hpp>
11 #include <boost/histogram/histogram.hpp>
12 #include <boost/histogram/literals.hpp>
13 #include <boost/histogram/ostream.hpp>
14 #include <boost/histogram/storage_adaptor.hpp>
15 #include <boost/histogram/unlimited_storage.hpp>
16 #include <vector>
17 #include "throw_exception.hpp"
18 #include "utility_histogram.hpp"
19
20 using namespace boost::histogram;
21
22 template <typename T1, typename T2>
run_tests()23 void run_tests() {
24 // compare
25 {
26 auto a = make(T1{}, axis::regular<>{3, 0, 3}, axis::integer<>(0, 2));
27 auto b = make_s(T2{}, std::vector<unsigned>(), axis::regular<>{3, 0, 3},
28 axis::integer<>(0, 2));
29 BOOST_TEST_EQ(a, b);
30 auto b2 = make(T2{}, axis::integer<>{0, 3}, axis::integer<>(0, 2));
31 BOOST_TEST_NE(a, b2);
32 auto b3 = make(T2{}, axis::regular<>(3, 0, 4), axis::integer<>(0, 2));
33 BOOST_TEST_NE(a, b3);
34 }
35
36 // operators
37 {
38 auto a = make(T1{}, axis::integer<int, use_default, axis::option::none_t>{0, 2});
39 auto b = make(T2{}, axis::integer<int, use_default, axis::option::none_t>{0, 2});
40 BOOST_TEST_EQ(a, b);
41 a(0); // 1 0
42 b(1); // 0 1
43 a += b;
44 BOOST_TEST_EQ(a[0], 1);
45 BOOST_TEST_EQ(a[1], 1);
46 a *= b;
47 BOOST_TEST_EQ(a[0], 0);
48 BOOST_TEST_EQ(a[1], 1);
49 a -= b;
50 BOOST_TEST_EQ(a[0], 0);
51 BOOST_TEST_EQ(a[1], 0);
52 a[0] = 2;
53 a[1] = 4;
54 b[0] = 2;
55 b[1] = 2;
56 a /= b;
57 BOOST_TEST_EQ(a[0], 1);
58 BOOST_TEST_EQ(a[1], 2);
59
60 BOOST_TEST_THROWS(a += make(T2{}, axis::integer<>{0, 3}), std::invalid_argument);
61 BOOST_TEST_THROWS(a -= make(T2{}, axis::integer<>{0, 3}), std::invalid_argument);
62 BOOST_TEST_THROWS(a *= make(T2{}, axis::integer<>{0, 3}), std::invalid_argument);
63 BOOST_TEST_THROWS(a /= make(T2{}, axis::integer<>{0, 3}), std::invalid_argument);
64 }
65
66 // copy_assign
67 {
68 auto a = make(T1{}, axis::regular<>{3, 0, 3}, axis::integer<>{0, 2});
69 auto b = make_s(T2{}, std::vector<double>(), axis::regular<>{3, 0, 3},
70 axis::integer<>{0, 2});
71 a(1, 1);
72 BOOST_TEST_NE(a, b);
73 b = a;
74 BOOST_TEST_EQ(a, b);
75 }
76 }
77
main()78 int main() {
79 run_tests<static_tag, dynamic_tag>();
80 run_tests<dynamic_tag, static_tag>();
81
82 // copy assign
83 {
84 auto a = make(static_tag{}, axis::regular<>{3, 0, 3}, axis::integer<>{0, 2});
85 auto b = make(dynamic_tag{}, axis::regular<>{3, 0, 3}, axis::regular<>{2, 0, 2},
86 axis::integer<>{0, 2});
87 BOOST_TEST_THROWS(a = b, std::invalid_argument);
88 }
89
90 return boost::report_errors();
91 }
92