• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
main()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
52     wrapping_int<short, 10> wi4(5);
53     check("subtract negative value to cause wrap",
54           (wi4.subtract(-8) == -1 && wi4 == 3));
55     check("reset", wi4.add(2) == 0 && wi4 ==5);
56     check("add negative value to cause wrap",
57           (wi4.add(-8) == -1 && wi4 == 7));
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 
139