testdate_input_facet.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 572 行 · 第 1/2 页
CPP
572 行
/* Copyright (c) 2005 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-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $ */#include "boost/date_time/gregorian/gregorian.hpp"#include "boost/date_time/testfrmwk.hpp"#include <iostream>#include <sstream>#include <string>#include <vector>#ifndef USE_DATE_TIME_PRE_1_33_FACET_IO// for tests that are expected to fail and throw exceptionstemplate<class temporal_type, class exception_type>bool failure_test(temporal_type component, const std::string& input, exception_type /*except*/, boost::gregorian::date_input_facet* facet){ using namespace boost::gregorian; bool result = false; std::istringstream iss(input); iss.exceptions(std::ios_base::failbit); // turn on exceptions iss.imbue(std::locale(std::locale::classic(), facet)); try { iss >> component; } catch(exception_type e) { std::cout << "Expected exception caught: \"" << e.what() << "\"" << std::endl; result = iss.fail(); // failbit must be set to pass test } catch(...) { result = false; } return result;}// for tests that are expected to fail quietlytemplate<class temporal_type>bool failure_test(temporal_type component, const std::string& input, boost::gregorian::date_input_facet* facet){ using namespace boost::gregorian; std::istringstream iss(input); /* leave exceptions turned off * iss.exceptions(std::ios_base::failbit); */ iss.imbue(std::locale(std::locale::classic(), facet)); try { iss >> component; } catch(...) { std::cout << "Caught unexpected exception" << std::endl; return false; } return iss.fail(); // failbit must be set to pass test}#endifint main(){#ifndef USE_DATE_TIME_PRE_1_33_FACET_IO using namespace boost::gregorian; { // verify no extra character are consumed greg_month m(1); std::stringstream ss("Mar."); std::istreambuf_iterator<char> sitr(ss), str_end; date_input_facet* f = new date_input_facet(); f->get(sitr, str_end, ss, m); check("No extra characters consumed", m = greg_month(Mar) && *sitr == '.'); } // set up initial objects date d(not_a_date_time); days dd(not_a_date_time); greg_month m(1); greg_weekday gw(0); greg_day gd(1); greg_year gy(2000); // exceptions for failure_tests std::ios_base::failure e_failure("default"); bad_month e_bad_month; bad_year e_bad_year; bad_day_of_month e_bad_day_of_month; bad_weekday e_bad_weekday; bad_day_of_year e_bad_day_of_year; // default format tests: date, days, month, weekday, day, year std::istringstream iss("2005-Jan-15 21 Feb Tue 4 2002"); iss >> d; check("Default format date", d == date(2005,Jan,15)); iss >> dd; check("Default (only) format positive days", dd == days(21)); iss >> m; check("Default format month", m == greg_month(2)); iss >> gw; check("Default format weekday", gw == greg_weekday(2)); iss >> gd; check("Default (only) format day of month", gd == greg_day(4)); iss >> gy; check("Default format year", gy == greg_year(2002)); // failure tests check("Input Misspelled in year (date) w/exceptions", failure_test(d, "205-Jan-15", e_bad_year, new date_input_facet())); check("Input Misspelled in year (date) no-exceptions", failure_test(d, "205-Jan-15", new date_input_facet())); check("Input Misspelled in month (date) w/exceptions", failure_test(d, "2005-Jsn-15", e_bad_month, new date_input_facet())); check("Input Misspelled in month (date) no-exceptions", failure_test(d, "2005-Jsn-15", new date_input_facet())); check("Input Misspelled in day (date) w/exceptions", failure_test(d, "2005-Jan-51", e_bad_day_of_month, new date_input_facet())); check("Input Misspelled in day (date) no-exceptions", failure_test(d, "2005-Jan-51", new date_input_facet())); check("Input Misspelled greg_weekday w/exceptions", failure_test(gw, "San", e_bad_weekday, new date_input_facet())); check("Input Misspelled greg_weekday no-exceptions", failure_test(gw, "San", new date_input_facet())); check("Input Misspelled month w/exceptions", failure_test(m, "Jsn", e_bad_month, new date_input_facet())); check("Input Misspelled month no-exceptions", failure_test(m, "Jsn", new date_input_facet())); check("Bad Input greg_day w/exceptions", failure_test(gd, "Sun", e_bad_day_of_month, new date_input_facet())); check("Bad Input greg_day no-exceptions", failure_test(gd, "Sun", new date_input_facet())); check("Input Misspelled greg_year w/exceptions", failure_test(gy, "205", e_bad_year, new date_input_facet())); check("Input Misspelled greg_year no-exceptions", failure_test(gy, "205", new date_input_facet())); // change to full length names, iso date format, and 2 digit year date_input_facet* facet = new date_input_facet(); facet->set_iso_format(); facet->month_format("%B"); facet->weekday_format("%A"); facet->year_format("%y"); iss.str("20050115 -55 February Tuesday 02"); iss.imbue(std::locale(std::locale::classic(), facet)); iss >> d; check("ISO format date", d == date(2005,Jan,15)); iss >> dd; check("Default (only) format negative days", dd == days(-55)); iss >> m; check("Full format month", m == greg_month(2)); iss >> gw; check("Full format weekday", gw == greg_weekday(2)); iss >> gy; check("2 digit format year", gy == greg_year(2002)); date_input_facet* f1 = new date_input_facet(); date_input_facet* f2 = new date_input_facet(); f1->set_iso_format(); f2->set_iso_format(); check("Missing digit(s) in ISO string", failure_test(d,"2005071", f1)); check("Missing digit(s) in ISO string", failure_test(d,"2005071", e_bad_day_of_month, f2)); { // literal % in format tests date d(not_a_date_time); greg_month m(1); greg_weekday gw(0); greg_year y(1400); date_input_facet* f = new date_input_facet("%%d %Y-%b-%d"); std::stringstream ss; ss.imbue(std::locale(ss.getloc(), f)); ss.str("%d 2005-Jun-14"); ss >> d; check("Literal '%' in date format", d == date(2005,Jun,14)); f->format("%%%d %Y-%b-%d"); ss.str("%14 2005-Jun-14"); ss >> d; check("Multiple literal '%'s in date format", d == date(2005,Jun,14)); f->month_format("%%b %b"); ss.str("%b Jun"); ss >> m; check("Literal '%' in month format", m == greg_month(6)); f->month_format("%%%b"); ss.str("%Jun"); ss >> m; check("Multiple literal '%'s in month format", m == greg_month(6)); f->weekday_format("%%a %a"); ss.str("%a Tue"); ss >> gw; check("Literal '%' in weekday format", gw == greg_weekday(2)); f->weekday_format("%%%a"); ss.str("%Tue"); ss >> gw; check("Multiple literal '%'s in weekday format", gw == greg_weekday(2)); f->year_format("%%Y %Y"); ss.str("%Y 2005"); ss >> y; check("Literal '%' in year format", y == greg_year(2005)); f->year_format("%%%Y"); ss.str("%2005"); ss >> y; check("Multiple literal '%'s in year format", y == greg_year(2005)); } // All days, month, weekday, day, and year formats have been tested // begin testing other date formats facet->set_iso_extended_format(); iss.str("2005-01-15"); iss >> d; check("ISO Extended format date", d == date(2005,Jan,15)); facet->format("%B %d, %Y"); iss.str("March 15, 2006"); iss >> d; check("Custom date format: \"%B %d, %Y\" => 'March 15, 2006'", d == date(2006,Mar,15)); facet->format("%Y-%j"); // Ordinal format ISO8601(2000 sect 5.2.2.1 extended) iss.str("2006-074"); iss >> d; check("Custom date format: \"%Y-%j\" => '2006-074'", d == date(2006,Mar,15)); check("Bad input Custom date format: \"%Y-%j\" => '2006-74' (w/exceptions)", failure_test(d, "2006-74", e_bad_day_of_year, facet)); check("Bad input Custom date format: \"%Y-%j\" => '2006-74' (no exceptions)", failure_test(d, "2006-74", facet)); // date_period tests // A date_period is constructed with an open range. So the periods // [2000-07--04/2000-07-25) <-- open range // And // [2000-07--04/2000-07-24] <-- closed range // Are equal date begin(2002, Jul, 4); days len(21); date_period dp(date(2000,Jan,1), days(1)); iss.str("[2002-07-04/2002-07-24]"); facet->set_iso_extended_format(); iss >> dp; check("Default period (closed range)", dp == date_period(begin,len)); { std::stringstream ss; date d(not_a_date_time); date d2 = day_clock::local_day(); date d3(neg_infin); date d4(pos_infin); date_period dp(d2, d); // date/nadt date_period dp2(d, d); // nadt/nadt date_period dp3(d3, d4); ss << dp; ss >> dp2; check("Special values period (reversibility test)", dp == dp2); ss.str("[-infinity/+infinity]"); ss >> dp2; check("Special values period (infinities)", dp3 == dp2); } // open range period_parser pp(period_parser::AS_OPEN_RANGE); iss.str("[2002-07-04/2002-07-25)"); facet->period_parser(pp); iss >> dp; check("Open range period", dp == date_period(begin,len)); // custom period delimiters pp.delimiter_strings(" to ", "from ", " exclusive", " inclusive"); iss.str("from 2002-07-04 to 2002-07-25 exclusive"); facet->period_parser(pp); iss >> dp; check("Open range period - custom delimiters", dp == date_period(begin,len)); pp.range_option(period_parser::AS_CLOSED_RANGE); iss.str("from 2002-07-04 to 2002-07-24 inclusive"); facet->period_parser(pp);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?