• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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