| |
| /* Copyright (c) 2004 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, Bart Garst |
| * $Date: 2008-11-26 16:07:14 -0500 (Wed, 26 Nov 2008) $ |
| */ |
| |
| #include <iostream> |
| #include <sstream> |
| #include <boost/shared_ptr.hpp> |
| #include "boost/date_time/local_time/local_time.hpp" |
| #include "../testfrmwk.hpp" |
| |
| |
| template<class temporal_type, typename charT> |
| inline |
| void |
| teststreaming(std::string const& testname, |
| temporal_type value, |
| std::basic_string<charT> const& expected_result, |
| const std::locale& locale) |
| { |
| std::basic_stringstream<charT> ss; |
| ss.imbue(locale); |
| ss << value; |
| |
| if (!check(testname, ss.str() == expected_result)) |
| #if !defined(BOOST_NO_STD_WSTRING) |
| std::wcout << L"Expected: \"" << expected_result.c_str() << L"\"\nGot: \"" << ss.str().c_str() << L"\"" << std::endl; |
| #else |
| std::cout << "Expected: \"" << expected_result.c_str() << "\"\nGot: \"" << ss.str().c_str() << L"\"" << std::endl; |
| #endif |
| } |
| |
| int main(){ |
| /* use the tz_database for the time zones. |
| * Chicago, Denver, Los_Angeles, New_Tork, and Phoenix |
| * have all had full names added */ |
| using namespace boost; |
| using namespace boost::local_time; |
| using namespace boost::posix_time; |
| using namespace boost::gregorian; |
| |
| tz_database time_zones; |
| |
| try { |
| // first try to find the data file from the test dir |
| time_zones.load_from_file("../data/date_time_zonespec.csv"); |
| } |
| catch(const data_not_accessible& e) { |
| // couldn't find the data file so assume we are being run from |
| // boost_root/status and try again |
| try { |
| time_zones.load_from_file("../libs/date_time/data/date_time_zonespec.csv"); |
| } |
| catch(const data_not_accessible&) { |
| check("Cannot locate data file - aborting.", false); |
| return printTestStats(); |
| } |
| } |
| |
| time_zone_ptr utc; |
| time_zone_ptr chicago = time_zones.time_zone_from_region("America/Chicago"); |
| time_zone_ptr denver = time_zones.time_zone_from_region("America/Denver"); |
| time_zone_ptr la = time_zones.time_zone_from_region("America/Los_Angeles"); |
| time_zone_ptr nyc = time_zones.time_zone_from_region("America/New_York"); |
| time_zone_ptr phx = time_zones.time_zone_from_region("America/Phoenix"); |
| // sydney does not have full time zone names in the tz_database |
| time_zone_ptr sydney = time_zones.time_zone_from_region("Australia/Sydney"); |
| |
| ptime a_time(date(2004,Dec,15), hours(12)); |
| ptime b_time(date(2004,Aug,15), hours(12)); |
| local_date_time ldt1(a_time, utc); |
| local_date_time ldt2(b_time, chicago); |
| local_date_time ldt3(a_time, denver); |
| local_date_time ldt4(b_time, la); |
| local_date_time ldt5(a_time, nyc); |
| local_date_time ldt6(b_time, phx); |
| |
| local_time_period ltp1(ldt1, hours(10) + minutes(24) + seconds(5)); |
| local_time_period ltp2(ldt4, hours(15) + minutes(20) + seconds(41)); |
| |
| typedef boost::date_time::time_facet<local_date_time, char> ldt_facet; |
| //ldt_facet* timefacet = new ldt_facet("%c %Z"); // full name |
| ldt_facet* timefacet = new ldt_facet("%a %b %d %H:%M:%S %Y %Z"); // full name |
| std::locale loc1(std::locale::classic(), timefacet); |
| |
| typedef boost::date_time::time_facet<ptime, char> pt_facet; |
| //pt_facet* ptimefacet1 = new pt_facet("%c %Z"); // show that zone is ignored |
| pt_facet* ptimefacet1 = new pt_facet("%a %b %d %H:%M:%S %Y %Z"); // show that zone is ignored |
| std::locale loc2(std::locale::classic(), ptimefacet1); |
| |
| |
| std::cout << "\nFull time zone names tests" << std::endl; |
| teststreaming("ptime with %Z flag\n", a_time, std::string("Wed Dec 15 12:00:00 2004") , loc2); |
| |
| teststreaming("UTC local_date_time", ldt1, std::string("Wed Dec 15 12:00:00 2004 Coordinated Universal Time"), loc1); |
| teststreaming("Chicago in summer", ldt2, std::string("Sun Aug 15 07:00:00 2004 Central Daylight Time") , loc1); |
| teststreaming("Denver in winter", ldt3, std::string("Wed Dec 15 05:00:00 2004 Mountain Standard Time"), loc1); |
| teststreaming("Los Angeles in summer", ldt4, std::string("Sun Aug 15 05:00:00 2004 Pacific Daylight Time"), loc1); |
| teststreaming("New York in winter", ldt5, std::string("Wed Dec 15 07:00:00 2004 Eastern Standard Time"), loc1); |
| teststreaming("Phoenix in Summer", ldt6, std::string("Sun Aug 15 05:00:00 2004 Mountain Standard Time"), loc1); |
| |
| teststreaming("UTC local_time_period", ltp1, std::string("[Wed Dec 15 12:00:00 2004 Coordinated Universal Time/Wed Dec 15 22:24:04 2004 Coordinated Universal Time]"), loc1); |
| teststreaming("LA local_time_period", ltp2, std::string("[Sun Aug 15 05:00:00 2004 Pacific Daylight Time/Sun Aug 15 20:20:40 2004 Pacific Daylight Time]"), loc1); |
| |
| //ptimefacet1->format("%c %z"); // show that zone abbrev is ignored |
| ptimefacet1->format("%a %b %d %H:%M:%S %Y %z"); // show that zone abbrev is ignored |
| std::cout << "\nTime zone abbreviation tests" << std::endl; |
| teststreaming("ptime with %z flag\n", a_time, std::string("Wed Dec 15 12:00:00 2004") , loc2); |
| |
| // using standard format |
| //timefacet->format("%c %z"); // abbreviated zone |
| timefacet->format("%a %b %d %H:%M:%S %Y %z"); // abbreviated zone |
| teststreaming("UTC local_date_time", ldt1, std::string("Wed Dec 15 12:00:00 2004 UTC"), loc1); |
| teststreaming("Chicago in summer", ldt2, std::string("Sun Aug 15 07:00:00 2004 CDT") , loc1); |
| teststreaming("Denver in winter", ldt3, std::string("Wed Dec 15 05:00:00 2004 MST"), loc1); |
| teststreaming("Los Angeles in summer", ldt4, std::string("Sun Aug 15 05:00:00 2004 PDT"), loc1); |
| teststreaming("New York in winter", ldt5, std::string("Wed Dec 15 07:00:00 2004 EST"), loc1); |
| teststreaming("Phoenix in Summer", ldt6, std::string("Sun Aug 15 05:00:00 2004 MST"), loc1); |
| |
| // iso format |
| // show that zone offset is ignored |
| ptimefacet1->format(pt_facet::iso_time_format_specifier); |
| std::cout << "\nLocal time iso format tests" << std::endl; |
| teststreaming("ptime with iso format\n", a_time, |
| std::string("20041215T120000") , loc2); |
| |
| timefacet->format(ldt_facet::iso_time_format_specifier); |
| teststreaming("UTC local_date_time", ldt1, |
| std::string("20041215T120000Z"), loc1); |
| teststreaming("Chicago in summer", ldt2, |
| std::string("20040815T070000-0500") , loc1); |
| teststreaming("Denver in winter", ldt3, |
| std::string("20041215T050000-0700"), loc1); |
| teststreaming("Los Angeles in summer", ldt4, |
| std::string("20040815T050000-0700"), loc1); |
| teststreaming("New York in winter", ldt5, |
| std::string("20041215T070000-0500"), loc1); |
| teststreaming("Phoenix in Summer", ldt6, |
| std::string("20040815T050000-0700"), loc1); |
| teststreaming("Sydney in December", ldt1.local_time_in(sydney), |
| std::string("20041215T230000+1100"), loc1); |
| |
| // iso extended format |
| // show that zone offset is ignored |
| ptimefacet1->format(pt_facet::iso_time_format_extended_specifier); |
| std::cout << "\nLocal time iso_extended tests" << std::endl; |
| teststreaming("ptime with iso extended format\n", a_time, |
| std::string("2004-12-15 12:00:00") , loc2); |
| |
| timefacet->format(ldt_facet::iso_time_format_extended_specifier); |
| teststreaming("UTC local_date_time", ldt1, |
| std::string("2004-12-15 12:00:00Z"), loc1); |
| teststreaming("Chicago in summer", ldt2, |
| std::string("2004-08-15 07:00:00-05:00") , loc1); |
| teststreaming("Denver in winter", ldt3, |
| std::string("2004-12-15 05:00:00-07:00"), loc1); |
| teststreaming("Los Angeles in summer", ldt4, |
| std::string("2004-08-15 05:00:00-07:00"), loc1); |
| teststreaming("New York in winter", ldt5, |
| std::string("2004-12-15 07:00:00-05:00"), loc1); |
| teststreaming("Phoenix in Summer", ldt6, |
| std::string("2004-08-15 05:00:00-07:00"), loc1); |
| teststreaming("Sydney in December", ldt1.local_time_in(sydney), |
| std::string("2004-12-15 23:00:00+11:00"), loc1); |
| |
| #if !defined(BOOST_NO_STD_WSTRING) |
| |
| typedef boost::date_time::time_facet<local_date_time, wchar_t> wldt_facet; |
| //wldt_facet* wtimefacet = new wldt_facet(L"%c %Z"); // full name |
| wldt_facet* wtimefacet = new wldt_facet(L"%a %b %d %H:%M:%S %Y %Z"); // full name |
| std::locale loc3(std::locale::classic(), wtimefacet); |
| |
| /* Again, wide stream tests are more thoroughly done in the |
| * time_facet tests. Here we just need to show that they work */ |
| std::cout << "\nFull time zone names tests - wide stream" << std::endl; |
| teststreaming("UTC local_date_time", ldt1, std::wstring(L"Wed Dec 15 12:00:00 2004 Coordinated Universal Time"), loc3); |
| teststreaming("Chicago in summer", ldt2, std::wstring(L"Sun Aug 15 07:00:00 2004 Central Daylight Time") , loc3); |
| |
| teststreaming("UTC local_time_period", ltp1, std::wstring(L"[Wed Dec 15 12:00:00 2004 Coordinated Universal Time/Wed Dec 15 22:24:04 2004 Coordinated Universal Time]"), loc3); |
| teststreaming("LA local_time_period", ltp2, std::wstring(L"[Sun Aug 15 05:00:00 2004 Pacific Daylight Time/Sun Aug 15 20:20:40 2004 Pacific Daylight Time]"), loc3); |
| |
| //wtimefacet->format(L"%c %z"); // abbrev |
| wtimefacet->format(L"%a %b %d %H:%M:%S %Y %z"); // abbrev |
| std::cout << "\nAbbreviated time zone names tests - wide stream" << std::endl; |
| teststreaming("UTC local_date_time", ldt1, std::wstring(L"Wed Dec 15 12:00:00 2004 UTC"), loc3); |
| teststreaming("Phoenix in Summer", ldt6, std::wstring(L"Sun Aug 15 05:00:00 2004 MST"), loc3); |
| |
| #endif // BOOST_NO_STD_WSTRING |
| |
| return printTestStats(); |
| } |