blob: d9947a6eb01ab290058d5924b2f997eadc048aec [file] [log] [blame]
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
* Use, modification and distribution is subject to the
* Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
* Author: Jeff Garland
*/
#include <stdexcept>
#include "boost/date_time/posix_time/posix_time.hpp"
#include "boost/date_time/c_local_time_adjustor.hpp"
#include "../testfrmwk.hpp"
int
main()
{
using namespace boost::posix_time;
using namespace boost::gregorian;
//These are a compile check / test. They have to be hand inspected
//b/c they depend on the TZ settings of the machine and hence it is
//unclear what the results will be
typedef boost::date_time::c_local_adjustor<ptime> local_adj;
bool btd1e = false;
bool btd2e = false;
bool btd3e = false;
time_duration td1;
time_duration td2;
time_duration td3;
try
{
ptime t1(date(2002,Jan,1), hours(7)+millisec(5));
std::cout << "UTC <--> TZ Setting of Machine -- No DST" << std::endl;
ptime t2 = local_adj::utc_to_local(t1);
std::cout << t2 << " LOCAL is "
<< t1 << " UTC time "
<< std::endl;
td1 = t2 - t1;
std::cout << "A difference of: " << td1
<< std::endl;
}
catch (std::runtime_error & re)
{
btd1e = true;
check(re.what(), false);
}
try
{
ptime t3(date(2002,May,1), hours(5)+millisec(5));
std::cout << "UTC <--> TZ Setting of Machine -- In DST" << std::endl;
ptime t4 = local_adj::utc_to_local(t3);
std::cout << t4 << " LOCAL is "
<< t3 << " UTC time "
<< std::endl;
td2 = t4 - t3;
std::cout << "A difference of: " << td2
<< std::endl;
}
catch (std::runtime_error & re)
{
btd2e = true;
check(re.what(), false);
}
try
{
ptime t5(date(2040,May,1), hours(5)+millisec(5));
std::cout << "UTC <--> TZ Setting of Machine -- In DST" << std::endl;
ptime t6 = local_adj::utc_to_local(t5);
std::cout << t6 << " LOCAL is "
<< t5 << " UTC time "
<< std::endl;
td3 = t6 - t5;
std::cout << "a difference of: " << td3
<< std::endl;
}
catch (std::runtime_error & re)
{
btd3e = true;
check(re.what(), false);
}
catch (std::bad_cast&)
{
btd3e = true;
check("32-bit time_t overflow detected", sizeof(std::time_t) < 8);
}
// The following tests are unaware of the local time zone, but they
// should help spot some errors. Manual inspection could still be
// required.
// Based on http://stackoverflow.com/questions/8131023
// All time zones are between -12 and +14
if (!btd1e)
{
check("td1 isn't too low", td1 >= hours(-12));
check("td1 isn't too high", td1 <= hours(14));
}
if (!btd2e)
{
check("td2 isn't too low", td2 >= hours(-12));
check("td2 isn't too high", td2 <= hours(14));
}
if (!btd3e)
{
check("td3 isn't too low", td3 >= hours(-12));
check("td3 isn't too high", td3 <= hours(14));
}
// Assuming that no one uses DST of more than an hour.
if (!btd1e && !btd2e)
{
check("td1 and td2 are close",
td1 - td2 <= hours(1) && td2 - td1 <= hours(1));
}
if (!btd2e && !btd3e)
{
check("td2 and td3 are close",
td2 - td3 <= hours(2) && td3 - td2 <= hours(2));
}
if (!btd1e && !btd3e)
{
check("td1 and td3 are close",
td1 - td3 <= hours(1) && td3 - td1 <= hours(1));
}
return printTestStats();
}