| |
| |
| /* 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: 2009-06-04 04:24:49 -0400 (Thu, 04 Jun 2009) $ |
| */ |
| |
| #include "boost/date_time/gregorian/gregorian.hpp" |
| #include "boost/date_time/date_facet.hpp" |
| #include "../testfrmwk.hpp" |
| #include <iostream> |
| #include <sstream> |
| |
| |
| template<class temporal_type, typename charT> |
| inline |
| void |
| teststreaming(std::string testname, |
| temporal_type value, |
| std::basic_string<charT> expected_result, |
| const std::locale& locale = std::locale::classic()) |
| { |
| std::basic_stringstream<charT> ss; |
| ss.imbue(locale); |
| ss << value; |
| check_equal(testname, ss.str(), expected_result); |
| } |
| |
| |
| // collections for adding to facet |
| const char* const month_short_names[]={"*jan*","*feb*","*mar*", |
| "*apr*","*may*","*jun*", |
| "*jul*","*aug*","*sep*", |
| "*oct*","*nov*","*dec*"}; |
| |
| const char* const month_long_names[]={"**January**","**February**","**March**", |
| "**April**","**May**","**June**", |
| "**July**","**August**","**September**", |
| "**October**","**November**","**December**"}; |
| |
| const char* const weekday_short_names[]={"day1", "day2","day3","day4", |
| "day5","day6","day7"}; |
| |
| const char* const weekday_long_names[]= {"Sun-0", "Mon-1", "Tue-2", |
| "Wed-3", "Thu-4", |
| "Fri-5", "Sat-6"}; |
| |
| std::vector<std::basic_string<char> > short_weekday_names; |
| std::vector<std::basic_string<char> > long_weekday_names; |
| std::vector<std::basic_string<char> > short_month_names; |
| std::vector<std::basic_string<char> > long_month_names; |
| |
| #if !defined(BOOST_NO_STD_WSTRING) |
| // collections of test results |
| const std::wstring full_months[]={L"January",L"February",L"March", |
| L"April",L"May",L"June", |
| L"July",L"August",L"September", |
| L"October",L"November",L"December"}; |
| const std::wstring short_months[]={L"Jan",L"Feb",L"Mar", |
| L"Apr",L"May",L"Jun", |
| L"Jul",L"Aug",L"Sep", |
| L"Oct",L"Nov",L"Dec"}; |
| |
| const std::wstring full_weekdays[]= {L"Sunday", L"Monday",L"Tuesday", |
| L"Wednesday", L"Thursday", |
| L"Friday", L"Saturday"}; |
| const std::wstring short_weekdays[]= {L"Sun", L"Mon",L"Tue", |
| L"Wed", L"Thu", |
| L"Fri", L"Sat"}; |
| |
| //const whcar_t const |
| #endif // BOOST_NO_STD_WSTRING |
| |
| int main() { |
| using namespace boost::gregorian; |
| |
| std::copy(&month_short_names[0], |
| &month_short_names[12], |
| std::back_inserter(short_month_names)); |
| |
| std::copy(&month_long_names[0], |
| &month_long_names[12], |
| std::back_inserter(long_month_names)); |
| |
| std::copy(&weekday_short_names[0], |
| &weekday_short_names[7], |
| std::back_inserter(short_weekday_names)); |
| |
| std::copy(&weekday_long_names[0], |
| &weekday_long_names[7], |
| std::back_inserter(long_weekday_names)); |
| |
| { |
| std::stringstream ss; |
| date d(2004,Oct,31); |
| date_period dp(d, d + days(7)); |
| ss << d; |
| check("to_string & default formats match", |
| to_simple_string(d) == ss.str()); |
| ss.str(""); |
| ss << dp; |
| check("to_string & default formats match", |
| to_simple_string(dp) == ss.str()); |
| } |
| |
| { |
| date d(2004,Oct, 13); |
| date_period dp(d, d + days(7)); |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->format(date_facet::standard_format_specifier); |
| std::cout.imbue(std::locale(std::locale::classic(), datefacet)); |
| teststreaming("default classic date", d, std::string("10/13/04"), |
| std::locale(std::locale::classic(), datefacet)); |
| std::cout << "default classic date output: " << d << std::endl; |
| |
| } |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->format(date_facet::standard_format_specifier); |
| teststreaming("default classic date period", dp, |
| std::string("[10/13/04/10/19/04]"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->format("%Y-%d-%b %a"); |
| teststreaming("custom date facet date period", dp, |
| std::string("[2004-13-Oct Wed/2004-19-Oct Tue]"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->set_iso_format(); |
| teststreaming("custom date facet date", d, |
| std::string("20041013"), |
| std::locale(std::locale::classic(), datefacet)); |
| |
| } |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->set_iso_format(); |
| teststreaming("custom date facet date period", dp, |
| std::string("[20041013/20041019]"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->set_iso_extended_format(); |
| teststreaming("custom date facet date", d, |
| std::string("2004-10-13"), |
| std::locale(std::locale::classic(), datefacet)); |
| |
| } |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->set_iso_extended_format(); |
| teststreaming("custom date facet date period", dp, |
| std::string("[2004-10-13/2004-10-19]"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->set_iso_extended_format(); |
| period_formatter pf(period_formatter::AS_OPEN_RANGE, " / ", "[ ", " )", " ]"); |
| datefacet->period_formatter(pf); |
| teststreaming("custom date facet date period - open range custom delimeters", dp, |
| std::string("[ 2004-10-13 / 2004-10-20 )"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet("%A %b %d, %Y"); |
| datefacet->short_month_names(short_month_names); |
| teststreaming("custom date facet -- custom short month names", d, |
| std::string("Wednesday *oct* 13, 2004"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet("%B %A %d, %Y"); |
| datefacet->long_month_names(long_month_names); |
| teststreaming("custom date facet -- custom long month names", d, |
| std::string("**October** Wednesday 13, 2004"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet("%a - %b %d, %Y"); |
| datefacet->short_weekday_names(short_weekday_names); |
| std::cout.imbue(std::locale(std::locale::classic(), datefacet)); |
| std::cout << d << std::endl; |
| teststreaming("custom date facet -- custom short weekday names", d, |
| std::string("day4 - Oct 13, 2004"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| { |
| date_facet* datefacet = new date_facet("%b %d, %Y ++ %A"); |
| datefacet->long_weekday_names(long_weekday_names); |
| teststreaming("custom date facet -- custom short weekday names", d, |
| std::string("Oct 13, 2004 ++ Wed-3"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| {//date |
| date_facet* datefacet = new date_facet("%Y-%b-%d %%d"); |
| teststreaming("Literal '%' in date format", d, |
| std::string("2004-Oct-13 %d"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| { |
| date_facet* datefacet = new date_facet("%Y-%b-%d %%%d"); |
| teststreaming("Multiple literal '%'s in date format", d, |
| std::string("2004-Oct-13 %13"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| {//month |
| date_facet* datefacet = new date_facet(); |
| datefacet->month_format("%b %%b"); |
| teststreaming("Literal '%' in month format", d.month(), |
| std::string("Oct %b"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->month_format("%b %%%b"); |
| teststreaming("Multiple literal '%'s in month format", d.month(), |
| std::string("Oct %Oct"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| {//weekday |
| date_facet* datefacet = new date_facet(); |
| datefacet->weekday_format("%a %%a"); |
| teststreaming("Literal '%' in weekday format", d.day_of_week(), |
| std::string("Wed %a"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| { |
| date_facet* datefacet = new date_facet(); |
| datefacet->weekday_format("%a %%%a"); |
| teststreaming("Multiple literal '%'s in weekday format", d.day_of_week(), |
| std::string("Wed %Wed"), |
| std::locale(std::locale::classic(), datefacet)); |
| } |
| |
| |
| |
| date d_not_date(not_a_date_time); |
| teststreaming("special value, no special facet", d_not_date, std::string("not-a-date-time")); |
| |
| |
| // std::cout.imbue(std::locale(std::locale::classic(), datefacet)); |
| // std::cout << d << std::endl; |
| |
| |
| } |
| |
| // date_generator tests |
| { |
| partial_date pd(31,Oct); |
| teststreaming("partial date", pd, std::string("31 Oct")); |
| first_kday_of_month fkd(Tuesday, Sep); |
| teststreaming("first kday", fkd, std::string("first Tue of Sep")); |
| nth_kday_of_month nkd2(nth_kday_of_month::second, Tuesday, Sep); |
| teststreaming("nth kday", nkd2, std::string("second Tue of Sep")); |
| nth_kday_of_month nkd3(nth_kday_of_month::third, Tuesday, Sep); |
| teststreaming("nth kday", nkd3, std::string("third Tue of Sep")); |
| nth_kday_of_month nkd4(nth_kday_of_month::fourth, Tuesday, Sep); |
| teststreaming("nth kday", nkd4, std::string("fourth Tue of Sep")); |
| nth_kday_of_month nkd5(nth_kday_of_month::fifth, Tuesday, Sep); |
| teststreaming("nth kday", nkd5, std::string("fifth Tue of Sep")); |
| last_kday_of_month lkd(Tuesday, Sep); |
| teststreaming("last kday", lkd, std::string("last Tue of Sep")); |
| first_kday_before fkb(Wednesday); |
| teststreaming("First before", fkb, std::string("Wed before")); |
| first_kday_after fka(Thursday); |
| teststreaming("First after", fka, std::string("Thu after")); |
| } |
| |
| #if !defined(BOOST_NO_STD_WSTRING) |
| date d(2004,Oct, 13); |
| date_period dp(d, d + days(7)); |
| date d_not_date(not_a_date_time); |
| |
| teststreaming("special value, no special facet wide", d_not_date, |
| std::wstring(L"not-a-date-time")); |
| { |
| wdate_facet* wdatefacet = new wdate_facet(); |
| wdatefacet->format(wdate_facet::standard_format_specifier); |
| teststreaming("widestream default classic date", d, |
| std::wstring(L"10/13/04"), |
| std::locale(std::locale::classic(), wdatefacet)); |
| } |
| { |
| wdate_facet* wdatefacet = new wdate_facet(); |
| wdatefacet->format(wdate_facet::standard_format_specifier); |
| teststreaming("widestream default classic date period", dp, |
| std::wstring(L"[10/13/04/10/19/04]"), |
| std::locale(std::locale::classic(), wdatefacet)); |
| } |
| { |
| wdate_facet* wdatefacet = new wdate_facet(); |
| wdatefacet->format(L"%Y-%d-%b %a"); |
| teststreaming("widestream custom date facet", d, |
| std::wstring(L"2004-13-Oct Wed"), |
| std::locale(std::locale::classic(), wdatefacet)); |
| } |
| { |
| wdate_facet* wdatefacet = new wdate_facet(); |
| wdatefacet->format(L"%Y-%d-%b %a"); |
| teststreaming("widestream custom date facet date period", dp, |
| std::wstring(L"[2004-13-Oct Wed/2004-19-Oct Tue]"), |
| std::locale(std::locale::classic(), wdatefacet)); |
| } |
| { |
| wdate_facet* wdatefacet = new wdate_facet(); |
| wdatefacet->set_iso_extended_format(); |
| wperiod_formatter pf(wperiod_formatter::AS_OPEN_RANGE, L" / ", L"[ ", L" )", L" ]"); |
| wdatefacet->period_formatter(pf); |
| teststreaming("custom date facet date period - open range custom delimeters", dp, |
| std::wstring(L"[ 2004-10-13 / 2004-10-20 )"), |
| std::locale(std::locale::classic(), wdatefacet)); |
| } |
| /************* small gregorian types tests *************/ |
| wdate_facet* small_types_facet = new wdate_facet(); |
| std::locale loc = std::locale(std::locale::classic(), small_types_facet); |
| |
| // greg_year test |
| greg_year gy(2004); |
| teststreaming("greg_year", gy, std::string("2004")); |
| |
| // greg_month tests |
| { |
| for(int i = 0; i < 12; ++i) { |
| greg_month m(i+1); // month numbers 1-12 |
| teststreaming("greg_month short", m, short_months[i], loc); |
| } |
| small_types_facet->month_format(L"%B"); // full name |
| for(int i = 0; i < 12; ++i) { |
| greg_month m(i+1); // month numbers 1-12 |
| teststreaming("greg_month full", m, full_months[i], loc); |
| } |
| } |
| |
| // greg_weekday tests |
| { |
| for(int i = 0; i < 7; ++i) { |
| greg_weekday gw(i); // weekday numbers 0-6 |
| teststreaming("greg_weekday short", gw, short_weekdays[i], loc); |
| } |
| small_types_facet->weekday_format(L"%A"); // full name |
| for(int i = 0; i < 7; ++i) { |
| greg_weekday gw(i); // weekday numbers 0-6 |
| teststreaming("greg_weekday full", gw, full_weekdays[i], loc); |
| } |
| } |
| #endif // BOOST_NO_STD_WSTRING |
| |
| return printTestStats(); |
| } |
| |