]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc. |
2 | * Use, modification and distribution is subject to the | |
3 | * Boost Software License, Version 1.0. (See accompanying | |
4 | * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) | |
5 | * Author: Jeff Garland, Bart Garst | |
6 | */ | |
7 | ||
8 | #include "boost/date_time/wrapping_int.hpp" | |
9 | //#define BOOST_INCLUDE_MAIN | |
10 | //#include <boost/test/test_tools.hpp> | |
11 | #include "testfrmwk.hpp" | |
12 | #include "boost/cstdint.hpp" | |
13 | #include <iostream> | |
14 | ||
15 | ||
16 | int | |
17 | main() | |
18 | // int | |
19 | // test_main(int, char*[]) | |
20 | { | |
21 | using namespace boost::date_time; | |
22 | ||
23 | wrapping_int<int, 3600> wi(3599); | |
24 | check("construction/conversion", wi == 3599); | |
25 | check("add with wrap", wi.add(1) == 1); | |
26 | check("added value ok", wi == 0); | |
27 | check("add with 2 wraps", wi.add(7201) == 2); | |
28 | check("added value ok", wi == 1); | |
29 | check("add with 3 wraps", wi.add(10800) == 3); | |
30 | check("added value ok", wi == 1); | |
31 | check("subtract no wrap", wi.subtract(1) == 0); | |
32 | check("subtract val ok", wi == 0); | |
33 | check("subtract no wrap", wi.subtract(3601) == 2); | |
34 | check("subtract val ok", wi == 3599); | |
35 | check("add again", (wi.add(2) == 1) && (wi == 1)); | |
36 | check("subtract again", (wi.subtract(2) == 1) && (wi == 3599)); | |
37 | check("add again", (wi.add(2) == 1) && (wi == 1)); | |
38 | check("subtract again", (wi.subtract(3600) == 1) && (wi == 1)); | |
39 | check("subtract again", (wi.subtract(3599) == 1) && (wi == 2)); | |
40 | check("subtract again", (wi.subtract(1) == 0) && (wi == 1)); | |
41 | std::cout << wi << std::endl; | |
42 | ||
43 | wrapping_int<short, 60> wi2(0); | |
44 | check("add with wrap - return", wi2.add(121) == 2); | |
45 | check("add with wrap - value", wi2 == 1); | |
46 | ||
47 | wrapping_int<short, 60> wi3(-5); | |
48 | check("signed int - add return", wi3.add(5) == 0); | |
49 | check("signed int - value", wi3 == 0); | |
50 | ||
51 | { // subtracting negative values | |
11fdf7f2 | 52 | wrapping_int<short, 10> wi4(5); |
7c673cae | 53 | check("subtract negative value to cause wrap", |
11fdf7f2 TL |
54 | (wi4.subtract(-8) == -1 && wi4 == 3)); |
55 | check("reset", wi4.add(2) == 0 && wi4 ==5); | |
7c673cae | 56 | check("add negative value to cause wrap", |
11fdf7f2 | 57 | (wi4.add(-8) == -1 && wi4 == 7)); |
7c673cae FG |
58 | } |
59 | ||
60 | wrapping_int2<short, 1, 5> wi4(1); | |
61 | check("construct", wi4 == 1); | |
62 | check("add up to wrap value", (wi4.add(4) == 0 && wi4 == 5)); | |
63 | check("add over the wrap value", (wi4.add(1) == 1 && wi4 == 1)); | |
64 | check("add over the wrap value X 2", (wi4.add(10) == 2 && wi4 == 1)); | |
65 | check("add over the wrap value X 3", (wi4.add(15) == 3 && wi4 == 1)); | |
66 | ||
67 | wrapping_int2<short, 1, 12> wi5(12); | |
68 | check("construct", wi5 == 12); | |
69 | check("add over the wrap value", (wi5.add(1) == 1 && wi5 == 1)); | |
70 | ||
71 | check("subtract of the wrap value", (wi5.subtract(1) == -1 && wi5 == 12)); | |
72 | check("subtract of the wrap value", (wi5.subtract(13) == -1 && wi5 == 11)); | |
73 | ||
74 | // min_values other than 1 | |
75 | wrapping_int2<short, 2, 6> wi6(2); | |
76 | check("construct", wi6 == 2); | |
77 | check("add up to wrap value", (wi6.add(4) == 0 && wi6 == 6)); | |
78 | check("add over the wrap value", (wi6.add(1) == 1 && wi6 == 2)); | |
79 | check("add over the wrap value X 2", wi6.add(11) == 2); | |
80 | check("add over the wrap value X 2", wi6 == 3); | |
81 | check("sub down to wrap value", wi6.subtract(1) == 0 && wi6 == 2); | |
82 | check("sub under the wrap value", wi6.subtract(1) == -1 && wi6 == 6); | |
83 | check("sub under the wrap value X 2", wi6.subtract(11) == -2 && wi6 == 5); | |
84 | //std::cout << wi6 << std::endl; | |
85 | ||
86 | // adding & subtracting negative values | |
87 | wrapping_int2<short, 1, 12> wi7(6); | |
88 | wrapping_int2<short, -5, 5> wi8(0); | |
89 | check("add negative value", (wi7.add(-2) == 0 && wi7 == 4)); | |
90 | check("add negative value", (wi8.add(-2) == 0 && wi8 == -2)); | |
91 | check("add negative value to cause single wrap", | |
92 | (wi7.add(-6) == -1 && wi7 == 10)); | |
93 | check("add negative value to cause single wrap", | |
94 | (wi8.add(-5) == -1 && wi8 == 4)); | |
95 | check("add negative value to cause multiple wrap", | |
96 | (wi7.add(-22) == -2 && wi7 == 12)); | |
97 | check("add negative value to cause multiple wrap", | |
98 | (wi8.add(-22) == -2 && wi8 == 4)); | |
99 | // reset values to mid range | |
100 | wi7.subtract(6); | |
101 | check("reset", wi7 == 6); | |
102 | wi8.subtract(4); | |
103 | check("reset", wi8 == 0); | |
104 | check("subtract negative value", (wi7.subtract(-2) == 0 && wi7 == 8)); | |
105 | check("subtract negative value", (wi8.subtract(-2) == 0 && wi8 == 2)); | |
106 | check("subtract negative value to cause single wrap", | |
107 | (wi7.subtract(-6) == 1 && wi7 == 2)); | |
108 | check("subtract negative value to cause single wrap", | |
109 | (wi8.subtract(-5) == 1 && wi8 == -4)); | |
110 | check("subtract negative value to cause multiple wrap", | |
111 | (wi7.subtract(-23) == 2 && wi7 == 1)); | |
112 | check("subtract negative value to cause multiple wrap", | |
113 | (wi8.subtract(-22) == 2 && wi8 == -4)); | |
114 | ||
115 | // #ifdef BOOST_HAS_LONG_LONG | |
116 | // wrapping_int<boost::int64_t, 86400*100000LL> wi4(0); | |
117 | // check("construction/conversion", wi4 == 0); | |
118 | // boost::int64_t off2 = 372300000; | |
119 | // boost::int64_t wrap = 86400LL*100000LL; | |
120 | // boost::int64_t wrap2 = 86400000000; | |
121 | // wrapping_int<boost::int64_t,86400000000LL> wi5((3600*1 + 60*2 + 3)*100000); | |
122 | // std::cout << wi5 << std::endl; | |
123 | // boost::int64_t over = wi4.add(off2); | |
124 | // std::cout << over << std::endl; | |
125 | // std::cout << wrap << std::endl; | |
126 | // std::cout << wrap2 << std::endl; | |
127 | // // check("construction/conversion", wi4 == 0); | |
128 | // #endif | |
129 | ||
130 | // wrapping_int<int, 60> wi(121); | |
131 | // check("construction/conversion", wi == 121); | |
132 | // check("add with wrap", wi.add(1) == 1); | |
133 | ||
134 | return printTestStats(); | |
135 | ||
136 | } | |
137 | ||
138 |