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