13 #if __cplusplus < 201103L && !defined(__clang__)
14 #include <ext/algorithm>
17 #include <boost/lexical_cast.hpp>
19 #include <cppunit/extensions/HelperMacros.h>
21 #include <utl/TimeStamp.h>
22 #include <utl/UTCDateTime.h>
23 #include <utl/TimeInterval.h>
24 #include <utl/TimeRange.h>
25 #include <utl/Stopwatch.h>
26 #include <utl/RealTimeStopwatch.h>
27 #include <utl/AugerUnits.h>
28 #include <tst/Verify.h>
29 #include <utl/AugerException.h>
30 #include <utl/UTCDate.h>
31 #include <utl/LeapSeconds.h>
36 using boost::lexical_cast;
45 CPPUNIT_TEST(TestTimeStampInitialization);
52 CPPUNIT_TEST(TestLeap1);
53 CPPUNIT_TEST(TestLeap2);
54 CPPUNIT_TEST(TestLeap3);
55 CPPUNIT_TEST(TestLeap4);
56 CPPUNIT_TEST(TestLeap5);
57 CPPUNIT_TEST(TestLeap6);
58 CPPUNIT_TEST(TestTimeIntervalInitialization);
59 CPPUNIT_TEST(TestLeapSecondBoundary);
60 CPPUNIT_TEST(TestArithmetic);
61 CPPUNIT_TEST(TestBool);
62 CPPUNIT_TEST(TestTimeRange);
63 CPPUNIT_TEST(TestTimeRangeSearch);
64 CPPUNIT_TEST(TestStopwatch);
65 CPPUNIT_TEST(TestRealTimeStopwatch);
66 CPPUNIT_TEST(TestUTCToGPSLeapSeconds);
67 CPPUNIT_TEST(TestConversions);
68 CPPUNIT_TEST(TestConversions2);
69 CPPUNIT_TEST(TestConversions3);
70 CPPUNIT_TEST(TestConversions4);
71 CPPUNIT_TEST(TestConversions5);
72 CPPUNIT_TEST(TestTimeConsistency);
73 CPPUNIT_TEST_SUITE_END();
87 fLeapMinusOne(
UTCDateTime(1998, 12, 31, 23, 59, 59).GetTimeStamp()),
88 fLeap(
UTCDateTime(1998, 12, 31, 23, 59, 60).GetTimeStamp()),
89 fLeapPlusOne(
UTCDateTime(1999, 1, 1, 0, 0, 0).GetTimeStamp()),
90 fNoLeapMinusOne(
UTCDateTime(1999, 12, 31, 23, 59, 59).GetTimeStamp()),
91 fNoLeap(
UTCDateTime(2000, 1, 1, 0, 0, 0).GetTimeStamp()),
92 fNoLeapPlusOne(
UTCDateTime(2000, 1, 1, 0, 0, 1).GetTimeStamp()),
108 CPPUNIT_ASSERT(Verify<Equal>(t1.
GetSecond(), 1000L));
109 CPPUNIT_ASSERT(Verify<CloseTo>(t1.
GetNanoSecond(), 987654321.));
115 CPPUNIT_ASSERT(Verify<CloseTo>(t2.GetInterval(), -9.5*
second));
116 CPPUNIT_ASSERT(Verify<Equal>(t2.GetSecond(), -10L));
117 CPPUNIT_ASSERT(Verify<CloseTo>(t2.GetNanoSecond(), 500000000.));
129 const TimeStamp tt1((365*23 + 6)*24*3600 + 13);
134 string(
"00:00:00 06 JAN 2003")));
136 string(
"2003-01-06T00:00:00Z")));
138 CPPUNIT_ASSERT(Verify<Equal>(t1.
GetYear(), 2003));
139 CPPUNIT_ASSERT(Verify<Equal>(t1.
GetMonth(), 1));
140 CPPUNIT_ASSERT(Verify<Equal>(t1.
GetDay(), 6));
141 CPPUNIT_ASSERT(Verify<Equal>(t1.
GetHour(), 0));
142 CPPUNIT_ASSERT(Verify<Equal>(t1.
GetMinute(), 0));
143 CPPUNIT_ASSERT(Verify<Equal>(t1.
GetSecond(), 0));
148 CPPUNIT_ASSERT(Verify<Equal>(t2.GetGPSSecond(), tt1.
GetGPSSecond()));
157 CPPUNIT_ASSERT(Verify<Equal>(tb.
GetYear(), 2005));
158 CPPUNIT_ASSERT(Verify<Equal>(tb.
GetMonth(), 3));
159 CPPUNIT_ASSERT(Verify<Equal>(tb.
GetDay(), 12));
160 CPPUNIT_ASSERT(Verify<Equal>(tb.
GetHour(), 20));
161 CPPUNIT_ASSERT(Verify<Equal>(tb.
GetMinute(), 21));
162 CPPUNIT_ASSERT(Verify<Equal>(tb.
GetSecond(), 22));
166 CPPUNIT_ASSERT(Verify<Equal>(t3, t4));
193 CPPUNIT_ASSERT(Verify<Equal>(
UTCDateTime(fLeapMinusOne).GetInAugerFormat(),
194 string(
"23:59:59 31 DEC 1998")));
195 CPPUNIT_ASSERT(Verify<Equal>(
UTCDateTime(fLeap).GetInAugerFormat(),
196 string(
"23:59:60 31 DEC 1998")));
197 CPPUNIT_ASSERT(Verify<Equal>(
UTCDateTime(fLeapPlusOne).GetInAugerFormat(),
198 string(
"00:00:00 01 JAN 1999")));
199 CPPUNIT_ASSERT(Verify<Equal>(
UTCDateTime(fLeapMinusOne + fOneSecond).GetInAugerFormat(),
200 string(
"23:59:60 31 DEC 1998")));
203 CPPUNIT_ASSERT(Verify<Equal>(fLeapMinusOne.GetGPSSecond(),
204 fLeap.GetGPSSecond() - 1));
205 CPPUNIT_ASSERT(Verify<Equal>(fLeap.GetGPSSecond(),
206 fLeapPlusOne.GetGPSSecond() - 1));
207 CPPUNIT_ASSERT(Verify<Equal>(fNoLeapMinusOne.GetGPSSecond(),
208 fNoLeap.GetGPSSecond() - 1));
209 CPPUNIT_ASSERT(Verify<Equal>(fNoLeap.GetGPSSecond(),
210 fNoLeapPlusOne.GetGPSSecond() - 1));
213 CPPUNIT_ASSERT(Verify<Equal>(
UTCDateTime(fNoLeapMinusOne + fOneSecond).GetInAugerFormat(),
215 CPPUNIT_ASSERT(Verify<Equal>(
UTCDateTime(fNoLeap + fOneSecond).GetInAugerFormat(),
223 CPPUNIT_ASSERT(Verify<Equal>((fLeapPlusOne - fLeapMinusOne).GetSecond(),
227 CPPUNIT_ASSERT(Verify<Equal>(fLeapMinusOne - fOneSecond,
231 CPPUNIT_ASSERT(Verify<Equal>(fLeapPlusOne + fOneSecond,
235 CPPUNIT_ASSERT(Verify<CloseTo>((fOneSecond/2.0).GetInterval(),
239 CPPUNIT_ASSERT(Verify<CloseTo>((fOneSecond + fOneSecond).GetInterval(),
243 CPPUNIT_ASSERT(Verify<CloseTo>((fTwoSeconds - fOneSecond).GetInterval(),
247 CPPUNIT_ASSERT(Verify<CloseTo>(((fOneSecond)*10.0).GetInterval(),
258 CPPUNIT_ASSERT(Verify<Equal>(ta.GetGPSSecond(), 101UL));
259 CPPUNIT_ASSERT(Verify<CloseTo>(ta.GetGPSNanoSecond(), 8.));
263 CPPUNIT_ASSERT(Verify<CloseTo>(ta.GetGPSNanoSecond(), 8.));
265 CPPUNIT_ASSERT(Verify<Equal>(tb.GetGPSSecond(), 99UL));
266 CPPUNIT_ASSERT(Verify<CloseTo>(tb.GetGPSNanoSecond(), 999999998.));
271 CPPUNIT_ASSERT(Verify<Equal>(tc.GetGPSSecond(), 102UL));
272 CPPUNIT_ASSERT(Verify<CloseTo>(tc.GetGPSNanoSecond(), 8.));
277 CPPUNIT_ASSERT(Verify<Equal>(td.GetGPSSecond(), 98UL));
278 CPPUNIT_ASSERT(Verify<CloseTo>(td.GetGPSNanoSecond(), 999999998.));
282 CPPUNIT_ASSERT(Verify<Equal>(te.GetGPSSecond(), 1UL));
283 CPPUNIT_ASSERT(Verify<CloseTo>(te.GetGPSNanoSecond(), 1.));
288 CPPUNIT_ASSERT(Verify<Equal>(tf.GetGPSSecond(), 1UL));
289 CPPUNIT_ASSERT(Verify<CloseTo>(tf.GetGPSNanoSecond(), 1.));
295 CPPUNIT_ASSERT(fLeapMinusOne < fLeap);
296 CPPUNIT_ASSERT(fLeapPlusOne > fLeap);
297 CPPUNIT_ASSERT(fLeap == fLeap);
298 CPPUNIT_ASSERT(fLeap != fLeapPlusOne);
299 CPPUNIT_ASSERT(fLeap >= fLeap);
300 CPPUNIT_ASSERT(fLeap <= fLeap);
302 CPPUNIT_ASSERT(fZero.GetInterval() <= numeric_limits<double>::min());
303 CPPUNIT_ASSERT(fOneSecond.GetInterval() >= numeric_limits<double>::min());
304 CPPUNIT_ASSERT(fTwoSeconds > fOneSecond);
305 CPPUNIT_ASSERT(fOneSecond < fTwoSeconds);
306 CPPUNIT_ASSERT(fOneSecond <= fTwoSeconds);
307 CPPUNIT_ASSERT(fOneSecond <= fOneSecond);
308 CPPUNIT_ASSERT(fTwoSeconds >= fOneSecond);
309 CPPUNIT_ASSERT(fTwoSeconds >= fTwoSeconds);
319 CPPUNIT_ASSERT(tr1 == tr2);
320 CPPUNIT_ASSERT(!(tr1 != tr2));
327 CPPUNIT_ASSERT(tr1 != tr2);
328 CPPUNIT_ASSERT(!(tr1 == tr2));
331 CPPUNIT_ASSERT(!tr2.HasCommonTime(tr1));
334 CPPUNIT_ASSERT(tr1 < tr2);
335 CPPUNIT_ASSERT(tr2 > tr1);
336 CPPUNIT_ASSERT(!(tr1 > tr2));
337 CPPUNIT_ASSERT(!(tr2 < tr1));
340 tr1.
SetTimeRange(tr2.GetStartTime(), tr2.GetStopTime());
341 CPPUNIT_ASSERT(tr1 == tr2);
342 CPPUNIT_ASSERT(!(tr1 != tr2));
348 CPPUNIT_ASSERT(tr2.HasCommonTime(tr1));
353 CPPUNIT_ASSERT(tr2.HasCommonTime(tr1));
358 CPPUNIT_ASSERT(tr2.HasCommonTime(tr1));
366 vector<TimeRange> trs;
367 for (
int i = 20-2; i >= 0; i-=2)
368 trs.push_back(
TimeRange(t0 +
double(i)*dt, t0 +
double(i+1)*dt));
370 CPPUNIT_ASSERT(!is_sorted(trs.begin(), trs.end()));
372 sort(trs.begin(), trs.end());
374 CPPUNIT_ASSERT(is_sorted(trs.begin(), trs.end()));
378 vector<TimeRange>::const_iterator it1 =
379 lower_bound(trs.begin(), trs.end(),
TimeRange(t1, t1));
381 CPPUNIT_ASSERT(it1 != trs.begin());
382 CPPUNIT_ASSERT(it1 != trs.end());
384 CPPUNIT_ASSERT(!it1->IsInRange(t1));
388 CPPUNIT_ASSERT(!it1->IsInRange(t1));
392 vector<TimeRange>::const_iterator it2 =
393 lower_bound(trs.begin(), trs.end(),
TimeRange(t2, t2));
395 CPPUNIT_ASSERT(it2 != trs.begin());
396 CPPUNIT_ASSERT(it2 != trs.end());
398 CPPUNIT_ASSERT(!it2->IsInRange(t2));
402 CPPUNIT_ASSERT(it2->IsInRange(t2));
411 [[maybe_unused]]
double sum = 0;
413 for (
int i = 0; i < 100000; ++i)
428 cout <<
"\nusleep(10000)..." << flush;
432 const double time = sw.
Stop();
434 CPPUNIT_ASSERT(1.234*
second < time && time < 1.4*
second);
435 CPPUNIT_ASSERT(Verify<Equal>(time, sw.
GetTime()));
436 cout <<
"usleep(1000000)..." << flush;
438 const double time2 = sw.
GetTime();
440 CPPUNIT_ASSERT(Verify<Equal>(time, time2));
442 cout <<
"usleep(1000)..." << flush;
444 const double time3 = sw.
Stop();
446 CPPUNIT_ASSERT(Verify<GreaterOrEqual>(time3, time));
448 CPPUNIT_ASSERT(Verify<Equal>(sw.
GetTime(), 0.));
449 for (
int i = 0; i < 10; ++i) {
450 cout <<
"usleep(200000)..." << flush;
454 cout <<
"\nusleep(10000)..." << flush;
458 cout <<
"\ntime " << sw.
GetTime() << endl;
472 const UTCDateDays utcDays[] = {
491 const unsigned int secPerDay = 24 * 60 * 60;
492 const int n =
sizeof(utcDays) /
sizeof(utcDays[0]);
493 for (
int i = 0; i < n; ++i) {
494 const time_t unixSecond = utcDays[i].fUTCDate.GetUnixSecond();
495 const int days = (unixSecond - gpsUnixSec) / secPerDay;
496 const int rem = (unixSecond - gpsUnixSec) % secPerDay;
497 const int check = utcDays[i].fDays;
498 CPPUNIT_ASSERT(Verify<Equal>(days, check));
499 CPPUNIT_ASSERT(Verify<Equal>(rem, 0));
500 const unsigned int gpsSecond = unixSecond - gpsUnixSec + i;
504 isLeap = LeapSeconds::GetInstance().ConvertGPSToUnix(gpsSecond-1, unixSecond2);
505 CPPUNIT_ASSERT(!isLeap);
506 CPPUNIT_ASSERT(Verify<Equal>(unixSecond2, unixSecond-1));
508 isLeap = LeapSeconds::GetInstance().ConvertGPSToUnix(gpsSecond, unixSecond2);
509 CPPUNIT_ASSERT(isLeap);
510 CPPUNIT_ASSERT(Verify<Equal>(unixSecond2, unixSecond));
512 isLeap = LeapSeconds::GetInstance().ConvertGPSToUnix(gpsSecond+1, unixSecond2);
513 CPPUNIT_ASSERT(!isLeap);
514 CPPUNIT_ASSERT(Verify<Equal>(unixSecond2, unixSecond));
522 boost::lexical_cast<
UTCDateTime>(
"2002-05-12T00:23:45.000001500Z");
523 CPPUNIT_ASSERT(Verify<Equal>(utc.
GetYear(), 2002));
524 CPPUNIT_ASSERT(Verify<Equal>(utc.
GetMonth(), 5));
525 CPPUNIT_ASSERT(Verify<Equal>(utc.
GetDay(), 12));
526 CPPUNIT_ASSERT(Verify<Equal>(utc.
GetHour(), 0));
527 CPPUNIT_ASSERT(Verify<Equal>(utc.
GetMinute(), 23));
528 CPPUNIT_ASSERT(Verify<Equal>(utc.
GetSecond(), 45));
531 CPPUNIT_ASSERT(Verify<CloseTo>(ts.GetGPSNanoSecond(), 1500.));
533 CPPUNIT_ASSERT(Verify<Equal>(utc2.GetYear(), 2002));
534 CPPUNIT_ASSERT(Verify<Equal>(utc2.GetMonth(), 5));
535 CPPUNIT_ASSERT(Verify<Equal>(utc2.GetDay(), 12));
536 CPPUNIT_ASSERT(Verify<Equal>(utc2.GetHour(), 0));
537 CPPUNIT_ASSERT(Verify<Equal>(utc2.GetMinute(), 23));
538 CPPUNIT_ASSERT(Verify<Equal>(utc2.GetSecond(), 45));
539 CPPUNIT_ASSERT(Verify<CloseTo>(utc2.GetNanosecond(), 1500.));
540 CPPUNIT_ASSERT(Verify<Equal>(utc, utc2));
541 const TimeStamp ts2 = utc2.GetTimeStamp();
542 CPPUNIT_ASSERT(Verify<Equal>(ts, ts2));
548 const char*
const date[][2] = {
549 {
"2002-05-12T00:23:45.000001500Z",
"2002-05-12T00:23:45.000001500" },
550 {
"2002-05-12T00:23:45Z",
"2002-05-12T00:23:45" },
551 {
"2002-05-12T00:23:45.000001500Z",
"2002-05-12T00:23:45.000001500" },
552 {
"2002-05-12T00:23:45Z",
"2002-05-12T00:23:45" }
556 for (
int i = 0; i < n; ++i) {
561 CPPUNIT_ASSERT(Verify<Equal>(utc1, utc2));
565 CPPUNIT_ASSERT(Verify<Equal>(ts, ts2));
579 for (
int i = 0; i < n; i++) {
585 for (
unsigned long gps = start; gps <= stop; ++gps) {
589 cout <<
'\n' << year <<
':';
593 cout <<
' ' << month << flush;
606 const unsigned long int gps1 = 1055178059;
608 LeapSeconds::GetInstance().ConvertGPSToUnix(gps1, unix1);
609 unsigned long gps2 = 0;
610 LeapSeconds::GetInstance().ConvertUnixToGPS(unix1, gps2);
611 CPPUNIT_ASSERT(Verify<Equal>(gps1, gps2));
619 const unsigned long gps = 1097740007;
630 CPPUNIT_ASSERT(Verify<Equal>(tsMax, ts));
632 CPPUNIT_ASSERT(Verify<Equal>(utcdtMax, dt));
634 CPPUNIT_ASSERT(Verify<Equal>(utcdtMax, utcdtMax2));
636 CPPUNIT_ASSERT(Verify<Equal>(tsMax, tsMax2));
638 CPPUNIT_ASSERT(tsMax > tsMax1);
639 const TimeStamp tsMax0 = tsMax1 + TimeInterval(1);
640 CPPUNIT_ASSERT(Verify<Equal>(tsMax, tsMax0));
643 const TimeInterval big = tsMax - empty;
645 CPPUNIT_ASSERT(Verify<CloseTo>(tsMax - maybe, TimeInterval(0)));
649 CPPUNIT_ASSERT(Verify<Equal>(empty, empty2));
651 CPPUNIT_ASSERT(Verify<Equal>(utempty, utempty2));
653 CPPUNIT_ASSERT(Verify<Equal>(
657 CPPUNIT_ASSERT(Verify<Equal>(
std::time_t GetUnixSecond() const
Relative to Unix epoch (1 Jan 1970 00:00:00 UTC) without leap corrections.
void TestLeapException2()
void TestLeapException5()
double GetNanosecond() const
Time interval defined by two TimeStamps.
std::string GetInAugerFormat() const
void TestLeapException4()
long GetSecond() const
Get the seconds floor for the interval.
CPPUNIT_TEST_SUITE_REGISTRATION(testAiresShowerFile)
void TestRealTimeStopwatch()
A TimeStamp holds GPS second and nanosecond for some event.
Exception for reporting variable out of valid range.
static UTCDateTime GetGPSEpoch()
void SetTimeRange(const TimeStamp &start, const TimeStamp &stop)
Set time range.
void TestLeapException1()
void SetGPSTime(const unsigned long sec, const double nsec=0)
Set GPS second and (optionally) nanosecond.
constexpr double nanosecond
static UTCDate GetGPSEpoch()
void TestUTCToGPSLeapSeconds()
void TestTimeStampInitException()
void TestLeapSecondBoundary()
void Expected()
Print `Expected' for expected failures.
a t3: algo, second, usecond and a vector of <t3stat>
void TestTimeStampInitialization()
void TestTimeIntervalInitialization()
fwk::VModule::ResultFlag(fwk::VModule::* run)(evt::Event &)
double GetInterval() const
Get the time interval as a double (in Auger base units)
A TimeInterval is used to represent time elapsed between two events.
unsigned long GetGPSSecond() const
GPS second.
double GetGPSNanoSecond() const
GPS nanosecond.
TimeStamp fNoLeapMinusOne
void TestTimeRangeSearch()
double Stop()
returns time since last call to Start()
double GetCPUTime(const CPUTime kind=eTotal)
double GetNanoSecond() const
Get integer number of nanoseconds past seconds boundary.
std::string GetInXMLFormat() const
void TestTimeConsistency()
bool HasCommonTime(const TimeRange &tr) const
TimeStamp GetTimeStamp() const
void TestLeapException3()
static TimeInterval Max()