xref: /freebsd-src/contrib/kyua/utils/datetime_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2010 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis //   documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis //   may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis //   without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis 
29*b0d29bc4SBrooks Davis #include "utils/datetime.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <time.h>
33*b0d29bc4SBrooks Davis #include <unistd.h>
34*b0d29bc4SBrooks Davis }
35*b0d29bc4SBrooks Davis 
36*b0d29bc4SBrooks Davis #include <sstream>
37*b0d29bc4SBrooks Davis #include <stdexcept>
38*b0d29bc4SBrooks Davis 
39*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
40*b0d29bc4SBrooks Davis 
41*b0d29bc4SBrooks Davis namespace datetime = utils::datetime;
42*b0d29bc4SBrooks Davis 
43*b0d29bc4SBrooks Davis 
44*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__defaults);
45*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__defaults)
46*b0d29bc4SBrooks Davis {
47*b0d29bc4SBrooks Davis     const datetime::delta delta;
48*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0, delta.seconds);
49*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0, delta.useconds);
50*b0d29bc4SBrooks Davis }
51*b0d29bc4SBrooks Davis 
52*b0d29bc4SBrooks Davis 
53*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__overrides);
54*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__overrides)
55*b0d29bc4SBrooks Davis {
56*b0d29bc4SBrooks Davis     const datetime::delta delta(1, 2);
57*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, delta.seconds);
58*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(2, delta.useconds);
59*b0d29bc4SBrooks Davis 
60*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(
61*b0d29bc4SBrooks Davis         std::runtime_error, "Negative.*not supported.*-4999997us",
62*b0d29bc4SBrooks Davis         datetime::delta(-5, 3));
63*b0d29bc4SBrooks Davis }
64*b0d29bc4SBrooks Davis 
65*b0d29bc4SBrooks Davis 
66*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__from_microseconds);
67*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__from_microseconds)
68*b0d29bc4SBrooks Davis {
69*b0d29bc4SBrooks Davis     {
70*b0d29bc4SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(0);
71*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(0, delta.seconds);
72*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(0, delta.useconds);
73*b0d29bc4SBrooks Davis     }
74*b0d29bc4SBrooks Davis     {
75*b0d29bc4SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
76*b0d29bc4SBrooks Davis             999999);
77*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(0, delta.seconds);
78*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(999999, delta.useconds);
79*b0d29bc4SBrooks Davis     }
80*b0d29bc4SBrooks Davis     {
81*b0d29bc4SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
82*b0d29bc4SBrooks Davis             1000000);
83*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(1, delta.seconds);
84*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(0, delta.useconds);
85*b0d29bc4SBrooks Davis     }
86*b0d29bc4SBrooks Davis     {
87*b0d29bc4SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
88*b0d29bc4SBrooks Davis             10576293);
89*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(10, delta.seconds);
90*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(576293, delta.useconds);
91*b0d29bc4SBrooks Davis     }
92*b0d29bc4SBrooks Davis     {
93*b0d29bc4SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
94*b0d29bc4SBrooks Davis             123456789123456LL);
95*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(123456789, delta.seconds);
96*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(123456, delta.useconds);
97*b0d29bc4SBrooks Davis     }
98*b0d29bc4SBrooks Davis 
99*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(
100*b0d29bc4SBrooks Davis         std::runtime_error, "Negative.*not supported.*-12345us",
101*b0d29bc4SBrooks Davis         datetime::delta::from_microseconds(-12345));
102*b0d29bc4SBrooks Davis }
103*b0d29bc4SBrooks Davis 
104*b0d29bc4SBrooks Davis 
105*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__to_microseconds);
106*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__to_microseconds)
107*b0d29bc4SBrooks Davis {
108*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0, datetime::delta(0, 0).to_microseconds());
109*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(999999, datetime::delta(0, 999999).to_microseconds());
110*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1000000, datetime::delta(1, 0).to_microseconds());
111*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(10576293, datetime::delta(10, 576293).to_microseconds());
112*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(11576293, datetime::delta(10, 1576293).to_microseconds());
113*b0d29bc4SBrooks Davis }
114*b0d29bc4SBrooks Davis 
115*b0d29bc4SBrooks Davis 
116*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__equals);
117*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__equals)
118*b0d29bc4SBrooks Davis {
119*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::delta() == datetime::delta());
120*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::delta() == datetime::delta(0, 0));
121*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::delta(1, 2) == datetime::delta(1, 2));
122*b0d29bc4SBrooks Davis 
123*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta() == datetime::delta(0, 1)));
124*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta() == datetime::delta(1, 0)));
125*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(1, 2) == datetime::delta(2, 1)));
126*b0d29bc4SBrooks Davis }
127*b0d29bc4SBrooks Davis 
128*b0d29bc4SBrooks Davis 
129*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__differs);
130*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__differs)
131*b0d29bc4SBrooks Davis {
132*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta() != datetime::delta()));
133*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta() != datetime::delta(0, 0)));
134*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(1, 2) != datetime::delta(1, 2)));
135*b0d29bc4SBrooks Davis 
136*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::delta() != datetime::delta(0, 1));
137*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::delta() != datetime::delta(1, 0));
138*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::delta(1, 2) != datetime::delta(2, 1));
139*b0d29bc4SBrooks Davis }
140*b0d29bc4SBrooks Davis 
141*b0d29bc4SBrooks Davis 
142*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__sorting);
143*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__sorting)
144*b0d29bc4SBrooks Davis {
145*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta() <  datetime::delta()));
146*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta() <= datetime::delta());
147*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta() >  datetime::delta()));
148*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta() >= datetime::delta());
149*b0d29bc4SBrooks Davis 
150*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(9, 8) <  datetime::delta(9, 8)));
151*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(9, 8) <= datetime::delta(9, 8));
152*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(9, 8) >  datetime::delta(9, 8)));
153*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(9, 8) >= datetime::delta(9, 8));
154*b0d29bc4SBrooks Davis 
155*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <  datetime::delta(4, 8));
156*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <= datetime::delta(4, 8));
157*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >  datetime::delta(4, 8)));
158*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >= datetime::delta(4, 8)));
159*b0d29bc4SBrooks Davis 
160*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <  datetime::delta(2, 8));
161*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <= datetime::delta(2, 8));
162*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >  datetime::delta(2, 8)));
163*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >= datetime::delta(2, 8)));
164*b0d29bc4SBrooks Davis 
165*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(4, 8) <  datetime::delta(2, 5)));
166*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(4, 8) <= datetime::delta(2, 5)));
167*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(4, 8) >  datetime::delta(2, 5));
168*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(4, 8) >= datetime::delta(2, 5));
169*b0d29bc4SBrooks Davis 
170*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 8) <  datetime::delta(2, 5)));
171*b0d29bc4SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 8) <= datetime::delta(2, 5)));
172*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 8) >  datetime::delta(2, 5));
173*b0d29bc4SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 8) >= datetime::delta(2, 5));
174*b0d29bc4SBrooks Davis }
175*b0d29bc4SBrooks Davis 
176*b0d29bc4SBrooks Davis 
177*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__addition);
178*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__addition)
179*b0d29bc4SBrooks Davis {
180*b0d29bc4SBrooks Davis     using datetime::delta;
181*b0d29bc4SBrooks Davis 
182*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(), delta() + delta());
183*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(0, 10), delta() + delta(0, 10));
184*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(10, 0), delta(10, 0) + delta());
185*b0d29bc4SBrooks Davis 
186*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(1, 234567), delta(0, 1234567) + delta());
187*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(12, 34), delta(10, 20) + delta(2, 14));
188*b0d29bc4SBrooks Davis }
189*b0d29bc4SBrooks Davis 
190*b0d29bc4SBrooks Davis 
191*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__addition_and_set);
192*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__addition_and_set)
193*b0d29bc4SBrooks Davis {
194*b0d29bc4SBrooks Davis     using datetime::delta;
195*b0d29bc4SBrooks Davis 
196*b0d29bc4SBrooks Davis     {
197*b0d29bc4SBrooks Davis         delta d;
198*b0d29bc4SBrooks Davis         d += delta(3, 5);
199*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(delta(3, 5), d);
200*b0d29bc4SBrooks Davis     }
201*b0d29bc4SBrooks Davis     {
202*b0d29bc4SBrooks Davis         delta d(1, 2);
203*b0d29bc4SBrooks Davis         d += delta(3, 5);
204*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(delta(4, 7), d);
205*b0d29bc4SBrooks Davis     }
206*b0d29bc4SBrooks Davis     {
207*b0d29bc4SBrooks Davis         delta d(1, 2);
208*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(delta(4, 7), (d += delta(3, 5)));
209*b0d29bc4SBrooks Davis     }
210*b0d29bc4SBrooks Davis }
211*b0d29bc4SBrooks Davis 
212*b0d29bc4SBrooks Davis 
213*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__scale);
214*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__scale)
215*b0d29bc4SBrooks Davis {
216*b0d29bc4SBrooks Davis     using datetime::delta;
217*b0d29bc4SBrooks Davis 
218*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(), delta() * 0);
219*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(), delta() * 5);
220*b0d29bc4SBrooks Davis 
221*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(0, 30), delta(0, 10) * 3);
222*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(delta(17, 500000), delta(3, 500000) * 5);
223*b0d29bc4SBrooks Davis }
224*b0d29bc4SBrooks Davis 
225*b0d29bc4SBrooks Davis 
226*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__scale_and_set);
227*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__scale_and_set)
228*b0d29bc4SBrooks Davis {
229*b0d29bc4SBrooks Davis     using datetime::delta;
230*b0d29bc4SBrooks Davis 
231*b0d29bc4SBrooks Davis     {
232*b0d29bc4SBrooks Davis         delta d(3, 5);
233*b0d29bc4SBrooks Davis         d *= 2;
234*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(delta(6, 10), d);
235*b0d29bc4SBrooks Davis     }
236*b0d29bc4SBrooks Davis     {
237*b0d29bc4SBrooks Davis         delta d(8, 0);
238*b0d29bc4SBrooks Davis         d *= 8;
239*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(delta(64, 0), d);
240*b0d29bc4SBrooks Davis     }
241*b0d29bc4SBrooks Davis     {
242*b0d29bc4SBrooks Davis         delta d(3, 5);
243*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(delta(9, 15), (d *= 3));
244*b0d29bc4SBrooks Davis     }
245*b0d29bc4SBrooks Davis }
246*b0d29bc4SBrooks Davis 
247*b0d29bc4SBrooks Davis 
248*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__output);
249*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(delta__output)
250*b0d29bc4SBrooks Davis {
251*b0d29bc4SBrooks Davis     {
252*b0d29bc4SBrooks Davis         std::ostringstream str;
253*b0d29bc4SBrooks Davis         str << datetime::delta(15, 8791);
254*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("15008791us", str.str());
255*b0d29bc4SBrooks Davis     }
256*b0d29bc4SBrooks Davis     {
257*b0d29bc4SBrooks Davis         std::ostringstream str;
258*b0d29bc4SBrooks Davis         str << datetime::delta(12345678, 0);
259*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("12345678000000us", str.str());
260*b0d29bc4SBrooks Davis     }
261*b0d29bc4SBrooks Davis }
262*b0d29bc4SBrooks Davis 
263*b0d29bc4SBrooks Davis 
264*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__copy);
265*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__copy)
266*b0d29bc4SBrooks Davis {
267*b0d29bc4SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
268*b0d29bc4SBrooks Davis         2011, 2, 16, 19, 15, 30, 0);
269*b0d29bc4SBrooks Davis     {
270*b0d29bc4SBrooks Davis         const datetime::timestamp ts2 = ts1;
271*b0d29bc4SBrooks Davis         const datetime::timestamp ts3 = datetime::timestamp::from_values(
272*b0d29bc4SBrooks Davis             2012, 2, 16, 19, 15, 30, 0);
273*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("2011", ts1.strftime("%Y"));
274*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("2011", ts2.strftime("%Y"));
275*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("2012", ts3.strftime("%Y"));
276*b0d29bc4SBrooks Davis     }
277*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2011", ts1.strftime("%Y"));
278*b0d29bc4SBrooks Davis }
279*b0d29bc4SBrooks Davis 
280*b0d29bc4SBrooks Davis 
281*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__from_microseconds);
282*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__from_microseconds)
283*b0d29bc4SBrooks Davis {
284*b0d29bc4SBrooks Davis     const datetime::timestamp ts = datetime::timestamp::from_microseconds(
285*b0d29bc4SBrooks Davis         1328829351987654LL);
286*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2012-02-09 23:15:51", ts.strftime("%Y-%m-%d %H:%M:%S"));
287*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1328829351987654LL, ts.to_microseconds());
288*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1328829351, ts.to_seconds());
289*b0d29bc4SBrooks Davis }
290*b0d29bc4SBrooks Davis 
291*b0d29bc4SBrooks Davis 
292*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__mock);
293*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__now__mock)
294*b0d29bc4SBrooks Davis {
295*b0d29bc4SBrooks Davis     datetime::set_mock_now(2011, 2, 21, 18, 5, 10, 0);
296*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2011-02-21 18:05:10",
297*b0d29bc4SBrooks Davis                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
298*b0d29bc4SBrooks Davis 
299*b0d29bc4SBrooks Davis     datetime::set_mock_now(datetime::timestamp::from_values(
300*b0d29bc4SBrooks Davis                                2012, 3, 22, 19, 6, 11, 54321));
301*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2012-03-22 19:06:11",
302*b0d29bc4SBrooks Davis                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
303*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2012-03-22 19:06:11",
304*b0d29bc4SBrooks Davis                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
305*b0d29bc4SBrooks Davis }
306*b0d29bc4SBrooks Davis 
307*b0d29bc4SBrooks Davis 
308*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__real);
309*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__now__real)
310*b0d29bc4SBrooks Davis {
311*b0d29bc4SBrooks Davis     // This test is might fail if we happen to run at the crossing of one
312*b0d29bc4SBrooks Davis     // day to the other and the two measures we pick of the current time
313*b0d29bc4SBrooks Davis     // differ.  This is so unlikely that I haven't bothered to do this in any
314*b0d29bc4SBrooks Davis     // other way.
315*b0d29bc4SBrooks Davis 
316*b0d29bc4SBrooks Davis     const time_t just_before = ::time(NULL);
317*b0d29bc4SBrooks Davis     const datetime::timestamp now = datetime::timestamp::now();
318*b0d29bc4SBrooks Davis 
319*b0d29bc4SBrooks Davis     ::tm data;
320*b0d29bc4SBrooks Davis     char buf[1024];
321*b0d29bc4SBrooks Davis     ATF_REQUIRE(::gmtime_r(&just_before, &data) != 0);
322*b0d29bc4SBrooks Davis     ATF_REQUIRE(::strftime(buf, sizeof(buf), "%Y-%m-%d", &data) != 0);
323*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(buf, now.strftime("%Y-%m-%d"));
324*b0d29bc4SBrooks Davis 
325*b0d29bc4SBrooks Davis     ATF_REQUIRE(now.strftime("%Z") == "GMT" || now.strftime("%Z") == "UTC");
326*b0d29bc4SBrooks Davis }
327*b0d29bc4SBrooks Davis 
328*b0d29bc4SBrooks Davis 
329*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__granularity);
330*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__now__granularity)
331*b0d29bc4SBrooks Davis {
332*b0d29bc4SBrooks Davis     const datetime::timestamp first = datetime::timestamp::now();
333*b0d29bc4SBrooks Davis     ::usleep(1);
334*b0d29bc4SBrooks Davis     const datetime::timestamp second = datetime::timestamp::now();
335*b0d29bc4SBrooks Davis     ATF_REQUIRE(first.to_microseconds() != second.to_microseconds());
336*b0d29bc4SBrooks Davis }
337*b0d29bc4SBrooks Davis 
338*b0d29bc4SBrooks Davis 
339*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__strftime);
340*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__strftime)
341*b0d29bc4SBrooks Davis {
342*b0d29bc4SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
343*b0d29bc4SBrooks Davis         2010, 12, 10, 8, 45, 50, 0);
344*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2010-12-10", ts1.strftime("%Y-%m-%d"));
345*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("08:45:50", ts1.strftime("%H:%M:%S"));
346*b0d29bc4SBrooks Davis 
347*b0d29bc4SBrooks Davis     const datetime::timestamp ts2 = datetime::timestamp::from_values(
348*b0d29bc4SBrooks Davis         2011, 2, 16, 19, 15, 30, 0);
349*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2011-02-16T19:15:30", ts2.strftime("%Y-%m-%dT%H:%M:%S"));
350*b0d29bc4SBrooks Davis }
351*b0d29bc4SBrooks Davis 
352*b0d29bc4SBrooks Davis 
353*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_iso8601_in_utc);
354*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__to_iso8601_in_utc)
355*b0d29bc4SBrooks Davis {
356*b0d29bc4SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
357*b0d29bc4SBrooks Davis         2010, 12, 10, 8, 45, 50, 0);
358*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2010-12-10T08:45:50.000000Z", ts1.to_iso8601_in_utc());
359*b0d29bc4SBrooks Davis 
360*b0d29bc4SBrooks Davis     const datetime::timestamp ts2= datetime::timestamp::from_values(
361*b0d29bc4SBrooks Davis         2016, 7, 11, 17, 51, 28, 123456);
362*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("2016-07-11T17:51:28.123456Z", ts2.to_iso8601_in_utc());
363*b0d29bc4SBrooks Davis }
364*b0d29bc4SBrooks Davis 
365*b0d29bc4SBrooks Davis 
366*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_microseconds);
367*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__to_microseconds)
368*b0d29bc4SBrooks Davis {
369*b0d29bc4SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
370*b0d29bc4SBrooks Davis         2010, 12, 10, 8, 45, 50, 123456);
371*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1291970750123456LL, ts1.to_microseconds());
372*b0d29bc4SBrooks Davis }
373*b0d29bc4SBrooks Davis 
374*b0d29bc4SBrooks Davis 
375*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_seconds);
376*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__to_seconds)
377*b0d29bc4SBrooks Davis {
378*b0d29bc4SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
379*b0d29bc4SBrooks Davis         2010, 12, 10, 8, 45, 50, 123456);
380*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1291970750, ts1.to_seconds());
381*b0d29bc4SBrooks Davis }
382*b0d29bc4SBrooks Davis 
383*b0d29bc4SBrooks Davis 
384*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__leap_second);
385*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__leap_second)
386*b0d29bc4SBrooks Davis {
387*b0d29bc4SBrooks Davis     // This is actually a test for from_values(), which is the function that
388*b0d29bc4SBrooks Davis     // includes assertions to validate the input parameters.
389*b0d29bc4SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
390*b0d29bc4SBrooks Davis         2012, 6, 30, 23, 59, 60, 543);
391*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1341100800, ts1.to_seconds());
392*b0d29bc4SBrooks Davis }
393*b0d29bc4SBrooks Davis 
394*b0d29bc4SBrooks Davis 
395*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__equals);
396*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__equals)
397*b0d29bc4SBrooks Davis {
398*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::timestamp::from_microseconds(1291970750123456LL) ==
399*b0d29bc4SBrooks Davis                 datetime::timestamp::from_microseconds(1291970750123456LL));
400*b0d29bc4SBrooks Davis }
401*b0d29bc4SBrooks Davis 
402*b0d29bc4SBrooks Davis 
403*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__differs);
404*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__differs)
405*b0d29bc4SBrooks Davis {
406*b0d29bc4SBrooks Davis     ATF_REQUIRE(datetime::timestamp::from_microseconds(1291970750123456LL) !=
407*b0d29bc4SBrooks Davis                 datetime::timestamp::from_microseconds(1291970750123455LL));
408*b0d29bc4SBrooks Davis }
409*b0d29bc4SBrooks Davis 
410*b0d29bc4SBrooks Davis 
411*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__sorting);
412*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__sorting)
413*b0d29bc4SBrooks Davis {
414*b0d29bc4SBrooks Davis     {
415*b0d29bc4SBrooks Davis         const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
416*b0d29bc4SBrooks Davis             1291970750123455LL);
417*b0d29bc4SBrooks Davis         const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
418*b0d29bc4SBrooks Davis             1291970750123455LL);
419*b0d29bc4SBrooks Davis 
420*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(ts1 < ts2));
421*b0d29bc4SBrooks Davis         ATF_REQUIRE(  ts1 <= ts2);
422*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(ts1 > ts2));
423*b0d29bc4SBrooks Davis         ATF_REQUIRE(  ts1 >= ts2);
424*b0d29bc4SBrooks Davis     }
425*b0d29bc4SBrooks Davis     {
426*b0d29bc4SBrooks Davis         const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
427*b0d29bc4SBrooks Davis             1291970750123455LL);
428*b0d29bc4SBrooks Davis         const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
429*b0d29bc4SBrooks Davis             1291970759123455LL);
430*b0d29bc4SBrooks Davis 
431*b0d29bc4SBrooks Davis         ATF_REQUIRE( ts1 < ts2);
432*b0d29bc4SBrooks Davis         ATF_REQUIRE( ts1 <= ts2);
433*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(ts1 > ts2));
434*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(ts1 >= ts2));
435*b0d29bc4SBrooks Davis     }
436*b0d29bc4SBrooks Davis     {
437*b0d29bc4SBrooks Davis         const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
438*b0d29bc4SBrooks Davis             1291970759123455LL);
439*b0d29bc4SBrooks Davis         const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
440*b0d29bc4SBrooks Davis             1291970750123455LL);
441*b0d29bc4SBrooks Davis 
442*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(ts1 < ts2));
443*b0d29bc4SBrooks Davis         ATF_REQUIRE(!(ts1 <= ts2));
444*b0d29bc4SBrooks Davis         ATF_REQUIRE(  ts1 > ts2);
445*b0d29bc4SBrooks Davis         ATF_REQUIRE(  ts1 >= ts2);
446*b0d29bc4SBrooks Davis     }
447*b0d29bc4SBrooks Davis }
448*b0d29bc4SBrooks Davis 
449*b0d29bc4SBrooks Davis 
450*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__add_delta);
451*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__add_delta)
452*b0d29bc4SBrooks Davis {
453*b0d29bc4SBrooks Davis     using datetime::delta;
454*b0d29bc4SBrooks Davis     using datetime::timestamp;
455*b0d29bc4SBrooks Davis 
456*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 30, 1234),
457*b0d29bc4SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 0, 0) +
458*b0d29bc4SBrooks Davis                    delta(30, 1234));
459*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 22, 43, 7, 100),
460*b0d29bc4SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 0, 0) +
461*b0d29bc4SBrooks Davis                    delta(3602, 5000100));
462*b0d29bc4SBrooks Davis }
463*b0d29bc4SBrooks Davis 
464*b0d29bc4SBrooks Davis 
465*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__add_delta_and_set);
466*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__add_delta_and_set)
467*b0d29bc4SBrooks Davis {
468*b0d29bc4SBrooks Davis     using datetime::delta;
469*b0d29bc4SBrooks Davis     using datetime::timestamp;
470*b0d29bc4SBrooks Davis 
471*b0d29bc4SBrooks Davis     {
472*b0d29bc4SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 0, 0);
473*b0d29bc4SBrooks Davis         ts += delta(30, 1234);
474*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 30, 1234),
475*b0d29bc4SBrooks Davis                        ts);
476*b0d29bc4SBrooks Davis     }
477*b0d29bc4SBrooks Davis     {
478*b0d29bc4SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 0, 0);
479*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 22, 43, 7, 100),
480*b0d29bc4SBrooks Davis                        ts += delta(3602, 5000100));
481*b0d29bc4SBrooks Davis     }
482*b0d29bc4SBrooks Davis }
483*b0d29bc4SBrooks Davis 
484*b0d29bc4SBrooks Davis 
485*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__subtract_delta);
486*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__subtract_delta)
487*b0d29bc4SBrooks Davis {
488*b0d29bc4SBrooks Davis     using datetime::delta;
489*b0d29bc4SBrooks Davis     using datetime::timestamp;
490*b0d29bc4SBrooks Davis 
491*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 10, 4321),
492*b0d29bc4SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 40, 5555) -
493*b0d29bc4SBrooks Davis                    delta(30, 1234));
494*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 20, 43, 1, 300),
495*b0d29bc4SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 8, 400) -
496*b0d29bc4SBrooks Davis                    delta(3602, 5000100));
497*b0d29bc4SBrooks Davis }
498*b0d29bc4SBrooks Davis 
499*b0d29bc4SBrooks Davis 
500*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__subtract_delta_and_set);
501*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__subtract_delta_and_set)
502*b0d29bc4SBrooks Davis {
503*b0d29bc4SBrooks Davis     using datetime::delta;
504*b0d29bc4SBrooks Davis     using datetime::timestamp;
505*b0d29bc4SBrooks Davis 
506*b0d29bc4SBrooks Davis     {
507*b0d29bc4SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 40, 5555);
508*b0d29bc4SBrooks Davis         ts -= delta(30, 1234);
509*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 10, 4321),
510*b0d29bc4SBrooks Davis                        ts);
511*b0d29bc4SBrooks Davis     }
512*b0d29bc4SBrooks Davis     {
513*b0d29bc4SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 8, 400);
514*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 20, 43, 1, 300),
515*b0d29bc4SBrooks Davis                        ts -= delta(3602, 5000100));
516*b0d29bc4SBrooks Davis     }
517*b0d29bc4SBrooks Davis }
518*b0d29bc4SBrooks Davis 
519*b0d29bc4SBrooks Davis 
520*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__subtraction);
521*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__subtraction)
522*b0d29bc4SBrooks Davis {
523*b0d29bc4SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
524*b0d29bc4SBrooks Davis         1291970750123456LL);
525*b0d29bc4SBrooks Davis     const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
526*b0d29bc4SBrooks Davis         1291970750123468LL);
527*b0d29bc4SBrooks Davis     const datetime::timestamp ts3 = datetime::timestamp::from_microseconds(
528*b0d29bc4SBrooks Davis         1291970850123456LL);
529*b0d29bc4SBrooks Davis 
530*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(0, 0), ts1 - ts1);
531*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(0, 12), ts2 - ts1);
532*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(100, 0), ts3 - ts1);
533*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(99, 999988), ts3 - ts2);
534*b0d29bc4SBrooks Davis 
535*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(
536*b0d29bc4SBrooks Davis         std::runtime_error,
537*b0d29bc4SBrooks Davis         "Cannot subtract 1291970850123456us from 1291970750123468us "
538*b0d29bc4SBrooks Davis         ".*negative datetime::delta.*not supported",
539*b0d29bc4SBrooks Davis         ts2 - ts3);
540*b0d29bc4SBrooks Davis }
541*b0d29bc4SBrooks Davis 
542*b0d29bc4SBrooks Davis 
543*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__output);
544*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(timestamp__output)
545*b0d29bc4SBrooks Davis {
546*b0d29bc4SBrooks Davis     {
547*b0d29bc4SBrooks Davis         std::ostringstream str;
548*b0d29bc4SBrooks Davis         str << datetime::timestamp::from_microseconds(1291970750123456LL);
549*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("1291970750123456us", str.str());
550*b0d29bc4SBrooks Davis     }
551*b0d29bc4SBrooks Davis     {
552*b0d29bc4SBrooks Davis         std::ostringstream str;
553*b0d29bc4SBrooks Davis         str << datetime::timestamp::from_microseconds(1028309798759812LL);
554*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("1028309798759812us", str.str());
555*b0d29bc4SBrooks Davis     }
556*b0d29bc4SBrooks Davis }
557*b0d29bc4SBrooks Davis 
558*b0d29bc4SBrooks Davis 
559*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
560*b0d29bc4SBrooks Davis {
561*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__defaults);
562*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__overrides);
563*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__from_microseconds);
564*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__to_microseconds);
565*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__equals);
566*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__differs);
567*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__sorting);
568*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__addition);
569*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__addition_and_set);
570*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__scale);
571*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__scale_and_set);
572*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__output);
573*b0d29bc4SBrooks Davis 
574*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__copy);
575*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__from_microseconds);
576*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__now__mock);
577*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__now__real);
578*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__now__granularity);
579*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__strftime);
580*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__to_iso8601_in_utc);
581*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__to_microseconds);
582*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__to_seconds);
583*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__leap_second);
584*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__equals);
585*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__differs);
586*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__sorting);
587*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__add_delta);
588*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__add_delta_and_set);
589*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__subtract_delta);
590*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__subtract_delta_and_set);
591*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__subtraction);
592*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__output);
593*b0d29bc4SBrooks Davis }
594