1 // Copyright 2015-2018 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/accumulators/ostream.hpp>
9 #include <boost/histogram/accumulators/sum.hpp>
10 #include "throw_exception.hpp"
11 #include "utility_str.hpp"
12
13 using namespace boost::histogram;
14 using namespace std::literals;
15
main()16 int main() {
17 double bad_sum = 0;
18 bad_sum += 1;
19 bad_sum += 1e100;
20 bad_sum += 1;
21 bad_sum += -1e100;
22 BOOST_TEST_EQ(bad_sum, 0); // instead of 2
23
24 using s_t = accumulators::sum<double>;
25 s_t sum;
26 ++sum;
27 BOOST_TEST_EQ(sum, 1);
28 BOOST_TEST_EQ(sum.value(), 1);
29 BOOST_TEST_EQ(sum.large(), 1);
30 BOOST_TEST_EQ(sum.small(), 0);
31 BOOST_TEST_EQ(str(sum), "sum(1 + 0)"s);
32 BOOST_TEST_EQ(str(sum, 15, false), " sum(1 + 0)"s);
33 BOOST_TEST_EQ(str(sum, 15, true), "sum(1 + 0) "s);
34
35 sum += 1e100;
36 BOOST_TEST_EQ(sum, (s_t{1e100, 1}));
37 ++sum;
38 BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
39 sum += -1e100;
40 BOOST_TEST_EQ(sum, (s_t{0, 2}));
41 BOOST_TEST_EQ(sum, 2); // correct answer
42 BOOST_TEST_EQ(sum.value(), 2);
43 BOOST_TEST_EQ(sum.large(), 0);
44 BOOST_TEST_EQ(sum.small(), 2);
45
46 sum = s_t{1e100, 1};
47 sum += s_t{1e100, 1};
48 BOOST_TEST_EQ(sum, (s_t{2e100, 2}));
49 sum = s_t{1e100, 1};
50 sum += s_t{1, 0};
51 BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
52 sum = s_t{1, 0};
53 sum += s_t{1e100, 1};
54 BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
55 sum = s_t{0, 1};
56 sum += s_t{1, 0};
57 BOOST_TEST_EQ(sum, (s_t{1, 1}));
58
59 accumulators::sum<double> a{3}, b{2}, c{3};
60 BOOST_TEST_LT(b, c);
61 BOOST_TEST_LE(b, c);
62 BOOST_TEST_LE(a, c);
63 BOOST_TEST_GT(a, b);
64 BOOST_TEST_GE(a, b);
65 BOOST_TEST_GE(a, c);
66
67 BOOST_TEST_EQ(s_t{} += s_t{}, s_t{});
68
69 return boost::report_errors();
70 }
71