xref: /netbsd-src/external/bsd/kyua-cli/dist/utils/datetime_test.cpp (revision 6b3a42af15b5e090c339512c790dd68f3d11a9d8)
1*6b3a42afSjmmv // Copyright 2010 Google Inc.
2*6b3a42afSjmmv // All rights reserved.
3*6b3a42afSjmmv //
4*6b3a42afSjmmv // Redistribution and use in source and binary forms, with or without
5*6b3a42afSjmmv // modification, are permitted provided that the following conditions are
6*6b3a42afSjmmv // met:
7*6b3a42afSjmmv //
8*6b3a42afSjmmv // * Redistributions of source code must retain the above copyright
9*6b3a42afSjmmv //   notice, this list of conditions and the following disclaimer.
10*6b3a42afSjmmv // * Redistributions in binary form must reproduce the above copyright
11*6b3a42afSjmmv //   notice, this list of conditions and the following disclaimer in the
12*6b3a42afSjmmv //   documentation and/or other materials provided with the distribution.
13*6b3a42afSjmmv // * Neither the name of Google Inc. nor the names of its contributors
14*6b3a42afSjmmv //   may be used to endorse or promote products derived from this software
15*6b3a42afSjmmv //   without specific prior written permission.
16*6b3a42afSjmmv //
17*6b3a42afSjmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*6b3a42afSjmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*6b3a42afSjmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*6b3a42afSjmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*6b3a42afSjmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*6b3a42afSjmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*6b3a42afSjmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*6b3a42afSjmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*6b3a42afSjmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*6b3a42afSjmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*6b3a42afSjmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*6b3a42afSjmmv 
29*6b3a42afSjmmv #include "utils/datetime.hpp"
30*6b3a42afSjmmv 
31*6b3a42afSjmmv extern "C" {
32*6b3a42afSjmmv #include <time.h>
33*6b3a42afSjmmv #include <unistd.h>
34*6b3a42afSjmmv }
35*6b3a42afSjmmv 
36*6b3a42afSjmmv #include <sstream>
37*6b3a42afSjmmv 
38*6b3a42afSjmmv #include <atf-c++.hpp>
39*6b3a42afSjmmv 
40*6b3a42afSjmmv namespace datetime = utils::datetime;
41*6b3a42afSjmmv 
42*6b3a42afSjmmv 
43*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__defaults);
ATF_TEST_CASE_BODY(delta__defaults)44*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__defaults)
45*6b3a42afSjmmv {
46*6b3a42afSjmmv     const datetime::delta delta;
47*6b3a42afSjmmv     ATF_REQUIRE_EQ(0, delta.seconds);
48*6b3a42afSjmmv     ATF_REQUIRE_EQ(0, delta.useconds);
49*6b3a42afSjmmv }
50*6b3a42afSjmmv 
51*6b3a42afSjmmv 
52*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__overrides);
ATF_TEST_CASE_BODY(delta__overrides)53*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__overrides)
54*6b3a42afSjmmv {
55*6b3a42afSjmmv     const datetime::delta delta(1, 2);
56*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, delta.seconds);
57*6b3a42afSjmmv     ATF_REQUIRE_EQ(2, delta.useconds);
58*6b3a42afSjmmv }
59*6b3a42afSjmmv 
60*6b3a42afSjmmv 
61*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__from_microseconds);
ATF_TEST_CASE_BODY(delta__from_microseconds)62*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__from_microseconds)
63*6b3a42afSjmmv {
64*6b3a42afSjmmv     {
65*6b3a42afSjmmv         const datetime::delta delta = datetime::delta::from_microseconds(0);
66*6b3a42afSjmmv         ATF_REQUIRE_EQ(0, delta.seconds);
67*6b3a42afSjmmv         ATF_REQUIRE_EQ(0, delta.useconds);
68*6b3a42afSjmmv     }
69*6b3a42afSjmmv     {
70*6b3a42afSjmmv         const datetime::delta delta = datetime::delta::from_microseconds(
71*6b3a42afSjmmv             999999);
72*6b3a42afSjmmv         ATF_REQUIRE_EQ(0, delta.seconds);
73*6b3a42afSjmmv         ATF_REQUIRE_EQ(999999, delta.useconds);
74*6b3a42afSjmmv     }
75*6b3a42afSjmmv     {
76*6b3a42afSjmmv         const datetime::delta delta = datetime::delta::from_microseconds(
77*6b3a42afSjmmv             1000000);
78*6b3a42afSjmmv         ATF_REQUIRE_EQ(1, delta.seconds);
79*6b3a42afSjmmv         ATF_REQUIRE_EQ(0, delta.useconds);
80*6b3a42afSjmmv     }
81*6b3a42afSjmmv     {
82*6b3a42afSjmmv         const datetime::delta delta = datetime::delta::from_microseconds(
83*6b3a42afSjmmv             10576293);
84*6b3a42afSjmmv         ATF_REQUIRE_EQ(10, delta.seconds);
85*6b3a42afSjmmv         ATF_REQUIRE_EQ(576293, delta.useconds);
86*6b3a42afSjmmv     }
87*6b3a42afSjmmv     {
88*6b3a42afSjmmv         const datetime::delta delta = datetime::delta::from_microseconds(
89*6b3a42afSjmmv             123456789123456);
90*6b3a42afSjmmv         ATF_REQUIRE_EQ(123456789, delta.seconds);
91*6b3a42afSjmmv         ATF_REQUIRE_EQ(123456, delta.useconds);
92*6b3a42afSjmmv     }
93*6b3a42afSjmmv }
94*6b3a42afSjmmv 
95*6b3a42afSjmmv 
96*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__to_microseconds);
ATF_TEST_CASE_BODY(delta__to_microseconds)97*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__to_microseconds)
98*6b3a42afSjmmv {
99*6b3a42afSjmmv     ATF_REQUIRE_EQ(0, datetime::delta(0, 0).to_microseconds());
100*6b3a42afSjmmv     ATF_REQUIRE_EQ(999999, datetime::delta(0, 999999).to_microseconds());
101*6b3a42afSjmmv     ATF_REQUIRE_EQ(1000000, datetime::delta(1, 0).to_microseconds());
102*6b3a42afSjmmv     ATF_REQUIRE_EQ(10576293, datetime::delta(10, 576293).to_microseconds());
103*6b3a42afSjmmv     ATF_REQUIRE_EQ(11576293, datetime::delta(10, 1576293).to_microseconds());
104*6b3a42afSjmmv }
105*6b3a42afSjmmv 
106*6b3a42afSjmmv 
107*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__equals);
ATF_TEST_CASE_BODY(delta__equals)108*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__equals)
109*6b3a42afSjmmv {
110*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta() == datetime::delta());
111*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta() == datetime::delta(0, 0));
112*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta(1, 2) == datetime::delta(1, 2));
113*6b3a42afSjmmv 
114*6b3a42afSjmmv     ATF_REQUIRE(!(datetime::delta() == datetime::delta(0, 1)));
115*6b3a42afSjmmv     ATF_REQUIRE(!(datetime::delta() == datetime::delta(1, 0)));
116*6b3a42afSjmmv     ATF_REQUIRE(!(datetime::delta(1, 2) == datetime::delta(2, 1)));
117*6b3a42afSjmmv }
118*6b3a42afSjmmv 
119*6b3a42afSjmmv 
120*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__differs);
ATF_TEST_CASE_BODY(delta__differs)121*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__differs)
122*6b3a42afSjmmv {
123*6b3a42afSjmmv     ATF_REQUIRE(!(datetime::delta() != datetime::delta()));
124*6b3a42afSjmmv     ATF_REQUIRE(!(datetime::delta() != datetime::delta(0, 0)));
125*6b3a42afSjmmv     ATF_REQUIRE(!(datetime::delta(1, 2) != datetime::delta(1, 2)));
126*6b3a42afSjmmv 
127*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta() != datetime::delta(0, 1));
128*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta() != datetime::delta(1, 0));
129*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta(1, 2) != datetime::delta(2, 1));
130*6b3a42afSjmmv }
131*6b3a42afSjmmv 
132*6b3a42afSjmmv 
133*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__addition);
ATF_TEST_CASE_BODY(delta__addition)134*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__addition)
135*6b3a42afSjmmv {
136*6b3a42afSjmmv     using datetime::delta;
137*6b3a42afSjmmv 
138*6b3a42afSjmmv     ATF_REQUIRE(delta() == delta() + delta());
139*6b3a42afSjmmv     ATF_REQUIRE(delta(0, 10) == delta() + delta(0, 10));
140*6b3a42afSjmmv     ATF_REQUIRE(delta(10, 0) == delta(10, 0) + delta());
141*6b3a42afSjmmv 
142*6b3a42afSjmmv     ATF_REQUIRE(delta(1, 234567) == delta(0, 1234567) + delta());
143*6b3a42afSjmmv     ATF_REQUIRE(delta(12, 34) == delta(10, 20) + delta(2, 14));
144*6b3a42afSjmmv }
145*6b3a42afSjmmv 
146*6b3a42afSjmmv 
147*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__addition_and_set);
ATF_TEST_CASE_BODY(delta__addition_and_set)148*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__addition_and_set)
149*6b3a42afSjmmv {
150*6b3a42afSjmmv     using datetime::delta;
151*6b3a42afSjmmv 
152*6b3a42afSjmmv     {
153*6b3a42afSjmmv         delta d;
154*6b3a42afSjmmv         d += delta(3, 5);
155*6b3a42afSjmmv         ATF_REQUIRE(delta(3, 5) == d);
156*6b3a42afSjmmv     }
157*6b3a42afSjmmv     {
158*6b3a42afSjmmv         delta d(1, 2);
159*6b3a42afSjmmv         d += delta(3, 5);
160*6b3a42afSjmmv         ATF_REQUIRE(delta(4, 7) == d);
161*6b3a42afSjmmv     }
162*6b3a42afSjmmv     {
163*6b3a42afSjmmv         delta d(1, 2);
164*6b3a42afSjmmv         ATF_REQUIRE(delta(4, 7) == (d += delta(3, 5)));
165*6b3a42afSjmmv     }
166*6b3a42afSjmmv }
167*6b3a42afSjmmv 
168*6b3a42afSjmmv 
169*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(delta__output);
ATF_TEST_CASE_BODY(delta__output)170*6b3a42afSjmmv ATF_TEST_CASE_BODY(delta__output)
171*6b3a42afSjmmv {
172*6b3a42afSjmmv     {
173*6b3a42afSjmmv         std::ostringstream str;
174*6b3a42afSjmmv         str << datetime::delta(15, 8791);
175*6b3a42afSjmmv         ATF_REQUIRE_EQ("15008791us", str.str());
176*6b3a42afSjmmv     }
177*6b3a42afSjmmv     {
178*6b3a42afSjmmv         std::ostringstream str;
179*6b3a42afSjmmv         str << datetime::delta(12345678, 0);
180*6b3a42afSjmmv         ATF_REQUIRE_EQ("12345678000000us", str.str());
181*6b3a42afSjmmv     }
182*6b3a42afSjmmv }
183*6b3a42afSjmmv 
184*6b3a42afSjmmv 
185*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__copy);
ATF_TEST_CASE_BODY(timestamp__copy)186*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__copy)
187*6b3a42afSjmmv {
188*6b3a42afSjmmv     const datetime::timestamp ts1 = datetime::timestamp::from_values(
189*6b3a42afSjmmv         2011, 2, 16, 19, 15, 30, 0);
190*6b3a42afSjmmv     {
191*6b3a42afSjmmv         const datetime::timestamp ts2 = ts1;
192*6b3a42afSjmmv         const datetime::timestamp ts3 = datetime::timestamp::from_values(
193*6b3a42afSjmmv             2012, 2, 16, 19, 15, 30, 0);
194*6b3a42afSjmmv         ATF_REQUIRE_EQ("2011", ts1.strftime("%Y"));
195*6b3a42afSjmmv         ATF_REQUIRE_EQ("2011", ts2.strftime("%Y"));
196*6b3a42afSjmmv         ATF_REQUIRE_EQ("2012", ts3.strftime("%Y"));
197*6b3a42afSjmmv     }
198*6b3a42afSjmmv     ATF_REQUIRE_EQ("2011", ts1.strftime("%Y"));
199*6b3a42afSjmmv }
200*6b3a42afSjmmv 
201*6b3a42afSjmmv 
202*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__from_microseconds);
ATF_TEST_CASE_BODY(timestamp__from_microseconds)203*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__from_microseconds)
204*6b3a42afSjmmv {
205*6b3a42afSjmmv     const datetime::timestamp ts = datetime::timestamp::from_microseconds(
206*6b3a42afSjmmv         1328829351987654LL);
207*6b3a42afSjmmv     ATF_REQUIRE_EQ("2012-02-09 23:15:51", ts.strftime("%Y-%m-%d %H:%M:%S"));
208*6b3a42afSjmmv     ATF_REQUIRE_EQ(1328829351987654LL, ts.to_microseconds());
209*6b3a42afSjmmv     ATF_REQUIRE_EQ(1328829351, ts.to_seconds());
210*6b3a42afSjmmv }
211*6b3a42afSjmmv 
212*6b3a42afSjmmv 
213*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__mock);
ATF_TEST_CASE_BODY(timestamp__now__mock)214*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__now__mock)
215*6b3a42afSjmmv {
216*6b3a42afSjmmv     datetime::set_mock_now(2011, 2, 21, 18, 5, 10, 0);
217*6b3a42afSjmmv     ATF_REQUIRE_EQ("2011-02-21 18:05:10",
218*6b3a42afSjmmv                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
219*6b3a42afSjmmv 
220*6b3a42afSjmmv     datetime::set_mock_now(2012, 3, 22, 19, 6, 11, 54321);
221*6b3a42afSjmmv     ATF_REQUIRE_EQ("2012-03-22 19:06:11",
222*6b3a42afSjmmv                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
223*6b3a42afSjmmv     ATF_REQUIRE_EQ("2012-03-22 19:06:11",
224*6b3a42afSjmmv                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
225*6b3a42afSjmmv }
226*6b3a42afSjmmv 
227*6b3a42afSjmmv 
228*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__real);
ATF_TEST_CASE_BODY(timestamp__now__real)229*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__now__real)
230*6b3a42afSjmmv {
231*6b3a42afSjmmv     // This test is might fail if we happen to run at the crossing of one
232*6b3a42afSjmmv     // day to the other and the two measures we pick of the current time
233*6b3a42afSjmmv     // differ.  This is so unlikely that I haven't bothered to do this in any
234*6b3a42afSjmmv     // other way.
235*6b3a42afSjmmv 
236*6b3a42afSjmmv     const time_t just_before = ::time(NULL);
237*6b3a42afSjmmv     const datetime::timestamp now = datetime::timestamp::now();
238*6b3a42afSjmmv 
239*6b3a42afSjmmv     ::tm data;
240*6b3a42afSjmmv     char buf[1024];
241*6b3a42afSjmmv     ATF_REQUIRE(::gmtime_r(&just_before, &data) != 0);
242*6b3a42afSjmmv     ATF_REQUIRE(::strftime(buf, sizeof(buf), "%Y-%m-%d", &data) != 0);
243*6b3a42afSjmmv     ATF_REQUIRE_EQ(buf, now.strftime("%Y-%m-%d"));
244*6b3a42afSjmmv 
245*6b3a42afSjmmv     ATF_REQUIRE(now.strftime("%Z") == "GMT" || now.strftime("%Z") == "UTC");
246*6b3a42afSjmmv }
247*6b3a42afSjmmv 
248*6b3a42afSjmmv 
249*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__granularity);
ATF_TEST_CASE_BODY(timestamp__now__granularity)250*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__now__granularity)
251*6b3a42afSjmmv {
252*6b3a42afSjmmv     const datetime::timestamp first = datetime::timestamp::now();
253*6b3a42afSjmmv     ::usleep(1);
254*6b3a42afSjmmv     const datetime::timestamp second = datetime::timestamp::now();
255*6b3a42afSjmmv     ATF_REQUIRE(first.to_microseconds() != second.to_microseconds());
256*6b3a42afSjmmv }
257*6b3a42afSjmmv 
258*6b3a42afSjmmv 
259*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__strftime);
ATF_TEST_CASE_BODY(timestamp__strftime)260*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__strftime)
261*6b3a42afSjmmv {
262*6b3a42afSjmmv     const datetime::timestamp ts1 = datetime::timestamp::from_values(
263*6b3a42afSjmmv         2010, 12, 10, 8, 45, 50, 0);
264*6b3a42afSjmmv     ATF_REQUIRE_EQ("2010-12-10", ts1.strftime("%Y-%m-%d"));
265*6b3a42afSjmmv     ATF_REQUIRE_EQ("08:45:50", ts1.strftime("%H:%M:%S"));
266*6b3a42afSjmmv 
267*6b3a42afSjmmv     const datetime::timestamp ts2 = datetime::timestamp::from_values(
268*6b3a42afSjmmv         2011, 2, 16, 19, 15, 30, 0);
269*6b3a42afSjmmv     ATF_REQUIRE_EQ("2011-02-16T19:15:30", ts2.strftime("%Y-%m-%dT%H:%M:%S"));
270*6b3a42afSjmmv }
271*6b3a42afSjmmv 
272*6b3a42afSjmmv 
273*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_microseconds);
ATF_TEST_CASE_BODY(timestamp__to_microseconds)274*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__to_microseconds)
275*6b3a42afSjmmv {
276*6b3a42afSjmmv     const datetime::timestamp ts1 = datetime::timestamp::from_values(
277*6b3a42afSjmmv         2010, 12, 10, 8, 45, 50, 123456);
278*6b3a42afSjmmv     ATF_REQUIRE_EQ(1291970750123456LL, ts1.to_microseconds());
279*6b3a42afSjmmv }
280*6b3a42afSjmmv 
281*6b3a42afSjmmv 
282*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_seconds);
ATF_TEST_CASE_BODY(timestamp__to_seconds)283*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__to_seconds)
284*6b3a42afSjmmv {
285*6b3a42afSjmmv     const datetime::timestamp ts1 = datetime::timestamp::from_values(
286*6b3a42afSjmmv         2010, 12, 10, 8, 45, 50, 123456);
287*6b3a42afSjmmv     ATF_REQUIRE_EQ(1291970750, ts1.to_seconds());
288*6b3a42afSjmmv }
289*6b3a42afSjmmv 
290*6b3a42afSjmmv 
291*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__leap_second);
ATF_TEST_CASE_BODY(timestamp__leap_second)292*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__leap_second)
293*6b3a42afSjmmv {
294*6b3a42afSjmmv     // This is actually a test for from_values(), which is the function that
295*6b3a42afSjmmv     // includes assertions to validate the input parameters.
296*6b3a42afSjmmv     const datetime::timestamp ts1 = datetime::timestamp::from_values(
297*6b3a42afSjmmv         2012, 6, 30, 23, 59, 60, 543);
298*6b3a42afSjmmv     ATF_REQUIRE_EQ(1341100800, ts1.to_seconds());
299*6b3a42afSjmmv }
300*6b3a42afSjmmv 
301*6b3a42afSjmmv 
302*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__equals);
ATF_TEST_CASE_BODY(timestamp__equals)303*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__equals)
304*6b3a42afSjmmv {
305*6b3a42afSjmmv     ATF_REQUIRE(datetime::timestamp::from_microseconds(1291970750123456LL) ==
306*6b3a42afSjmmv                 datetime::timestamp::from_microseconds(1291970750123456LL));
307*6b3a42afSjmmv }
308*6b3a42afSjmmv 
309*6b3a42afSjmmv 
310*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__differs);
ATF_TEST_CASE_BODY(timestamp__differs)311*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__differs)
312*6b3a42afSjmmv {
313*6b3a42afSjmmv     ATF_REQUIRE(datetime::timestamp::from_microseconds(1291970750123456LL) !=
314*6b3a42afSjmmv                 datetime::timestamp::from_microseconds(1291970750123455LL));
315*6b3a42afSjmmv }
316*6b3a42afSjmmv 
317*6b3a42afSjmmv 
318*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__subtraction);
ATF_TEST_CASE_BODY(timestamp__subtraction)319*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__subtraction)
320*6b3a42afSjmmv {
321*6b3a42afSjmmv     const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
322*6b3a42afSjmmv         1291970750123456LL);
323*6b3a42afSjmmv     const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
324*6b3a42afSjmmv         1291970750123468LL);
325*6b3a42afSjmmv     const datetime::timestamp ts3 = datetime::timestamp::from_microseconds(
326*6b3a42afSjmmv         1291970850123456LL);
327*6b3a42afSjmmv 
328*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta(0, 0) == ts1 - ts1);
329*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta(0, 12) == ts2 - ts1);
330*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta(100, 0) == ts3 - ts1);
331*6b3a42afSjmmv     ATF_REQUIRE(datetime::delta(99, 999988) == ts3 - ts2);
332*6b3a42afSjmmv }
333*6b3a42afSjmmv 
334*6b3a42afSjmmv 
335*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(timestamp__output);
ATF_TEST_CASE_BODY(timestamp__output)336*6b3a42afSjmmv ATF_TEST_CASE_BODY(timestamp__output)
337*6b3a42afSjmmv {
338*6b3a42afSjmmv     {
339*6b3a42afSjmmv         std::ostringstream str;
340*6b3a42afSjmmv         str << datetime::timestamp::from_microseconds(1291970750123456LL);
341*6b3a42afSjmmv         ATF_REQUIRE_EQ("1291970750123456us", str.str());
342*6b3a42afSjmmv     }
343*6b3a42afSjmmv     {
344*6b3a42afSjmmv         std::ostringstream str;
345*6b3a42afSjmmv         str << datetime::timestamp::from_microseconds(1028309798759812LL);
346*6b3a42afSjmmv         ATF_REQUIRE_EQ("1028309798759812us", str.str());
347*6b3a42afSjmmv     }
348*6b3a42afSjmmv }
349*6b3a42afSjmmv 
350*6b3a42afSjmmv 
ATF_INIT_TEST_CASES(tcs)351*6b3a42afSjmmv ATF_INIT_TEST_CASES(tcs)
352*6b3a42afSjmmv {
353*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__defaults);
354*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__overrides);
355*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__from_microseconds);
356*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__to_microseconds);
357*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__equals);
358*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__differs);
359*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__addition);
360*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__addition_and_set);
361*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, delta__output);
362*6b3a42afSjmmv 
363*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__copy);
364*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__from_microseconds);
365*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__now__mock);
366*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__now__real);
367*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__now__granularity);
368*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__strftime);
369*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__to_microseconds);
370*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__to_seconds);
371*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__leap_second);
372*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__equals);
373*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__differs);
374*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__subtraction);
375*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, timestamp__output);
376*6b3a42afSjmmv }
377