summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/date_time/test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/date_time/test
parentInitial commit. (diff)
downloadceph-upstream/16.2.11+ds.tar.xz
ceph-upstream/16.2.11+ds.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/date_time/test')
-rw-r--r--src/boost/libs/date_time/test/Jamfile.v2168
-rw-r--r--src/boost/libs/date_time/test/gregorian/testcurrent_day.cpp37
-rw-r--r--src/boost/libs/date_time/test/gregorian/testdate.cpp319
-rw-r--r--src/boost/libs/date_time/test/gregorian/testdate_duration.cpp77
-rw-r--r--src/boost/libs/date_time/test/gregorian/testdate_facet_new.cpp388
-rw-r--r--src/boost/libs/date_time/test/gregorian/testdate_input_facet.cpp582
-rw-r--r--src/boost/libs/date_time/test/gregorian/testdate_iterator.cpp367
-rw-r--r--src/boost/libs/date_time/test/gregorian/testfacet.cpp342
-rw-r--r--src/boost/libs/date_time/test/gregorian/testformat_date_parser.cpp363
-rw-r--r--src/boost/libs/date_time/test/gregorian/testformatters.cpp62
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgenerators.cpp175
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgreg_cal.cpp135
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgreg_day.cpp91
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgreg_durations.cpp241
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgreg_month.cpp67
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgreg_serialize.cpp190
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgreg_wstream.cpp178
-rw-r--r--src/boost/libs/date_time/test/gregorian/testgreg_year.cpp45
-rw-r--r--src/boost/libs/date_time/test/gregorian/testparse_date.cpp368
-rw-r--r--src/boost/libs/date_time/test/gregorian/testperiod.cpp153
-rw-r--r--src/boost/libs/date_time/test/local_time/README.poorly_formed_zonespec4
-rw-r--r--src/boost/libs/date_time/test/local_time/poorly_formed_zonespec.csv2
-rw-r--r--src/boost/libs/date_time/test/local_time/testclocks.cpp40
-rw-r--r--src/boost/libs/date_time/test/local_time/testcustom_time_zone.cpp88
-rw-r--r--src/boost/libs/date_time/test/local_time/testdst_transition_day_rule.cpp65
-rw-r--r--src/boost/libs/date_time/test/local_time/testlocal_time.cpp370
-rw-r--r--src/boost/libs/date_time/test/local_time/testlocal_time_facet.cpp188
-rw-r--r--src/boost/libs/date_time/test/local_time/testlocal_time_input_facet.cpp239
-rw-r--r--src/boost/libs/date_time/test/local_time/testlocal_time_iterator.cpp95
-rw-r--r--src/boost/libs/date_time/test/local_time/testlocal_time_period.cpp82
-rw-r--r--src/boost/libs/date_time/test/local_time/testposix_time_zone.cpp221
-rw-r--r--src/boost/libs/date_time/test/local_time/testtz_database.cpp116
-rw-r--r--src/boost/libs/date_time/test/local_time/testwcustom_time_zone.cpp89
-rw-r--r--src/boost/libs/date_time/test/local_time/testwposix_time_zone.cpp224
-rw-r--r--src/boost/libs/date_time/test/posix_time/compile_fail/hours_special_value.cpp19
-rw-r--r--src/boost/libs/date_time/test/posix_time/compile_fail/millisec_special_value.cpp19
-rw-r--r--src/boost/libs/date_time/test/posix_time/compile_fail/minutes_special_value.cpp19
-rw-r--r--src/boost/libs/date_time/test/posix_time/compile_fail/seconds_special_value.cpp19
-rw-r--r--src/boost/libs/date_time/test/posix_time/testc_local_adjustor.cpp131
-rw-r--r--src/boost/libs/date_time/test/posix_time/testclock.cpp42
-rw-r--r--src/boost/libs/date_time/test/posix_time/testdst_rules.cpp451
-rw-r--r--src/boost/libs/date_time/test/posix_time/testduration.cpp282
-rw-r--r--src/boost/libs/date_time/test/posix_time/testfiletime_functions.cpp90
-rw-r--r--src/boost/libs/date_time/test/posix_time/testformatters.cpp18
-rw-r--r--src/boost/libs/date_time/test/posix_time/testgreg_duration_operators.cpp85
-rw-r--r--src/boost/libs/date_time/test/posix_time/testiterator.cpp135
-rw-r--r--src/boost/libs/date_time/test/posix_time/testlocal_adjustor.cpp175
-rw-r--r--src/boost/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp139
-rw-r--r--src/boost/libs/date_time/test/posix_time/testparse_time.cpp280
-rw-r--r--src/boost/libs/date_time/test/posix_time/testperiod.cpp22
-rw-r--r--src/boost/libs/date_time/test/posix_time/teststreams.cpp179
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime.cpp336
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime_facet.cpp458
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime_formatters.cpp116
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime_input_facet.cpp453
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime_period.cpp77
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime_serialize.cpp125
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime_serialize_versioning.cpp64
-rw-r--r--src/boost/libs/date_time/test/posix_time/testtime_wstream.cpp89
-rw-r--r--src/boost/libs/date_time/test/self_contained_header.cpp22
-rw-r--r--src/boost/libs/date_time/test/testconstrained_value.cpp74
-rw-r--r--src/boost/libs/date_time/test/testfrmwk.hpp113
-rw-r--r--src/boost/libs/date_time/test/testfrom_facet.cpp50
-rw-r--r--src/boost/libs/date_time/test/testgeneric_period.cpp273
-rw-r--r--src/boost/libs/date_time/test/testgregorian_calendar.cpp253
-rw-r--r--src/boost/libs/date_time/test/testint64_range.cpp95
-rw-r--r--src/boost/libs/date_time/test/testint_adapter.cpp158
-rw-r--r--src/boost/libs/date_time/test/testmisc.cpp59
-rw-r--r--src/boost/libs/date_time/test/testtime_resolution_traits.cpp72
-rw-r--r--src/boost/libs/date_time/test/testwrapping_int.cpp138
70 files changed, 11301 insertions, 0 deletions
diff --git a/src/boost/libs/date_time/test/Jamfile.v2 b/src/boost/libs/date_time/test/Jamfile.v2
new file mode 100644
index 000000000..74da9b90a
--- /dev/null
+++ b/src/boost/libs/date_time/test/Jamfile.v2
@@ -0,0 +1,168 @@
+import os ;
+import path ;
+import regex ;
+import testing ;
+
+local DATE_TIME_DYNAMIC_PROPERTIES = <define>BOOST_ALL_DYN_LINK <runtime-link>shared <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG <define>BOOST_ALL_NO_LIB ;
+local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ # FIXME
+ #std::locale-support
+ <define>BOOST_ALL_NO_LIB ;
+
+# core stuff
+run testint_adapter.cpp ;
+run testtime_resolution_traits.cpp ;
+run testwrapping_int.cpp ;
+run testconstrained_value.cpp ;
+run testgregorian_calendar.cpp ;
+run testgeneric_period.cpp ;
+# the library dependence below is just to test that the
+# stub library will build, it's completely uneeded not that
+# date-time is all inline
+run testmisc.cpp
+ ../build//boost_date_time/<link>static
+ : : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ : testmisc_std_cfg ;
+
+### gregorian
+
+run gregorian/testdate.cpp ;
+run gregorian/testdate_duration.cpp ;
+run gregorian/testdate_facet_new.cpp ;
+run gregorian/testdate_input_facet.cpp ;
+run gregorian/testdate_iterator.cpp ;
+
+run gregorian/testgenerators.cpp ;
+run gregorian/testgreg_cal.cpp ;
+run gregorian/testgreg_day.cpp ;
+run gregorian/testgreg_durations.cpp ;
+run gregorian/testgreg_month.cpp ;
+run gregorian/testgreg_year.cpp ;
+run gregorian/testformatters.cpp ;
+run gregorian/testparse_date.cpp ;
+run gregorian/testperiod.cpp ;
+
+run gregorian/testgreg_serialize.cpp
+ ../../serialization/build//boost_serialization
+ : : : <define>DATE_TIME_XML_SERIALIZE
+ : testgreg_serialize_xml ;
+
+run gregorian/testgreg_serialize.cpp
+ ../../serialization/build//boost_serialization
+ : : :
+ : testgreg_serialize ;
+
+run posix_time/testfiletime_functions.cpp ;
+run posix_time/testlocal_adjustor.cpp ;
+run posix_time/testc_local_adjustor.cpp ;
+run posix_time/testclock.cpp ;
+run posix_time/testdst_rules.cpp ;
+run posix_time/testduration.cpp ;
+run posix_time/testiterator.cpp ;
+run posix_time/testparse_time.cpp ;
+run posix_time/testtime_period.cpp ;
+run posix_time/testtime.cpp ;
+run posix_time/testmicrosec_time_clock.cpp ;
+run posix_time/testgreg_duration_operators.cpp ;
+run posix_time/testtime_facet.cpp ;
+run posix_time/testtime_input_facet.cpp
+ : : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ : testtime_input_facet ;
+
+run posix_time/testtime_formatters.cpp
+ : : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ : testtime_formatters ;
+
+# text archive tests
+run posix_time/testtime_serialize.cpp
+ ../../serialization/build//boost_serialization
+ : : :
+ : testtime_serialize ;
+
+run posix_time/testtime_serialize.cpp
+ ../../serialization/build//boost_serialization
+ : : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ : testtime_serialize_std_config ;
+
+# xml archive tests
+run posix_time/testtime_serialize.cpp
+ ../../serialization/build//boost_serialization
+ : : : <define>DATE_TIME_XML_SERIALIZE <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ : testtime_serialize_xml_std_config ;
+
+run posix_time/testtime_serialize.cpp
+ ../../serialization/build//boost_serialization
+ : : : <define>DATE_TIME_XML_SERIALIZE
+ : testtime_serialize_xml ;
+
+# versioning tests
+run posix_time/testtime_serialize_versioning.cpp
+ ../../serialization/build//boost_serialization
+ : : testtime_serialize_versioning_prev
+ : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ : testtime_serialize_versioning_curr ;
+
+run posix_time/testtime_serialize_versioning.cpp
+ ../../serialization/build//boost_serialization
+ : : : <define>BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION=0
+ : testtime_serialize_versioning_prev ;
+
+
+
+
+compile-fail posix_time/compile_fail/hours_special_value.cpp ;
+compile-fail posix_time/compile_fail/minutes_special_value.cpp ;
+compile-fail posix_time/compile_fail/seconds_special_value.cpp ;
+compile-fail posix_time/compile_fail/millisec_special_value.cpp ;
+
+run local_time/testdst_transition_day_rule.cpp ;
+run local_time/testcustom_time_zone.cpp ;
+run local_time/testposix_time_zone.cpp ;
+run local_time/testwcustom_time_zone.cpp ;
+run local_time/testwposix_time_zone.cpp ;
+run local_time/testlocal_time.cpp ;
+run local_time/testlocal_time_iterator.cpp ;
+run local_time/testlocal_time_period.cpp ;
+
+run local_time/testtz_database.cpp
+ : : ../data/date_time_zonespec.csv local_time/poorly_formed_zonespec.csv
+ : ;
+run local_time/testlocal_time_facet.cpp
+ : : ../data/date_time_zonespec.csv : ;
+run local_time/testclocks.cpp ;
+
+
+#todo
+#if ! [ os.environ UBSAN_OPTIONS ]
+#{
+# local DATE_TIME_PROPERTIES = <define>BOOST_ALL_NO_LIB <define>USE_DATE_TIME_PRE_1_33_FACET_IO
+# # FIXME
+# # std::locale-support toolset::require-boost-spirit-support
+# ;
+
+# Iterate over all public headers and generate a self-contained header test to check for any missing includes
+# and basic syntax errors.
+if ! [ os.environ BOOST_DATE_TIME_TEST_WITHOUT_SELF_CONTAINED_HEADER_TESTS ]
+{
+ local headers_path = [ path.make $(BOOST_ROOT)/libs/date_time/include/boost ] ;
+ for file in [ path.glob-tree $(headers_path) : *.hpp ]
+ {
+ local rel_file = [ path.relative-to $(headers_path) $(file) ] ;
+ # Note: The test name starts with '~' in order to group these tests in the test report table, preferably at the end.
+ # All '/' are replaced with '-' because apparently test scripts have a problem with test names containing slashes.
+ local test_name = [ regex.replace ~hdr/$(rel_file) "/" "-" ] ;
+ #ECHO $(rel_file) ;
+ compile self_contained_header.cpp : <define>"BOOST_DATE_TIME_TEST_HEADER=$(rel_file)" <dependency>$(file) : $(test_name) ;
+ }
+}
+
+
+# Copyright (c) 2000-2020
+# CrystalClear Software, Inc.
+# 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)
+
+
+
+
diff --git a/src/boost/libs/date_time/test/gregorian/testcurrent_day.cpp b/src/boost/libs/date_time/test/gregorian/testcurrent_day.cpp
new file mode 100644
index 000000000..e89e32df4
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testcurrent_day.cpp
@@ -0,0 +1,37 @@
+/* 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 "boost/date_time/gregorian/gregorian.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ boost::gregorian::date d1(boost::gregorian::day_clock::local_day());
+ std::cout << "Check the printed date by hand: "
+ << boost::gregorian::to_iso_string(d1) << std::endl;
+
+ using namespace boost::gregorian;
+ date::ymd_type ymd = day_clock::local_day_ymd();
+ std::cout << ymd.year << "-"
+ << ymd.month.as_long_string() << "-"
+ << ymd.day << std::endl;
+
+ date d2(day_clock::universal_day());
+ std::cout << "Getting UTC date: "
+ << to_iso_string(d2) << std::endl;
+
+ date::ymd_type ymd2 = day_clock::universal_day_ymd();
+ std::cout << ymd2.year << "-"
+ << ymd2.month.as_long_string() << "-"
+ << ymd2.day << std::endl;
+
+ return 0;
+
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testdate.cpp b/src/boost/libs/date_time/test/gregorian/testdate.cpp
new file mode 100644
index 000000000..e8b957ed9
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testdate.cpp
@@ -0,0 +1,319 @@
+/* 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, Bart Garst
+ */
+
+#include <boost/cstdint.hpp>
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+
+void test_yearlimit(int yr, bool allowed)
+{
+ std::stringstream sdesc;
+ sdesc << "should" << (allowed ? "" : " not") << " be able to make a date in year " << yr;
+
+ try {
+ boost::gregorian::date chkyr(yr, 1, 1);
+ check(sdesc.str(), allowed);
+ }
+ catch (std::out_of_range&) { check(sdesc.str(), !allowed); }
+}
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+
+ //various constructors
+#if !defined(DATE_TIME_NO_DEFAULT_CONSTRUCTOR)
+ date def;
+ check("Default constructor", def == date(not_a_date_time));
+#endif
+
+ date d1(1900,1,1);
+ date d2 = date(2000,1,1);
+ date d3(d2);
+ check("Copy constructor", d3 == d2);
+ date d4(2000,12,31);
+ date d4a(2000,Dec,31);
+ //d4a.print(std::cout); std::cout << std::endl;
+ check("month_rep constructor", d4 == d4a);
+ //std::cout << d3 << std::endl;
+ //retrieval functions
+ check_equal("1900-01-01 day is 01", d1.day(), 1);
+ check_equal("1900-01-01 month is 01", d1.month(), 1);
+ check_equal("1900-01-01 year is 1900", d1.year(), 1900);
+ check_equal("2000-12-31 day is 31", d4.day(), 31);
+ check_equal("2000-12-31 month is 12", d4.month(), 12);
+ check_equal("2000-12-31 year is 2000", d4.year(), 2000);
+ //operator<
+ check("1900-01-01 is less than 2000-01-01", d1 < d2);
+ check("2000-01-01 is NOT less than 2000-01-01", !(d1 < d1));
+ //operator<=
+ check("2000-01-01 is less equal than 2000-01-01", d1 <= d1);
+ //operator>
+ check("2000-01-01 is greater than 1900-01-01", d2 > d1);
+ check("2000-01-01 is NOT greater than 2000-01-01", !(d1 < d1));
+ //operator>=
+ check("2000-01-01 is greater equal than 2000-01-01", d1 >= d1);
+ //operator!=
+ check("2000-01-01 is NOT equal to 1900-01-01", d2 != d1);
+ //operator==
+ check_equal("2000-01-01 is equal 2000-01-01", d3, d2);
+ check("2000-01-01 is greater equal 2000-01-01", d3 >= d2);
+ check("2000-01-01 is greater equal 2000-01-01", d3 <= d2);
+
+ date::ymd_type ymd = d1.year_month_day();
+ check_equal("ymd year", ymd.year, 1900);
+ check_equal("ymd month", ymd.month, 1);
+ check_equal("ymd day", ymd.day, 1);
+
+ //The max function will not compile with Borland 5.5
+ //Complains about must specialize basic_data<limits> ???
+// std::cout << "Max date is " << (date::max)() << std::endl;
+// //std::cout << "Max date is " << (basic_date< date_limits<unsigned int,1900> >::max)() << std::endl;
+// //std::cout << "Max date is " << (date_limits<unsigned int, 1900>::max)() << std::endl;
+
+ const date answers[] = {date(1900,Jan,1),date(1900,Jan,4),date(1900,Jan,7),
+ date(1900,Jan,10),date(1900,Jan,13)};
+ date_duration off(3);
+ date d5(1900,1,1);
+ for (int i=0; i < 5; ++i) {
+ //std::cout << d5 << " ";
+ check(" addition ", d5 == answers[i]);
+ d5 = d5 + off;
+ }
+ std::cout << std::endl;
+
+ const date answers1[] = {date(2000,2,26),date(2000,2,28),date(2000,Mar,1)};
+ date d8(2000,Feb,26);
+ for (int j=0; j < 3; ++j) {
+ //std::cout << d8 << " ";
+ check(" more addition ", d8 == answers1[j]);
+ d8 = d8 + days(2);
+ }
+ // std::cout << std::endl;
+
+ date d6(2000,2,28);
+ date d7(2000,3,1);
+ date_duration twoDays(2);
+ date_duration negtwoDays(-2);
+ date_duration zeroDays(0);
+ check_equal("2000-03-01 - 2000-02-28 == 2 days", twoDays, (d7-d6));
+ check_equal("2000-02-28 - 2000-03-01 == - 2 days", negtwoDays, (d6-d7));
+ check_equal("2000-02-28 - 2000-02-28 == 0 days", zeroDays, (d6-d6));
+ check_equal("2000-02-28 + 2 days == 2000-03-01 ", d6 + twoDays, d7);
+ check_equal("2000-03-01 - 2 days == 2000-02-28 ", d7 - twoDays, d6);
+ check_equal("Add duration to date", date(1999,1,1) + date_duration(365), date(2000,1,1));
+ check_equal("Add zero days", date(1999,1,1) + zeroDays, date(1999,1,1));
+ //can't do this...
+ //check("Add date to duration", date_duration(365) + date(1999,1,1) == date(2000,1,1));
+
+ {
+ date d(2003,Oct,31);
+ date_duration dd(55);
+ d += dd;
+ check("date += date_duration", d == date(2003,Dec,25));
+ d -= dd;
+ check("date -= date_duration", d == date(2003,Oct,31));
+ /* special_values is more thoroughly tested later,
+ * this is just a test of += & -= with special values */
+ d += date_duration(pos_infin);
+ check("date += inf_dur", d == date(pos_infin));
+ d -= dd;
+ check("inf_date -= dur", d == date(pos_infin));
+ }
+ {
+ date d(2003,Oct,31);
+ date_duration dd1(pos_infin), dd2(neg_infin), dd3(not_a_date_time);
+ check_equal("date + inf_dur", d + dd1, date(pos_infin));
+ check_equal("date + inf_dur", d + dd2, date(neg_infin));
+ check_equal("date + nan_dur", d + dd3, date(not_a_date_time));
+ check_equal("date - inf_dur", d - dd1, date(neg_infin));
+ check_equal("date - inf_dur", d - dd2, date(pos_infin));
+ check_equal("date - nan_dur", d - dd3, date(not_a_date_time));
+ check_equal("inf_date + inf_dur", date(pos_infin) + dd1, date(pos_infin));
+ check_equal("inf_date - inf_dur", date(pos_infin) - dd1, date(not_a_date_time));
+ check_equal("inf_date + inf_dur", date(neg_infin) + dd1, date(not_a_date_time));
+ check_equal("inf_date - inf_dur", date(neg_infin) - dd1, date(neg_infin));
+ }
+
+
+ try {
+ date d9(2000, Jan, 32);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d9) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+ try {
+ date d9(2000, Jan, 0);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d9) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ try {
+ date d20(2000, Feb, 31);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d20) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ //more subtle -- one day past in a leap year
+ try {
+ date d21(2000, Feb, 30);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d21) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ //more subtle -- one day past in a leap year
+ try {
+ date d22(2000, Feb, 29);
+ check("last day of month ok", true);
+ std::cout << to_iso_string(d22) << std::endl; //stop compiler warning
+ }
+ catch (bad_day_of_month&) {
+ check("last day of month -- oops bad exception", false);
+ }
+
+ //Not a leap year -- now Feb 29 is bad
+ try {
+ date d23(1999, Feb, 29);
+ check("day out of range", false);
+ //never reached if working -- but stops compiler warnings :-)
+ std::cout << "Oops: " << to_iso_string(d23) << std::endl;
+ }
+ catch (bad_day_of_month&) {
+ check("day out of range", true);
+ }
+
+ //check out some special values
+ check("check not a date - false", !d7.is_not_a_date());
+ check("check positive infinity - false", !d7.is_pos_infinity());
+ check("check negative infinity - false", !d7.is_neg_infinity());
+
+ date d10(neg_infin);
+ check("check negative infinity - true", d10.is_infinity());
+ d10 = d10 + twoDays; //still neg infinity
+ check("check negative infinity - true", d10.is_neg_infinity());
+
+ date d11(pos_infin);
+ check("check positive infinity - true", d11.is_infinity());
+ d11 = d11 + twoDays;
+ check("check positive infinity add - true", d11.is_pos_infinity());
+
+ date d12(not_a_date_time);
+ check("check not a date", d12.is_not_a_date());
+ check("check infinity compare ", d10 != d11);
+ check("check infinity compare ", d10 < d11);
+ check("check infinity nad compare ", d12 != d11);
+ date d13(max_date_time);
+ check("check infinity - max compare ", d13 < d11);
+ check_equal("max date_time value ", d13, date(9999,Dec, 31));
+ std::cout << to_simple_string(d13) << std::endl;
+ date d14(min_date_time);
+ check("check infinity - min compare ", d14 > d10);
+ std::cout << to_simple_string(d14) << std::endl;
+ check_equal("min date_time value ", d14, date(1400,Jan, 1));
+
+
+ date d15(1400,1,1);
+ std::cout << d15.day_of_week().as_long_string() << std::endl;
+ check("check infinity - min compare ", d10 < d15);
+
+ // most of this testing is in the gregorian_calendar tests
+ std::cout << d15.julian_day() << std::endl;
+ check_equal("check julian day ", d15.julian_day(),
+ static_cast<boost::uint32_t>(2232400));
+ check_equal("check modjulian day ", d15.modjulian_day(), -167601);
+ date d16(2004,2,29);
+ check_equal("check julian day ", d16.julian_day(),
+ static_cast<boost::uint32_t>(2453065));
+ check_equal("check modjulian day ", d16.modjulian_day(),
+ static_cast<boost::uint32_t>(53064));
+
+ // most of this testing is in the gregorian_calendar tests
+ date d31(2000, Jun, 1);
+ check_equal("check iso week number ", d31.week_number(), 22);
+ date d32(2000, Aug, 1);
+ check_equal("check iso week number ", d32.week_number(), 31);
+ date d33(2000, Oct, 1);
+ check_equal("check iso week number ", d33.week_number(), 39);
+ date d34(2000, Dec, 1);
+ check_equal("check iso week number ", d34.week_number(), 48);
+ date d35(2000, Dec, 24);
+ check_equal("check iso week number ", d35.week_number(), 51);
+ date d36(2000, Dec, 25);
+ check_equal("check iso week number ", d36.week_number(), 52);
+ date d37(2000, Dec, 31);
+ check_equal("check iso week number ", d37.week_number(), 52);
+ date d38(2001, Jan, 1);
+ check_equal("check iso week number ", d38.week_number(), 1);
+
+ try {
+ int dayofyear1 = d38.day_of_year();
+ check_equal("check day of year number", dayofyear1, 1);
+ check_equal("check day of year number", d37.day_of_year(), 366);
+ date d39(2001,Dec,31);
+ check_equal("check day of year number", d39.day_of_year(), 365);
+ date d40(2000,Feb,29);
+ check_equal("check day of year number", d40.day_of_year(), 60);
+ date d41(1400,Jan,1);
+ check_equal("check day of year number", d41.day_of_year(), 1);
+ date d42(1400,Jan,1);
+ check_equal("check day of year number", d42.day_of_year(), 1);
+ date d43(2002,Nov,17);
+ check_equal("check day of year number", d43.day_of_year(), 321);
+ }
+ catch(std::exception& e) {
+ std::cout << e.what() << std::endl;
+ check("check day of year number", false);
+ }
+
+ //converts to date and back -- should get same result
+ check_equal("tm conversion functions 2000-1-1", date_from_tm(to_tm(d2)), d2);
+ check_equal("tm conversion functions 1900-1-1", date_from_tm(to_tm(d1)), d1);
+ check_equal("tm conversion functions min date 1400-1-1 ", date_from_tm(to_tm(d14)), d14);
+ check_equal("tm conversion functions max date 9999-12-31", date_from_tm(to_tm(d13)), d13);
+
+ try{
+ date d(neg_infin);
+ tm d_tm = to_tm(d);
+ check("Exception not thrown (special_value to_tm)", false);
+ std::cout << d_tm.tm_sec << std::endl; //does nothing useful but stops compiler from complaining about unused d_tm
+ }catch(std::out_of_range&){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+
+ // trac-13159
+ test_yearlimit( 0, false);
+ test_yearlimit( 1399, false);
+ test_yearlimit( 1400, true);
+ test_yearlimit( 1401, true);
+ test_yearlimit( 9999, true);
+ test_yearlimit(10000, false);
+ test_yearlimit(10001, false);
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testdate_duration.cpp b/src/boost/libs/date_time/test/gregorian/testdate_duration.cpp
new file mode 100644
index 000000000..12bee2dbb
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testdate_duration.cpp
@@ -0,0 +1,77 @@
+/* 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, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void test_date_duration()
+{
+ using namespace boost::gregorian;
+
+ date_duration threeDays(3);
+ date_duration twoDays(2);
+ //date_duration zeroDays(0);
+ check("Self equal case", threeDays == threeDays);
+ check("Not equal case", !(threeDays == twoDays));
+ check("Less case succeed", twoDays < threeDays);
+ check("Not less case", !(threeDays < twoDays));
+ check("Not less case - equal", !(threeDays < threeDays));
+ check("Greater than ", !(threeDays > threeDays));
+ check("Greater equal ", threeDays >= threeDays);
+ check("Greater equal - false", !(twoDays >= threeDays));
+ check("add", twoDays + threeDays == date_duration(5));
+ date_duration fiveDays = threeDays;
+ fiveDays += twoDays;
+ check("add", fiveDays == date_duration(5));
+ date_duration tenDays = fiveDays;
+ tenDays += date_duration(5);
+ check("add", tenDays.days() == 10);
+
+ date_duration derivedOneDay = threeDays - twoDays;
+ check("Subtraction - neg result", twoDays - threeDays == date_duration(-1));
+ date_duration oneDay(1);
+ check("Subtraction", oneDay == derivedOneDay);
+ date_duration fiveDaysDerived = tenDays;
+ fiveDaysDerived -= fiveDays;
+ check("Subtraction", fiveDaysDerived == fiveDays);
+
+ oneDay = twoDays / 2;
+ check("Division", oneDay.days() == 1);
+ date_duration oneDayDivide = threeDays / 2;
+ check("Division", oneDayDivide.days() == 1);
+ date_duration hundred(100);
+ hundred /= -10;
+ check("Division", hundred.days() == -10 && hundred.is_negative());
+
+ date_duration pos_dur(123);
+ date_duration neg_dur(-pos_dur);
+ check("unary-", neg_dur.days() == -123);
+
+ // special values tests
+ date_duration pi_dur(pos_infin);
+ date_duration ni_dur(neg_infin);
+ date_duration nd_dur(not_a_date_time);
+ check("pos_inf + neg_inf", (pi_dur + ni_dur) == nd_dur);
+ //check("inf * integer", (pi_dur * 2) == pi_dur); // not implemented
+ check("neg_inf / integer", (ni_dur / 3) == ni_dur);
+ check("inf + dur", (pi_dur + hundred) == pi_dur);
+ check("unary-", date_duration(-pi_dur) == ni_dur);
+
+// date_duration dd(1);
+// dd++;
+// check("Increment", dd == twoDays);
+
+}
+
+int main() {
+ test_date_duration();
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testdate_facet_new.cpp b/src/boost/libs/date_time/test/gregorian/testdate_facet_new.cpp
new file mode 100644
index 000000000..9c6dafbe2
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testdate_facet_new.cpp
@@ -0,0 +1,388 @@
+
+
+/* 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$
+ */
+
+#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));
+ }
+
+ // trac-11142: actually test delimiter_strings(...)
+ {
+ date_facet* datefacet = new date_facet();
+ datefacet->set_iso_extended_format();
+ period_formatter pf(period_formatter::AS_OPEN_RANGE, " / ", "[ ", " )", " ]");
+ pf.delimiter_strings(" to ", "from ", " inclusive", " exclusive");
+ datefacet->period_formatter(pf);
+ teststreaming("custom date facet date period - delimiter_strings", dp,
+ std::string("from 2004-10-13 to 2004-10-20 inclusive"),
+ 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));
+ }
+ {
+ date d1(2004,Oct, 13);
+ date_facet* datefacet = new date_facet("%d%m%y");
+ teststreaming("Single digit year and %y", d1,
+ std::string("131004"),
+ 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(greg_month::value_type 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(greg_month::value_type 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(greg_weekday::value_type 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(greg_weekday::value_type 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();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testdate_input_facet.cpp b/src/boost/libs/date_time/test/gregorian/testdate_input_facet.cpp
new file mode 100644
index 000000000..d0b9c19cc
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testdate_input_facet.cpp
@@ -0,0 +1,582 @@
+/* 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$
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../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 exceptions
+template<class temporal_type, class exception_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ exception_type const& /*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 quietly
+template<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
+}
+
+#endif
+
+
+
+int 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;
+ 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_equal("Default format date", d, date(2005,Jan,15));
+ iss >> dd;
+ check_equal("Default (only) format positive days", dd, days(21));
+ iss >> m;
+ check_equal("Default format month", m, greg_month(2));
+ iss >> gw;
+ check_equal("Default format weekday", gw, greg_weekday(2));
+ iss >> gd;
+ check_equal("Default (only) format day of month", gd, greg_day(4));
+ iss >> gy;
+ check_equal("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_equal("ISO format date", d, date(2005,Jan,15));
+ iss >> dd;
+ check_equal("Default (only) format negative days", dd, days(-55));
+ iss >> m;
+ check_equal("Full format month", m, greg_month(2));
+ iss >> gw;
+ check_equal("Full format weekday", gw, greg_weekday(2));
+ iss >> gy;
+ check_equal("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 dx(not_a_date_time);
+ greg_month mx(1);
+ greg_weekday gwx(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 >> dx;
+ check_equal("Literal '%' in date format", dx, date(2005,Jun,14));
+ f->format("%%%d %Y-%b-%d");
+ ss.str("%14 2005-Jun-14");
+ ss >> dx;
+ check_equal("Multiple literal '%'s in date format", dx, date(2005,Jun,14));
+
+ f->month_format("%%b %b");
+ ss.str("%b Jun");
+ ss >> mx;
+ check_equal("Literal '%' in month format", mx, greg_month(6));
+ f->month_format("%%%b");
+ ss.str("%Jun");
+ ss >> mx;
+ check_equal("Multiple literal '%'s in month format", mx, greg_month(6));
+
+ f->weekday_format("%%a %a");
+ ss.str("%a Tue");
+ ss >> gwx;
+ check_equal("Literal '%' in weekday format", gwx, greg_weekday(2));
+ f->weekday_format("%%%a");
+ ss.str("%Tue");
+ ss >> gwx;
+ check_equal("Multiple literal '%'s in weekday format", gwx, greg_weekday(2));
+
+ f->year_format("%%Y %Y");
+ ss.str("%Y 2005");
+ ss >> y;
+ check_equal("Literal '%' in year format", y, greg_year(2005));
+ f->year_format("%%%Y");
+ ss.str("%2005");
+ ss >> y;
+ check_equal("Multiple literal '%'s in year format", y, greg_year(2005));
+
+ f->year_format("%Y%");
+ ss.str("2005%");
+ ss >> y;
+ check_equal("Trailing'%'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_equal("ISO Extended format date", d, date(2005,Jan,15));
+
+ facet->format("%B %d, %Y");
+ iss.str("March 15, 2006");
+ iss >> d;
+ check_equal("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_equal("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_equal("Default period (closed range)", dp, date_period(begin,len));
+ {
+ std::stringstream ss;
+ date dx(not_a_date_time);
+ date d2 = day_clock::local_day();
+ date d3(neg_infin);
+ date d4(pos_infin);
+ date_period dpx(d2, dx); // date/nadt
+ date_period dp2(dx, dx); // nadt/nadt
+ date_period dp3(d3, d4);
+ ss << dpx;
+ ss >> dp2;
+ check_equal("Special values period (reversibility test)", dpx, dp2);
+ ss.str("[-infinity/+infinity]");
+ ss >> dp2;
+ check_equal("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_equal("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_equal("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);
+ iss >> dp;
+ check_equal("Closed range period - custom delimiters", dp, date_period(begin,len));
+
+
+ // date_generator tests
+
+ // date_generators use formats contained in the
+ // date_input_facet for weekdays and months
+ // reset month & weekday formats to defaults
+ facet->month_format("%b");
+ facet->weekday_format("%a");
+
+ partial_date pd(1,Jan);
+ nth_kday_of_month nkd(nth_kday_of_month::first, Sunday, Jan);
+ first_kday_of_month fkd(Sunday, Jan);
+ last_kday_of_month lkd(Sunday, Jan);
+ first_kday_before fkb(Sunday);
+ first_kday_after fka(Sunday);
+ // using default date_generator_parser "nth_strings"
+ iss.str("29 Feb");
+ iss >> pd;
+ // Feb-29 is a valid date_generator, get_date() will fail in a non-leap year
+ check_equal("Default strings, partial_date",
+ pd.get_date(2004), date(2004,Feb,29));
+ iss.str("second Mon of Mar");
+ iss >> nkd;
+ check_equal("Default strings, nth_day_of_the_week_in_month",
+ nkd.get_date(2004), date(2004,Mar,8));
+ iss.str("first Tue of Apr");
+ iss >> fkd;
+ check_equal("Default strings, first_day_of_the_week_in_month",
+ fkd.get_date(2004), date(2004,Apr,6));
+ iss.str("last Wed of May");
+ iss >> lkd;
+ check_equal("Default strings, last_day_of_the_week_in_month",
+ lkd.get_date(2004), date(2004,May,26));
+ iss.str("Thu before");
+ iss >> fkb;
+ check_equal("Default strings, first_day_of_the_week_before",
+ fkb.get_date(date(2004,Feb,8)), date(2004,Feb,5));
+ iss.str("Fri after");
+ iss >> fka;
+ check_equal("Default strings, first_day_of_the_week_after",
+ fka.get_date(date(2004,Feb,1)), date(2004,Feb,6));
+ // failure tests
+ check("Incorrect elements (date_generator) w/exceptions", // after/before type mixup
+ failure_test(fkb, "Fri after", e_failure, new date_input_facet()));
+ check("Incorrect elements (date_generator) no exceptions", // after/before type mixup
+ failure_test(fkb, "Fri after", new date_input_facet()));
+ check("Incorrect elements (date_generator) w/exceptions", // first/last type mixup
+ failure_test(lkd, "first Tue of Apr", e_failure, new date_input_facet()));
+ check("Incorrect elements (date_generator) no exceptions", // first/last type mixup
+ failure_test(lkd, "first Tue of Apr", new date_input_facet()));
+ check("Incorrect elements (date_generator) w/exceptions", // 'in' is wrong
+ failure_test(nkd, "second Mon in Mar", e_failure, new date_input_facet()));
+ check("Incorrect elements (date_generator) no exceptions", // 'in' is wrong
+ failure_test(nkd, "second Mon in Mar", new date_input_facet()));
+
+ // date_generators - custom element strings
+ facet->date_gen_element_strings("1st","2nd","3rd","4th","5th","final","prior to","past","in");
+ iss.str("3rd Sat in Jul");
+ iss >> nkd;
+ check_equal("Custom strings, nth_day_of_the_week_in_month",
+ nkd.get_date(2004), date(2004,Jul,17));
+ iss.str("1st Wed in May");
+ iss >> fkd;
+ check_equal("Custom strings, first_day_of_the_week_in_month",
+ fkd.get_date(2004), date(2004,May,5));
+ iss.str("final Tue in Apr");
+ iss >> lkd;
+ check_equal("Custom strings, last_day_of_the_week_in_month",
+ lkd.get_date(2004), date(2004,Apr,27));
+ iss.str("Fri prior to");
+ iss >> fkb;
+ check_equal("Custom strings, first_day_of_the_week_before",
+ fkb.get_date(date(2004,Feb,8)), date(2004,Feb,6));
+ iss.str("Thu past");
+ iss >> fka;
+ check_equal("Custom strings, first_day_of_the_week_after",
+ fka.get_date(date(2004,Feb,1)), date(2004,Feb,5));
+
+ // date_generators - special case with empty element string
+ /* Doesn't work. Empty string returns -1 from string_parse_tree
+ * because it attempts to match the next set of characters in the
+ * stream to the wrong element. Ex. It attempts to match "Mar" to
+ * the 'of' element in the test below.
+ *
+ facet->date_gen_element_strings("1st","2nd","3rd","4th","5th","final","prior to","past",""); // the 'of' string is an empty string
+ iss.str("final Mon Mar");
+ iss >> lkd;
+ check_equal("Special case, empty element string",
+ lkd.get_date(2005), date(2005,Mar,28));
+ */
+
+
+ // special values tests (date and days only)
+ iss.str("minimum-date-time +infinity");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, default strings, min_date_time date",
+ d, date(min_date_time));
+ check_equal("Special values, default strings, pos_infin days",
+ dd, days(pos_infin));
+ iss.str("-infinity maximum-date-time");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, default strings, neg_infin date",
+ d, date(neg_infin));
+ check_equal("Special values, default strings, max_date_time days",
+ dd, days(max_date_time));
+ iss.str("not-a-date-time");
+ iss >> d;
+ check_equal("Special values, default strings, not_a_date_time date",
+ d, date(not_a_date_time));
+
+ // in addition check that special_value_from_string also works correctly for other special values
+ check_equal("Special values, default strings, not_special test",
+ special_value_from_string("not_special"), not_special);
+ check_equal("Special values, default strings, junk test",
+ special_value_from_string("junk"), not_special);
+
+ // special values custom, strings
+ special_values_parser svp("NADT", "MINF", "INF", "MINDT", "MAXDT");
+ facet->special_values_parser(svp);
+ iss.str("MINDT INF");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, custom strings, min_date_time date",
+ d, date(min_date_time));
+ check_equal("Special values, custom strings, pos_infin days",
+ dd, days(pos_infin));
+ iss.str("MINF MAXDT");
+ iss >> d;
+ iss >> dd;
+ check_equal("Special values, custom strings, neg_infin date",
+ d, date(neg_infin));
+ check_equal("Special values, custom strings, max_date_time days",
+ dd, days(max_date_time));
+ iss.str("NADT");
+ iss >> dd;
+ check_equal("Special values, custom strings, not_a_date_time days",
+ dd, days(not_a_date_time));
+ // failure test
+ check("Misspelled input, special_value date w/exceptions",
+ failure_test(d, "NSDT", e_bad_year, new date_input_facet()));
+ check("Misspelled input, special_value date no exceptions",
+ failure_test(d, "NSDT", new date_input_facet()));
+ check("Misspelled input, special_value days w/exceptions",
+ failure_test(dd, "NSDT", e_failure, new date_input_facet()));
+ check("Misspelled input, special_value days no exceptions",
+ failure_test(dd, "NSDT", new date_input_facet()));
+
+ {
+ // German names. Please excuse any errors, I don't speak German and
+ // had to rely on an on-line translation service.
+ // These tests check one of each (at least) from all sets of custom strings
+
+ // create a custom format_date_parser
+ std::string m_a[] = {"Jan","Feb","Mar","Apr","Mai",
+ "Jun","Jul","Aug","Sep","Okt","Nov","Dez"};
+ std::string m_f[] = {"Januar","Februar","Marz","April",
+ "Mai","Juni","Juli","August",
+ "September","Oktober","November","Dezember"};
+ std::string w_a[] = {"Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"};
+ std::string w_f[] = {"Sonntag", "Montag", "Dienstag","Mittwoch",
+ "Donnerstag", "Freitag", "Samstag"};
+ typedef boost::date_time::format_date_parser<date, char> date_parser;
+ date_parser::input_collection_type months_abbrev;
+ date_parser::input_collection_type months_full;
+ date_parser::input_collection_type wkdays_abbrev;
+ date_parser::input_collection_type wkdays_full;
+ months_abbrev.assign(m_a, m_a+12);
+ months_full.assign(m_f, m_f+12);
+ wkdays_abbrev.assign(w_a, w_a+7);
+ wkdays_full.assign(w_f, w_f+7);
+ date_parser d_parser("%B %d %Y",
+ months_abbrev, months_full,
+ wkdays_abbrev, wkdays_full);
+
+ // create a special_values parser
+ special_values_parser sv_parser("NichtDatumzeit",
+ "Negativ Unendlichkeit",
+ "Positiv Unendlichkeit",
+ "Wenigstes Datum",
+ "Maximales Datum");
+
+ // create a period_parser
+ period_parser p_parser; // default will do
+ // create date_generator_parser
+ typedef boost::date_time::date_generator_parser<date,char> date_gen_parser;
+ date_gen_parser dg_parser("Zuerst","Zweitens","Dritt","Viert",
+ "F\xC3\xBCnft","Letzt","Vor","Nach","Von");
+
+ // create the date_input_facet
+ date_input_facet* de_facet =
+ new date_input_facet("%B %d %Y",
+ d_parser,
+ sv_parser,
+ p_parser,
+ dg_parser);
+ std::istringstream iss2;
+ iss2.imbue(std::locale(std::locale::classic(), de_facet));
+ // June 06 2005, Dec, minimum date, Tues
+ iss2.str("Juni 06 2005 Dez Wenigstes Datum Die");
+ iss2 >> d;
+ iss2 >> m;
+ check_equal("German names: date", d, date(2005, Jun, 6));
+ check_equal("German names: month", m, greg_month(Dec));
+ iss2 >> d;
+ iss2 >> gw;
+ check_equal("German names: special value date", d, date(min_date_time));
+ check_equal("German names: short weekday", gw, greg_weekday(Tuesday));
+ de_facet->weekday_format("%A"); // long weekday
+ // Tuesday, Second Tuesday of Mar
+ iss2.str("Dienstag Zweitens Dienstag von Mar");
+ iss2 >> gw;
+ iss2 >> nkd;
+ check_equal("German names: long weekday", gw, greg_weekday(Tuesday));
+ check_equal("German names, nth_day_of_the_week_in_month",
+ nkd.get_date(2005), date(2005,Mar,8));
+ // Tuesday after
+ iss2.str("Dienstag Nach");
+ iss2 >> fka;
+ check_equal("German names, first_day_of_the_week_after",
+ fka.get_date(date(2005,Apr,5)), date(2005,Apr,12));
+ }
+
+ {
+ // test name replacement functions
+
+ // 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;
+
+ 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::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));
+
+ date dx(not_a_date_time);
+ date_input_facet* facetx = new date_input_facet();
+ std::stringstream ss;
+ ss.imbue(std::locale(std::locale::classic(), facetx));
+ facetx->short_month_names(short_month_names);
+ facetx->short_weekday_names(short_weekday_names);
+ facetx->long_month_names(long_month_names);
+ facetx->long_weekday_names(long_weekday_names);
+ facetx->format("%a %b %d, %Y");
+ ss.str("day7 *apr* 23, 2005");
+ ss >> dx;
+ check_equal("Short custom names, set via accessor function", dx.day_of_week(), greg_weekday(6));
+ check_equal("Short custom names, set via accessor function", dx.month(), greg_month(4));
+ ss.str("");
+ ss.str("Sun-0 **April** 24, 2005");
+ facetx->format("%A %B %d, %Y");
+ ss >> dx;
+ check_equal("Long custom names, set via accessor function", dx.day_of_week(), greg_weekday(0));
+ check_equal("Long custom names, set via accessor function", dx.month(), greg_month(4));
+
+ }
+#else
+ check("This test is a nop for platforms with USE_DATE_TIME_PRE_1_33_FACET_IO",
+ true);
+#endif
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testdate_iterator.cpp b/src/boost/libs/date_time/test/gregorian/testdate_iterator.cpp
new file mode 100644
index 000000000..f82e3d22f
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testdate_iterator.cpp
@@ -0,0 +1,367 @@
+/* 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, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void test_month_decrement_iterator(const boost::gregorian::date *Answers, int array_len){
+ using namespace boost::gregorian;
+ typedef boost::date_time::month_functor<date> mfg;
+
+ boost::date_time::date_itr<mfg, date> ditr(Answers[array_len-1]);
+ int i = array_len-1;
+ std::cout << "month iter decrement test..." << std::endl;
+ try {
+ for (; ditr > Answers[0] - date_duration(1); --ditr) {
+ check("month iterator: " + to_iso_string(*ditr), Answers[i] == *ditr);
+ i--;
+ }
+ check("month iterator iteration count", i == -1);
+ }
+ catch(std::exception& e)
+ {
+ check("month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+}
+
+void test_base_iterator(boost::gregorian::date end,
+ boost::gregorian::date_iterator& di,
+ std::string& data)
+{
+ using namespace boost::gregorian;
+ for (; di < end; ++di) {
+ data += to_iso_string(*di) + " ";
+ }
+}
+
+int
+main()
+{
+ using namespace boost::gregorian;
+
+ day_iterator di(date(2002,Jan,1));
+ std::string data;
+ test_base_iterator(date(2002,Jan,3),di,data);
+ month_iterator di2(date(2002,Jan,3));
+ test_base_iterator(date(2002,Mar,1),di2,data);
+ std::string result("20020101 20020102 20020103 20020203 ");
+ check("base iterator", data == result);
+ std::cout << data << std::endl;
+
+
+ typedef boost::date_time::day_functor<date> dfg;
+
+ {
+ const date DayAnswers[] = {date(2000,Jan,20),date(2000,Jan,22),date(2000,Jan,24)};
+ boost::date_time::date_itr<dfg,date> ditr(date(2000,Jan,20),2);
+ int i=0;
+ for (; ditr < date(2000,Jan,25); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("day iterator -- 2 days", DayAnswers[i] == *ditr);
+ i++;
+ }
+ check("day iterator -- 2 days", i == 3); // check the number of iterations
+ // decrement
+ i = 2;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("day iterator decrement -- 2 days", DayAnswers[i] == *ditr);
+ i--;
+ }
+ check("day iterator decrement -- 2 days", i == -1); // check the number of iterations
+ }
+
+ typedef boost::date_time::week_functor<date> wfg;
+ {
+ const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Jan,27),date(2000,Feb,3)};
+ boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20));
+ int i=0;
+ for (; ditr < date(2000,Feb,6); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i++;
+ }
+ check("week iterator", i == 3);
+ // decrement
+ i=2;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i--;
+ }
+ check("week iterator", i == -1);
+ }
+
+ {
+ const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Feb,3)};
+ boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20),2);
+ int i=0;
+ for (; ditr < date(2000,Feb,6); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i++;
+ }
+ check("week iterator", i == 2);
+ // decrement
+ i=1;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator", WeekAnswers[i] == *ditr);
+ i--;
+ }
+ check("week iterator", i == -1);
+ }
+
+ {
+ const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Feb,3), date(2000,Feb,17)};
+ boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20),2);
+ int i=0;
+ for (; ditr < date(2000,Feb,20); ++ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator -- 2 weeks", WeekAnswers[i] == *ditr);
+ i++;
+ }
+ check("week iterator -- 2 weeks", i == 3);
+ // decrement
+ i=2;
+ --ditr;
+ for (; ditr > date(2000,Jan,19); --ditr) {
+ //std::cout << *ditr << " ";
+ check("week iterator -- 2 weeks", WeekAnswers[i] == *ditr);
+ i--;
+ }
+ check("week iterator -- 2 weeks", i == -1);
+ }
+
+ typedef boost::date_time::month_functor<date> mfg;
+ {
+ const date MonthAnswers[] = {
+ date(2000,Jan,1),date(2000,Feb,1),date(2000,Mar,1),date(2000,Apr,1),
+ date(2000,May,1),date(2000,Jun,1),date(2000,Jul,1),date(2000,Aug,1),
+ date(2000,Sep,1),date(2000,Oct,1),date(2000,Nov,1),date(2000,Dec,1),
+ date(2001,Jan,1)
+ };
+ test_month_decrement_iterator(MonthAnswers, 13);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Jan,1));
+ int i = 0;
+ try {
+ for (; ditr < date(2001,Jan,2); ++ditr) {
+ check("month iterator: " + to_iso_string(*ditr), MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("month iterator iteration count", i == 13);
+ }
+ catch(std::exception& e)
+ {
+ check("month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ {
+ const date MonthAnswers[] = {
+ date(2000,Jan,31),date(2000,Feb,29),date(2000,Mar,31),date(2000,Apr,30),
+ date(2000,May,31),date(2000,Jun,30),date(2000,Jul,31),date(2000,Aug,31),
+ date(2000,Sep,30),date(2000,Oct,31),date(2000,Nov,30),date(2000,Dec,31),
+ date(2001,Jan,31)
+ };
+ test_month_decrement_iterator(MonthAnswers, 13);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Jan,31));
+ int i = 0;
+ try {
+ for (; ditr < date(2001,Feb,1); ++ditr) {
+ // std::cout << *ditr << " ";
+ check("last day of month iterator: " + to_iso_string(*ditr),
+ MonthAnswers[i] == *ditr);
+ //check("last day of month iterator", MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("last day of month iterator", i == 13);
+ }
+ catch(std::exception& e)
+ {
+ check("last day of month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ {
+ const date MonthAnswers[] = {
+ date(2000,Feb,29),date(2000,Mar,31),date(2000,Apr,30),
+ date(2000,May,31),date(2000,Jun,30),date(2000,Jul,31),date(2000,Aug,31),
+ date(2000,Sep,30),date(2000,Oct,31),date(2000,Nov,30),date(2000,Dec,31),
+ date(2001,Jan,31),date(2001,Feb,28)
+ };
+ test_month_decrement_iterator(MonthAnswers, 13);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Feb,29));
+ int i = 0;
+ try {
+ for (; ditr < date(2001,Mar,1); ++ditr) {
+ // std::cout << *ditr << " ";
+ check("last day of month iterator2: " + to_iso_string(*ditr),
+ MonthAnswers[i] == *ditr);
+ //check("last day of month iterator", MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("last day of month iterator2", i == 13);
+ }
+ catch(std::exception& e)
+ {
+ check("last day of month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ { // running a span of 5 years to verify snap to end doesn't occur at next leap year
+ const date MonthAnswers[] = {
+ date(2000,Feb,28),date(2000,Mar,28),date(2000,Apr,28),date(2000,May,28),
+ date(2000,Jun,28),date(2000,Jul,28),date(2000,Aug,28),date(2000,Sep,28),
+ date(2000,Oct,28),date(2000,Nov,28),date(2000,Dec,28),date(2001,Jan,28),
+ date(2001,Feb,28),date(2001,Mar,28),date(2001,Apr,28),date(2001,May,28),
+ date(2001,Jun,28),date(2001,Jul,28),date(2001,Aug,28),date(2001,Sep,28),
+ date(2001,Oct,28),date(2001,Nov,28),date(2001,Dec,28),date(2002,Jan,28),
+ date(2002,Feb,28),date(2002,Mar,28),date(2002,Apr,28),date(2002,May,28),
+ date(2002,Jun,28),date(2002,Jul,28),date(2002,Aug,28),date(2002,Sep,28),
+ date(2002,Oct,28),date(2002,Nov,28),date(2002,Dec,28),date(2003,Jan,28),
+ date(2003,Feb,28),date(2003,Mar,28),date(2003,Apr,28),date(2003,May,28),
+ date(2003,Jun,28),date(2003,Jul,28),date(2003,Aug,28),date(2003,Sep,28),
+ date(2003,Oct,28),date(2003,Nov,28),date(2003,Dec,28),date(2004,Jan,28),
+ date(2004,Feb,28),date(2004,Mar,28),date(2004,Apr,28),date(2004,May,28),
+ date(2004,Jun,28),date(2004,Jul,28),date(2004,Aug,28),date(2004,Sep,28),
+ date(2004,Oct,28),date(2004,Nov,28),date(2004,Dec,28),date(2005,Jan,28),
+ };
+ test_month_decrement_iterator(MonthAnswers, 60);
+
+ boost::date_time::date_itr<mfg, date> ditr(date(2000,Feb,28));
+ int i = 0;
+ try {
+ for (; ditr < date(2005,Feb,1); ++ditr) {
+ // std::cout << *ditr << " ";
+ check("last day of month iterator3: " + to_iso_string(*ditr),
+ MonthAnswers[i] == *ditr);
+ //check("last day of month iterator", MonthAnswers[i] == *ditr);
+ i++;
+ }
+ check("last day of month iterator3", i == 60);
+ }
+ catch(std::exception& e)
+ {
+ check("last day of month iterator: exception failure", false);
+ std::cout << e.what() << std::endl;
+ }
+ }
+
+ typedef boost::date_time::year_functor<date> yfg;
+ {
+ const date YearAnswers[] = {
+ date(2000,Jan,1),date(2001,Jan,1),date(2002,Jan,1),date(2003,Jan,1),
+ date(2004,Jan,1),date(2005,Jan,1),date(2006,Jan,1),date(2007,Jan,1),
+ date(2008,Jan,1),date(2009,Jan,1),date(2010,Jan,1)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Jan,1));
+ int i = 0;
+ for (; d3 < date(2010,Jan,2); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ std::cout << "Decrementing...." << std::endl;
+ i = 10;
+ --d3;
+ for (; d3 > date(1999,Dec,31); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+ { // WON'T snap top end of month
+ const date YearAnswers[] = {
+ date(2000,Feb,28),date(2001,Feb,28),date(2002,Feb,28),date(2003,Feb,28),
+ date(2004,Feb,28),date(2005,Feb,28),date(2006,Feb,28),date(2007,Feb,28),
+ date(2008,Feb,28),date(2009,Feb,28),date(2010,Feb,28)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Feb,28));
+ int i = 0;
+ for (; d3 < date(2010,Mar,1); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ std::cout << "Decrementing...." << std::endl;
+ i = 10;
+ --d3;
+ for (; d3 > date(2000,Feb,27); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+ {// WILL snap top end of month
+ const date YearAnswers[] = {
+ date(2000,Feb,29),date(2001,Feb,28),date(2002,Feb,28),date(2003,Feb,28),
+ date(2004,Feb,29),date(2005,Feb,28),date(2006,Feb,28),date(2007,Feb,28),
+ date(2008,Feb,29),date(2009,Feb,28),date(2010,Feb,28)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Feb,29));
+ int i = 0;
+ for (; d3 < date(2010,Mar,1); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ std::cout << "Decrementing...." << std::endl;
+ i = 10;
+ --d3;
+ for (; d3 > date(2000,Feb,27); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+
+ {
+ std::cout << "Increment by 2 years...." << std::endl;
+ const date YearAnswers[] = {
+ date(2000,Jan,1),date(2002,Jan,1),
+ date(2004,Jan,1),date(2006,Jan,1),
+ date(2008,Jan,1),date(2010,Jan,1)
+ };
+
+ boost::date_time::date_itr<yfg, date> d3(date(2000,Jan,1),2);
+ int i = 0;
+ for (; d3 < date(2010,Jan,2); ++d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i++;
+ }
+ // decrement
+ std::cout << "Decrementing...." << std::endl;
+ i = 5;
+ --d3;
+ for (; d3 > date(1999,Dec,31); --d3) {
+ //std::cout << *d3 << " ";
+ check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
+ i--;
+ }
+ }
+
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testfacet.cpp b/src/boost/libs/date_time/test/gregorian/testfacet.cpp
new file mode 100644
index 000000000..82a7253db
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testfacet.cpp
@@ -0,0 +1,342 @@
+/* Copyright (c) 2002,2003,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
+ */
+
+#include <sstream>
+#include <iostream>
+#include <fstream>
+
+#include "boost/date_time/gregorian/greg_month.hpp"
+#include "boost/date_time/gregorian/greg_facet.hpp"
+#include "boost/date_time/date_format_simple.hpp"
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+
+ const char* const de_short_month_names[]={"Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez", "NAM"};
+
+ const char* const de_long_month_names[]={"Januar","Februar","Marz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember","NichtDerMonat"};
+ const char* const de_special_value_names[]={"NichtDatumzeit","-unbegrenztheit", "+unbegrenztheit"};
+
+const char* const de_short_weekday_names[]={"Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"};
+
+ const char* const de_long_weekday_names[]={"Sonntag", "Montag", "Dienstag","Mittwoch", "Donnerstag", "Freitag", "Samstag"};
+
+#endif
+
+/** Not used for now
+ const char* const es_short_month_names[]={"Ene","Feb","Mar","Abr","Pue","Jun","Jul","Ago","Sep","Oct","Nov","Dic", "NAM"};
+
+ const char* const es_long_month_names[]={"Enero","Febrero","Marcha","Abril","Pueda","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre","NoAMes"};
+ const char* const es_special_value_names[]={"NoUnRatoDeLaFacha","-infinito", "+infinito"};
+**/
+int
+main()
+{
+// std::locale native("");
+// std::cout << "native: " << native.name() << std::endl;
+//#ifndef BOOST_NO_STD_LOCALE
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+
+ using namespace boost::gregorian;
+
+ typedef greg_facet_config facet_config;
+ typedef boost::date_time::all_date_names_put<facet_config> date_facet;
+ typedef boost::date_time::date_names_put<facet_config> date_facet_base;
+ typedef boost::date_time::ostream_month_formatter<date_facet_base> month_formatter;
+
+ {
+ // special_values tests
+ std::stringstream ss;
+ date_facet_base* f = new date_facet_base();
+ std::locale loc(std::locale::classic(), f);
+ ss.imbue(loc);
+ date d(not_a_date_time);
+ ss << d;
+ check("Special value, stream out nadt" , ss.str() == std::string("not-a-date-time"));
+ ss.str("");
+ d = date(neg_infin);
+ ss << d;
+ check("Special value, stream out neg_infin" , ss.str() == std::string("-infinity"));
+ ss.str("");
+ d = date(pos_infin);
+ ss << d;
+ check("Special value, stream out pos_infin" , ss.str() == std::string("+infinity"));
+ }
+
+ date_facet gdnp(de_short_month_names, de_long_month_names,
+ de_special_value_names, de_long_weekday_names,
+ de_long_weekday_names,
+ '.',
+ boost::date_time::ymd_order_dmy);
+
+ std::stringstream ss;
+ std::ostreambuf_iterator<char> coi(ss);
+ gdnp.put_month_short(coi, Oct);
+ check("check german short month: " + ss.str(),
+ ss.str() == std::string("Okt"));
+
+ ss.str(""); //reset string stream
+ greg_month mo(Oct);
+ month_formatter::format_month(mo, ss, gdnp);
+ check("check german short month: " + ss.str(),
+ ss.str() == std::string("Okt"));
+ ss.str(""); //reset string stream
+// month_formatter::format_month(mo, ss, gdnp);
+// check("check german long month: " + ss.str(),
+// ss.str() == std::string("Oktober"));
+
+
+ greg_year_month_day ymd(2002,Oct,1);
+ typedef boost::date_time::ostream_ymd_formatter<greg_year_month_day, date_facet_base> ymd_formatter;
+ ss.str(""); //reset string stream
+ ymd_formatter::ymd_put(ymd, ss, gdnp);
+ check("check ymd: " + ss.str(),
+ ss.str() == std::string("01.Okt.2002"));
+
+
+ typedef boost::date_time::ostream_date_formatter<date, date_facet_base> datef;
+
+ std::stringstream os;
+ date d1(2002, Oct, 1);
+ datef::date_put(d1, os, gdnp);
+ check("ostream low level check string:"+os.str(),
+ os.str() == std::string("01.Okt.2002"));
+
+// //Locale tests
+ std::locale global;
+ std::cout << "global: " << global.name() << std::endl;
+
+ // put a facet into a locale
+ //check for a facet p319
+ check("no registered facet here",
+ !std::has_facet<date_facet>(global));
+
+ std::locale global2(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_long_weekday_names,
+ de_long_weekday_names));
+
+ check("facet registered here",
+ std::has_facet<boost::date_time::date_names_put<facet_config> >(global2));
+
+ std::stringstream os2;
+ os2.imbue(global2);
+ datef::date_put(d1, os2);
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("2002-Okt-01"));
+
+ date infin(pos_infin);
+ os2.str(""); //clear stream
+ datef::date_put(infin, os2);
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("+unbegrenztheit"));
+
+ os2.str(""); //clear stream
+ os2 << infin;
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("+unbegrenztheit"));
+
+
+ date nadt(not_a_date_time);
+ os2.str(""); //clear stream
+ datef::date_put(nadt, os2);
+ check("check string imbued ostream: "+os2.str(),
+ os2.str() == std::string("NichtDatumzeit"));
+
+
+ std::stringstream os3;
+ os3 << d1;
+ check("check any old ostream: "+os3.str(),
+ os3.str() == std::string("2002-Oct-01"));
+
+ std::ofstream f("test_facet_file.out");
+ f << d1 << std::endl;
+
+// // date formatter that takes locale and gets facet from locale
+ std::locale german_dates1(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ '.',
+ boost::date_time::ymd_order_dmy,
+ boost::date_time::month_as_integer));
+
+ os3.imbue(german_dates1);
+ os3.str("");
+ os3 << d1;
+ check("check date order: "+os3.str(),
+ os3.str() == std::string("01.10.2002"));
+
+ std::locale german_dates2(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ ' ',
+ boost::date_time::ymd_order_iso,
+ boost::date_time::month_as_short_string));
+
+ os3.imbue(german_dates2);
+ os3.str("");
+ os3 << d1;
+ check("check date order: "+os3.str(),
+ os3.str() == std::string("2002 Okt 01"));
+
+ std::locale german_dates3(global,
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ ' ',
+ boost::date_time::ymd_order_us,
+ boost::date_time::month_as_long_string));
+
+ os3.imbue(german_dates3);
+ os3.str("");
+ os3 << d1;
+ check("check date order: "+os3.str(),
+ os3.str() == std::string("Oktober 01 2002"));
+
+ date_period dp(d1, date_duration(3));
+ os3.str("");
+ os3 << dp;
+ check("check date period: "+os3.str(),
+ os3.str() == std::string("[Oktober 01 2002/Oktober 03 2002]"));
+
+
+ /*******************************************************************/
+ /* Streaming operations for date durations */
+ /*******************************************************************/
+
+ date_duration dur(26);
+ std::stringstream ss2;
+ ss2 << dur;
+ check("date_duration stream out", ss2.str() == std::string("26"));
+
+ dur = date_duration(boost::date_time::pos_infin);
+ ss2.str("");
+ ss2 << dur;
+ check("date_duration stream out", ss2.str() == std::string("+infinity"));
+
+ /*******************************************************************/
+ /* Streaming operations for date generator functions */
+ /*******************************************************************/
+
+ partial_date pd(26, Jun);
+ //std::stringstream ss2;
+ ss2.str("");
+ ss2 << pd;
+ check("partial date stream out", ss2.str() == std::string("26 Jun"));
+
+ ss2.str("");
+ nth_kday_of_month nkm(nth_kday_of_month::second, Friday, Sep);
+ ss2 << nkm;
+ check("nth kday of month", ss2.str() == std::string("second Fri of Sep"));
+
+ ss2.str("");
+ first_kday_of_month fkm(Saturday, May);
+ ss2 << fkm;
+ check("first kday of month", ss2.str() == std::string("first Sat of May"));
+
+ ss2.str("");
+ last_kday_of_month lkm(Monday, Aug);
+ ss2 << lkm;
+ check("last kday of month", ss2.str() == std::string("last Mon of Aug"));
+
+ ss2.str("");
+ first_kday_after fka(Thursday);//fkb.get_date(d)
+ ss2 << fka;
+ check("first kday after", ss2.str() == std::string("Thu after"));
+
+ ss2.str("");
+ first_kday_before fkb(Tuesday); // same ^
+ ss2 << fkb;
+ check("first kday after", ss2.str() == std::string("Tue before"));
+
+ std::cout << pd << '\n'
+ << nkm << '\n'
+ << fkm << '\n'
+ << lkm << '\n'
+ << fka << '\n'
+ << fkb << '\n'
+ << std::endl;
+
+ /*******************************************************************/
+ /* Input Streaming for greg_month */
+ /*******************************************************************/
+ {
+ std::stringstream ss1("January");
+ std::stringstream ss2m("dec"); // misspelled
+ std::stringstream german("Okt");
+ german.imbue(global2);
+ greg_month m(3);
+ ss1 >> m;
+ check("Stream in month", m == greg_month(Jan));
+#ifndef BOOST_NO_STD_WSTRING
+ std::wstringstream ws1(L"Dec");
+ ws1 >> m;
+ check("Wide Stream in month", m == greg_month(Dec));
+#else
+ check("Wide Stream in not supported by this compiler", false);
+#endif // BOOST_NO_STD_WSTRING
+ german >> m;
+ check("Stream in German month", m == greg_month(Oct));
+ try{
+ ss2m >> m; // misspelled
+ check("Bad month exception NOT thrown (misspelled name)", false);
+ }catch(bad_month&){
+ check("Bad month exception caught (misspelled name)", true);
+ }catch(...){
+ check("Bad month exception NOT caught (misspelled name)", false);
+ }
+ }
+ /*******************************************************************/
+ /* Input Streaming for greg_weekday */
+ /*******************************************************************/
+ {
+ std::stringstream ss1("Sun");
+ std::stringstream ss2w("Wensday"); // misspelled
+ std::stringstream german("Mittwoch"); // Wednesday
+ german.imbue(global2);
+ greg_weekday wd(Friday); //something not Sunday...
+ ss1 >> wd;
+ check("Stream in weekday", wd == greg_weekday(Sunday));
+#ifndef BOOST_NO_STD_WSTRING
+ std::wstringstream ws1(L"Saturday");
+ ws1 >> wd;
+ check("Wide Stream in weekday", wd == greg_weekday(Saturday));
+#else
+ check("Wide Stream in not supported by this compiler", false);
+#endif // BOOST_NO_STD_WSTRING
+ german >> wd;
+ check("Stream in German weekday", wd == greg_weekday(Wednesday));
+ try{
+ ss2w >> wd;
+ check("Bad weekday exception NOT thrown (misspelled name)", false);
+ }catch(bad_weekday&){
+ check("Bad weekday exception caught (misspelled name)", true);
+ }catch(...){
+ check("Bad weekday exception NOT caught (misspelled name)", false);
+ }
+ }
+
+#else
+ check("No tests executed - Locales not supported by this compiler", false);
+
+#endif //BOOST_DATE_TIME_NO_LOCALE
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testformat_date_parser.cpp b/src/boost/libs/date_time/test/gregorian/testformat_date_parser.cpp
new file mode 100644
index 000000000..f29ab4ed2
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testformat_date_parser.cpp
@@ -0,0 +1,363 @@
+
+/* 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
+ */
+
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include "boost/date_time/format_date_parser.hpp"
+#include <sstream>
+#include <algorithm>
+#include <iostream>
+
+const wchar_t* const wmonth_short_names[]={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 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 wchar_t* const wmonth_long_names[]={L"January",L"February",L"March",
+ L"April",L"May",L"June",
+ L"July",L"August",L"September",
+ L"October",L"Novomber",L"December"};
+
+const wchar_t* const wweek_short_names[]= {L"Sun", L"Mon", L"Tue", L"Wed",
+ L"Thu", L"Fri", L"Sat"};
+
+const char* const week_short_names[]={"Sun", "Mon","Tue","Wed",
+ "Thu","Fri","Sat"};
+
+const wchar_t* const wweek_long_names[]= {L"Sunday", L"Monday", L"Tuesday",
+ L"Wednesday", L"Thursday",
+ L"Friday", L"Saturday"};
+
+const char* const week_long_names[]= {"Sunday", "Monday", "Tuesday",
+ "Wednesday", "Thursday",
+ "Friday", "Saturday"};
+
+
+
+
+std::vector<std::basic_string<char> > short_month_names;
+std::vector<std::basic_string<wchar_t> > wshort_month_names;
+std::vector<std::basic_string<char> > long_month_names;
+std::vector<std::basic_string<wchar_t> > wlong_month_names;
+std::vector<std::basic_string<char> > short_week_names;
+std::vector<std::basic_string<wchar_t> > wshort_week_names;
+std::vector<std::basic_string<char> > long_week_names;
+std::vector<std::basic_string<wchar_t> > wlong_week_names;
+
+
+using namespace boost::gregorian;
+
+void
+wtest_format(const std::basic_string<wchar_t>& format,
+ const std::basic_string<wchar_t>& value,
+ const std::string& testname,
+ boost::gregorian::date expected_res)
+{
+ typedef boost::date_time::format_date_parser<date, wchar_t> parser_type;
+ typedef std::basic_string<wchar_t> string_type;
+ typedef std::istreambuf_iterator<wchar_t> iter_type;
+ try {
+ // string_type format(format);
+ std::basic_stringstream<wchar_t> ws;
+ ws << value;
+ iter_type sitr(ws);
+ iter_type stream_end;
+
+ parser_type p(format, wshort_month_names, wlong_month_names,
+ wshort_week_names, wlong_week_names);
+ date d = p.parse_date(sitr, stream_end, format);
+ check_equal(testname, d, expected_res);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an exception: " << e.what() << std::endl;
+ check(testname, false);
+ }
+}
+
+
+void
+test_format(const std::basic_string<char>& format,
+ const std::basic_string<char>& value,
+ const std::string& testname,
+ boost::gregorian::date expected_res)
+{
+ typedef boost::date_time::format_date_parser<date, char> parser_type;
+ typedef std::basic_string<char> string_type;
+ typedef std::istreambuf_iterator<char> iter_type;
+ try {
+ string_type format(format);
+ std::basic_stringstream<char> ws;
+ ws << value;
+ iter_type sitr(ws);
+ iter_type stream_end;
+
+ parser_type pt(format, short_month_names, long_month_names,
+ short_week_names, long_week_names);
+ date d = pt.parse_date(sitr, stream_end, format);
+ check_equal(testname, d, expected_res);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an exception: " << e.what() << std::endl;
+ check(testname, false);
+ }
+}
+
+
+template<typename charT>
+void
+test_format2(boost::date_time::format_date_parser<date, charT>& parser,
+ const charT* const format,
+ const charT* const value,
+ const std::string& testname,
+ boost::gregorian::date expected_res)
+{
+ try {
+ date d = parser.parse_date(value, format);
+ check_equal(testname, d == expected_res);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an exception: " << e.what() << std::endl;
+ check(testname, false);
+ }
+}
+
+int
+main()
+{
+ std::copy(&wmonth_short_names[0],
+ &wmonth_short_names[12],
+ std::back_inserter(wshort_month_names));
+
+ 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(&wmonth_long_names[0],
+ &wmonth_long_names[12],
+ std::back_inserter(wlong_month_names));
+
+
+ std::copy(&wweek_short_names[0],
+ &wweek_short_names[7],
+ std::back_inserter(wshort_week_names));
+
+ std::copy(&week_short_names[0],
+ &week_short_names[7],
+ std::back_inserter(short_week_names));
+
+ std::copy(&wweek_long_names[0],
+ &wweek_long_names[7],
+ std::back_inserter(wlong_week_names));
+
+ std::copy(&week_long_names[0],
+ &week_long_names[7],
+ std::back_inserter(long_week_names));
+
+
+ wtest_format(L"1%%23%Y %m %d", L"1232004 12 31 other stuff...",
+ "wide and weird", date(2004,12,31));
+
+ wtest_format(L"%Y-%m-%d", L"2004-12-31",
+ "%Y-%m-%d wide", date(2004,12,31));
+
+ wtest_format(L"%Y day %j", L"2004 day 001",
+ "%Y day %j wide", date(2004,1,1));
+
+ test_format("%m/%d/%y", "10/31/04",
+ "%m/%d/%y", date(2004,10,31));
+
+
+ wtest_format(L"%Y/%m/%d", L"2004-12-31",
+ "%Y/%m/%d wide 2004-12-31 input", date(2004,12,31));
+
+ test_format("%Y.%d.%m", "2004.31.1",
+ "%Y.%d.%m var length", date(2004,Jan,31));
+
+ test_format("%d.%m.%Y", "1.1.2004",
+ "%d.%m.%Y var length month and day", date(2004,1,1));
+
+ test_format("%Y.%m.%d", "2004.1.31",
+ "%Y.%m.%d var length month", date(2004,Jan,31));
+
+ test_format("%Y.%b.%d", "2004.Jan.1",
+ "%Y.%b.%d var length month", date(2004,Jan,1));
+
+ test_format("%Y%m%d", "20041231",
+ "%Y%m%d undelimited", date(2004,12,31));
+
+ test_format("%Y/%d/%b", "2004/01/Jan",
+ "%Y/%d/%b month at end", date(2004,1,1));
+
+ test_format("%Y/%b/%d", "2004/Jan/01",
+ "%Y/%b/%d named month jan", date(2004,1,1));
+
+ test_format("%Y/%b/%d", "2004/Dec/20",
+ "%Y/%b/%d named month dec", date(2004,12,20));
+
+ wtest_format(L"%Y/%b/%d", L"2004-Jul-31",
+ "%Y/%b/%d wide 2004-Jul-31 input", date(2004,7,31));
+
+ wtest_format(L"%B %d, %Y", L"March 15, 2004",
+ "%B %d, %Y", date(2004,3,15));
+
+ wtest_format(L"%a %B %d, %Y", L"Sun March 15, 2004",
+ "%a %B %d, %Y", date(2004,3,15));
+
+ wtest_format(L"%A %B %d, %Y", L"Sunday March 15, 2004",
+ "%A %B %d, %Y", date(2004,3,15));
+
+ // bad format case...
+
+ {
+ try {
+ std::wstring format(L"%Y-%d");
+ std::wstringstream ws;
+ ws << L"2004-12-31";
+ std::istreambuf_iterator<wchar_t> sitr(ws);
+ std::istreambuf_iterator<wchar_t> stream_end;
+
+ boost::date_time::format_date_parser<date,wchar_t> pt(format,
+ wshort_month_names,
+ wlong_month_names,
+ wshort_week_names,
+ wlong_week_names);
+ date d = pt.parse_date(sitr, stream_end);
+ check("Bad format spec test", false);
+ }
+ catch(std::exception& e) {
+ std::cout << "Got an expected exception: " << e.what() << std::endl;
+ check("Bad format spec test -- pass", true);
+
+ }
+ }
+
+ {
+ //some interesting month names
+ const char* const roman_months[]={"I","II","III",
+ "IV","V","VI",
+ "VII","VIII","IX",
+ "X","XI","XII"};
+ std::vector<std::basic_string<char> > roman_month_names;
+ std::copy(&roman_months[0],
+ &roman_months[12],
+ std::back_inserter(roman_month_names));
+
+ std::string format("%Y.%b.%d");
+
+ boost::date_time::format_date_parser<date,char> parser(format,
+ roman_month_names,
+ long_month_names,
+ short_week_names,
+ long_week_names);
+
+
+ test_format2(parser, "%Y.%b.%d", "2004-I-1",
+ "roman I", date(2004,Jan,1));
+ test_format2(parser, "%Y.%b.%d", "2004-II-01",
+ "roman II", date(2004,Feb,1));
+ test_format2(parser, "%Y.%b.%d", "2004-III-01",
+ "roman III", date(2004,Mar,1));
+ test_format2(parser, "%Y.%b.%d", "2004-IV-01",
+ "roman IV", date(2004,Apr,1));
+ test_format2(parser, "%Y.%b.%d", "2004-V-01",
+ "roman V", date(2004,May,1));
+ test_format2(parser, "%Y.%b.%d", "2004-VI-01",
+ "roman VI", date(2004,Jun,1));
+ test_format2(parser, "%Y.%b.%d", "2004-VII-01",
+ "roman VII", date(2004,Jul,1));
+ test_format2(parser, "%Y.%b.%d", "2004-VIII-01",
+ "roman VIII", date(2004,Aug,1));
+ test_format2(parser, "%Y.%b.%d", "2004-IX-01",
+ "roman IX", date(2004,Sep,1));
+ test_format2(parser, "%Y.%b.%d", "2004-X-01",
+ "roman X", date(2004,Oct,1));
+ test_format2(parser, "%Y.%b.%d", "2004-XI-01",
+ "roman XI", date(2004,Nov,1));
+ test_format2(parser, "%Y.%b.%d", "2004 XII 1",
+ "roman XII", date(2004,Dec,1));
+
+ }
+
+ {
+ //alternate constructor that takes month/weekday strings
+ //from a locale
+ std::string format("%Y %m %d");
+ boost::date_time::format_date_parser<date,char> parser(format,
+ std::locale::classic());
+ test_format2(parser, "%a %Y.%b.%d", "Sun 2004 Jan 1",
+ "strings from locale", date(2004,Jan,1));
+ test_format2(parser, "%a %Y.%b.%d", "Mon 2004 Feb 1",
+ "strings from locale", date(2004,Feb,1));
+ test_format2(parser, "%a %Y.%b.%d", "Tue 2004 Mar 1",
+ "strings from locale", date(2004,Mar,1));
+ test_format2(parser, "%a %Y.%b.%d", "Wed 2004 Apr 1",
+ "strings from locale", date(2004,Apr,1));
+ test_format2(parser, "%a %Y.%b.%d", "thu 2004 May 1",
+ "strings from locale", date(2004,May,1));
+ test_format2(parser, "%a %Y.%b.%d", "fri 2004 Jun 1",
+ "strings from locale", date(2004,Jun,1));
+ test_format2(parser, "%a %Y.%b.%d", "sat 2004 Jul 1",
+ "strings from locale", date(2004,Jul,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Aug 1",
+ "strings from locale", date(2004,Aug,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Sep 1",
+ "strings from locale", date(2004,Sep,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Sep 1",
+ "strings from locale", date(2004,Sep,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Oct 1",
+ "strings from locale", date(2004,Oct,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Nov 1",
+ "strings from locale", date(2004,Nov,1));
+ test_format2(parser, "%Y.%b.%d", "2004 Dec 1",
+ "strings from locale", date(2004,Dec,1));
+
+ test_format2(parser, "%A %B %d, %Y", "Sunday January 1, 2004",
+ "long strings from locale", date(2004,Jan,1));
+ test_format2(parser, "%A %B %d, %Y", "Monday February 29, 2004",
+ "long strings from locale", date(2004,Feb,29));
+ test_format2(parser, "%A %B %d, %Y", "Tuesday March 1, 2004",
+ "long strings from locale", date(2004,Mar,1));
+ test_format2(parser, "%A %B %d, %Y", "Wednesday APRIL 1, 2004",
+ "long strings from locale", date(2004,Apr,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday may 15, 2004",
+ "long strings from locale", date(2004,May,15));
+ test_format2(parser, "%A %B %d, %Y", "friday june 15, 2004",
+ "long strings from locale", date(2004,Jun,15));
+ test_format2(parser, "%A %B %d, %Y", "saturday july 30, 2004",
+ "long strings from locale", date(2004,Jul,30));
+ test_format2(parser, "%A %B %d, %Y", "thursday auguST 15, 2004",
+ "long strings from locale", date(2004,Aug,15));
+ test_format2(parser, "%A %B %d, %Y", "thursday september 1, 2004",
+ "long strings from locale", date(2004,Sep,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday october 1, 2004",
+ "long strings from locale", date(2004,Oct,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday november 1, 2004",
+ "long strings from locale", date(2004,Nov,1));
+ test_format2(parser, "%A %B %d, %Y", "thursday december 31, 2004",
+ "long strings from locale", date(2004,Dec,31));
+
+ }
+
+ return printTestStats();
+
+}
diff --git a/src/boost/libs/date_time/test/gregorian/testformatters.cpp b/src/boost/libs/date_time/test/gregorian/testformatters.cpp
new file mode 100644
index 000000000..80d778c1f
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testformatters.cpp
@@ -0,0 +1,62 @@
+/* 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, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+
+ boost::gregorian::date d1(2002,01,02);
+ std::string ds1 = boost::gregorian::to_simple_string(d1);
+ check("check string: " + ds1, ds1 == "2002-Jan-02");
+
+ std::string ids1(boost::gregorian::to_iso_string(d1));
+ // std::cout << boost::gregorian::to_iso_string(d1) << std::endl;
+ check("check iso normal: " + ids1, ids1 == "20020102");
+
+ std::string sds1 = boost::gregorian::to_sql_string(d1);
+ check("check sql string: "+sds1, sds1 == "2002-01-02");
+
+ boost::gregorian::date d2(2001,12,30);
+ std::string ds2 = boost::gregorian::to_simple_string(d2);
+ check("check string: "+ds2, ds2 == "2001-Dec-30");
+ std::string ids2 = boost::gregorian::to_iso_extended_string(d2);
+ check("check iso extended string: "+ids2, ids2 == "2001-12-30");
+
+ using namespace boost::gregorian;
+ date d3(neg_infin);
+ std::cout << "|" << to_simple_string(d3) << "|" << std::endl;
+ check("check negative infinity",
+ (to_simple_string(d3) == std::string("-infinity")));
+ date d4(pos_infin);
+ check("check positive infinity",
+ (to_simple_string(d4) == std::string("+infinity")));
+ date d5(not_a_date_time);
+ std::cout << to_simple_string(d5) << "|" << std::endl;
+ check("check not a date",
+ (to_simple_string(d5) == std::string("not-a-date-time")));
+
+ date_period p1(date(2000,Jan,1), date(2001,Jan,1));
+ check("check period format",
+ (to_simple_string(p1) == std::string("[2000-Jan-01/2000-Dec-31]")));
+ date_period p2(date(2000,Jan,1), date(pos_infin));
+ check("check period format",
+ (to_simple_string(p2) == std::string("[2000-Jan-01/+infinity]")));
+ std::cout << to_simple_string(p2) << std::endl;
+
+
+
+ // TODO enhance wchar support
+// std::wstringstream wss;
+// wss << d3 << std::endl;
+// std::wcout << d3;
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testgenerators.cpp b/src/boost/libs/date_time/test/gregorian/testgenerators.cpp
new file mode 100644
index 000000000..b58c1c343
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgenerators.cpp
@@ -0,0 +1,175 @@
+/* Copyright (c) 2002,2003,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
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <string>
+#include <sstream>
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+
+ partial_date pd1(1,Jan);
+ date d = pd1.get_date(2000);
+ check("Partial date to_string()", pd1.to_string() == std::string("0"));
+ check("Partial date getdate", date(2000,1,1) == d);
+ d = pd1.get_date(2001);
+ check("Partial date getdate", date(2001,1,1) == d);
+ partial_date pd2(1,Feb);
+ check("Partial date to_string()", pd2.to_string() == std::string("31"));
+ check("Partial date operator==", pd1 == pd1);
+ check("Partial date operator==", !(pd1 == pd2));
+ check("Partial date operator==", !(pd2 == pd1));
+ check("Partial date operator<", !(pd1 < pd1));
+ check("Partial date operator<", pd1 < pd2);
+ check("Partial date operator<", !(pd2 < pd1));
+
+ typedef last_day_of_the_week_in_month lastkday;
+
+ //Find last Sunday in Feb
+ lastkday lsif(Sunday, Feb);
+ std::cout << lsif.get_date(2002) << std::endl; //24th
+ check("Last kday", date(2002,Feb,24) == lsif.get_date(2002));
+ check("Last kday to_string()", lsif.to_string() == std::string("M2.5.0"));
+ lastkday ltif(Thursday, Feb);
+ check("Last kday", date(2002,Feb,28) == ltif.get_date(2002));
+ check("Last kday to_string()", ltif.to_string() == std::string("M2.5.4"));
+ lastkday lfif(Friday, Feb);
+ check("Last kday", date(2002,Feb,22) == lfif.get_date(2002));
+ check("Last kday to_string()", lfif.to_string() == std::string("M2.5.5"));
+
+ typedef first_day_of_the_week_in_month firstkday;
+
+ firstkday fsif(Sunday, Feb);
+ std::cout << fsif.get_date(2002) << std::endl; //24th
+ check("First kday", date(2002,Feb,3) == fsif.get_date(2002));
+ check("First kday to_string()", fsif.to_string() == std::string("M2.1.0"));
+ firstkday ftif(Thursday, Feb);
+ check("First kday", date(2002,Feb,7) == ftif.get_date(2002));
+ check("First kday to_string()", ftif.to_string() == std::string("M2.1.4"));
+ firstkday ffif(Friday, Feb);
+ check("First kday", date(2002,Feb,1) == ffif.get_date(2002));
+ check("First kday to_string()", ffif.to_string() == std::string("M2.1.5"));
+
+ typedef first_day_of_the_week_after firstkdayafter;
+ firstkdayafter fkaf(Monday);
+ std::cout << fkaf.get_date(date(2002,Feb,1)) << std::endl; //feb 4
+ check("kday after",date(2002,Feb,4) == fkaf.get_date(date(2002,Feb,1)));
+ firstkdayafter fkaf2(Thursday);
+ check("kday after",date(2002,Feb,7) == fkaf2.get_date(date(2002,Feb,1)));
+ check("kday after",date(2002,Feb,28)== fkaf2.get_date(date(2002,Feb,21)));
+
+ typedef first_day_of_the_week_before firstkdaybefore;
+ firstkdaybefore fkbf(Monday);
+ std::cout << fkaf.get_date(date(2002,Feb,10))
+ << std::endl; //feb 4
+ check("kday before",date(2002,Feb,4) == fkbf.get_date(date(2002,Feb,10)));
+ firstkdaybefore fkbf2(Thursday);
+ check("kday before",date(2002,Jan,31) == fkbf2.get_date(date(2002,Feb,1)));
+ check("kday before",date(2002,Feb,7)== fkbf2.get_date(date(2002,Feb,14)));
+
+ typedef nth_day_of_the_week_in_month nthkdayofmonth;
+ nthkdayofmonth nkd1(nthkdayofmonth::third, Sunday, Jul);
+ check("nth_kday 1", date(1969, Jul, 20) == nkd1.get_date(1969));
+ check("Nth kday to_string()", nkd1.to_string() == std::string("M7.3.0"));
+ nthkdayofmonth nkd2(nthkdayofmonth::second, Monday, Dec);
+ check("nth_kday 2", date(1980, Dec, 8) == nkd2.get_date(1980));
+ check("Nth kday to_string()", nkd2.to_string() == std::string("M12.2.1"));
+ nthkdayofmonth nkd3(nthkdayofmonth::fifth, Wednesday, Jan);
+ check("nth_kday fifth wed jan 2003 2003-Jan-29",
+ date(2003, Jan, 29) == nkd3.get_date(2003));
+ check("Nth kday to_string()", nkd3.to_string() == std::string("M1.5.3"));
+ nthkdayofmonth nkd4(nthkdayofmonth::fifth, Monday, Jan);
+ check("nth_kday fifth mon jan 2003 (actaully 4th) 2003-Jan-27",
+ date(2003, Jan, 27) == nkd4.get_date(2003));
+ check("Nth kday to_string()", nkd4.to_string() == std::string("M1.5.1"));
+
+ // greg date_generator functions tests
+ {
+ date sunday(2003,Feb,2),tuesday(2003,Feb,4);
+ date friday(2003,Feb,7),saturday(2003,Feb,8);
+ greg_weekday sat(Saturday), tue(Tuesday), fri(Friday), sund(Sunday);
+
+ check("Days until weekday" , days_until_weekday(saturday, sund) == days(1));
+ check("Days until weekday" , days_until_weekday(friday, tue) == days(4));
+ check("Days until weekday" , days_until_weekday(tuesday, fri) == days(3));
+ check("Days until weekday" , days_until_weekday(sunday, sat) == days(6));
+ check("Days until weekday" , days_until_weekday(sunday, sund) == days(0));
+ check("Days until weekday" , days_until_weekday(tuesday, tue) == days(0));
+
+ check("Days before weekday" , days_before_weekday(saturday, sund) == days(6));
+ check("Days before weekday" , days_before_weekday(friday, tue) == days(3));
+ check("Days before weekday" , days_before_weekday(tuesday, fri) == days(4));
+ check("Days before weekday" , days_before_weekday(sunday, sat) == days(1));
+ check("Days before weekday" , days_before_weekday(sunday, sund) == days(0));
+ check("Days before weekday" , days_before_weekday(tuesday, tue) == days(0));
+
+ check("Date of next weekday", next_weekday(saturday, sund)== date(2003,Feb,9));
+ check("Date of next weekday", next_weekday(friday, tue) == date(2003,Feb,11));
+ check("Date of next weekday", next_weekday(tuesday, fri) == date(2003,Feb,7));
+ check("Date of next weekday", next_weekday(sunday, sat) == date(2003,Feb,8));
+ check("Date of next weekday", next_weekday(sunday, sund) == sunday);
+ check("Date of next weekday", next_weekday(tuesday, tue) == tuesday);
+
+ check("Date of previous weekday", previous_weekday(saturday, sund)== date(2003,Feb,2));
+ check("Date of previous weekday", previous_weekday(friday, tue) == date(2003,Feb,4));
+ check("Date of previous weekday", previous_weekday(tuesday, fri) == date(2003,Jan,31));
+ check("Date of previous weekday", previous_weekday(sunday, sat) == date(2003,Feb,1));
+ check("Date of previous weekday", previous_weekday(sunday, sund) == sunday);
+ check("Date of previous weekday", previous_weekday(tuesday, tue) == tuesday);
+
+ }
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+#if !defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
+ //TODO: this is temporary condition -- don't force a failure...
+ // check("no streaming implemented for new facet", false);
+#else
+ // streaming tests...
+ std::stringstream ss("");
+ std::string s("");
+
+ ss.str("");
+ ss << pd1;
+ s = "01 Jan";
+ check("streaming partial_date", ss.str() == s);
+ std::cout << ss.str() << std::endl;
+
+ ss.str("");
+ ss << lsif;
+ s = "last Sun of Feb";
+ check("streaming last_kday_of_month", ss.str() == s);
+
+ ss.str("");
+ ss << fsif;
+ s = "first Sun of Feb";
+ check("streaming first_kday_of_month", ss.str() == s);
+
+ ss.str("");
+ ss << fkaf;
+ s = "Mon after";
+ check("streaming first_kday_after", ss.str() == s);
+
+ ss.str("");
+ ss << fkbf;
+ s = "Mon before";
+ check("streaming first_kday_before", ss.str() == s);
+
+ ss.str("");
+ ss << nkd1;
+ s = "third Sun of Jul";
+ check("streaming nth_kday", ss.str() == s);
+#endif // USE_DATE_TIME_PRE_1_33_FACET_IO
+#endif // NO_LOCAL
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testgreg_cal.cpp b/src/boost/libs/date_time/test/gregorian/testgreg_cal.cpp
new file mode 100644
index 000000000..43558a20c
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgreg_cal.cpp
@@ -0,0 +1,135 @@
+/* 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 "boost/date_time/gregorian/greg_calendar.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void
+test_greg_calendar()
+{
+ using namespace boost::gregorian;
+ check("Day of week 2000-09-24 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,24))==0);
+ check("Day of week 2000-09-25 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,25))==1);
+ check("Day of week 2000-09-26 == 2 (Tue)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,26))==2);
+ check("Day of week 2000-09-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,27))==3);
+ check("Day of week 2000-09-28 == 4 (Thu)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,28))==4);
+ check("Day of week 2000-09-29 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,29))==5);
+ check("Day of week 2000-09-30 == 6 (Sat)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,30))==6);
+ //see calendar FAQ 2.2 for reference
+ check("Day of week 1953-08-02 == 0 (Sun)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,2))==0);
+ check("Day of week 1953-08-03 == 1 (Mon)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,3))==1);
+ check("Day of week 1953-08-04 == 2 (Tue)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,4))==2);
+ check("Day of week 1953-08-05 == 3 (Wed)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,5))==3);
+ check("Day of week 1953-08-06 == 4 (Thu)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,6))==4);
+ check("Day of week 1953-08-07 == 5 (Fri)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,7))==5);
+ check("Day of week 1953-08-08 == 6 (Sat)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,8))==6);
+ check("Day of week 2001-08-31 == 5 (Fri)", gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2001,8,31))==5);
+
+ //Checked against Caledrical Calc M. Edition p 396 and www site
+ check("Day of week 1400-01-01 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1400,1,1))==3);
+ check("Day of week 1436-02-03 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1436,2,3))==3);
+ check("Day of week 1492-04-9 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1492,4,9))==6);
+ check("Day of week 1560-03-5 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1560,3,5))==6);
+ check("Day of week 1716-07-24 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1716,7,24))==5);
+ check("Day of week 1768-06-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1768,6,19))==0);
+ check("Day of week 1839-03-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1839,3,27))==3);
+ check("Day of week 1819-08-02 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1819,8,2))==1);
+ check("Day of week 1903-04-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1903,4,19))==0);
+ check("Day of week 1929-08-25 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1929,8,25))==0);
+ check("Day of week 2038-11-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2038,11,10))==3);
+ check("Day of week 2094-07-18 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2094,7,18))==0);
+ //verified against website applet
+ check("Day of week 3002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(3002,7,10))==6);
+ //verified against website applet
+ check("Day of week 4002-07-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(4002,7,10))==3);
+ //verified against website applet
+ check("Day of week 5002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(5002,7,10))==6);
+
+ check("1404 is a leap year", gregorian_calendar::is_leap_year(1404));
+ check("2000 is a leap year", gregorian_calendar::is_leap_year(2000));
+ check("2004 is a leap year", gregorian_calendar::is_leap_year(2004));
+ check("2400 is a leap year", gregorian_calendar::is_leap_year(2400));
+ check("4000 is a leap year", gregorian_calendar::is_leap_year(4000));
+ check("1400 is NOT a leap year", !gregorian_calendar::is_leap_year(1400));
+ check("1900 is NOT a leap year", !gregorian_calendar::is_leap_year(1900));
+ check("2100 is NOT a leap year", !gregorian_calendar::is_leap_year(2100));
+ check("1999 is NOT a leap year", !gregorian_calendar::is_leap_year(1999));
+ check("5000 is NOT a leap year", !gregorian_calendar::is_leap_year(5000));
+
+
+ unsigned long jday1 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,1,1));
+ unsigned long jday2 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2001,1,1));
+// unsigned short year, month, day;
+// //2451545 is 2000-1-1
+ check("ToDayNumber 2000-1-1 is day 2451545", jday1 == 2451545);
+ check("ToDayNumber 2001-1-1 is day 2451911", jday2 == 2451911);
+ gregorian_calendar::ymd_type ymd = gregorian_calendar::from_day_number(jday1);
+ check("from_day_number test 2000-1-1", (ymd.year==2000)&&
+ (ymd.month==1) &&
+ (ymd.day==1) );
+
+ unsigned long jday3 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(1999,1,1));
+ check("366 days between 2000-1-1 and 2001-1-1", (jday2-jday1) == 366);
+ check("731 days between 1999-1-1 and 2001-1-1 ",(jday2-jday3) == 731);
+
+ unsigned long jday4 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,2,28));
+ unsigned long jday5 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,3,1));
+ check("2 days between 2000-2-28 and 2000-3-1 ",(jday5-jday4) == 2);
+
+ check("31 days in month Jan 2000", gregorian_calendar::end_of_month_day(2000,1) == 31);
+ check("29 days in month Feb 2000", gregorian_calendar::end_of_month_day(2000,2) == 29);
+ check("28 days in month Feb 1999", gregorian_calendar::end_of_month_day(1999,2) == 28);
+ check("28 days in month Feb 2001", gregorian_calendar::end_of_month_day(2001,2) == 28);
+ check("31 days in month Mar 2000", gregorian_calendar::end_of_month_day(2000,3) == 31);
+ check("30 days in month Apr 2000", gregorian_calendar::end_of_month_day(2000,4) == 30);
+ check("31 days in month May 2000", gregorian_calendar::end_of_month_day(2000,5) == 31);
+ check("30 days in month Jun 2000", gregorian_calendar::end_of_month_day(2000,6) == 30);
+ check("31 days in month Jul 2000", gregorian_calendar::end_of_month_day(2000,7) == 31);
+ check("31 days in month Aug 2000", gregorian_calendar::end_of_month_day(2000,8) == 31);
+ check("30 days in month Sep 2000", gregorian_calendar::end_of_month_day(2000,9) == 30);
+ check("31 days in month Oct 2000", gregorian_calendar::end_of_month_day(2000,10) == 31);
+ check("30 days in month Nov 2000", gregorian_calendar::end_of_month_day(2000,11) == 30);
+ check("31 days in month Dec 2000", gregorian_calendar::end_of_month_day(2000,12) == 31);
+
+
+// unsigned long jday0 = date_limits<>::dayNumber(gregorian_calendar::ymd_type(1900,1,1));
+// std::cout << "Day 0: " << jday0 << std::endl;
+
+ std::cout << gregorian_calendar::epoch().year << std::endl;
+}
+
+
+int
+main()
+{
+ test_greg_calendar();
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testgreg_day.cpp b/src/boost/libs/date_time/test/gregorian/testgreg_day.cpp
new file mode 100644
index 000000000..1cb5c4470
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgreg_day.cpp
@@ -0,0 +1,91 @@
+/* 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 "boost/date_time/gregorian/greg_day.hpp"
+#include "boost/date_time/gregorian/greg_weekday.hpp"
+#include "boost/date_time/gregorian/greg_day_of_year.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void
+test_day()
+{
+ using namespace boost::gregorian;
+ greg_day d1(1);
+ check("Basic test", d1 == 1);
+ try {
+ greg_day bad(0);
+ check("Bad day creation", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(std::exception &) {
+ check("Bad day creation", true); //good
+
+ }
+ try {
+ greg_day bad(32);
+ check("Bad day creation2", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(std::exception&) {
+ check("Bad day creation2", true); //good
+
+ }
+ check("traits min day", (greg_day::min)() == 1);
+ check("traits max day", (greg_day::max)() == 31);
+
+ greg_weekday sunday(0);
+ greg_weekday monday(1);
+
+ check("Weekday 0 short name == Sun",
+ sunday.as_short_string() == std::string("Sun"));
+ check("Weekday 1 short name == Mon",
+ monday.as_short_string() == std::string("Mon"));
+ check("Weekday 2 short name == Tue",
+ greg_weekday(2).as_short_string() == std::string("Tue"));
+ check("Weekday 3 short name == Wed",
+ greg_weekday(3).as_short_string() == std::string("Wed"));
+ check("Weekday 4 short name == Thu",
+ greg_weekday(4).as_short_string() == std::string("Thu"));
+ check("Weekday 5 short name == Fri",
+ greg_weekday(5).as_short_string() == std::string("Fri"));
+ check("Weekday 6 short name == Sat",
+ greg_weekday(6).as_short_string() == std::string("Sat"));
+ try {
+ greg_weekday bad(7);
+ check("Bad weekday creation", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+ }
+ catch(bad_weekday&) {
+ check("Bad weekday creation", true); //good
+
+ }
+
+ try {
+ greg_day_of_year_rep bad(367);
+ check("Bad day of year", false); //oh oh, fail
+ //unreachable
+ std::cout << "Shouldn't reach here: " << bad << std::endl;
+
+ }
+ catch(bad_day_of_year&) {
+ check("Bad day of year", true); //good
+ }
+
+}
+
+int
+main()
+{
+ test_day();
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testgreg_durations.cpp b/src/boost/libs/date_time/test/gregorian/testgreg_durations.cpp
new file mode 100644
index 000000000..53c3c0420
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgreg_durations.cpp
@@ -0,0 +1,241 @@
+/* Copyright (c) 2002,2003,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
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+
+int main(){
+
+#if !defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
+ // do not set this test to return fail -
+ // this is not necessarily a compiler problem
+ check("Optional gregorian types not selected - no tests run", true);
+#else
+
+ using namespace boost::gregorian;
+
+
+ /*** months ***/
+ {
+ months m1(5), m2(3), m3(1);
+ check("months & months addable", months(8) == m1 + m2);
+ m1 += m2;
+ check("months & months addable", months(8) == m1);
+ check("months & months subtractable", months(-5) == m2 - m1);
+ m2 -= m1;
+ check("months & months subtractable", months(-5) == m2);
+ {
+ // adding and subtracting negative values
+ date d1(2005, Jan, 1);
+ date d2(2005, Feb, 1);
+ check("add neg months (year wrap under)",
+ d1 + months(-1) == date(2004,Dec,1));
+ check("add neg months (no year wrap under)",
+ d2 + months(-1) == date(2005,Jan,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-2) == date(2004,Dec,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-12) == date(2004,Feb,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-13) == date(2004,Jan,1));
+ check("add neg months (year wrap under)",
+ d2 + months(-14) == date(2003,Dec,1));
+ date d3(2005, Dec, 1);
+ date d4(2005, Nov, 1);
+ check("subtract neg months (year wrap over)",
+ d3 - months(-1) == date(2006,Jan,1));
+ check("subtract neg months (no year wrap over)",
+ d4 - months(-1) == date(2005,Dec,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-2) == date(2006,Jan,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-12) == date(2006,Nov,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-13) == date(2006,Dec,1));
+ check("subtract neg months (year wrap over)",
+ d4 - months(-14) == date(2007,Jan,1));
+ }
+ {
+ months m1x(5), m3x(10);
+ check("months & int multipliable", months(15) == m1x * 3);
+ m1x *= 3;
+ check("months & int multipliable", months(15) == m1x);
+ //check("int * months", months(12) == 4 * m2x);
+ check("months & int dividable", months(3) == m3x / 3);
+ m3x /= 3;
+ check("months & int dividable", months(3) == m3x);
+ }
+ {
+ months m(-5), m_pos(pos_infin), m_neg(neg_infin), m_nadt(not_a_date_time);
+ check("months add special_values", m + m_pos == m_pos);
+ check("months add special_values", m + m_neg == m_neg);
+ check("months add special_values", m_pos + m_neg == m_nadt);
+ check("months add special_values", m_neg + m_neg == m_neg);
+ check("months subtract special_values", m - m_pos == m_neg);
+ check("months subtract special_values", m - m_neg == m_pos);
+ check("months subtract special_values", m_pos - m_neg == m_pos);
+ check("months special_values & int multipliable", m_pos * -1 == m_neg);
+ check("months special_values & int multipliable", m_pos * 0 == m_nadt);
+ check("months special_values & int dividable", m_neg / 3 == m_neg);
+ }
+
+ years y1(2), y2(4);
+ check("months & years addable", months(25) == m3 + y1);
+ m3 += y1;
+ check("months & years addable", months(25) == m3);
+ check("months & years subtractable", months(-23) == m3 - y2);
+ m3 -= y2;
+ check("months & years subtractable", months(-23) == m3);
+
+ {
+ date d(2001, Oct, 31);
+ check("date + months", date(2002, Feb, 28) == d + months(4));
+ d += months(4);
+ check("date += months", date(2002, Feb, 28) == d);
+ }
+ {
+ date d(2001, Oct, 31);
+ check("date - months", date(2001, Apr, 30) == d - months(6));
+ d -= months(6);
+ check("date -= months", date(2001, Apr, 30) == d);
+ }
+ }
+
+ /*** years ***/
+ {
+ years y1(2), y2(4), y3(1);
+ check("years & years addable", years(3) == y3 + y1);
+ y3 += y1;
+ check("years & years addable", years(3) == y3);
+ check("years & years subtractable", years(-1) == y3 - y2);
+ y3 -= y2;
+ check("years & years subtractable", years(-1) == y3);
+ {
+ years y1x(5), y3x(10);
+ check("years & int multipliable", years(15) == y1x * 3);
+ y1x *= 3;
+ check("years & int multipliable", years(15) == y1x);
+ //check("int * years", years(12) == 4 * y2x);
+ check("years & int dividable", years(3) == y3x / 3);
+ y3x /= 3;
+ check("years & int dividable", years(3) == y3x);
+ }
+ {
+ years m(15), y_pos(pos_infin), y_neg(neg_infin), y_nadt(not_a_date_time);
+ check("years add special_values", m + y_pos == y_pos);
+ check("years add special_values", m + y_neg == y_neg);
+ check("years add special_values", y_pos + y_neg == y_nadt);
+ check("years add special_values", y_neg + y_neg == y_neg);
+ check("years subtract special_values", m - y_pos == y_neg);
+ check("years subtract special_values", m - y_neg == y_pos);
+ check("years subtract special_values", y_pos - y_neg == y_pos);
+ check("years special_values & int multipliable", y_pos * -1 == y_neg);
+ check("years special_values & int multipliable", y_pos * 0 == y_nadt);
+ check("years special_values & int dividable", y_neg / 3 == y_neg);
+ }
+
+ months m1(5), m2(3);
+ check("years & months addable", months(51) == y2 + m2);
+ check("years & months subtractable", months(43) == y2 - m1);
+
+ {
+ date d(2001, Feb, 28); // not a leap year
+ check("date + years", date(2004, Feb, 29) == d + years(3));
+ d += years(3);
+ check("date += years", date(2004, Feb, 29) == d);
+ }
+ {
+ date d(2000, Feb, 29);
+ check("date - years", date(1994, Feb, 28) == d - years(6));
+ d -= years(6);
+ check("date -= years", date(1994, Feb, 28) == d);
+ }
+
+ try {
+ date d1(1400, 6, 1);
+ const date d2 = d1 + years(8599);
+ check("date + many years != overflow", d2 == date(9999, 6, 1));
+ }
+ catch (...) {
+ check("date + many years != overflow", false);
+ }
+
+ try {
+ date d1(9999, 1, 1);
+ const date d2 = d1 - years(8599);
+ check("date - many years != overflow", d2 == date(1400, 1, 1));
+ }
+ catch (...) {
+ check("date - many years != overflow", false);
+ }
+
+ }
+
+ /*** weeks ***/
+ // shouldn't need many tests, it is nothing more than a date_duration
+ // so all date_duration tests should prove this class
+ {
+ weeks w1(2), w2(4), w3(1), pi(pos_infin);
+ check("add special_values", weeks(pos_infin) == w1 + pi);
+ check("weeks & weeks addable", weeks(3) == w3 + w1);
+ w3 += w1;
+ check("weeks & weeks addable", weeks(3) == w3);
+ check("weeks & weeks subtractable", weeks(-1) == w3 - w2);
+ w3 -= w2;
+ check("weeks & weeks subtractable", weeks(-1) == w3);
+ {
+ days d(10);
+ check("days + weeks", days(31) == d + weeks(3));
+ d += weeks(3);
+ check("days += weeks", days(31) == d);
+ }
+ {
+ days d(10);
+ check("days - weeks", days(-32) == d - weeks(6));
+ d -= weeks(6);
+ check("days -= weeks", days(-32) == d);
+ }
+ {
+ date d(2001, Feb, 28);
+ check("date + weeks", date(2001, Mar, 21) == d + weeks(3));
+ d += weeks(3);
+ check("date += weeks", date(2001, Mar, 21) == d);
+ }
+ {
+ date d(2001, Feb, 28);
+ check("date - weeks", date(2001, Jan, 17) == d - weeks(6));
+ d -= weeks(6);
+ check("date -= weeks", date(2001, Jan, 17) == d);
+ }
+ }
+
+ {
+ date d(2000, Oct, 31);
+ date d2 = d + months(4) + years(2);
+ date d3 = d + years(2) + months(4);
+ check("date + years + months", date(2003,Feb,28) == d2);
+ check("date + years + months", date(2003,Feb,28) == d3);
+ months m = years(2) + months(4) - months(4) - years(2);
+ check("sanity check", m.number_of_months() == 0);
+ }
+ /*{
+ date d(2001, Mar, 31);
+ date d1 = (d - months(1)) + months(1); //Mar 28, right? WRONG
+ // Mar31 - 1 month is Feb28 (last day of month) so Feb28 + 1 month
+ // will be Mar31 (last day of month)
+ check("date + 1 months - 1 months", date(2001,Mar,28) == d1);
+ std::cout << d1 << std::endl;
+ //date d2 = (d - months(1)) + d; //compile error, right? RIGHT
+ //weeks w1 = weeks(1) + months(1); //compiler error, right? RIGHT
+ }*/
+
+#endif // BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
+
+ return printTestStats();
+
+}
diff --git a/src/boost/libs/date_time/test/gregorian/testgreg_month.cpp b/src/boost/libs/date_time/test/gregorian/testgreg_month.cpp
new file mode 100644
index 000000000..3e5db8fa9
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgreg_month.cpp
@@ -0,0 +1,67 @@
+/* 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 "boost/date_time/gregorian/greg_month.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+
+void
+test_month()
+{
+ using namespace boost::gregorian;
+ greg_month m1(Jan), m2(Feb), m3(Mar), m4(Apr), m5(May), m6(Jun);
+ greg_month m7(Jul), m8(Aug), m9(Sep), m10(Oct), m11(Nov),m12(Dec);
+ check("January as_number", m1.as_number() == 1);
+ check("December as_number", m12.as_number() == 12);
+ check("Jan as Short String", m1.as_short_string() == std::string("Jan"));
+ check("Feb as Short String", m2.as_short_string() == std::string("Feb"));
+ check("Mar as Short String", m3.as_short_string() == std::string("Mar"));
+ check("Apr as Short String", m4.as_short_string() == std::string("Apr"));
+ check("May as Short String", m5.as_short_string() == std::string("May"));
+ check("Jun as Short String", m6.as_short_string() == std::string("Jun"));
+ check("Jul as Short String", m7.as_short_string() == std::string("Jul"));
+ check("Aug as Short String", m8.as_short_string() == std::string("Aug"));
+ check("Sep as Short String", m9.as_short_string() == std::string("Sep"));
+ check("Oct as Short String", m10.as_short_string() == std::string("Oct"));
+ check("Nov as Short String", m11.as_short_string() == std::string("Nov"));
+ check("Dec as Short String", m12.as_short_string() == std::string("Dec"));
+ check("Jan as Long String", m1.as_long_string() == std::string("January"));
+ check("Feb as Long String", m2.as_long_string() == std::string("February"));
+ check("Mar as Long String", m3.as_long_string() == std::string("March"));
+ check("Apr as Long String", m4.as_long_string() == std::string("April"));
+ check("May as Long String", m5.as_long_string() == std::string("May"));
+ check("Jun as Long String", m6.as_long_string() == std::string("June"));
+ check("Jul as Long String", m7.as_long_string() == std::string("July"));
+ check("Aug as Long String", m8.as_long_string() == std::string("August"));
+ check("Sep as Long String", m9.as_long_string() == std::string("September"));
+ check("Oct as Long String", m10.as_long_string() == std::string("October"));
+ check("Nov as Long String", m11.as_long_string() == std::string("November"));
+ check("Dec as Long String", m12.as_long_string() == std::string("December"));
+ //month m(5);
+
+ //TODO can this support NAM? or check exception
+ // greg_month sm0(0);
+ greg_month sm1(1);
+ greg_month sm12(12);
+ //check("check not a month value", sm0.as_short_string() == "NAM");
+ check("short construction -- 1",
+ sm1.as_short_string() == std::string("Jan"));
+ check("short construction -- 12",
+ sm12.as_short_string() == std::string("Dec"));
+ check("month traits min", (greg_month::min)() == 1);
+ check("month traits max", (greg_month::max)() == 12);
+
+}
+
+int
+main()
+{
+ test_month();
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testgreg_serialize.cpp b/src/boost/libs/date_time/test/gregorian/testgreg_serialize.cpp
new file mode 100644
index 000000000..e1b608b40
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgreg_serialize.cpp
@@ -0,0 +1,190 @@
+/* Copyright (c) 2002-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
+ */
+
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/gregorian/greg_serialize.hpp>
+#include "../testfrmwk.hpp"
+#include <sstream>
+
+using namespace boost;
+using namespace gregorian;
+
+template<class archive_type, class temporal_type>
+void save_to(archive_type& ar, const temporal_type& tt)
+{
+ ar << tt;
+}
+
+int main(){
+ date d(2002,Feb,12);
+ date sv_d1(not_a_date_time);
+ date sv_d2(pos_infin);
+ date_duration dd(11);
+ date_duration sv_dd(neg_infin);
+ date_period dp(d,dd);
+ greg_year gy(1959);
+ greg_month gm(Feb);
+ greg_day gd(14);
+ greg_weekday gwd(Friday);
+ partial_date pd(26,Jul);
+ nth_kday_of_month nkd(nth_kday_of_month::second,Tuesday,Mar);
+ first_kday_of_month fkd(Saturday,Apr);
+ last_kday_of_month lkd(Saturday,Apr);
+ first_kday_before fkdb(Thursday);
+ first_kday_after fkda(Thursday);
+
+ std::ostringstream oss;
+
+ {
+
+ // NOTE: DATE_TIME_XML_SERIALIZE is only used in testing and is
+ // defined in the testing Jamfile
+#if defined(DATE_TIME_XML_SERIALIZE)
+ std::cout << "Running xml archive tests" << std::endl;
+ archive::xml_oarchive oa(oss);
+#else
+ std::cout << "Running text archive tests" << std::endl;
+ archive::text_oarchive oa(oss);
+#endif
+
+ // load up the archive
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ save_to(oa, BOOST_SERIALIZATION_NVP(d));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_d1));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_d2));
+ save_to(oa, BOOST_SERIALIZATION_NVP(dd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_dd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(dp));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gy));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gm));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(gwd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(pd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(nkd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(fkd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(lkd));
+ save_to(oa, BOOST_SERIALIZATION_NVP(fkdb));
+ save_to(oa, BOOST_SERIALIZATION_NVP(fkda));
+#else
+ save_to(oa, d);
+ save_to(oa, sv_d1);
+ save_to(oa, sv_d2);
+ save_to(oa, dd);
+ save_to(oa, sv_dd);
+ save_to(oa, dp);
+ save_to(oa, gy);
+ save_to(oa, gm);
+ save_to(oa, gd);
+ save_to(oa, gwd);
+ save_to(oa, pd);
+ save_to(oa, nkd);
+ save_to(oa, fkd);
+ save_to(oa, lkd);
+ save_to(oa, fkdb);
+ save_to(oa, fkda);
+#endif
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error writing to archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+ }
+
+ // read from the archive
+ date d2(not_a_date_time);
+ date sv_d3(min_date_time);
+ date sv_d4(min_date_time);
+ date_duration dd2(not_a_date_time);
+ date_duration sv_dd2(0);
+ date_period dp2(date(2000,Jan,1),date_duration(1));
+ greg_year gy2(1960);
+ greg_month gm2(Jan);
+ greg_day gd2(1);
+ greg_weekday gwd2(Monday);
+ partial_date pd2(1);
+ nth_kday_of_month nkd2(nth_kday_of_month::first,Monday,Jan);
+ first_kday_of_month fkd2(Monday,Jan);
+ last_kday_of_month lkd2(Monday,Jan);
+ first_kday_before fkdb2(Monday);
+ first_kday_after fkda2(Monday);
+
+ {
+ std::istringstream iss(oss.str());
+#if defined(DATE_TIME_XML_SERIALIZE)
+ archive::xml_iarchive ia(iss);
+#else
+ archive::text_iarchive ia(iss);
+#endif
+
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ ia >> BOOST_SERIALIZATION_NVP(d2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_d3);
+ ia >> BOOST_SERIALIZATION_NVP(sv_d4);
+ ia >> BOOST_SERIALIZATION_NVP(dd2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_dd2);
+ ia >> BOOST_SERIALIZATION_NVP(dp2);
+ ia >> BOOST_SERIALIZATION_NVP(gy2);
+ ia >> BOOST_SERIALIZATION_NVP(gm2);
+ ia >> BOOST_SERIALIZATION_NVP(gd2);
+ ia >> BOOST_SERIALIZATION_NVP(gwd2);
+ ia >> BOOST_SERIALIZATION_NVP(pd2);
+ ia >> BOOST_SERIALIZATION_NVP(nkd2);
+ ia >> BOOST_SERIALIZATION_NVP(fkd2);
+ ia >> BOOST_SERIALIZATION_NVP(lkd2);
+ ia >> BOOST_SERIALIZATION_NVP(fkdb2);
+ ia >> BOOST_SERIALIZATION_NVP(fkda2);
+#else
+ ia >> d2;
+ ia >> sv_d3;
+ ia >> sv_d4;
+ ia >> dd2;
+ ia >> sv_dd2;
+ ia >> dp2;
+ ia >> gy2;
+ ia >> gm2;
+ ia >> gd2;
+ ia >> gwd2;
+ ia >> pd2;
+ ia >> nkd2;
+ ia >> fkd2;
+ ia >> lkd2;
+ ia >> fkdb2;
+ ia >> fkda2;
+#endif
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error reading from archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+ }
+
+ check("date", d == d2);
+ check("special_value date (nadt)", sv_d1 == sv_d3);
+ check("special_value date (pos_infin)", sv_d2 == sv_d4);
+ check("date_duration", dd == dd2);
+ check("special_value date_duration (neg_infin)", sv_dd == sv_dd2);
+ check("date_period", dp == dp2);
+ check("greg_year", gy == gy2);
+ check("greg_month", gm == gm2);
+ check("greg_day", gd == gd2);
+ check("greg_weekday", gwd == gwd2);
+ check("date_generator: partial_date", pd == pd2);
+ check("date_generator: nth_kday_of_month", nkd.get_date(2002) == nkd2.get_date(2002)); // no operator== for nth_kday_of_week - yet
+ check("date_generator: first_kday_of_month", fkd.get_date(2002) == fkd2.get_date(2002)); // no operator== for first_kday_of_week - yet
+ check("date_generator: last_kday_of_month", lkd.get_date(2002) == lkd2.get_date(2002)); // no operator== for last_kday_of_week - yet
+ check("date_generator: first_kday_before", fkdb.get_date(d) == fkdb2.get_date(d)); // no operator== for first_kday_before - yet
+ check("date_generator: first_kday_after", fkda.get_date(d) == fkda2.get_date(d)); // no operator== for first_kday_after - yet
+
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/gregorian/testgreg_wstream.cpp b/src/boost/libs/date_time/test/gregorian/testgreg_wstream.cpp
new file mode 100644
index 000000000..08173fc8c
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgreg_wstream.cpp
@@ -0,0 +1,178 @@
+/* Copyright (c) 2003-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: Bart Garst
+ * $Date$
+ */
+#include <iostream>
+#include <sstream>
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include "../testfrmwk.hpp"
+
+using namespace boost::gregorian;
+
+int main(){
+#if defined(BOOST_NO_STD_WSTRING) || \
+ defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+ check("No wstring/wstream support for this compiler", false);
+#else
+ std::wstring res, ws;
+ std::wstringstream wss;
+ /* date_period is used because almost all the date-type objects
+ * that have the operator<< can be easily accessed from it.
+ * Those are: date, greg_month, greg_day_of_week,
+ * date_period, date_duration (also date_generators) */
+ date_period dp(date(2003,Aug,21), date(2004,May,27));
+
+
+ // date
+ wss << dp.begin();
+ res = L"2003-Aug-21";
+ check("date operator<<", wss.str() == res);
+ wss.str(L"");
+ ws = to_simple_wstring(dp.begin());
+ check("date to_simple_string", ws == res);
+ ws = to_iso_wstring(dp.begin());
+ res = L"20030821";
+ check("date to_iso_string", ws == res);
+ ws = to_iso_extended_wstring(dp.begin());
+ res = L"2003-08-21";
+ check("date to_iso_extended_string", ws == res);
+ ws = to_sql_wstring(dp.begin());
+ check("date to_sql_string", ws == res);
+ wss.str(L"");
+#ifndef BOOST_NO_STD_ITERATOR_TRAITS
+ {
+ res = L"2003-Aug-21";
+ std::wstringstream wss2(L"2003-Aug-21");
+ date testdate(not_a_date_time);
+ wss2 >> testdate;
+ check("date operator>>", to_simple_wstring(testdate) == res);
+ }
+#else
+ check("no date operator>> for this compiler", false);
+#endif
+
+ // greg_month
+ wss << dp.begin().month();
+ res = L"08";
+ check("greg_month", wss.str() == res);
+ wss.str(L"");
+ ws = dp.begin().month().as_short_wstring();
+ res = L"Aug";
+ check("greg_month as_short_wstring", ws == res);
+ ws = dp.begin().month().as_long_wstring();
+ res = L"August";
+ check("greg_month as_long_wstring", ws == res);
+ /*{
+ std::wstringstream wss2(L"August");
+ greg_month testmonth(not_a_date_time);
+ wss2 >> testmonth;
+ check("greg_month operator>>", to_simple_wstring(testmonth) == res);
+ }*/
+
+ // greg_day_of_week
+ wss << dp.begin().day_of_week();
+ res = L"Thu";
+ check("greg_day_of_week", wss.str() == res);
+ wss.str(L"");
+ ws = dp.begin().day_of_week().as_short_wstring();
+ check("greg_day_of_week as_short_wstring", ws == res);
+ ws = dp.begin().day_of_week().as_long_wstring();
+ res = L"Thursday";
+ check("greg_day_of_week as_long_wstring", ws == res);
+ /*{
+ std::wstringstream wss2(L"Thu");
+ greg_day_of_week testday(not_a_date_time);
+ wss2 >> testday;
+ check("greg_day_of_week operator>>", to_simple_wstring(testday) == res);
+ }*/
+
+ // date_period
+ wss << dp;
+ res = L"[2003-Aug-21/2004-May-26]";
+ check("date_period", wss.str() == res);
+ wss.str(L"");
+ ws = to_simple_wstring(dp);
+ check("date_period to_simple_string", ws == res);
+ res = L"20030821/20040526";
+ ws = to_iso_wstring(dp);
+ check("date_period to_iso_string", ws == res);
+ {
+ std::wstringstream wss2(L"[2003-Aug-21/2004-May-27]");
+ res = L"[2003-Aug-21/2004-May-26]";
+ // following line gives an ambiguous overload of op>>
+ //date_period testperiod(date(not_a_date_time),date_duration(not_a_date_time));
+ date_period testperiod(date(2003,Aug,21), date(2004,May,27));
+ wss2 >> testperiod;
+ check("date_period operator>>", to_simple_wstring(testperiod) == res);
+ }
+
+ // date_duration
+ wss << dp.length();
+ res = L"280";
+ check("date_duration", wss.str() == res);
+ wss.str(L"");
+ {
+ std::wstringstream wss2(L"280");
+ date_duration testduration(not_a_date_time);
+ wss2 >> testduration;
+ check("date_duration operator>>", testduration.days() == 280);
+ }
+
+ // special values
+ date sv_d(neg_infin);
+ date_duration sv_dd(pos_infin);
+ //date_period sv_dp(sv_d,sv_dd);
+ // sv-date
+ wss << sv_d;
+ res = L"-infinity";
+ check("date operator<< special value", wss.str() == res);
+ wss.str(L"");
+ ws = to_simple_wstring(sv_d);
+ check("date to_simple_string special value", ws == res);
+ // sv-date_duration
+ wss << sv_dd;
+ res = L"+infinity";
+ check("date_duration operator<< special value", wss.str() == res);
+ wss.str(L"");
+ // sv-date_period
+ /*
+ * works - just gives unexpected results:
+ *[-infinity/not-a-date-time]
+ wss << sv_dp;
+ res = L"[2003-Aug-21/2004-May-26]";
+ check("date_period", wss.str() == res);
+ std::wcout << wss.str() << std::endl;
+ wss.str(L"");
+ */
+
+ // date_generators
+ first_day_of_the_week_after fka(Monday);
+ wss << fka;
+ res = L"Mon after";
+ check("first_kday_after", wss.str() == res);
+ wss.str(L"");
+
+ first_day_of_the_week_before fkb(Monday);
+ wss << fkb;
+ res = L"Mon before";
+ check("first_kday_before", wss.str() == res);
+ wss.str(L"");
+
+ first_day_of_the_week_in_month fkom(Monday,Jan);
+ wss << fkom;
+ res = L"first Mon of Jan";
+ check("first_kday_of_month", wss.str() == res);
+ wss.str(L"");
+
+ last_day_of_the_week_in_month lkom(Monday,Jan);
+ wss << lkom;
+ res = L"last Mon of Jan";
+ check("last_kday_of_month", wss.str() == res);
+ wss.str(L"");
+
+#endif
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/gregorian/testgreg_year.cpp b/src/boost/libs/date_time/test/gregorian/testgreg_year.cpp
new file mode 100644
index 000000000..2f2f3a4d1
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testgreg_year.cpp
@@ -0,0 +1,45 @@
+/* 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 "boost/date_time/gregorian/greg_year.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+
+void test_yearlimit(int yr, bool allowed)
+{
+ std::stringstream sdesc;
+ sdesc << "should" << (allowed ? "" : " not") << " be able to make a year " << yr;
+
+ try {
+ boost::gregorian::greg_year chkyr(yr);
+ check(sdesc.str(), allowed);
+ if (allowed) {
+ check_equal("year operator ==", chkyr, yr);
+ }
+ }
+ catch (std::out_of_range&) { check(sdesc.str(), !allowed); }
+}
+
+int
+main()
+{
+ // trac-13159 better limit testing
+ test_yearlimit( 0, false);
+ test_yearlimit( 1399, false);
+ test_yearlimit( 1400, true);
+ test_yearlimit( 1401, true);
+ test_yearlimit( 9999, true);
+ test_yearlimit(10000, false);
+ test_yearlimit(10001, false);
+
+ check("traits min year", (boost::gregorian::greg_year::min)() == 1400);
+ check("traits max year", (boost::gregorian::greg_year::max)() == 9999);
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testparse_date.cpp b/src/boost/libs/date_time/test/gregorian/testparse_date.cpp
new file mode 100644
index 000000000..a28280a38
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testparse_date.cpp
@@ -0,0 +1,368 @@
+/* Copyright (c) 2002,2003,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
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include "boost/lexical_cast.hpp"
+#include <iostream>
+#include <string>
+
+// missing or misspelled parts of date string tests
+// 'output_str' will be overwritten with what() from caught exception
+bool failure_tests(std::string date_spec,
+ std::string& output_str)
+{
+ using namespace boost::gregorian;
+ bool result = false;
+ date d(not_a_date_time);
+ try {
+ d = from_simple_string(date_spec);
+ }
+ catch(bad_year& by){ // ex: "205-Jan-15"
+ result = true;
+ output_str = by.what();
+ }
+ catch(bad_month& bm){ // ex: "2005-Jsn-15"
+ result = true;
+ output_str = bm.what();
+ }
+ catch(bad_day_of_month& bd){ // ex: "2005-Jan-51"
+ result = true;
+ output_str = bd.what();
+ }
+ catch(...){
+ // test failed - unexpected exception, leave result set to false
+ }
+ return result;
+}
+
+int
+main()
+{
+
+
+// Examples from 8601
+// Full date
+// Extended CCYY-MM-DD
+ std::string s("2001-10-5");
+
+ //This one aborts gcc2.95.3 on mandrake 8.1 linux with
+ //bad lexical cast?
+ try {
+ boost::gregorian::date d(boost::gregorian::from_string(s));
+ check("check year", d.year() == 2001);
+ check("check month", d.month() == 10);
+ check("check day", d.day() == 5);
+ }
+ catch(std::exception& e) {
+ check("parse 2001-10-5", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ {
+ using namespace boost::gregorian;
+ // date objects from strings & strings to date objects
+ date d(2000, 2, 29);
+ date d2 = from_string("2000-2-29");
+ check("2000-2-29", d2 == d);
+ date d3 = from_string("2000-FEB-29");
+ check("2000-FEB-29 (uppercase)", d3 == d);
+ date d4 = from_string("2000-february-29");
+ check("2000-february-29 (lowercase)", d4 == d);
+ date d5 = from_string(to_simple_string(d));
+ check("date to string to date", d5 == d);
+ date d6 = from_string(to_iso_extended_string(d));
+ check("date to string to date", d6 == d);
+ date d7 = from_us_string("Feb-29-2000");
+ check("date from month-day-year string", d7 == d);
+ date d8 = from_uk_string("29-Feb-2000");
+ check("date from day-month-year string", d8 == d);
+ {
+ std::string sn("20050229"); // no Feb-29 in 2005
+ date dn(not_a_date_time);
+ try {
+ dn = date_from_iso_string(sn);
+ check("Expected exception not thrown: from ISO string (bad_day_of_month)", false);
+ std::cout << date_from_iso_string(sn) << std::endl;
+ }
+ catch(bad_day_of_month&) {
+ check("Caught expected exception: bad_day_of_month ", true);
+ }
+ catch(...) {
+ check("Caught unexpected exception", false);
+ }
+/* not currently passing due to a bug in boost::offset_separator (reported 2005-Aug-02)
+ sn = "2005022"; // missing a digit
+ try {
+ d = date_from_iso_string(sn);
+ check("Expected exception not thrown: from ISO string (missing digit)", false);
+ std::cout << date_from_iso_string(sn) << std::endl;
+ }
+ catch(bad_day_of_month& e) {
+ check("Caught expected exception: bad_day_of_month ", true);
+ }
+ catch(...) {
+ check("Caught unexpected exception", false);
+ }
+ */
+ sn = "20050228"; // now it's correct
+ dn = date_from_iso_string(sn);
+ check("from ISO string", date(2005,Feb,28) == dn);
+ }
+
+ date d9 = from_us_string(__DATE__);
+ std::cout << "Today's date: " << to_simple_string(d9) << std::endl;
+ date d10 = from_us_string("Feb 29, 2000");
+ std::cout << "With comma: " << to_simple_string(d10) << std::endl;
+ check("american date with comma: Feb 29, 2000 ", d10 == d);
+
+ date d11 = from_us_string("feb 29 2000");
+ check("american date with comma: feb 29 2000 ", d11 == d);
+
+ // test for missing or misspelled date spec components
+ std::string output_str("unexpected exception caught");
+ check("Year misspelled/out of range: " + output_str,
+ failure_tests("205-Jan-15", output_str));
+ output_str = "unexpected exception caught";
+ check("Month misspelled: " + output_str,
+ failure_tests("2005-Jsn-15", output_str));
+ output_str = "unexpected exception caught";
+ check("Day out of range: " + output_str,
+ failure_tests("2005-Jan-55", output_str));
+ output_str = "unexpected exception caught";
+ check("Missing month and day: " + output_str,
+ failure_tests("2005", output_str));
+ output_str = "unexpected exception caught";
+ check("Missing day: " + output_str,
+ failure_tests("2005-Jan", output_str));
+
+
+#if defined(BOOST_DATE_TIME_NO_LOCALE) || defined(BOOST_NO_STD_ITERATOR_TRAITS) || !defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
+
+ //TODO -- all these PRE_1_33 exclusions need to be removed. In the meantime, don't make
+ //this stuff fail.
+#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
+ check("input streaming for date not available", false); // force a failure
+#endif
+#else
+ {
+ std::stringstream ss("2000-2-29");
+ ss >> d2;
+ check("2000-2-29 stream-in", d2 == d);
+ }
+ {
+ std::stringstream ss("2000-FEB-29");
+ ss >> d2;
+ //std::cout << d2 << std::endl;
+ check("2000-FEB-29 stream-in (uppercase)", d2 == d);
+ }
+ {
+ std::stringstream ss("2000-february-29");
+ ss >> d2;
+ check("2000-february-29 stream-in (lowercase)", d2 == d);
+ }
+ // the removed (3) tests require a stream manipulator for date_order
+ // and date_separator (not yet implemented)
+ /*{
+ std::stringstream ss("Feb-29-2000");
+ ss >> d2;
+ check("date from month-day-year string stream-in", d2 == d);
+ }
+ {
+ std::stringstream ss("29-Feb-2000");
+ ss >> d2;
+ check("date from day-month-year string stream-in", d2 == d);
+ }
+ {
+ std::stringstream ss("Feb 29, 2000");
+ ss >> d2;
+ check("american date with comma: Feb 29, 2000 stream-in", d2 == d);
+ }*/
+#endif //BOOST_DATE_TIME_NO_LOCALE
+
+
+
+ // check proper range
+ d = date(2001, 1, 1);
+ d2 = from_string("2001-Jan-1");
+ d3 = from_string("2001-January-1");
+ check("January", d == d2);
+ check("January", d == d3);
+ d = date(2001, 12, 1);
+ d2 = from_string("2001-Dec-1");
+ d3 = from_string("2001-December-1");
+ check("December", d == d2);
+ check("December", d == d3);
+#if defined(BOOST_NO_STD_ITERATOR_TRAITS)
+ check("date from stream not available: no std iterator traits", false);
+#else
+ // from stream
+ d = date(2000, 10, 31);
+ std::stringstream ss("");
+ ss << "2000-Oct-31 is Halloween 2k!";
+ std::istream_iterator<std::string> iter(ss), eos;
+ check("from stream - stringstream", d == from_stream(iter, eos));
+#if !(defined(BOOST_NO_STD_WSTRING))
+#if !(defined(BOOST_DATE_TIME_NO_WISTREAM_ITERATOR))
+ std::wstringstream ws;
+ ws << "2000-Oct-31 is Halloween 2k!";
+ std::istream_iterator<std::wstring, wchar_t> witer(ws), weos;
+ check("from stream - wstringstream", d == from_stream(witer, weos));
+#endif // NO_WSTREAM_ITERATOR
+#endif // BOOST_NO_WSTRING
+ char d2_string[] = {"2000-10-31 is Halloween 2k!"};
+ char* end = d2_string + sizeof(d2_string) - 1;
+ check("from stream - char[]", d == from_stream(d2_string, end));
+
+ std::string s1_string("2000-Oct-31 is Halloween 2k!");
+ std::string::iterator s1_start = s1_string.begin();
+ std::string::iterator s1_end = s1_string.end();
+ check("from stream - string", d == from_stream(s1_start, s1_end));
+#ifndef BOOST_NO_STD_WSTRING
+ std::wstring w1_string(boost::lexical_cast<std::wstring>("2000-Oct-31 is Halloween 2k!"));
+ std::wstring::iterator w1_start = w1_string.begin();
+ std::wstring::iterator w1_end = w1_string.end();
+ check("from stream - wstring", d == from_stream(w1_start, w1_end));
+#endif // BOOST_NO_STD_WSTRING
+#endif // BOOST_NO_STD_ITERATOR_TRAITS
+ /* date objects from strings & strings to date objects
+ * with misspelled months */
+ try {
+ date bd = from_string("2002-Jull-4");
+ std::cout << "Shouldn't be reached." <<
+ boost::gregorian::to_simple_string(bd) << std::endl;
+ }
+ catch(boost::gregorian::bad_month&){
+ check("bad spelling 'Jull'", true);
+ }
+ catch(std::exception& e){
+ check("bad spelling", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+ }
+
+
+ try {
+ std::string s2("2001-12-41"); //oops should be 31
+ boost::gregorian::date bad_day(boost::gregorian::from_string(s2)); //won't construct
+ check("check bad day", false);
+ //The line below won't execute, but make the compiler think
+ //we are using bad day....
+ std::cout << "Oh oh, this shouldn't be reached: "
+ << boost::gregorian::to_iso_string(bad_day) << std::endl;
+
+ }
+ catch(boost::gregorian::bad_day_of_month&) { //expected
+ check("check bad day", true);
+ }
+ catch(std::exception& e) {
+ //oops wrong exception
+ check("check bad day", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ try {
+ std::string s2("2001-02-29"); //oops should be 28
+ boost::gregorian::date bad_day(boost::gregorian::from_string(s2)); //won't construct
+ check("check bad leap year", false);
+ //The line below won't execute, but make the compiler think
+ //we are using bad day....
+ std::cout << "Oh oh, this shouldn't be reached: "
+ << boost::gregorian::to_iso_string(bad_day) << std::endl;
+
+ }
+ catch(boost::gregorian::bad_day_of_month&) { //expected
+ check("check bad leap year", true);
+ }
+ catch(std::exception& e) {
+ //oops wrong exception
+ check("check bad leap year", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ try {
+ std::string s2("2001-14-1"); //oops should be <= 12
+ boost::gregorian::date bad_month(boost::date_time::parse_date<boost::gregorian::date>(s2));
+ check("check bad month", false); //fail the test
+ //The line below won't execute, but make the compiler think
+ //we are using bad day....
+ std::cout << "Oh oh, this shouldn't be reached: "
+ << boost::gregorian::to_iso_string(bad_month) << std::endl;
+
+ }
+ catch(boost::gregorian::bad_month&) { //expected
+ check("check bad month", true);
+ }
+ catch(std::exception& e) {
+ //oops wrong exception
+ check("check bad month", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ //This one aborts gcc2.95.3 on mandrake 8.1 linux with
+ //bad lexical cast?
+ try {
+ //Example of ISO Standard -- CCYYMMDD
+ using namespace boost::gregorian;
+ std::string ud("20011009"); //2001-Oct-09
+ date d1(boost::gregorian::from_undelimited_string(ud));
+ // std::cout << to_string(d1) << std::endl;
+ check("undelimited date string", d1 == date(2001,Oct,9));
+
+
+ std::string ad("2001/10/09");
+ date d2(boost::date_time::parse_date<date>(ad));
+ check("check american date", d2 == date(2001,Oct,9));
+ }
+ catch(std::exception& e) {
+ check("more parsing", false);
+ std::cout << "Fail: " << e.what() << std::endl;
+ }
+
+ using namespace boost::gregorian;
+ std::string s2("2003-07-28");
+ date d2(from_string(s2));
+ check("check date", d2.month() == 7 &&
+ d2.year() == 2003 &&
+ d2.day() == 28);
+// std::string s1("2001-Oct-5");
+// gregorian::date d1(parse_date<gregorian::date>(s1));
+// check("check month", d1.month() == 10);
+
+
+ //Check that the from_string and to_string can be reversed
+ date d10(2003, 10, 19);
+ std::string d10s = to_simple_string(d10);
+ date d11 = from_simple_string(d10s);
+ check("to from string inversion", d10 == d11);
+
+ try {
+ using namespace boost::gregorian;
+ std::string ud(""); //empty string error sf bug# 1155556
+ date d1(from_simple_string(ud));
+ check("empty string", false); //should never reach this piont
+ (void)d1;
+ }
+ catch(std::exception& e) {
+ check(std::string("empty string parse (exception expected): ") + e.what(), true);
+ }
+
+
+//Calendar Week + Day Number
+// CCYYWwwDThhmmss
+// 1986W105T
+// week == 10 day=5
+// see page 5
+
+
+//Duration rep
+//CCYYMMDDThhmmss/PnYnMnDTnHnMnS
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/gregorian/testperiod.cpp b/src/boost/libs/date_time/test/gregorian/testperiod.cpp
new file mode 100644
index 000000000..bca235276
--- /dev/null
+++ b/src/boost/libs/date_time/test/gregorian/testperiod.cpp
@@ -0,0 +1,153 @@
+/* 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 "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+int main()
+{
+ using namespace boost::gregorian;
+ date d1(2000,Jan,1),d2(2000,Jan,4);
+ date d3 = d2;
+ check("assignment", d3 == d2);
+ date_period p1(d1,d2);
+ date_period p2(d1,date_duration(3));
+ check("construction and ==", p1 == p2);
+ check("begin", p1.begin() == d1);
+ check("last", p1.last() == d2-date_duration(1) );
+ check("end", p1.end() == d2);
+ check("length", p2.length() == date_duration(3));
+ check("contains begin", p1.contains(d1));
+ check("contains last", !p1.contains(d2));
+ date_period p3(date(2000,Jan,4),date(2000,Feb,1));
+ check("operator== not equal case", !(p1 == p3));
+ check("less than order", p1 < p3);
+ check("greater than order", p3 > p1);
+ check("not equal", p3 != p1);
+ check("intersects with myself", p1.intersects(p1));
+ check("not intersects", !(p1.intersects(p3)));
+ check("not intersects", !(p3.intersects(p1)));
+ date_period p4(date(1999,Dec,1), d2);
+ check("intersects", p1.intersects(p4));
+ check("intersects", p4.intersects(p1));
+ date_period p5(date(1999,Dec,1), date(2000,Dec,31));
+ check("intersects", p1.intersects(p5));
+ check("intersects", p5.intersects(p1));
+ date_period p6(date(2000,Jan,1),date(2000,Dec,31));
+ check("contains period", p5.contains(p6));
+ check("contains period equal", p6.contains(p6));
+ check("not contains period", !p6.contains(p5));
+
+ //shift test
+ date_duration fourDays(4);
+ p1.shift(fourDays); //from 2000-Jan-01--2000-Jan-04
+ date_period shifted(date(2000,Jan,5),date(2000,Jan,8));
+ // std::cout << to_string(p1.begin()) <<"--"
+ // << to_string(p1.last()) << std::endl;
+ check("shift", p1 == shifted);
+
+ //expand the date period
+ date_period p10(date(2000,Jan,5),date(2000,Jan,8));
+ p10.expand(days(2)); //from 2000-Jan-01--2000-Jan-04
+ check("expand", p10 == date_period(date(2000,Jan,3),date(2000,Jan,10)));
+
+ //intersection tests
+ date_period i1(date(2000,Jan,5), date(2000,Jan,10));
+ date_period i2(date(2000,Jan,1), date(2000,Jan,7));
+ date_period r1(date(2000,Jan,5), date(2000,Jan,7));
+ //case 1 [5 -10) intersect [1-7) -> [5-7)
+ std::cout << i1.intersection(i2) << std::endl;
+ check("intersect case1", i1.intersection(i2) == r1);
+ check("intersect case1", i2.intersection(i1) == r1);
+ //case 2 [5 -10) intersect [1-15) -> [5-10)
+ date_period i3(date(2000,Jan,1), date(2000,Jan,15));
+ check("intersect case2", i1.intersection(i3) == i1);
+ check("intersect case2", i3.intersection(i1) == i1);
+ //case 3 [5-10) intersect [7-15) -> [7-10)
+ date_period i4(date(2000,Jan,7), date(2000,Jan,10));
+ date_period r2(date(2000,Jan,7), date(2000,Jan,10));
+ check("intersect case3", i1.intersection(i4) == r2);
+ check("intersect case3", i4.intersection(i1) == r2);
+ //case 4 [5-10) intersect [6-9) -> [6-9)
+ date_period i5(date(2000,Jan,6), date(2000,Jan,9));
+ check("intersect case4", i1.intersection(i5) == i5);
+ check("intersect case4", i5.intersection(i1) == i5);
+ //case 5 no intersection [1-7) intersect [7-10)
+ check("no intersection", i2.intersection(i4).is_null());
+
+ //case 1 [5 -10) merge [1-7) -> [1-10)
+ date_period r3(date(2000,Jan,1), date(2000,Jan,10));
+ // std::cout << to_iso_string(i1.merge(i2).begin()) << "/" << to_iso_string(i1.merge(i2).last()) << std::endl;
+ check("[5 -10) merge [1-7) -> [1-10)", i1.merge(i2) == r3);
+ check("[1 -7) merge [7-10) -> null", i2.merge(i4).is_null());
+ date_period r4(date(2000,Jan,5), date(2000,Jan,10));
+ check("[5 -10) merge [6-9) -> [5-10)", i1.merge(i5) == r4);
+
+ check("[5-10) span [1-7) -> [1-10)", i1.span(i2) == r3);
+ check("[1-7) span [7-10) -> [1-10)", i2.span(i4) == r3);
+ check("[7-10) span [1-7) -> [1-10)", i4.span(i2) == r3);
+ check("[1-15) span [1-7) -> [1-15)", i3.span(i2) == i3);
+
+ date_period i6(date(2000,Jan,1), date(2000,Jan,2));
+ check("[1-2) span [7-10) -> [1-10)", i6.span(i4) == r3);
+ check("[7-10) span [1-2) -> [1-10)", i4.span(i6) == r3);
+
+
+ date bf_start(2000,Jan,5);
+ date bf_end(2000,Jan,10);
+ date bf_before(2000,Jan,4); //is before the period
+ date bf_after(2000,Jan,11); //is really after
+ date bf_during(2000, Jan, 7);
+ date_period bfp1(bf_start, bf_end); //[2000-Jan-5 - 2000-Jan10)
+
+ check("is before -- start boundary", !bfp1.is_before(bf_start));
+ check("is before -- end boundary", bfp1.is_before(bf_end));
+ check("is before -- last boundary", !bfp1.is_before(bfp1.last()));
+ check("is before -- false", !bfp1.is_before(bf_before));
+ check("is before -- false", !bfp1.is_before(bf_during));
+ check("is before -- true", bfp1.is_before(bf_after));
+
+ check("is after -- start boundary", !bfp1.is_after(bf_start));
+ check("is after -- end boundary", !bfp1.is_after(bf_end));
+ check("is after -- last boundary", !bfp1.is_after(bfp1.last()));
+ check("is after -- true", bfp1.is_after(bf_before));
+ check("is after -- false", !bfp1.is_after(bf_during));
+ check("is after -- false", !bfp1.is_after(bf_after));
+
+ //adjacent tests
+ /*
+ [5-----10) adj1
+ [1----5) adj2
+ [7-----12) adj3
+ [12----15) adj4
+ [1-3) adj5
+ [7-9) adj6
+ */
+ date_period adj1(date(2000,Jan,5), date(2000,Jan,10));
+ date_period adj2(date(2000,Jan,1), date(2000,Jan,5));
+ date_period adj3(date(2000,Jan,7), date(2000,Jan,12));
+ date_period adj4(date(2000,Jan,12), date(2000,Jan,15));
+ date_period adj5(date(2000,Jan,1), date(2000,Jan,3));
+ date_period adj6(date(2000,Jan,7), date(2000,Jan,9));
+
+ check("is adjacent -- adj1-->adj2", adj1.is_adjacent(adj2));
+ check("is adjacent -- adj2-->adj1", adj2.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj3", !adj1.is_adjacent(adj3));
+ check("is adjacent -- adj3-->adj1", !adj3.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj4", !adj1.is_adjacent(adj4));
+ check("is adjacent -- adj4-->adj1", !adj4.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj5", !adj1.is_adjacent(adj5));
+ check("is adjacent -- adj5-->adj1", !adj5.is_adjacent(adj1));
+ check("is adjacent -- adj1-->adj6", !adj1.is_adjacent(adj6));
+ check("is adjacent -- adj6-->adj1", !adj6.is_adjacent(adj1));
+
+ printTestStats();
+
+ return 0;
+}
+
diff --git a/src/boost/libs/date_time/test/local_time/README.poorly_formed_zonespec b/src/boost/libs/date_time/test/local_time/README.poorly_formed_zonespec
new file mode 100644
index 000000000..b417cc8a6
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/README.poorly_formed_zonespec
@@ -0,0 +1,4 @@
+The file "poorly_formed_zonespec.csv" is only used for testing.
+
+This file has the wrong number of fields in it and should not be used for
+any other prupose.
diff --git a/src/boost/libs/date_time/test/local_time/poorly_formed_zonespec.csv b/src/boost/libs/date_time/test/local_time/poorly_formed_zonespec.csv
new file mode 100644
index 000000000..d5eb87149
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/poorly_formed_zonespec.csv
@@ -0,0 +1,2 @@
+"ID","STD ABBR","STD NAME","DST ABBR","DST NAME","GMT offset","DST adjustment","DST Start Date rule","Start time","DST End date rule","End time"
+"Unique/Zone_name","GMT","","+00:00:00"
diff --git a/src/boost/libs/date_time/test/local_time/testclocks.cpp b/src/boost/libs/date_time/test/local_time/testclocks.cpp
new file mode 100644
index 000000000..6744631e2
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testclocks.cpp
@@ -0,0 +1,40 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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$
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include <iostream>
+
+// The actual clocks are tested in posix_time/testclock.cpp.
+// These tests are to verify that the time zone is applied correctly
+
+int
+main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+
+ boost::shared_ptr<time_zone> az_tz(new posix_time_zone("MST-07"));
+ boost::shared_ptr<time_zone> ny_tz(new posix_time_zone("EST-05EDT,M4.1.0,M10.5.0"));
+
+ ptime tl = second_clock::local_time();
+ std::cout << tl << std::endl;
+ local_date_time ldt1 = local_sec_clock::local_time(az_tz);
+ std::cout << ldt1.to_string() << std::endl;
+ local_date_time ldt2 = local_sec_clock::local_time(ny_tz);
+ std::cout << ldt2.to_string() << std::endl;
+
+ tl = microsec_clock::local_time();
+ std::cout << tl << std::endl;
+ local_date_time ldt3 = local_microsec_clock::local_time(az_tz);
+ std::cout << ldt3.to_string() << std::endl;
+ local_date_time ldt4 = local_microsec_clock::local_time(ny_tz);
+ std::cout << ldt4.to_string() << std::endl;
+
+ return 0;
+}
diff --git a/src/boost/libs/date_time/test/local_time/testcustom_time_zone.cpp b/src/boost/libs/date_time/test/local_time/testcustom_time_zone.cpp
new file mode 100644
index 000000000..c45965e55
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testcustom_time_zone.cpp
@@ -0,0 +1,88 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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$
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+
+ boost::shared_ptr<dst_calc_rule>
+ rule1(new partial_date_dst_rule(partial_date(30,Apr),
+ partial_date(30,Oct)));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule2(new first_last_dst_rule(first_last_dst_rule::start_rule(Sunday,Apr),
+ first_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule>
+ rule3(new last_last_dst_rule(last_last_dst_rule::start_rule(Sunday,Mar),
+ last_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule> rule4; // no daylight savings
+
+ time_zone_names pst("Pacific Standard Time",
+ "PST",
+ "Pacific Daylight Time" ,
+ "PDT");
+ time_zone_names mst("Mountain Standard Time",
+ "MST",
+ "" ,
+ "");
+
+ dst_adjustment_offsets of(hours(1), hours(2), hours(2));
+ dst_adjustment_offsets of2(hours(0), hours(0), hours(0)); // no daylight savings
+
+ time_zone_ptr tz1(new custom_time_zone(pst, hours(-8), of, rule1));
+ time_zone_ptr tz2(new custom_time_zone(pst, hours(-8), of, rule2));
+ time_zone_ptr tz3(new custom_time_zone(pst, hours(-8), of, rule3));
+ time_zone_ptr tz4(new custom_time_zone(mst, hours(-7), of2, rule4));
+
+ check("out string",
+ tz1->dst_zone_abbrev() == std::string("PDT"));
+ check("out string",
+ tz1->std_zone_abbrev() == std::string("PST"));
+ check("out string",
+ tz1->std_zone_name() == std::string("Pacific Standard Time"));
+ check("out string",
+ tz1->dst_zone_name() == std::string("Pacific Daylight Time"));
+
+ check("dst offset", tz1->dst_offset() == hours(1));
+ check("base offset", tz1->base_utc_offset() == hours(-8));
+ check("has dst", tz1->has_dst());
+
+ check("dst start time",
+ tz1->dst_local_start_time(2003) == ptime(date(2003,Apr,30),hours(2)));
+ check("dst end time",
+ tz1->dst_local_end_time(2003) == ptime(date(2003,Oct,30),hours(2)));
+
+ check("tz1 to posix string",
+ tz1->to_posix_string() == std::string("PST-08PDT+01,120/02:00,303/02:00"));
+ check("tz2 to posix string",
+ tz2->to_posix_string() == std::string("PST-08PDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("tz3 to posix string",
+ tz3->to_posix_string() == std::string("PST-08PDT+01,M3.5.0/02:00,M10.5.0/02:00"));
+ check("tz4 to posix string",
+ tz4->to_posix_string() == std::string("MST-07"));
+
+ // test start/end for non-dst zone
+ check("has dst in non-dst zone", !tz4->has_dst());
+ check("dst start in non-dst zone",
+ tz4->dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ tz4->dst_local_end_time(2005) == ptime(not_a_date_time));
+
+
+ return printTestStats();
+}
+
+
diff --git a/src/boost/libs/date_time/test/local_time/testdst_transition_day_rule.cpp b/src/boost/libs/date_time/test/local_time/testdst_transition_day_rule.cpp
new file mode 100644
index 000000000..d3ca19afa
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testdst_transition_day_rule.cpp
@@ -0,0 +1,65 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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$
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/local_time/dst_transition_day_rules.hpp"
+#include "boost/shared_ptr.hpp"
+#include "../testfrmwk.hpp"
+
+
+
+// see http://www.timeanddate.com/time/aboutdst.html for some info
+// also
+int
+main()
+{
+ // using namespace boost::posix_time;
+ using namespace boost::local_time;
+ using namespace boost::gregorian;
+
+ boost::shared_ptr<dst_calc_rule>
+ rule1(new partial_date_dst_rule(partial_date(30,Apr),
+ partial_date(30,Oct)));
+
+ check("partial date rule", rule1->start_day(2001) == date(2001, Apr, 30));
+ check("partial date rule", rule1->end_day(2001) == date(2001, Oct, 30));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule2(new first_last_dst_rule(first_last_dst_rule::start_rule(Sunday,Apr),
+ first_last_dst_rule::end_rule(Sunday,Oct)));
+
+ check("first last rule", rule2->start_day(2001) == date(2001, Apr, 1));
+ check("first last rule", rule2->end_day(2001) == date(2001, Oct, 28));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule3(new last_last_dst_rule(last_last_dst_rule::start_rule(Sunday,Mar),
+ last_last_dst_rule::end_rule(Sunday,Oct)));
+
+ check("last last rule", rule3->start_day(2001) == date(2001, Mar, 25));
+ check("last last rule", rule3->end_day(2001) == date(2001, Oct, 28));
+
+ typedef nth_kday_of_month nkday;
+ boost::shared_ptr<dst_calc_rule>
+ rule4(new nth_last_dst_rule(nth_last_dst_rule::start_rule(nkday::first,Sunday,Mar),
+ nth_last_dst_rule::end_rule(Sunday,Oct)));
+
+ check("nth Last rule", rule4->start_day(2001) == date(2001, Mar, 4));
+ check("nth Last rule", rule4->end_day(2001) == date(2001, Oct, 28));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule5(new nth_kday_dst_rule(nth_kday_dst_rule::start_rule(nkday::first,Sunday,Mar),
+ nth_kday_dst_rule::end_rule(nkday::fourth,Sunday,Oct)));
+
+ check("nth_kday rule", rule5->start_day(2001) == date(2001, Mar, 4));
+ check("nth_kday rule", rule5->end_day(2001) == date(2001, Oct, 28));
+
+
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/local_time/testlocal_time.cpp b/src/boost/libs/date_time/test/local_time/testlocal_time.cpp
new file mode 100644
index 000000000..058090fc0
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testlocal_time.cpp
@@ -0,0 +1,370 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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$
+ */
+
+
+#include "boost/date_time/local_time/custom_time_zone.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time/local_time.hpp"
+// #include "boost/date_time/local_time/posix_time_zone.hpp"
+#include "../testfrmwk.hpp"
+//#include "boost/date_time/c_time.hpp"
+#include <iostream>
+
+#include <sstream>
+// function eases testing
+std::string tm_out(const tm& ptr){
+ std::stringstream ss;
+
+ ss
+ << ptr.tm_wday << ' ' << ptr.tm_yday << ' '
+ << std::setw(2) << std::setfill('0') << ptr.tm_mon + 1 << '/'
+ << std::setw(2) << std::setfill('0') << ptr.tm_mday << '/'
+ << std::setw(2) << std::setfill('0') << ptr.tm_year + 1900 << ' '
+ << std::setw(2) << std::setfill('0') << ptr.tm_hour << ':'
+ << std::setw(2) << std::setfill('0') << ptr.tm_min << ':'
+ << std::setw(2) << std::setfill('0') << ptr.tm_sec << ' ';
+ if(ptr.tm_isdst >= 0){
+ ss << (ptr.tm_isdst ? "DST" : "STD");
+ }
+ else{
+ ss << "DST/STD unknown";
+ }
+ return ss.str();
+}
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+ // since local_date_time inherits it's math operations from time, the
+ // tests here only show that the operations work. The thorough testing
+ // of these operations is done in the posix_time tests
+
+ try {
+ time_zone_ptr az_tz(new posix_time_zone("MST-07"));
+ time_zone_ptr ny_tz(new posix_time_zone("EST-05EDT,M4.1.0,M10.5.0"));
+ // EST & EST for sydney is correct, according to zoneinfo files
+ time_zone_ptr sydney(new posix_time_zone("EST+10EST,M10.5.0,M3.5.0/03:00"));
+ time_zone_ptr null_tz;
+ date d(2003, 12, 20);
+ hours h(12);
+ ptime t(d,h);
+ local_date_time az_time(t, az_tz); // ptime constructor is a UTC time
+
+ check("Zone abbreviation", az_time.zone()->std_zone_abbrev() == std::string("MST"));
+ check("base offset", az_time.zone()->base_utc_offset() == hours(-7));
+ check("zone has dst", az_time.zone()->has_dst() == false);
+ check("is_dst check", az_time.is_dst() == false);
+ check("to_string: " + az_time.to_string(),
+ az_time.to_string() == "2003-Dec-20 05:00:00 MST");
+
+
+
+ std::cout << "\nChecking copy construction" << std::endl;
+ local_date_time az_time2(az_time); //copy constructor
+ // Now test the copy
+ check("is_dst check", az_time2.is_dst() == false);
+ check("to_string: " + az_time2.to_string(),
+ az_time2.to_string() == "2003-Dec-20 05:00:00 MST");
+ check("zone has dst", az_time2.zone()->has_dst() == false);
+ check("base offset", az_time2.zone()->base_utc_offset() == hours(-7));
+
+
+ std::cout << "\nChecking special_value construction" << std::endl;
+ // since local_date_time inherits its special value operatorations
+ // from time, we only need to show here that they work as thorough
+ // testing is done in the posix_time tests
+ ptime svpt(not_a_date_time);
+ local_date_time sv_time(svpt, ny_tz);
+ check("is special_value", sv_time.is_not_a_date_time());
+ check("to_string: " + sv_time.to_string(),
+ sv_time.to_string() == "not-a-date-time");
+ check("is_dst", sv_time.is_dst() == false);
+ local_date_time sv_time2(pos_infin);
+ check("is special_value", sv_time2.is_pos_infinity());
+ check("to_string: " + sv_time2.to_string(),
+ sv_time2.to_string() == "+infinity");
+ check("is_dst", sv_time2.is_dst() == false);
+ sv_time2 += days(12); // add a duration to a special value
+ check("Add a duration to a special value", sv_time2.is_pos_infinity());
+
+ local_date_time sv_time3(max_date_time, ny_tz);
+#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ check("max_date_time to_string: " + sv_time3.to_string(),
+ sv_time3.to_string() == "9999-Dec-31 18:59:59.999999999 EST");
+#else
+ check("max_date_time to_string: " + sv_time3.to_string(),
+ sv_time3.to_string() == "9999-Dec-31 18:59:59.999999 EST");
+#endif
+
+ try {
+ local_date_time sv_time4(min_date_time);
+ check("min_date_time to_string: " + sv_time4.to_string(),
+ sv_time4.to_string() == "1400-Jan-01 00:00:00 UTC");
+ }
+ catch (std::exception& e) {
+ check("min_date_time to_string -- exception" , false);
+ std::cout << "Exception is : " << e.what() << std::endl;
+ }
+
+/** todo -- this will cause an out of range when min_date is adjusted for ny_tz
+ local_date_time sv_time5(min_date_time, ny_tz);
+ std::cout << sv_time5.to_string() << std::endl;
+**/
+
+ std::cout << "\nChecking calc_options construction" << std::endl;
+ { // invalid NADT
+ date dx(2004, Apr, 4);
+ time_duration td(2,30,0); // invalid local time in ny_tz
+ local_date_time calcop(dx, td, ny_tz, local_date_time::NOT_DATE_TIME_ON_ERROR);
+ check("is NADT", calcop.is_not_a_date_time());
+ }
+ { // invalid exception
+ date dx(2004, Apr, 4);
+ time_duration td(2,30,0); // invalid local time in ny_tz
+ try{
+ local_date_time calcop(dx, td, ny_tz, local_date_time::EXCEPTION_ON_ERROR);
+ check("Did not catch expected exception", false);
+ }catch(time_label_invalid& /*i*/){
+ check("Caught expected exception", true);
+ }catch(...){
+ check("Caught unexpected exception", false);
+ }
+ }
+ { // ambig NADT
+ date dx(2004, Oct, 31);
+ time_duration td(1,30,0); // ambig local time in ny_tz
+ local_date_time calcop(dx, td, ny_tz, local_date_time::NOT_DATE_TIME_ON_ERROR);
+ check("is NADT", calcop.is_not_a_date_time());
+ }
+ { // ambig exception
+ date dx(2004, Oct, 31);
+ time_duration td(1,30,0); // ambig local time in ny_tz
+ try{
+ local_date_time calcop(dx, td, ny_tz, local_date_time::EXCEPTION_ON_ERROR);
+ check("Did not catch expected exception", false);
+ }catch(ambiguous_result& /*a*/){
+ check("Caught expected exception", true);
+ }catch(...){
+ check("Caught unexpected exception", false);
+ }
+ }
+
+
+ //Now construct with a date and time
+ std::cout << "\nChecking construct with date and time_duration" << std::endl;
+ local_date_time az_time3(d, h, az_tz, false);
+ check("Zone abbreviation", az_time3.zone()->std_zone_abbrev() == std::string("MST"));
+ check("base offset", az_time3.zone()->base_utc_offset() == hours(-7));
+ check("base offset", az_time3.zone()->has_dst() == false);
+ check("is_dst check", az_time3.is_dst() == false);
+ check("to_string: " + az_time3.to_string(),
+ az_time3.to_string() == "2003-Dec-20 12:00:00 MST");
+
+ // construct with a null tz
+ //local_date_time null_tz_time(d, h, null_tz, false);
+ local_date_time null_tz_time(d, h, null_tz, true);
+ // TODO: how to handle calls to null_tz_time.zone()->...
+ check("is_dst check", null_tz_time.is_dst() == false);
+ check("to_string: " + null_tz_time.to_string(),
+ null_tz_time.to_string() == "2003-Dec-20 12:00:00 UTC");
+
+ //Now construct with a date and time - invalid parameters
+ try{
+ local_date_time blt(d, h, ny_tz, true);
+ check("Did not catch expected exception (dst_not_valid)", false);
+ }catch(dst_not_valid& e){
+ check(std::string("Caught expected exception (dst_not_valid) ") + e.what(), true);
+ }catch(std::exception& e){
+ check(std::string("Caught unexpected exception ") + e.what(), false);
+ }
+ try{
+ local_date_time blt(date(2004,Apr,4), time_duration(2,30,0), ny_tz, true);
+ check("Did not catch expected exception (Invalid_Time_Label)", false);
+ }catch(time_label_invalid& e){
+ check(std::string("Caught expected exception (Invalid_Time_Label) ") + e.what(), true);
+ }catch(std::exception& e){
+ check(std::string("Caught unexpected exception ") + e.what(), false);
+ }
+
+
+ // thorough is_dst() tests, tests againts null_tz and non dst tz are
+ // done where those local times were tested
+ {
+ date dx(2004,Apr,4);
+ time_duration td(1,15,0); // local
+ local_date_time lt1(dx,td,ny_tz,false);
+ local_date_time lt2(ptime(dx,time_duration(6,15,0)), ny_tz);
+ check("are local_times equal", lt1.utc_time() == lt2.utc_time());
+ check("is_dst - transition in 1", lt1.is_dst() == false);
+ check("is_dst - transition in 2", lt2.is_dst() == false);
+ lt1 += hours(1);
+ lt2 += hours(1);
+ check("is_dst - transition in 1", lt1.is_dst() == true);
+ check("is_dst - transition in 2", lt2.is_dst() == true);
+ }
+ {
+ date dx(2004,Oct,31);
+ time_duration td(1,15,0); // local
+ local_date_time lt1(dx,td,ny_tz,true);
+ /*try{
+ //local_date_time lt1(dx,td,ny_tz,false);
+ local_date_time lt1(dx,td,ny_tz,true);
+ std::cout << "no exception thrown" << std::endl;
+ }catch(time_label_invalid& e){
+ std::cout << "caught: " << e.what() << std::endl;
+ }*/
+ local_date_time lt2(ptime(dx,time_duration(5,15,0)), ny_tz);
+ check("are local_times equal", lt1.utc_time() == lt2.utc_time());
+ check("is_dst - transition out 1", lt1.is_dst() == true);
+ check("is_dst - transition out 2", lt2.is_dst() == true);
+ lt1 += hours(1);
+ lt2 += hours(1);
+ check("is_dst - transition out 1", lt1.is_dst() == false);
+ check("is_dst - transition out 2", lt2.is_dst() == false);
+ }
+ { // southern hemisphere
+ date dx(2004,Oct,31);
+ time_duration td(1,15,0); // local
+ local_date_time lt1(dx,td,sydney,false);
+ check("is_dst - transition in (sydney)", lt1.is_dst() == false);
+ lt1 += hours(1);
+ check("is_dst - transition in (sydney)", lt1.is_dst() == true);
+ }
+ {
+ date dx(2004,Mar,28);
+ time_duration td(2,15,0); // local; sydney has a weird trans time
+ local_date_time lt1(dx,td,sydney,true);
+ check("is_dst - transition out (sydney)", lt1.is_dst() == true);
+ lt1 += hours(1);
+ check("is_dst - transition out (sydney)", lt1.is_dst() == false);
+ }
+
+
+
+ std::cout << "\nTest conversion of time zone from Arizona to New York" << std::endl;
+ local_date_time ny_time = az_time.local_time_in(ny_tz);
+ check("Zone abbreviation", ny_time.zone()->std_zone_abbrev() == std::string("EST"));
+ check("base offset", ny_time.zone()->base_utc_offset() == hours(-5));
+ check("base offset", ny_time.zone()->has_dst() == true);
+ check("to_string: " + ny_time.to_string(),
+ ny_time.to_string() == "2003-Dec-20 07:00:00 EST");
+ ny_time += hours(3);
+ check("to_string after add 3 hours: " + ny_time.to_string(),
+ ny_time.to_string() == "2003-Dec-20 10:00:00 EST");
+ ny_time += days(3);
+ check("to_string after add 3 days: " + ny_time.to_string(),
+ ny_time.to_string() == "2003-Dec-23 10:00:00 EST");
+
+
+ { // test comparisons & math operations
+ date dx(2003, Aug, 28);
+ ptime sv_pt(pos_infin);
+ local_date_time sv_lt(sv_pt, ny_tz);
+ ptime utc_pt(dx, hours(12));
+ // all 4 of the following local times happen at the same instant
+ // so they are all equal
+ local_date_time utc_lt(utc_pt, null_tz); // noon in utc
+ local_date_time az_lt(dx, hours(5), az_tz, false); // 5am local std
+ local_date_time ny_lt(dx, hours(8), ny_tz, true); // 8am local dst
+ local_date_time au_lt(dx, hours(22), sydney, false);// 10pm local std
+
+ check("local_date_time to tm",
+ std::string("4 239 08/28/2003 05:00:00 STD") == tm_out(to_tm(az_lt)));
+ check("local_date_time to tm",
+ std::string("4 239 08/28/2003 08:00:00 DST") == tm_out(to_tm(ny_lt)));
+ check("local_date_time to tm",
+ std::string("4 239 08/28/2003 22:00:00 STD") == tm_out(to_tm(au_lt)));
+
+ try{
+ local_date_time ldt(not_a_date_time);
+ tm ldt_tm = to_tm(ldt);
+ check("Exception not thrown (special_value to_tm)", false);
+ //does nothing useful but stops compiler from complaining about unused ldt_tm
+ std::cout << ldt_tm.tm_sec << std::endl;
+ }catch(std::out_of_range&){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+ // check that all are equal to sv_pt
+ check("local == utc", az_lt == utc_lt);
+ check("local == utc", ny_lt == utc_lt);
+ check("local == utc", au_lt == utc_lt);
+ check("local <= utc", au_lt <= utc_lt);
+ check("local >= utc", au_lt >= utc_lt);
+ check("local == local", az_lt == ny_lt);
+ check("local < local", az_lt < ny_lt+seconds(1));
+ check("local > local", az_lt+seconds(1) > ny_lt);
+ check("local <= local", az_lt <= ny_lt);
+ check("local >= local", az_lt >= ny_lt);
+ check("local != local", az_lt+seconds(1) != ny_lt);
+
+ au_lt += hours(1);
+ check("local != after +=", au_lt != utc_lt);
+ check("local <= after +=", utc_lt <= au_lt);
+ check("local >= after +=", au_lt >= utc_lt);
+ check("local < after +=", utc_lt < au_lt);
+ check("local > after +=", au_lt > utc_lt);
+ au_lt -= hours(1);
+ check("local == utc after -=", au_lt == utc_lt);
+
+ check("local + days",
+ (az_lt + days(2)).to_string() == "2003-Aug-30 05:00:00 MST");
+ check("local - days",
+ (az_lt - days(2)).to_string() == "2003-Aug-26 05:00:00 MST");
+ check("local += days",
+ (az_lt += days(2)).to_string() == "2003-Aug-30 05:00:00 MST");
+ check("local -= days",
+ (az_lt -= days(2)).to_string() == "2003-Aug-28 05:00:00 MST");
+ check("local + time_duration",
+ (az_lt + hours(2)).to_string() == "2003-Aug-28 07:00:00 MST");
+ check("local - time_duration",
+ (az_lt - hours(2)).to_string() == "2003-Aug-28 03:00:00 MST");
+ // special_values is more thoroughly tested in posix_time
+ check("pos_infinity > local", sv_lt > au_lt);
+ local_date_time sv_lt2(sv_lt + days(2));
+ check("pos_infin + duration == pos_infin", sv_lt2 == sv_lt);
+
+#if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
+ months m(2);
+ years y(2);
+ check("Local + months",
+ (az_lt + m).to_string() == "2003-Oct-28 05:00:00 MST");
+ az_lt += m;
+ check("Local += months",
+ az_lt.to_string() == "2003-Oct-28 05:00:00 MST");
+ check("Local - months",
+ (az_lt - m).to_string() == "2003-Aug-28 05:00:00 MST");
+ az_lt -= m;
+ check("Local -= months",
+ az_lt.to_string() == "2003-Aug-28 05:00:00 MST");
+ check("Local + years",
+ (az_lt + y).to_string() == "2005-Aug-28 05:00:00 MST");
+ az_lt += y;
+ check("Local += years",
+ az_lt.to_string() == "2005-Aug-28 05:00:00 MST");
+ check("Local - years",
+ (az_lt - y).to_string() == "2003-Aug-28 05:00:00 MST");
+ az_lt -= y;
+ check("Local -= years",
+ az_lt.to_string() == "2003-Aug-28 05:00:00 MST");
+
+#endif // BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
+ }
+ }
+ catch(std::exception& e) {
+ check(std::string("test failed due to exception: ") + e.what(), false);
+ }
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/local_time/testlocal_time_facet.cpp b/src/boost/libs/date_time/test/local_time/testlocal_time_facet.cpp
new file mode 100644
index 000000000..2046ac156
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testlocal_time_facet.cpp
@@ -0,0 +1,188 @@
+
+/* 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$
+ */
+
+#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(int /* argc */, char const* argv[]){
+ /* 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(argv[1]);
+ }
+ 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();
+}
diff --git a/src/boost/libs/date_time/test/local_time/testlocal_time_input_facet.cpp b/src/boost/libs/date_time/test/local_time/testlocal_time_input_facet.cpp
new file mode 100644
index 000000000..7622e5676
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testlocal_time_input_facet.cpp
@@ -0,0 +1,239 @@
+/* Copyright (c) 2005 CrystalClear Software, Inc.
+ * 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$
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+#include <string>
+
+// for tests that are expected to fail and throw exceptions
+template<class temporal_type, class exception_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ exception_type const& /*except*/,
+ boost::local_time::local_time_input_facet* facet)
+{
+ using namespace boost::local_time;
+ 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 quietly
+template<class temporal_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ boost::local_time::local_time_input_facet* facet)
+{
+ using namespace boost::local_time;
+ 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
+}
+
+int main() {
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+ time_zone_ptr null_zone;
+ local_date_time ldt1(not_a_date_time, null_zone);
+
+ // verify wide stream works, thorough tests done in narrow stream
+#if !defined(BOOST_NO_STD_WSTRING)
+ {
+ std::wstringstream ws;
+ ws.str(L"2005-Feb-15 12:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ws >> ldt1;
+ check("Wide stream, Eastern US, daylight savings, winter, minimal input",
+ ldt1.local_time() == ptime(date(2005,2,15), time_duration(12,15,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, minimal input",
+ ldt1.utc_time() == ptime(date(2005,2,15), time_duration(17,15,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, minimal input", !ldt1.is_dst());
+ ws.str(L"");
+ wlocal_time_input_facet* wfacet = new wlocal_time_input_facet(L"%m/%d/%y %ZP");
+ std::locale loc(std::locale::classic(), wfacet);
+ ws.imbue(loc);
+ ws.str(L"10/31/04 PST-08PDT,M4.1.0,M10.5.0"); // midnight on end transition day, still in dst
+ ws >> ldt1;
+ std::wcout << ldt1.local_time() << std::endl;
+ check("Wide stream, Eastern US, daylight savings, winter, custom format",
+ ldt1.local_time() == ptime(date(2004,10,31), time_duration(0,0,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, custom format",
+ ldt1.utc_time() == ptime(date(2004,10,31), time_duration(7,0,0)));
+ check("Wide stream, Eastern US, daylight savings, winter, custom format", ldt1.is_dst());
+ }
+#endif // BOOST_NO_STD_WSTRING
+
+ std::stringstream ss;
+ ss.str("2005-Feb-25 12:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, winter, minimal input",
+ ldt1.local_time() == ptime(date(2005,2,25), time_duration(12,15,0)));
+ check("Eastern US, daylight savings, winter, minimal input",
+ ldt1.utc_time() == ptime(date(2005,2,25), time_duration(17,15,0)));
+ check("Eastern US, daylight savings, winter, minimal input", !ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Aug-25 12:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, summer, minimal input",
+ ldt1.local_time() == ptime(date(2005,8,25), time_duration(12,15,0)));
+ check("Eastern US, daylight savings, summer, minimal input",
+ ldt1.utc_time() == ptime(date(2005,8,25), time_duration(16,15,0)));
+ check("Eastern US, daylight savings, summer, minimal input", ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Apr-03 01:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ss.str("");
+ ss.str("2005-Apr-03 01:15:00 EST-05EDT,93,303");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Oct-30 00:15:00 EST-05EDT,M4.1.0,M10.5.0");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ss.str("");
+ ss.str("2005-Oct-30 00:15:00 EST-05EDT,93,303");
+ ss >> ldt1;
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", ldt1.is_dst());
+ ldt1 += hours(1);
+ check("Eastern US, daylight savings, transition point", !ldt1.is_dst());
+ ss.str("");
+
+ ss.str("2005-Aug-25 12:15:00 MST-07");
+ ss >> ldt1;
+ check("Mountain US, no daylight savings",
+ ldt1.local_time() == ptime(date(2005,8,25), time_duration(12,15,0)));
+ check("Mountain US, no daylight savings",
+ ldt1.utc_time() == ptime(date(2005,8,25), time_duration(19,15,0)));
+ check("Mountain US, no daylight savings", !ldt1.is_dst());
+ ss.str("");
+
+ // insure input & output formats match
+ local_time_facet* out_facet =
+ new local_time_facet(local_time_input_facet::default_time_input_format);
+ std::locale loc(std::locale::classic(), out_facet);
+ ss.imbue(loc);
+ time_zone_ptr syd_tz(new posix_time_zone("EST+10EST,M10.5.0,M3.5.0/03:00"));
+ ptime pt(date(2005,6,12), hours(0));
+ local_date_time ldt2(pt, syd_tz);
+ ss << ldt2;
+ ss >> ldt1;
+ check("Output as input makes match", ldt1 == ldt2);
+ check("Output as input makes match",
+ ldt1.zone()->dst_local_start_time(2004) == ldt2.zone()->dst_local_start_time(2004));
+ ss.str("");
+
+ time_zone_ptr f_tz(new posix_time_zone("FST+03FDT,90,300"));
+ ldt2 = local_date_time(ptime(date(2005,6,12), hours(0)), f_tz);
+ ss << ldt2;
+ ss >> ldt1;
+ check("Output as input makes match", ldt1 == ldt2);
+ check("Output as input makes match",
+ ldt1.zone()->dst_local_start_time(2004) == ldt2.zone()->dst_local_start_time(2004));
+ ss.str("");
+
+ // missing input & wrong format tests
+ ss.str("2005-Oct-30 00:15:00");
+ ss >> ldt1;
+ check("Missing time_zone spec makes UTC", ldt1.zone_as_posix_string() == std::string("UTC+00"));
+ check("Missing time_zone spec makes UTC", ldt1.utc_time() == ldt1.local_time());
+ ss.str("");
+ {
+ std::istringstream iss("2005-Aug-25 12:15:00 MST-07");
+ local_time_input_facet* f = new local_time_input_facet("%Y-%b-%d %H:%M:%S %z");
+ std::locale locx(std::locale::classic(), f);
+ iss.imbue(locx);
+ iss >> ldt1;
+ check("Wrong format flag makes UTC", ldt1.zone_as_posix_string() == std::string("UTC+00"));
+ check("Wrong format flag makes UTC", ldt1.utc_time() == ldt1.local_time());
+ }
+
+
+ // failure tests: (posix_time_zone) bad_offset, bad_adjustment,
+ // (local_date_time) ambiguous_result, time_label_invalid,
+ // time/date failures already tested
+ ambiguous_result amb_ex("default");
+ time_label_invalid inv_ex("default");
+ check("Failure test ambiguous time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ amb_ex,
+ new local_time_input_facet()));
+ check("Failure test ambiguous time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ new local_time_input_facet()));
+ check("Failure test ambiguous time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,93,303",
+ amb_ex,
+ new local_time_input_facet()));
+ check("Failure test ambiguous time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Oct-30 01:15:00 EST-05EDT,93,303",
+ new local_time_input_facet()));
+ check("Failure test invalid time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ inv_ex,
+ new local_time_input_facet()));
+ check("Failure test invalid time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,M4.1.0,M10.5.0",
+ new local_time_input_facet()));
+ check("Failure test invalid time label (w/exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,93,303",
+ inv_ex,
+ new local_time_input_facet()));
+ check("Failure test invalid time label (no exceptions)",
+ failure_test(ldt1,
+ "2005-Apr-03 02:15:00 EST-05EDT,93,303",
+ new local_time_input_facet()));
+
+
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/local_time/testlocal_time_iterator.cpp b/src/boost/libs/date_time/test/local_time/testlocal_time_iterator.cpp
new file mode 100644
index 000000000..670b572f4
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testlocal_time_iterator.cpp
@@ -0,0 +1,95 @@
+/* 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, Bart Garst
+ * $Date$
+ */
+
+#include <iostream>
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+// #if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+// #include "boost/date_time/gregorian/formatters_limited.hpp"
+// #else
+// #include "boost/date_time/gregorian/formatters.hpp"
+// #endif
+
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+using namespace boost::local_time;
+
+void iterate_backward(const local_date_time *answers,
+ int ary_len,
+ const time_duration& td)
+{
+ int i = ary_len -1;
+ local_date_time end = answers[i];
+ local_time_iterator titr(end,td);
+
+ std::cout << "counting down by previous duration..." << std::endl;
+ for (; titr >= answers[0]; --titr) {
+ std::cout << *titr << std::endl;
+ check("iterating backward", answers[i] == *titr);
+ --i;
+ }
+ check("iterating backward count", i == -1); // check the number of iterations
+ std::cout << std::endl;
+}
+
+int
+main()
+{
+
+ time_zone_ptr ny_tz(new posix_time_zone("EST-05EDT,M4.1.0,M10.5.0"));
+
+ //set up a time right on the dst boundary -- iterator will
+ //jump forward an hour at the boundary
+ date d(2005,Apr,3);
+ time_duration dst_offset(1,59,59);
+ local_date_time start(d, dst_offset, ny_tz, false);
+
+ const local_date_time answer1[] =
+ {
+ local_date_time(d,dst_offset, ny_tz, false),
+ local_date_time(d,hours(3), ny_tz, true),
+ local_date_time(d,hours(3)+seconds(1), ny_tz, true),
+ local_date_time(d,hours(3)+seconds(2), ny_tz, true)
+ };
+
+ int i=0;
+ local_time_iterator titr(start,seconds(1));
+ local_date_time end = start + seconds(4);
+ for (; titr < end; ++titr) {
+ std::cout << (*titr) << std::endl;
+ check("iterator -- 1 sec", answer1[i] == *titr);
+ i++;
+ }
+ check("iterator -- 1 sec -- num iterations", i == 4); // check the number of iterations
+
+ iterate_backward(answer1, 4, seconds(1));
+
+ //iterate by hours
+ const local_date_time answer2[] =
+ { local_date_time(d,dst_offset, ny_tz, false),
+ local_date_time(d,dst_offset+hours(2), ny_tz, true),
+ local_date_time(d,dst_offset+hours(3), ny_tz, true),
+ local_date_time(d,dst_offset+hours(4), ny_tz, true)
+ };
+ i=0;
+ local_time_iterator titr2(start,hours(1));
+ local_date_time end2 = start + hours(4);
+ for (; titr2 < end2; ++titr2) {
+ std::cout << *titr2 << std::endl;
+ check("iterator -- 1 hour", answer2[i] == *titr2);
+ i++;
+ }
+ check("iterator -- 1 hour -- num iterations", i == 4);
+
+ iterate_backward(answer2, 4, hours(1));
+
+
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/local_time/testlocal_time_period.cpp b/src/boost/libs/date_time/test/local_time/testlocal_time_period.cpp
new file mode 100644
index 000000000..64c8f7564
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testlocal_time_period.cpp
@@ -0,0 +1,82 @@
+/* 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
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+
+int main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+ date d1(2001,Jan, 1);
+
+ time_zone_ptr az_tz(new posix_time_zone("MST-07"));
+
+ local_date_time t1 (d1,hours(2), az_tz, false);//2001-Jan-1 02:00:00
+
+ local_date_time t2 (d1,hours(3), az_tz, false);//2001-Jan-1 03:00:00
+ local_time_period p1(t1,t2); //2001-Jan-1 02:59:59
+ local_time_period p2(p1);
+ check("copy construct & ==", p1 == p2);
+ local_time_period p3 = p2;
+ check("assignment", p3 == p2);
+ local_time_period p4(t1,hours(1));
+
+ check("length", p4.length() == hours(1));
+
+// std::cout << to_simple_string(t1) << std::endl;
+// std::cout << to_simple_string(p4) << std::endl;
+// std::cout << to_simple_string(p1) << std::endl;
+ check("construction and ==", p1 == p4);
+ check("begin", p1.begin() == t1);
+ check("last", p1.end() == t2);
+ check("end", p1.last() == t2-time_duration::unit());
+
+// std::cout << to_simple_string(p1) << std::endl;
+// // check("last", p1.() == t2);
+ check("contains begin", p1.contains(t1));
+ check("contains end-not", !p1.contains(t2));
+ check("contains last", p1.contains(t2-seconds(1)));
+ local_date_time t3(date(2001,Jan,1),hours(4), az_tz, false);
+ local_time_period p5(t2,t3);
+ check("check contains", !p1.contains(p5.begin()));
+ check("check contains", !p5.contains(p1.begin()));
+ check("operator== not equal case", !(p1 == p5));
+ check("less than order", p1 < p5);
+ check("greater than order", p5 > p1);
+ check("not equal", p5 != p1);
+ check("intersects with myself", p1.intersects(p1));
+ check("not intersects", !(p1.intersects(p5)));
+ check("not intersects", !(p5.intersects(p1)));
+
+ local_time_period p6(p5);
+ p6.shift(minutes(30));
+// std::cout << to_simple_string(p5) << std::endl;
+// std::cout << to_simple_string(p6) << std::endl;
+ check("shifted intersects", p5.intersects(p6));
+ check("shifted intersects", p6.intersects(p5));
+ check("contains begin", p5.contains(p6.begin()));
+ p6.shift(minutes(30));
+// std::cout << to_simple_string(p5) << std::endl;
+// std::cout << to_simple_string(p6) << std::endl;
+ check("shifted !intersects", !p5.intersects(p6));
+ check("shifted !intersects", !p6.intersects(p5));
+ p6.shift(minutes(-30));
+// std::cout << to_simple_string(p5) << std::endl;
+// std::cout << to_simple_string(p6) << std::endl;
+ local_time_period p7 = p5.intersection(p6);
+// std::cout << to_simple_string(p7) << std::endl;
+ check("shifted intersection",
+ p7 == local_time_period(local_date_time(d1,time_duration(3,30,0), az_tz, false),
+ local_date_time(d1,time_duration(4,0,0), az_tz, false)));
+
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/local_time/testposix_time_zone.cpp b/src/boost/libs/date_time/test/local_time/testposix_time_zone.cpp
new file mode 100644
index 000000000..7bf971e87
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testposix_time_zone.cpp
@@ -0,0 +1,221 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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$
+ */
+
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+//#include "boost/date_time/local_time/time_zone.hpp"
+#include "../testfrmwk.hpp"
+
+#include "boost/date_time/local_time/posix_time_zone.hpp"
+
+#include <string>
+#include <iostream>
+
+int main(){
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+ std::string specs[] = {"MST-07", "MST-07:00:00","EST-05EDT,M4.1.0,M10.5.0", "EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00","PST-08PDT,J46/1:30,J310","PST-08PDT,45,310/0:30:00"};
+
+ posix_time_zone nyc1(specs[2]);
+ posix_time_zone nyc2(specs[3]);
+ time_duration td = hours(-5);
+
+ check("Has DST", nyc1.has_dst() && nyc2.has_dst());
+ check("UTC offset", nyc1.base_utc_offset() == td);
+ check("UTC offsets match", nyc1.base_utc_offset() == nyc2.base_utc_offset());
+ check("Abbrevs", nyc1.std_zone_abbrev() == std::string("EST"));
+ check("Abbrevs", nyc2.std_zone_abbrev() == std::string("EST"));
+ check("Abbrevs", nyc1.dst_zone_abbrev() == std::string("EDT"));
+ check("Abbrevs", nyc2.dst_zone_abbrev() == std::string("EDT"));
+ // names not available for posix_time_zone, abbrevs used in their place
+ check("Names", nyc1.std_zone_name() == std::string("EST"));
+ check("Names", nyc2.std_zone_name() == std::string("EST"));
+ check("Names", nyc1.dst_zone_name() == std::string("EDT"));
+ check("Names", nyc2.dst_zone_name() == std::string("EDT"));
+ td = hours(1);
+ check("dst offset", nyc1.dst_offset() == td);
+ check("dst offsets match", nyc1.dst_offset() == nyc2.dst_offset());
+ check("dst start", nyc1.dst_local_start_time(2003) ==
+ ptime(date(2003,Apr,6),time_duration(2,0,0)));
+ check("dst starts match", nyc1.dst_local_start_time(2003) ==
+ nyc2.dst_local_start_time(2003));
+ check("dst end", nyc1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,26),time_duration(2,0,0)));
+ check("dst ends match", nyc1.dst_local_end_time(2003) ==
+ nyc2.dst_local_end_time(2003));
+ check("to posix string",
+ nyc1.to_posix_string() == std::string("EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("to posix string",
+ nyc2.to_posix_string() == std::string("EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+
+
+ posix_time_zone az1(specs[0]);
+ posix_time_zone az2(specs[1]);
+ td = hours(-7);
+
+ check("Has DST", !az1.has_dst() && !az2.has_dst());
+ check("UTC offset", az1.base_utc_offset() == td);
+ check("UTC offsets match", az1.base_utc_offset() == az2.base_utc_offset());
+ check("dst start in non-dst zone",
+ az1.dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ az2.dst_local_end_time(2005) == ptime(not_a_date_time));
+ check("Abbrevs", az1.std_zone_abbrev() == std::string("MST"));
+ check("Abbrevs", az2.std_zone_abbrev() == std::string("MST"));
+ // non-dst zones default to empty strings for dst names & abbrevs
+ check("Abbrevs", az1.dst_zone_abbrev() == std::string(""));
+ check("Abbrevs", az2.dst_zone_abbrev() == std::string(""));
+ check("Names", az1.std_zone_name() == std::string("MST"));
+ check("Names", az2.std_zone_name() == std::string("MST"));
+ check("Names", az1.dst_zone_name() == std::string(""));
+ check("Names", az2.dst_zone_name() == std::string(""));
+ check("to posix string",
+ az1.to_posix_string() == std::string("MST-07"));
+ check("to posix string",
+ az2.to_posix_string() == std::string("MST-07"));
+
+
+ // bizzar time zone spec to fully test parsing
+ std::cout << "\nFictitious time zone" << std::endl;
+ posix_time_zone bz("BST+11:21:15BDT-00:28,M2.2.4/03:15:42,M11.5.2/01:08:53");
+ check("hast dst", bz.has_dst());
+ check("UTC offset", bz.base_utc_offset() == time_duration(11,21,15));
+ check("Abbrev", bz.std_zone_abbrev() == std::string("BST"));
+ check("Abbrev", bz.dst_zone_abbrev() == std::string("BDT"));
+ check("dst offset", bz.dst_offset() == time_duration(0,-28,0));
+ check("dst start", bz.dst_local_start_time(1962) ==
+ ptime(date(1962,Feb,8),time_duration(3,15,42)));
+ check("dst end", bz.dst_local_end_time(1962) ==
+ ptime(date(1962,Nov,27),time_duration(1,8,53)));
+
+ // only checking start & end rules w/ 'J' notation
+ std::cout << "\n'J' notation Start/End rule tests..." << std::endl;
+ posix_time_zone la1(specs[4]); // "PST-08PDT,J124,J310"
+ //posix_time_zone la1("PST-08PDT,J1,J365");// Jan1/Dec31
+ check("dst start", la1.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(1,30,0)));
+ check("dst end", la1.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(2,0,0)));
+ /* NOTE: la1 was created from a 'J' notation string but to_posix_string
+ * returns an 'n' notation string. The difference between the two
+ * is Feb-29 is always counted in an 'n' notation string and numbering
+ * starts at zero ('J' notation starts at one).
+ * Every possible date spec that can be written in 'J' notation can also
+ * be written in 'n' notation. The reverse is not true so 'n' notation
+ * is used as the output for to_posix_string(). */
+ check("to posix string",
+ la1.to_posix_string() == std::string("PST-08PDT+01,45/01:30,310/02:00"));
+
+ // only checking start & end rules w/ 'n' notation
+ std::cout << "\n'n' notation Start/End rule tests..." << std::endl;
+ posix_time_zone la2(specs[5]); // "PST-08PDT,124,310"
+ //posix_time_zone la2("PST-08PDT,0,365");// Jan1/Dec31
+ check("dst start", la2.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(2,0,0)));
+ check("dst end", la2.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(0,30,0)));
+ check("to posix string",
+ la2.to_posix_string() == std::string("PST-08PDT+01,45/02:00,310/00:30"));
+
+ // bad posix time zone strings tests
+ std::cout << "\nInvalid time zone string tests..." << std::endl;
+ try {
+ posix_time_zone badz("EST-13");
+ check("Exception not thrown: bad UTC offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ posix_time_zone badz("EST-5EDT24:00:01,J124/1:30,J310");
+ check("Exception not thrown: bad DST adjust", false);
+ }catch(bad_adjustment& badj){
+ std::string msg(badj.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ posix_time_zone badz("EST-5EDT01:00:00,J124/-1:30,J310");
+ check("Exception not thrown: bad DST start/end offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ posix_time_zone badz("EST-5EDT01:00:00,J124/1:30,J370");
+ check("Exception not thrown: invalid date spec", false);
+ }catch(boost::gregorian::bad_day_of_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(boost::gregorian::bad_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(...){
+ check("Unexpected exception caught: ", false);
+ }
+
+ std::cout << "\nTest some Central Europe specs" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ posix_time_zone cet_tz("CET+01:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", cet_tz.has_dst());
+ check("UTC offset", cet_tz.base_utc_offset() == hours(1));
+ check("Abbrevs", cet_tz.std_zone_abbrev() == std::string("CET"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::string("EST"));
+
+ std::cout << "\nTest some Central Austrialia UTC+8:30" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ posix_time_zone caus_tz("CAS+08:30:00CDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", caus_tz.has_dst());
+ check("UTC offset", caus_tz.base_utc_offset() == hours(8)+minutes(30));
+ check("Abbrevs", caus_tz.std_zone_abbrev() == std::string("CAS"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::string("EST"));
+
+ {
+ /**** first/last of month Julian & non-Julian tests ****/
+ // Mar-01 & Oct-31, count begins at 1
+ std::string spec("FST+3FDT,J60,J304");
+ posix_time_zone fl_1(spec);
+ check("Julian First/last of month", fl_1.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 Non-leap year, count begins at 0
+ spec = "FST+3FDT,59,304"; // "304" is not a mistake here, see posix_time_zone docs
+ posix_time_zone fl_2(spec);
+ try{
+ check("Non-Julian First/last of month", fl_2.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ }catch(std::exception&){
+ check("Expected exception caught for Non-Julian day of 59, in non-leap year (Feb-29)", true);
+ }
+ check("Non-Julian First/last of month", fl_2.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 leap year, count begins at 0
+ spec = "FST+3FDT,60,304";
+ posix_time_zone fl_3(spec);
+ check("Non-Julian First/last of month", fl_3.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Non-Julian First/last of month", fl_3.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+ }
+
+ printTestStats();
+ return 0;
+}
+
diff --git a/src/boost/libs/date_time/test/local_time/testtz_database.cpp b/src/boost/libs/date_time/test/local_time/testtz_database.cpp
new file mode 100644
index 000000000..add2943b3
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testtz_database.cpp
@@ -0,0 +1,116 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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$
+ */
+
+
+#include "../testfrmwk.hpp"
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time/custom_time_zone.hpp"
+#include "boost/date_time/local_time/local_time_types.hpp"
+#include "boost/date_time/local_time/tz_database.hpp"
+#include "boost/date_time/local_time/posix_time_zone.hpp"
+#include <iostream>
+
+bool run_bad_field_count_test(char const* fn);
+
+int main(int /* argc */, char const* argv[]){
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+ /* NOTE: The testlocal_time_facet tests required full names
+ * be added to some of the date_time_zonespec.csv entries. The
+ * tests here also use those full names. Those entries are:
+ * Chicago, Denver, Los_Angeles, New_York, and Phoenix
+ * have all had full names added */
+
+ // run the exception tests first
+ try{
+ tz_database tz_db;
+ tz_db.load_from_file("missing_file.csv"); // file does not exist
+ }catch(data_not_accessible&){
+ check("Caught Missing data file exception", true);
+ }catch(...){
+ check("Caught first unexpected exception", false);
+ }
+ check("Caught Bad field count exception", run_bad_field_count_test(argv[2]));
+
+ tz_database tz_db;
+ try {
+ tz_db.load_from_file(argv[1]);
+ }catch(...) {
+ check("Cannot locate data file - aborting.", false);
+ return printTestStats();
+ }
+
+ time_zone_ptr bad_tz = tz_db.time_zone_from_region("Invalid/name");
+ check("Expected null pointer return", bad_tz == time_zone_ptr());
+
+ time_zone_ptr nyc_test = tz_db.time_zone_from_region("America/New_York");
+ check("nyc Valid pointer", nyc_test != time_zone_ptr() );
+ check("nyc Abbreviations",nyc_test->std_zone_abbrev() == std::string("EST"));
+ check("nyc Full Name", nyc_test->std_zone_name() == std::string("Eastern Standard Time"));
+ check("nyc Abbreviations",nyc_test->dst_zone_abbrev() == std::string("EDT"));
+ //std::cout << nyc_test->std_zone_name() << std::endl;
+ check("nyc Full Name", nyc_test->dst_zone_name() == std::string("Eastern Daylight Time"));
+ check("nyc GMT Offset", nyc_test->base_utc_offset() == hours(-5));
+ check("nyc DST Offset", nyc_test->dst_offset() == hours(1));
+ //std::cout << nyc_test->dst_local_start_time(2004) << std::endl;
+ check("nyc dst start", nyc_test->dst_local_start_time(2007) == ptime(date(2007, Mar, 11), hours(2)));
+ check("nyc dst end", nyc_test->dst_local_end_time(2007) == ptime(date(2007, Nov, 4), hours(2)));
+ check("nyc has dst", nyc_test->has_dst());
+
+ time_zone_ptr phx_test = tz_db.time_zone_from_region("America/Phoenix");
+ check("az Valid pointer", phx_test != time_zone_ptr() );
+ check("az Abbreviations",phx_test->std_zone_abbrev() == std::string("MST"));
+ check("az Full Name", phx_test->std_zone_name() == std::string("Mountain Standard Time"));
+ check("az Abbreviations", phx_test->dst_zone_abbrev() == std::string(""));
+ check("az Full Name", phx_test->dst_zone_name() == std::string(""));
+ check("az GMT Offset", phx_test->base_utc_offset() == hours(-7));
+ check("az DST Offset", phx_test->dst_offset() == hours(0));
+ //std::cout << phx_test->dst_local_start_time(2004) << std::endl;
+ check("az has dst", phx_test->has_dst() == false);
+
+ //Now add and retrieve a Posix tz spec from the database
+ time_zone_ptr eastern(new posix_time_zone("EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00"));
+ tz_db.add_record("United States/Eastern", eastern);
+ time_zone_ptr eastern_test = tz_db.time_zone_from_region("United States/Eastern");
+ check("eastern Valid pointer", eastern_test != time_zone_ptr() );
+ check("eastern Abbreviations",
+ eastern_test->std_zone_abbrev() == std::string("EST"));
+ check("eastern Abbreviations",
+ eastern_test->std_zone_name() == std::string("EST"));
+ check("eastern Abbreviations",
+ eastern_test->dst_zone_abbrev() == std::string("EDT"));
+ check("eastern Abbreviations",
+ eastern_test->dst_zone_name() == std::string("EDT"));
+ check("eastern GMT Offset", eastern_test->base_utc_offset() == hours(-5));
+ check("eastern dst start", eastern_test->dst_local_start_time(2004) == ptime(date(2004, Apr, 4), hours(2)));
+ check("eastern dst end", eastern_test->dst_local_end_time(2004) == ptime(date(2004, Oct, 31), hours(2)));
+ check("eastern has dst", eastern_test->has_dst() == true);
+
+
+ return printTestStats();
+}
+
+/* This test only checks to make sure the bad_field_count exception
+ * is properly thrown. It does not pay any attention to any other
+ * exception, those are tested elsewhere. */
+bool run_bad_field_count_test(char const* fn)
+{
+ using namespace boost::local_time;
+ bool caught_bfc = false;
+ tz_database other_db;
+ try{
+ other_db.load_from_file(fn);
+ }catch(bad_field_count&){
+ caught_bfc = true;
+ }catch(...) {
+ // do nothing (file not found)
+ }
+ return caught_bfc;
+}
diff --git a/src/boost/libs/date_time/test/local_time/testwcustom_time_zone.cpp b/src/boost/libs/date_time/test/local_time/testwcustom_time_zone.cpp
new file mode 100644
index 000000000..ad25ac31d
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testwcustom_time_zone.cpp
@@ -0,0 +1,89 @@
+/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
+ * 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$
+ */
+
+#include "boost/date_time/local_time/local_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ using namespace boost::local_time;
+
+ typedef custom_time_zone_base<wchar_t> wcustom_time_zone;
+
+ boost::shared_ptr<dst_calc_rule>
+ rule1(new partial_date_dst_rule(partial_date(30,Apr),
+ partial_date(30,Oct)));
+
+ boost::shared_ptr<dst_calc_rule>
+ rule2(new first_last_dst_rule(first_last_dst_rule::start_rule(Sunday,Apr),
+ first_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule>
+ rule3(new last_last_dst_rule(last_last_dst_rule::start_rule(Sunday,Mar),
+ last_last_dst_rule::end_rule(Sunday,Oct)));
+ boost::shared_ptr<dst_calc_rule> rule4; // no daylight savings
+
+ wtime_zone_names pst(L"Pacific Standard Time",
+ L"PST",
+ L"Pacific Daylight Time" ,
+ L"PDT");
+ wtime_zone_names mst(L"Mountain Standard Time",
+ L"MST",
+ L"" ,
+ L"");
+
+ dst_adjustment_offsets of(hours(1), hours(2), hours(2));
+ dst_adjustment_offsets of2(hours(0), hours(0), hours(0)); // no daylight savings
+
+ wtime_zone_ptr tz1(new wcustom_time_zone(pst, hours(-8), of, rule1));
+ wtime_zone_ptr tz2(new wcustom_time_zone(pst, hours(-8), of, rule2));
+ wtime_zone_ptr tz3(new wcustom_time_zone(pst, hours(-8), of, rule3));
+ wtime_zone_ptr tz4(new wcustom_time_zone(mst, hours(-7), of2, rule4));
+
+ check("out string",
+ tz1->dst_zone_abbrev() == std::wstring(L"PDT"));
+ check("out string",
+ tz1->std_zone_abbrev() == std::wstring(L"PST"));
+ check("out string",
+ tz1->std_zone_name() == std::wstring(L"Pacific Standard Time"));
+ check("out string",
+ tz1->dst_zone_name() == std::wstring(L"Pacific Daylight Time"));
+
+ check("dst offset", tz1->dst_offset() == hours(1));
+ check("base offset", tz1->base_utc_offset() == hours(-8));
+ check("has dst", tz1->has_dst());
+
+ check("dst start time",
+ tz1->dst_local_start_time(2003) == ptime(date(2003,Apr,30),hours(2)));
+ check("dst end time",
+ tz1->dst_local_end_time(2003) == ptime(date(2003,Oct,30),hours(2)));
+
+ check("tz1 to posix string",
+ tz1->to_posix_string() == std::wstring(L"PST-08PDT+01,120/02:00,303/02:00"));
+ check("tz2 to posix string",
+ tz2->to_posix_string() == std::wstring(L"PST-08PDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("tz3 to posix string",
+ tz3->to_posix_string() == std::wstring(L"PST-08PDT+01,M3.5.0/02:00,M10.5.0/02:00"));
+ check("tz4 to posix string",
+ tz4->to_posix_string() == std::wstring(L"MST-07"));
+
+ // test start/end for non-dst zone
+ check("has dst in non-dst zone", !tz4->has_dst());
+ check("dst start in non-dst zone",
+ tz4->dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ tz4->dst_local_end_time(2005) == ptime(not_a_date_time));
+
+
+ return printTestStats();
+}
+
+
diff --git a/src/boost/libs/date_time/test/local_time/testwposix_time_zone.cpp b/src/boost/libs/date_time/test/local_time/testwposix_time_zone.cpp
new file mode 100644
index 000000000..2bd11cbd6
--- /dev/null
+++ b/src/boost/libs/date_time/test/local_time/testwposix_time_zone.cpp
@@ -0,0 +1,224 @@
+/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
+ * 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$
+ */
+
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+//#include "boost/date_time/local_time/time_zone.hpp"
+#include "../testfrmwk.hpp"
+
+#include "boost/date_time/local_time/posix_time_zone.hpp"
+
+#include <string>
+#include <iostream>
+
+int main(){
+ using namespace boost::local_time;
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ typedef posix_time_zone_base<wchar_t> w_posix_time_zone;
+
+ std::wstring specs[] = {L"MST-07", L"MST-07:00:00",L"EST-05EDT,M4.1.0,M10.5.0", L"EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00",L"PST-08PDT,J46/1:30,J310",L"PST-08PDT,45,310/0:30:00"};
+
+ w_posix_time_zone nyc1(specs[2]);
+ w_posix_time_zone nyc2(specs[3]);
+ time_duration td = hours(-5);
+
+ check("Has DST", nyc1.has_dst() && nyc2.has_dst());
+ check("UTC offset", nyc1.base_utc_offset() == td);
+ check("UTC offsets match", nyc1.base_utc_offset() == nyc2.base_utc_offset());
+ check("Abbrevs", nyc1.std_zone_abbrev() == std::wstring(L"EST"));
+ check("Abbrevs", nyc2.std_zone_abbrev() == std::wstring(L"EST"));
+ check("Abbrevs", nyc1.dst_zone_abbrev() == std::wstring(L"EDT"));
+ check("Abbrevs", nyc2.dst_zone_abbrev() == std::wstring(L"EDT"));
+ // names not available for w_posix_time_zone, abbrevs used in their place
+ check("Names", nyc1.std_zone_name() == std::wstring(L"EST"));
+ check("Names", nyc2.std_zone_name() == std::wstring(L"EST"));
+ check("Names", nyc1.dst_zone_name() == std::wstring(L"EDT"));
+ check("Names", nyc2.dst_zone_name() == std::wstring(L"EDT"));
+ td = hours(1);
+ check("dst offset", nyc1.dst_offset() == td);
+ check("dst offsets match", nyc1.dst_offset() == nyc2.dst_offset());
+ check("dst start", nyc1.dst_local_start_time(2003) ==
+ ptime(date(2003,Apr,6),time_duration(2,0,0)));
+ check("dst starts match", nyc1.dst_local_start_time(2003) ==
+ nyc2.dst_local_start_time(2003));
+ check("dst end", nyc1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,26),time_duration(2,0,0)));
+ check("dst ends match", nyc1.dst_local_end_time(2003) ==
+ nyc2.dst_local_end_time(2003));
+ check("to posix string",
+ nyc1.to_posix_string() == std::wstring(L"EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+ check("to posix string",
+ nyc2.to_posix_string() == std::wstring(L"EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"));
+
+
+ w_posix_time_zone az1(specs[0]);
+ w_posix_time_zone az2(specs[1]);
+ td = hours(-7);
+
+ check("Has DST", !az1.has_dst() && !az2.has_dst());
+ check("UTC offset", az1.base_utc_offset() == td);
+ check("UTC offsets match", az1.base_utc_offset() == az2.base_utc_offset());
+ check("dst start in non-dst zone",
+ az1.dst_local_start_time(2005) == ptime(not_a_date_time));
+ check("dst end in non-dst zone",
+ az2.dst_local_end_time(2005) == ptime(not_a_date_time));
+ check("Abbrevs", az1.std_zone_abbrev() == std::wstring(L"MST"));
+ check("Abbrevs", az2.std_zone_abbrev() == std::wstring(L"MST"));
+ // non-dst zones default to empty strings for dst names & abbrevs
+ check("Abbrevs", az1.dst_zone_abbrev() == std::wstring(L""));
+ check("Abbrevs", az2.dst_zone_abbrev() == std::wstring(L""));
+ check("Names", az1.std_zone_name() == std::wstring(L"MST"));
+ check("Names", az2.std_zone_name() == std::wstring(L"MST"));
+ check("Names", az1.dst_zone_name() == std::wstring(L""));
+ check("Names", az2.dst_zone_name() == std::wstring(L""));
+ check("to posix string",
+ az1.to_posix_string() == std::wstring(L"MST-07"));
+ check("to posix string",
+ az2.to_posix_string() == std::wstring(L"MST-07"));
+
+
+ // bizzar time zone spec to fully test parsing
+ std::cout << "\nFictitious time zone" << std::endl;
+ w_posix_time_zone bz(L"BST+11:21:15BDT-00:28,M2.2.4/03:15:42,M11.5.2/01:08:53");
+ check("hast dst", bz.has_dst());
+ check("UTC offset", bz.base_utc_offset() == time_duration(11,21,15));
+ check("Abbrev", bz.std_zone_abbrev() == std::wstring(L"BST"));
+ check("Abbrev", bz.dst_zone_abbrev() == std::wstring(L"BDT"));
+ check("dst offset", bz.dst_offset() == time_duration(0,-28,0));
+ check("dst start", bz.dst_local_start_time(1962) ==
+ ptime(date(1962,Feb,8),time_duration(3,15,42)));
+ check("dst end", bz.dst_local_end_time(1962) ==
+ ptime(date(1962,Nov,27),time_duration(1,8,53)));
+
+ // only checking start & end rules w/ 'J' notation
+ std::cout << "\n'J' notation Start/End rule tests..." << std::endl;
+ w_posix_time_zone la1(specs[4]); // "PST-08PDT,J124,J310"
+ //w_posix_time_zone la1("PST-08PDT,J1,J365");// Jan1/Dec31
+ check("dst start", la1.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(1,30,0)));
+ check("dst end", la1.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(2,0,0)));
+ /* NOTE: la1 was created from a 'J' notation string but to_posix_string
+ * returns an 'n' notation string. The difference between the two
+ * is Feb-29 is always counted in an 'n' notation string and numbering
+ * starts at zero ('J' notation starts at one).
+ * Every possible date spec that can be written in 'J' notation can also
+ * be written in 'n' notation. The reverse is not true so 'n' notation
+ * is used as the output for to_posix_string(). */
+ check("to posix string",
+ la1.to_posix_string() == std::wstring(L"PST-08PDT+01,45/01:30,310/02:00"));
+
+ // only checking start & end rules w/ 'n' notation
+ std::cout << "\n'n' notation Start/End rule tests..." << std::endl;
+ w_posix_time_zone la2(specs[5]); // "PST-08PDT,124,310"
+ //w_posix_time_zone la2("PST-08PDT,0,365");// Jan1/Dec31
+ check("dst start", la2.dst_local_start_time(2003) ==
+ ptime(date(2003,Feb,15),time_duration(2,0,0)));
+ check("dst end", la2.dst_local_end_time(2003) ==
+ ptime(date(2003,Nov,6),time_duration(0,30,0)));
+ check("to posix string",
+ la2.to_posix_string() == std::wstring(L"PST-08PDT+01,45/02:00,310/00:30"));
+
+ // bad posix time zone strings tests
+ std::cout << "\nInvalid time zone string tests..." << std::endl;
+ try {
+ w_posix_time_zone badz(L"EST-13");
+ check("Exception not thrown: bad UTC offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ w_posix_time_zone badz(L"EST-5EDT24:00:01,J124/1:30,J310");
+ check("Exception not thrown: bad DST adjust", false);
+ }catch(bad_adjustment& badj){
+ std::string msg(badj.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ w_posix_time_zone badz(L"EST-5EDT01:00:00,J124/-1:30,J310");
+ check("Exception not thrown: bad DST start/end offset", false);
+ }catch(bad_offset& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }
+ try {
+ w_posix_time_zone badz(L"EST-5EDT01:00:00,J124/1:30,J370");
+ check("Exception not thrown: invalid date spec", false);
+ }catch(boost::gregorian::bad_day_of_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(boost::gregorian::bad_month& boff){
+ std::string msg(boff.what());
+ check("Exception caught: "+msg , true);
+ }catch(...){
+ check("Unexpected exception caught: ", false);
+ }
+
+ std::cout << "\nTest some Central Europe specs" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ w_posix_time_zone cet_tz(L"CET+01:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", cet_tz.has_dst());
+ check("UTC offset", cet_tz.base_utc_offset() == hours(1));
+ check("Abbrevs", cet_tz.std_zone_abbrev() == std::wstring(L"CET"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::wstring("EST"));
+
+ std::cout << "\nTest some Central Austrialia UTC+8:30" << std::endl;
+
+ //Test a timezone spec on the positive side of the UTC line.
+ //This is the time for central europe which is one hour in front of UTC
+ //Note these Summer time transition rules aren't actually correct.
+ w_posix_time_zone caus_tz(L"CAS+08:30:00CDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00");
+ check("Has DST", caus_tz.has_dst());
+ check("UTC offset", caus_tz.base_utc_offset() == hours(8)+minutes(30));
+ check("Abbrevs", caus_tz.std_zone_abbrev() == std::wstring(L"CAS"));
+// check("Abbrevs", nyc2.std_zone_abbrev() == std::wstring("EST"));
+
+ {
+ /**** first/last of month Julian & non-Julian tests ****/
+ // Mar-01 & Oct-31, count begins at 1
+ std::wstring spec(L"FST+3FDT,J60,J304");
+ w_posix_time_zone fl_1(spec);
+ check("Julian First/last of month", fl_1.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Julian First/last of month", fl_1.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 Non-leap year, count begins at 0
+ spec = L"FST+3FDT,59,304"; // "304" is not a mistake here, see posix_time_zone docs
+ w_posix_time_zone fl_2(spec);
+ try{
+ check("Non-Julian First/last of month", fl_2.dst_local_start_time(2003) ==
+ ptime(date(2003,Mar,1),hours(2)));
+ }catch(std::exception&){
+ check("Expected exception caught for Non-Julian day of 59, in non-leap year (Feb-29)", true);
+ }
+ check("Non-Julian First/last of month", fl_2.dst_local_end_time(2003) ==
+ ptime(date(2003,Oct,31),hours(2)));
+
+ // Mar-01 & Oct-31 leap year, count begins at 0
+ spec = L"FST+3FDT,60,304";
+ w_posix_time_zone fl_3(spec);
+ check("Non-Julian First/last of month", fl_3.dst_local_start_time(2004) ==
+ ptime(date(2004,Mar,1),hours(2)));
+ check("Non-Julian First/last of month", fl_3.dst_local_end_time(2004) ==
+ ptime(date(2004,Oct,31),hours(2)));
+ }
+
+ printTestStats();
+ return 0;
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/compile_fail/hours_special_value.cpp b/src/boost/libs/date_time/test/posix_time/compile_fail/hours_special_value.cpp
new file mode 100644
index 000000000..c2d001df7
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/compile_fail/hours_special_value.cpp
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2017 James E. King III
+// 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)
+//
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/date_time/special_defs.hpp>
+
+int main()
+{
+ using boost::date_time::pos_infin;
+ using boost::posix_time::hours;
+ boost::ignore_unused(hours(static_cast<boost::int64_t>(pos_infin))); // compiles: it's an integral
+ boost::ignore_unused(hours(pos_infin)); // won't compile: not an integral
+ return 1; // return an error if we actually compile
+}
diff --git a/src/boost/libs/date_time/test/posix_time/compile_fail/millisec_special_value.cpp b/src/boost/libs/date_time/test/posix_time/compile_fail/millisec_special_value.cpp
new file mode 100644
index 000000000..a8d18cc59
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/compile_fail/millisec_special_value.cpp
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2017 James E. King III
+// 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)
+//
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/date_time/special_defs.hpp>
+
+int main()
+{
+ using boost::date_time::pos_infin;
+ using boost::posix_time::millisec;
+ boost::ignore_unused(millisec(static_cast<boost::int64_t>(pos_infin))); // compiles: it's a number
+ boost::ignore_unused(millisec(pos_infin)); // won't compile: not an integral
+ return 1; // return an error if we actually run for some reason
+}
diff --git a/src/boost/libs/date_time/test/posix_time/compile_fail/minutes_special_value.cpp b/src/boost/libs/date_time/test/posix_time/compile_fail/minutes_special_value.cpp
new file mode 100644
index 000000000..f99b722f7
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/compile_fail/minutes_special_value.cpp
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2017 James E. King III
+// 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)
+//
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/date_time/special_defs.hpp>
+
+int main()
+{
+ using boost::date_time::pos_infin;
+ using boost::posix_time::minutes;
+ boost::ignore_unused(minutes(static_cast<boost::int64_t>(pos_infin))); // compiles: it's an integral
+ boost::ignore_unused(minutes(pos_infin)); // won't compile: not an integral
+ return 1; // return an error if we actually run for some reason
+}
diff --git a/src/boost/libs/date_time/test/posix_time/compile_fail/seconds_special_value.cpp b/src/boost/libs/date_time/test/posix_time/compile_fail/seconds_special_value.cpp
new file mode 100644
index 000000000..c3ccc7636
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/compile_fail/seconds_special_value.cpp
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2017 James E. King III
+// 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)
+//
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/date_time/special_defs.hpp>
+
+int main()
+{
+ using boost::date_time::pos_infin;
+ using boost::posix_time::seconds;
+ boost::ignore_unused(seconds(static_cast<boost::int64_t>(pos_infin))); // compiles: it's an integral
+ boost::ignore_unused(seconds(pos_infin)); // won't compile: not an integral
+ return 1; // return an error if we actually run for some reason
+}
diff --git a/src/boost/libs/date_time/test/posix_time/testc_local_adjustor.cpp b/src/boost/libs/date_time/test/posix_time/testc_local_adjustor.cpp
new file mode 100644
index 000000000..d9947a6eb
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testc_local_adjustor.cpp
@@ -0,0 +1,131 @@
+/* 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();
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testclock.cpp b/src/boost/libs/date_time/test/posix_time/testclock.cpp
new file mode 100644
index 000000000..6341cc81b
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testclock.cpp
@@ -0,0 +1,42 @@
+/* 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 <boost/config.hpp>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include <iostream>
+
+int
+main()
+{
+
+ using namespace boost::posix_time;
+ ptime tl = second_clock::local_time();
+ std::cout << tl << std::endl;
+
+ ptime tu = second_clock::universal_time();
+ std::cout << tu << std::endl;
+
+#if !defined(BOOST_WINDOWS) && defined(_POSIX_TIMERS)
+ for (int i=0; i < 3; ++i) {
+ ptime t2 = second_clock::local_time();
+ std::cout << t2 << std::endl;
+ sleep(1);
+ }
+#endif
+
+#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+ for (int i=0; i < 10; ++i) {
+ //ptime t2 = high_precision_clock::local_time();
+ ptime t2 = microsec_clock::local_time();
+ std::cout << t2 << std::endl;
+ }
+#endif // BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+
+ return 0;
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testdst_rules.cpp b/src/boost/libs/date_time/test/posix_time/testdst_rules.cpp
new file mode 100644
index 000000000..83fc1b523
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testdst_rules.cpp
@@ -0,0 +1,451 @@
+/* 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 "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_timezone_defs.hpp"
+#include "../testfrmwk.hpp"
+
+// Define dst rule for Paraguay which is transitions forward on Oct 1 and
+// back Mar 1
+
+struct paraguay_dst_traits {
+ typedef boost::gregorian::date date_type;
+ typedef boost::gregorian::date::day_type day_type;
+ typedef boost::gregorian::date::month_type month_type;
+ typedef boost::gregorian::date::year_type year_type;
+ typedef boost::date_time::partial_date<boost::gregorian::date> start_rule_functor;
+ typedef boost::date_time::partial_date<boost::gregorian::date> end_rule_functor;
+ static day_type start_day(year_type) {return 1;}
+ static month_type start_month(year_type) {return boost::date_time::Oct;}
+ static day_type end_day(year_type) {return 1;}
+ static month_type end_month(year_type) {return boost::date_time::Mar;}
+ static int dst_start_offset_minutes() { return 120;}
+ static int dst_end_offset_minutes() { return 120; }
+ static int dst_shift_length_minutes() { return 60; }
+ static date_type local_dst_start_day(year_type year)
+ {
+ start_rule_functor start(start_day(year),
+ start_month(year));
+ return start.get_date(year);
+ }
+ static date_type local_dst_end_day(year_type year)
+ {
+ end_rule_functor end(end_day(year),
+ end_month(year));
+ return end.get_date(year);
+ }
+
+
+};
+
+
+// see http://www.timeanddate.com/time/aboutdst.html for some info
+// also
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+ date d(2002,Feb,1);
+ ptime t(d);
+
+ //The following defines the US dst boundaries, except that the
+ //start and end dates are hard coded.
+ typedef boost::date_time::us_dst_rules<date, time_duration, 120, 60> us_dst_local;
+ date dst_start(2002,Apr, 7);
+ date dst_end(2002,Oct, 27);
+
+ ptime t3a(dst_start, time_duration(2,0,0)); //invalid time label
+ ptime t3b(dst_start, time_duration(2,59,59)); //invalid time label
+ ptime t4(dst_start, time_duration(1,59,59)); //not ds
+ ptime t5(dst_start, time_duration(3,0,0)); //always dst
+ ptime t6(dst_end, time_duration(0,59,59)); //is dst
+ ptime t7(dst_end, time_duration(1,0,0)); //ambiguous
+ ptime t8(dst_end, time_duration(1,59,59)); //ambiguous
+ ptime t9(dst_end, time_duration(2,0,0)); //always not dst
+
+ check("dst start", us_dst_local::local_dst_start_day(2002) == dst_start);
+ check("dst end", us_dst_local::local_dst_end_day(2002) == dst_end);
+ check("dst boundary", us_dst_local::is_dst_boundary_day(dst_start));
+ check("dst boundary", us_dst_local::is_dst_boundary_day(dst_end));
+ check("check if time is dst -- not",
+ us_dst_local::local_is_dst(t.date(), t.time_of_day())==boost::date_time::is_not_in_dst);
+ check("label on dst boundary invalid",
+ us_dst_local::local_is_dst(t3a.date(),t3a.time_of_day())==boost::date_time::invalid_time_label);
+ check("label on dst boundary invalid",
+ us_dst_local::local_is_dst(t3b.date(),t3b.time_of_day())==boost::date_time::invalid_time_label);
+ check("check if time is dst -- not",
+ us_dst_local::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ us_dst_local::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_in_dst);
+
+ check("check if time is dst -- not",
+ us_dst_local::local_is_dst(t6.date(),t6.time_of_day())==boost::date_time::is_in_dst);
+ check("check if time is dst -- ambig",
+ us_dst_local::local_is_dst(t7.date(),t7.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- ambig",
+ us_dst_local::local_is_dst(t8.date(),t8.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- not",
+ us_dst_local::local_is_dst(t9.date(),t9.time_of_day())==boost::date_time::is_not_in_dst);
+
+
+ //Now try a local without dst
+ typedef boost::date_time::null_dst_rules<date, time_duration> no_dst_adj;
+
+ check("check null dst rules",
+ no_dst_adj::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check null dst rules",
+ no_dst_adj::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check null dst rules",
+ no_dst_adj::utc_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check null dst rules",
+ no_dst_adj::utc_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_not_in_dst);
+
+
+ //Try a southern hemisphere adjustment calculation
+ //This is following the rules for South Australia as best I can
+ //decipher them. Basically conversion to DST is last Sunday in
+ //October 02:00:00 and conversion off of dst is last sunday in
+ //March 02:00:00.
+ //This stuff uses the dst calculator directly...
+ date dst_start2(2002,Oct,27); //last Sunday in Oct
+ date dst_end2(2002,Mar,31); //last Sunday in March
+
+ typedef boost::date_time::dst_calculator<date,time_duration> dstcalc;
+ //clearly not in dst
+ boost::date_time::time_is_dst_result a1 =
+ dstcalc::local_is_dst(date(2002,May,1),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+
+ check("check southern not dst", a1==boost::date_time::is_not_in_dst);
+
+ boost::date_time::time_is_dst_result a2 =
+ dstcalc::local_is_dst(date(2002,Jan,1),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+
+ check("check southern is dst", a2==boost::date_time::is_in_dst);
+
+ boost::date_time::time_is_dst_result a3 =
+ dstcalc::local_is_dst(date(2002,Oct,28),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+
+ check("check southern is dst", a3==boost::date_time::is_in_dst);
+ boost::date_time::time_is_dst_result a4 =
+ dstcalc::local_is_dst(date(2002,Oct,27),time_duration(1,59,59),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-not dst", a4==boost::date_time::is_not_in_dst);
+ boost::date_time::time_is_dst_result a5 =
+ dstcalc::local_is_dst(date(2002,Oct,27),hours(3),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-is dst", a5==boost::date_time::is_in_dst);
+ boost::date_time::time_is_dst_result a6 =
+ dstcalc::local_is_dst(date(2002,Oct,27),hours(2),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-invalid time", a6==boost::date_time::invalid_time_label);
+ boost::date_time::time_is_dst_result a7 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(1,59,59),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-is dst", a7==boost::date_time::is_in_dst);
+ boost::date_time::time_is_dst_result a8 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(2,0,0),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-ambiguous", a8==boost::date_time::ambiguous);
+ boost::date_time::time_is_dst_result a9 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(2,59,59),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-ambiguous", a9==boost::date_time::ambiguous);
+ boost::date_time::time_is_dst_result a10 =
+ dstcalc::local_is_dst(date(2002,Mar,31),time_duration(3,0,0),
+ dst_start2, 120,
+ dst_end2, 180,
+ 60);
+ check("check southern boundary-not", a10==boost::date_time::is_not_in_dst);
+
+ /******************** post release 1 -- new dst calc engine ********/
+
+ typedef boost::date_time::us_dst_trait<date> us_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration, us_dst_traits>
+ us_dst_calc2;
+
+ {
+ // us_dst_calc2
+ check("dst start", us_dst_calc2::local_dst_start_day(2002) == dst_start);
+ check("dst end", us_dst_calc2::local_dst_end_day(2002) == dst_end);
+ // std::cout << us_dst_calc2::local_dst_end_day(2002) << std::endl;
+ check("dst boundary", us_dst_calc2::is_dst_boundary_day(dst_start));
+ check("dst boundary", us_dst_calc2::is_dst_boundary_day(dst_end));
+
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t.date(), t.time_of_day())==boost::date_time::is_not_in_dst);
+ check("label on dst boundary invalid",
+ us_dst_calc2::local_is_dst(t3a.date(),t3a.time_of_day())==boost::date_time::invalid_time_label);
+ check("label on dst boundary invalid",
+ us_dst_calc2::local_is_dst(t3b.date(),t3b.time_of_day())==boost::date_time::invalid_time_label);
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ us_dst_calc2::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_in_dst);
+
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t6.date(),t6.time_of_day())==boost::date_time::is_in_dst);
+ check("check if time is dst -- ambig",
+ us_dst_calc2::local_is_dst(t7.date(),t7.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- ambig",
+ us_dst_calc2::local_is_dst(t8.date(),t8.time_of_day())==boost::date_time::ambiguous);
+ check("check if time is dst -- not",
+ us_dst_calc2::local_is_dst(t9.date(),t9.time_of_day())==boost::date_time::is_not_in_dst);
+ }
+ {
+ //some new checks for the new 2007 us dst rules
+ date dst_start07(2007,Mar, 11);
+ date dst_end07(2007,Nov, 4);
+
+ check("dst start07", us_dst_calc2::local_dst_start_day(2007) == dst_start07);
+ check("dst end07", us_dst_calc2::local_dst_end_day(2007) == dst_end07);
+ check("dst boundary07", us_dst_calc2::is_dst_boundary_day(dst_start07));
+ check("dst boundary07", us_dst_calc2::is_dst_boundary_day(dst_end07));
+
+ date dst_start08(2008,Mar, 9);
+ date dst_end08(2008,Nov, 2);
+
+ check("dst start08", us_dst_calc2::local_dst_start_day(2008) == dst_start08);
+ check("dst end08", us_dst_calc2::local_dst_end_day(2008) == dst_end08);
+ check("dst boundary08", us_dst_calc2::is_dst_boundary_day(dst_start08));
+ check("dst boundary08", us_dst_calc2::is_dst_boundary_day(dst_end08));
+
+ date dst_start09(2009,Mar, 8);
+ date dst_end09(2009,Nov, 1);
+
+ check("dst start09", us_dst_calc2::local_dst_start_day(2009) == dst_start09);
+ check("dst end09", us_dst_calc2::local_dst_end_day(2009) == dst_end09);
+ check("dst boundary09", us_dst_calc2::is_dst_boundary_day(dst_start09));
+ check("dst boundary09", us_dst_calc2::is_dst_boundary_day(dst_end09));
+
+ }
+
+
+
+ /******************** post release 1 -- new dst calc engine - eu dst ********/
+
+
+ typedef boost::date_time::eu_dst_trait<date> eu_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration, eu_dst_traits>
+ eu_dst_calc;
+ date eu_dst_start(2002,Mar, 31);
+ date eu_dst_end(2002,Oct, 27);
+ ptime eu_invalid1(eu_dst_start, time_duration(2,0,0)); //invalid time label
+ ptime eu_invalid2(eu_dst_start, time_duration(2,59,59)); //invalid time label
+ ptime eu_notdst1(eu_dst_start, time_duration(1,59,59)); //not ds
+ ptime eu_isdst1(eu_dst_start, time_duration(3,0,0)); //always dst
+ ptime eu_isdst2(eu_dst_end, time_duration(1,59,59)); //is dst
+ ptime eu_amgbig1(eu_dst_end, time_duration(2,0,0)); //ambiguous
+ ptime eu_amgbig2(eu_dst_end, time_duration(2,59,59)); //ambiguous
+ ptime eu_notdst2(eu_dst_end, time_duration(3,0,0)); //always not dst
+
+ check("eu dst start", eu_dst_calc::local_dst_start_day(2002) == eu_dst_start);
+ check("eu dst end", eu_dst_calc::local_dst_end_day(2002) == eu_dst_end);
+ check("eu dst boundary", eu_dst_calc::is_dst_boundary_day(eu_dst_start));
+ check("eu dst boundary", eu_dst_calc::is_dst_boundary_day(eu_dst_end));
+ // on forward shift boundaries
+ check("eu label on dst boundary invalid",
+ eu_dst_calc::local_is_dst(eu_invalid1.date(),eu_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("eu label on dst boundary invalid",
+ eu_dst_calc::local_is_dst(eu_invalid2.date(),eu_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("eu check if time is dst -- not",
+ eu_dst_calc::local_is_dst(eu_notdst1.date(),eu_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ eu_dst_calc::local_is_dst(eu_isdst1.date(),eu_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("eu check if time is dst -- yes",
+ eu_dst_calc::local_is_dst(eu_isdst2.date(),eu_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("eu check if time is dst -- ambig",
+ eu_dst_calc::local_is_dst(eu_amgbig1.date(),eu_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("eu check if time is dst -- ambig",
+ eu_dst_calc::local_is_dst(eu_amgbig2.date(),eu_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("eu check if time is dst -- not",
+ eu_dst_calc::local_is_dst(eu_notdst2.date(),eu_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+
+/******************** post release 1 -- new dst calc engine - gb dst ********/
+
+
+ /* Several places in Great Britan use eu start and end rules for the
+ day, but different local conversion times (eg: forward change at 1:00
+ am local and backward change at 2:00 am dst instead of 2:00am
+ forward and 3:00am back for the EU).
+ */
+
+ typedef boost::date_time::uk_dst_trait<date> uk_dst_traits;
+
+ typedef boost::date_time::dst_calc_engine<date, time_duration, uk_dst_traits> uk_dst_calc;
+
+
+ date uk_dst_start(2002,Mar, 31);
+ date uk_dst_end(2002,Oct, 27);
+ ptime uk_invalid1(uk_dst_start, time_duration(1,0,0)); //invalid time label
+ ptime uk_invalid2(uk_dst_start, time_duration(1,59,59)); //invalid time label
+ ptime uk_notdst1(uk_dst_start, time_duration(0,59,59)); //not ds
+ ptime uk_isdst1(uk_dst_start, time_duration(2,0,0)); //always dst
+ ptime uk_isdst2(uk_dst_end, time_duration(0,59,59)); //is dst
+ ptime uk_amgbig1(uk_dst_end, time_duration(1,0,0)); //ambiguous
+ ptime uk_amgbig2(uk_dst_end, time_duration(1,59,59)); //ambiguous
+ ptime uk_notdst2(uk_dst_end, time_duration(3,0,0)); //always not dst
+
+ check("uk dst start", uk_dst_calc::local_dst_start_day(2002) == uk_dst_start);
+ check("uk dst end", uk_dst_calc::local_dst_end_day(2002) == uk_dst_end);
+ check("uk dst boundary", uk_dst_calc::is_dst_boundary_day(uk_dst_start));
+ check("uk dst boundary", uk_dst_calc::is_dst_boundary_day(uk_dst_end));
+ // on forward shift boundaries
+ check("uk label on dst boundary invalid",
+ uk_dst_calc::local_is_dst(uk_invalid1.date(),uk_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("uk label on dst boundary invalid",
+ uk_dst_calc::local_is_dst(uk_invalid2.date(),uk_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("uk check if time is dst -- not",
+ uk_dst_calc::local_is_dst(uk_notdst1.date(),uk_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("uk check if time is dst -- yes",
+ uk_dst_calc::local_is_dst(uk_isdst1.date(),uk_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("uk check if time is dst -- yes",
+ uk_dst_calc::local_is_dst(uk_isdst2.date(),uk_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("uk check if time is dst -- ambig",
+ uk_dst_calc::local_is_dst(uk_amgbig1.date(),uk_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("uk check if time is dst -- ambig",
+ uk_dst_calc::local_is_dst(uk_amgbig2.date(),uk_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("uk check if time is dst -- not",
+ uk_dst_calc::local_is_dst(uk_notdst2.date(),uk_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+
+
+// /******************** post release 1 -- new dst calc engine ********/
+
+// //Define dst rule for Paraguay which is transitions forward on Oct 1 and back Mar 1
+
+ typedef boost::date_time::dst_calc_engine<date, time_duration,
+ paraguay_dst_traits> pg_dst_calc;
+
+ {
+
+ date pg_dst_start(2002,Oct, 1);
+ date pg_dst_end(2002,Mar, 1);
+ date pg_indst(2002,Dec, 1);
+ date pg_notdst(2002,Jul, 1);
+ ptime pg_invalid1(pg_dst_start, time_duration(2,0,0)); //invalid time label
+ ptime pg_invalid2(pg_dst_start, time_duration(2,59,59)); //invalid time label
+ ptime pg_notdst1(pg_dst_start, time_duration(1,59,59)); //not ds
+ ptime pg_isdst1(pg_dst_start, time_duration(3,0,0)); //always dst
+ ptime pg_isdst2(pg_dst_end, time_duration(0,59,59)); //is dst
+ ptime pg_amgbig1(pg_dst_end, time_duration(1,0,0)); //ambiguous
+ ptime pg_amgbig2(pg_dst_end, time_duration(1,59,59)); //ambiguous
+ ptime pg_notdst2(pg_dst_end, time_duration(2,0,0)); //always not dst
+
+ check("pg dst start", pg_dst_calc::local_dst_start_day(2002) == pg_dst_start);
+ check("pg dst end", pg_dst_calc::local_dst_end_day(2002) == pg_dst_end);
+ check("pg dst boundary", pg_dst_calc::is_dst_boundary_day(pg_dst_start));
+ check("pg dst boundary", pg_dst_calc::is_dst_boundary_day(pg_dst_end));
+ // on forward shift boundaries
+ check("pg label on dst boundary invalid",
+ pg_dst_calc::local_is_dst(pg_invalid1.date(),pg_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("pg label on dst boundary invalid",
+ pg_dst_calc::local_is_dst(pg_invalid2.date(),pg_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("pg check if time is dst -- not",
+ pg_dst_calc::local_is_dst(pg_notdst1.date(),pg_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ pg_dst_calc::local_is_dst(pg_isdst1.date(),pg_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("pg check if time is dst -- yes",
+ pg_dst_calc::local_is_dst(pg_isdst2.date(),pg_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("pg check if time is dst -- ambig",
+ pg_dst_calc::local_is_dst(pg_amgbig1.date(),pg_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("pg check if time is dst -- ambig",
+ pg_dst_calc::local_is_dst(pg_amgbig2.date(),pg_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("pg check if time is dst -- not",
+ pg_dst_calc::local_is_dst(pg_notdst2.date(),pg_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+ // a couple not on the boudnary
+ check("pg check if time is dst -- yes",
+ pg_dst_calc::local_is_dst(pg_indst,time_duration(0,0,0))==boost::date_time::is_in_dst);
+ check("pg check if time is dst -- not",
+ pg_dst_calc::local_is_dst(pg_notdst,time_duration(0,0,0))==boost::date_time::is_not_in_dst);
+
+ }
+
+// /******************** post release 1 -- new dst calc engine ********/
+
+// //Define dst rule for Adelaide australia
+
+ typedef boost::date_time::acst_dst_trait<date> acst_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration,
+ acst_dst_traits> acst_dst_calc;
+
+ {
+
+ date acst_dst_start(2002,Oct, 27);
+ date acst_dst_end(2002,Mar, 31);
+ date acst_indst(2002,Dec, 1);
+ date acst_notdst(2002,Jul, 1);
+ ptime acst_invalid1(acst_dst_start, time_duration(2,0,0)); //invalid time label
+ ptime acst_invalid2(acst_dst_start, time_duration(2,59,59)); //invalid time label
+ ptime acst_notdst1(acst_dst_start, time_duration(1,59,59)); //not ds
+ ptime acst_isdst1(acst_dst_start, time_duration(3,0,0)); //always dst
+ ptime acst_isdst2(acst_dst_end, time_duration(1,59,59)); //is dst
+ ptime acst_amgbig1(acst_dst_end, time_duration(2,0,0)); //ambiguous
+ ptime acst_amgbig2(acst_dst_end, time_duration(2,59,59)); //ambiguous
+ ptime acst_notdst2(acst_dst_end, time_duration(3,0,0)); //always not dst
+
+// std::cout << "acst dst_start: " << acst_dst_calc::local_dst_start_day(2002)
+// << std::endl;
+ check("acst dst start", acst_dst_calc::local_dst_start_day(2002) == acst_dst_start);
+ check("acst dst end", acst_dst_calc::local_dst_end_day(2002) == acst_dst_end);
+ check("acst dst boundary", acst_dst_calc::is_dst_boundary_day(acst_dst_start));
+ check("acst dst boundary", acst_dst_calc::is_dst_boundary_day(acst_dst_end));
+ // on forward shift boundaries
+ check("acst label on dst boundary invalid",
+ acst_dst_calc::local_is_dst(acst_invalid1.date(),acst_invalid1.time_of_day())==boost::date_time::invalid_time_label);
+ check("acst label on dst boundary invalid",
+ acst_dst_calc::local_is_dst(acst_invalid2.date(),acst_invalid2.time_of_day())==boost::date_time::invalid_time_label);
+ check("acst check if time is dst -- not",
+ acst_dst_calc::local_is_dst(acst_notdst1.date(),acst_notdst1.time_of_day())==boost::date_time::is_not_in_dst);
+ check("check if time is dst -- yes",
+ acst_dst_calc::local_is_dst(acst_isdst1.date(),acst_isdst1.time_of_day())==boost::date_time::is_in_dst);
+ //backward shift boundary
+ check("acst check if time is dst -- yes",
+ acst_dst_calc::local_is_dst(acst_isdst2.date(),acst_isdst2.time_of_day())==boost::date_time::is_in_dst);
+ check("acst check if time is dst -- ambig",
+ acst_dst_calc::local_is_dst(acst_amgbig1.date(),acst_amgbig1.time_of_day())==boost::date_time::ambiguous);
+ check("acst check if time is dst -- ambig",
+ acst_dst_calc::local_is_dst(acst_amgbig2.date(),acst_amgbig2.time_of_day())==boost::date_time::ambiguous);
+ check("acst check if time is dst -- not",
+ acst_dst_calc::local_is_dst(acst_notdst2.date(),acst_notdst2.time_of_day())==boost::date_time::is_not_in_dst);
+ // a couple not on the boudnary
+ check("acst check if time is dst -- yes",
+ acst_dst_calc::local_is_dst(acst_indst,time_duration(0,0,0))==boost::date_time::is_in_dst);
+ check("acst check if time is dst -- not",
+ acst_dst_calc::local_is_dst(acst_notdst,time_duration(0,0,0))==boost::date_time::is_not_in_dst);
+ // ptime utc_t = ptime(acst_dst_start, hours(2)) - time_duration(16,30,0);
+ // std::cout << "UTC date/time of Adelaide switch over: " << utc_t << std::endl;
+
+ }
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testduration.cpp b/src/boost/libs/date_time/test/posix_time/testduration.cpp
new file mode 100644
index 000000000..061089290
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testduration.cpp
@@ -0,0 +1,282 @@
+/* Copyright (c) 2002-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$
+ */
+
+#include "boost/date_time/posix_time/posix_time_duration.hpp"
+#include "boost/date_time/compiler_config.hpp"
+#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+#include "boost/date_time/posix_time/time_formatters_limited.hpp"
+#else
+#include "boost/date_time/posix_time/time_formatters.hpp"
+#endif
+#include "../testfrmwk.hpp"
+
+
+int
+main()
+{
+ using namespace boost::posix_time;
+
+
+// std::cout << "Default limits: SECOND " << std::endl;
+ {
+ time_duration td;
+ check("default construction -- 0 ticks", td.ticks() == 0);
+// check("default construction -- 0 secs", td.seconds() == 0);
+// check("default construction -- 0 min", td.minutes() == 0);
+ }
+
+ // construct from components
+ time_duration td1(1,25,0);
+ time_duration td3(td1.hours(),td1.minutes(),td1.seconds());
+ check("total up elements", td1 == td3);
+ td1 = -td1; // td1 == "-1:25:00"
+ check("invert_sign",td3 == td1.invert_sign());
+ check("invert_sign",td1 == td3.invert_sign());
+ check("abs",td3 == td1.abs());
+ check("abs",td3 == td3.abs());
+ check("is_positive",td3.is_positive());
+ check("is_positive",!td1.is_positive());
+ check("is_negative",td1.is_negative());
+ check("is_negative",!td3.is_negative());
+ check("is_zero",!td1.is_zero());
+ check("is_zero",(td1 - td1).is_zero());
+ td3 = time_duration(td1.hours(),td1.minutes(),td1.seconds());
+ check("total up elements-inverted sign", td1 == td3);
+
+
+ time_duration t_1(0,1,40);
+ time_duration t_2(0,1,41);
+ check("less test", !(t_2 < t_2));
+ check("equal test", t_1 == t_1);
+ check("greater equal - equal", t_1 >= t_1);
+ check("greater equal - greater", t_2 >= t_1);
+ check("less equal - equal ", t_2 <= t_2);
+ check("greater ", t_2 > t_1);
+ check("greater - not ", !(t_1 > t_2));
+ time_duration t_3(t_2);
+ check("copy constructor ", t_2 == t_3);
+ time_duration t_4 = t_3;
+ check("assignment operator ", t_2 == t_4);
+
+ time_duration t_5(1,30,20,10); // 1hr, 30min, 20sec, 10 frac sec
+ t_5 /= 2;
+ check("divide equal", (t_5.hours() == 0 &&
+ t_5.minutes() == 45 &&
+ t_5.seconds() == 10 &&
+ t_5.fractional_seconds() == 5));
+ t_5 = time_duration(3,15,8,0) / 2;
+ check("divide int", t_5 == time_duration(1,37,34,0));
+ {
+ time_duration td = hours(5);
+ td *= 5;
+ check("mult-equals int", time_duration(25,0,0,0) == td);
+ }
+
+
+ t_5 = t_2 + t_1;
+ //VC6 goes ambiguous on the next line...
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+ //sorry ticks() doesn't work on VC6
+#else
+ std::cout << t_5.ticks() << std::endl;
+#endif
+ check("add", t_5 == time_duration(0,3,21));
+ time_duration td_a(5,5,5,5);
+ time_duration td_b(4,4,4,4);
+ time_duration td_c(2,2,2,2);
+ td_a += td_b;
+ check("add equal", td_a == time_duration(9,9,9,9));
+ time_duration td_d = td_b - td_c;
+ check("subtract", td_d == time_duration(2,2,2,2));
+ td_d -= td_b;
+ check("subtract equal (neg result)", td_d == td_c - td_b);
+
+ time_duration utd(1,2,3,4);
+ time_duration utd2 = -utd;
+ //std::cout << td_d << '\n' << utd2 << std::endl;
+ check("unary-", ((utd2.hours() == -1) &&
+ (utd2.minutes() == -2) &&
+ (utd2.seconds() == -3) &&
+ (utd2.fractional_seconds() == -4)) );
+ utd2 = -hours(5);
+ check("unary-", utd2.hours() == -5);
+ utd2 = -utd2;
+ check("unary-", utd2.hours() == 5);
+
+ time_duration t_6(5,4,3); //05:04:03
+ check("h-m-s 5-4-3 hours", t_6.hours() == 5);
+ check("h-m-s 5-4-3 minutes", t_6.minutes() == 4);
+ check("h-m-s 5-4-3 seconds", t_6.seconds() == 3);
+ std::cout << t_6.total_seconds() << std::endl;
+ check("h-m-s 5-4-3 total_seconds", t_6.total_seconds() == 18243);
+
+ hours tenhours(10);
+ minutes fivemin(5);
+ time_duration t7 = time_duration(1,2,3) + tenhours + fivemin;
+ check("short hand durations add", t7 == time_duration(11,7,3));
+ time_duration t8 = tenhours + time_duration(1,2,3) + fivemin;
+ check("short hand durations add", t8 == time_duration(11,7,3));
+
+ if (time_duration::resolution() >= boost::date_time::micro) {
+ time_duration t_9(5,4,3,9876); //05:04:03.09876
+ check("h-m-s 5-4-3.21 hours", t_9.hours() == 5);
+ check("h-m-s 5-4-3.21 min ", t_9.minutes() == 4);
+ check("h-m-s 5-4-3.21 sec ", t_9.seconds() == 3);
+ check("h-m-s 5-4-3.21 fs ", t_9.fractional_seconds() == 9876);
+ check("h-m-s 5-4-3.21 total_seconds", t_9.total_seconds() == 18243);
+ // check("h-m-s 5-4-3.21 fs ", t_9.fs_as_double() == 0.9876);
+ //std::cout << t_9.fs_as_double() << std::endl;
+ std::cout << to_simple_string(t_9) << std::endl;
+ }
+
+ if (time_duration::resolution() >= boost::date_time::tenth) {
+ time_duration t_10(5,4,3,9); //05:04:03.00001
+ check("h-m-s 5-4-3.9 hours", t_10.hours() == 5);
+ check("h-m-s 5-4-3.9 min ", t_10.minutes() == 4);
+ check("h-m-s 5-4-3.9 sec ", t_10.seconds() == 3);
+ check("h-m-s 5-4-3.9 fs ", t_10.fractional_seconds() == 9);
+ check("h-m-s 5-4-3.9 total_seconds", t_10.total_seconds() == 18243);
+ std::cout << to_simple_string(t_10) << std::endl;
+ }
+
+ if (time_duration::resolution() >= boost::date_time::milli) {
+ millisec ms(9);
+ // time_duration t_10(0,0,0,); //00:00:00.009
+ std::cout << "time_resolution: " << time_duration::resolution() << std::endl;
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+ //sorry res_adjust() doesn't work on VC6
+#else
+ std::cout << "res_adjust " << time_res_traits::res_adjust() << std::endl;
+#endif
+ if (time_duration::resolution() == boost::date_time::nano) {
+ check("millisec", ms.fractional_seconds() == 9000000);
+ check("total_seconds - nofrac", ms.total_seconds() == 0);
+ check("total_millisec", ms.total_milliseconds() == 9);
+ check("ticks per second", time_duration::ticks_per_second() == 1000000000);
+ }
+ else {
+ check("millisec 9000", ms.fractional_seconds() == 9000);
+ check("total_seconds - nofrac", ms.total_seconds() == 0);
+ check("total_millisec", ms.total_milliseconds() == 9);
+ }
+ }
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ if (time_duration::resolution() >= boost::date_time::nano) {
+ nanosec ns(9);
+ // time_duration t_10(0,0,0,); //00:00:00.00009
+ check("nanosec", ns.fractional_seconds() == 9);
+ check("total nanosec", ns.total_nanoseconds() == 9);
+ check("total microsec - truncated", ns.total_microseconds() == 0);
+ std::cout << to_simple_string(ns) << std::endl;
+ time_duration ns18 = ns + ns;
+ check("nanosec", ns18.fractional_seconds() == 18);
+ std::cout << to_simple_string(ns18) << std::endl;
+ nanosec ns2(1000000000); //one second
+ check("nano to second compare", ns2 == seconds(1));
+ check("check total seconds", ns2.total_seconds() == 1);
+ std::cout << to_simple_string(ns2) << std::endl;
+ check("division of nanoseconds", (nanosec(3)/2) == nanosec(1));
+ check("multiplication of nanosec", nanosec(3)*1000 == microsec(3));
+ }
+#endif
+
+ // Test for overflows (ticket #3471)
+ {
+ ptime start(boost::gregorian::date(2000, 1, 1));
+ ptime end(boost::gregorian::date(2000, 5, 1));
+ time_duration td = end - start;
+ ptime end2 = start + microseconds(td.total_microseconds());
+ check("microseconds constructor overflow", end == end2);
+ }
+
+ time_duration t_11(3600,0,0);
+ check("3600 hours ", t_11.hours() == 3600);
+ check("total seconds 3600 hours", t_11.total_seconds() == 12960000);
+
+ time_duration td_12(1,2,3,10);
+ std::cout << td_12.total_seconds() << std::endl;
+ check("total seconds 3723 hours", td_12.total_seconds() == 3723);
+
+ // time_duration t_11a = t_11/time_duration(0,3,0);
+
+ check("division", (hours(2)/2) == hours(1));
+ check("division", (hours(3)/2) == time_duration(1,30,0));
+ check("division", (hours(3)/3) == hours(1));
+ check("multiplication", time_duration(3,0,0)*2 == hours(6));
+ check("multiplication", hours(360)*1000 == hours(360000));
+
+ // special_values operations
+ time_duration pi_dur(pos_infin), ni_dur(neg_infin), ndt_dur(not_a_date_time);
+ check("+infin + -infin", pi_dur + ni_dur == ndt_dur);
+ check("infin / int", pi_dur / 3 == pi_dur);
+ check("infin + duration", pi_dur + td_12 == pi_dur);
+ check("infin - duration", pi_dur - td_12 == pi_dur);
+ check("unary-", -pi_dur == ni_dur);
+ check("-infin less than +infin", ni_dur < pi_dur);
+ check("-infin less than duration", ni_dur < td_12);
+ check("+infin greater than duration", pi_dur > td_12);
+ std::string result(""), answer("+infinity");
+ result = to_simple_string(pi_dur);
+ check("to string +infin", result==answer);
+ result = to_simple_string(ni_dur);
+ answer = "-infinity";
+ check("to string +infin", result==answer);
+ result = to_simple_string(ndt_dur);
+ //answer = "not-a-number";
+ answer = "not-a-date-time";
+ check("to string +infin", result==answer);
+
+ using namespace boost::gregorian;
+ ptime t1(date(2001,7,14));
+ ptime t2(date(2002,7,14));
+ check("One year of hours: 365*24=8760", 365*24 == ((t2-t1).hours()));
+ check("Total seconds in a year", 365*24*3600 == ((t2-t1).total_seconds()));
+
+ std::cout << to_simple_string(time_duration(20000 * 24, 0, 0, 0)) << std::endl;
+ std::cout << to_simple_string(time_duration(24855 * 24, 0, 0, 0)) << std::endl;
+ std::cout << to_simple_string(time_duration(24856 * 24, 0, 0, 0)) << std::endl;
+ std::cout << to_simple_string(time_duration(25000 * 24, 0, 0, 0)) << std::endl;
+ time_duration tdl1(25000*24, 0, 0, 0);
+ check("600000 hours", tdl1.hours() == 600000);
+ time_duration tdl2(2000000, 0, 0, 0);
+ check("2000000 hours", tdl2.hours() == 2000000);
+
+ check("total milliseconds", seconds(1).total_milliseconds() == 1000);
+ check("total microseconds", seconds(1).total_microseconds() == 1000000);
+ check("total nanoseconds", seconds(1).total_nanoseconds() == 1000000000);
+ check("total milliseconds", hours(1).total_milliseconds() == 3600*1000);
+ boost::int64_t tms = static_cast<boost::int64_t>(3600)*1000000*1001; //ms per sec
+ check("total microseconds 1000 hours", hours(1001).total_microseconds() == tms);
+ tms = static_cast<boost::int64_t>(3600)*365*24*1000;
+ check("total milliseconds - one year", (t2-t1).total_milliseconds() == tms);
+ tms = 3600*365*24*static_cast<boost::int64_t>(1000000000);
+ check("total nanoseconds - one year", (t2-t1).total_nanoseconds() == tms);
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+#else
+ std::cout << "tms: " << (t2-t1).total_milliseconds() << std::endl;
+ std::cout << "nano per year: " << (t2-t1).total_nanoseconds() << std::endl;
+#endif
+ // make it into a double
+ double d1 = microseconds(25).ticks()/(double)time_duration::ticks_per_second();
+ std::cout << d1 << std::endl;
+
+ //Following causes errors on several compilers about value to large for
+ //type. So it is commented out for now. Strangely works on gcc 3.3
+ //eg: integer constant out of range
+// long sec_in_200k_hours(7200000000);
+// check("total sec in 2000000 hours",
+// tdl2.total_seconds() == sec_in_200k_hours);
+// std::cout << to_simple_string(time_duration(2000000, 0, 0, 0)) << std::endl;
+
+
+ return printTestStats();
+
+}
+
+
diff --git a/src/boost/libs/date_time/test/posix_time/testfiletime_functions.cpp b/src/boost/libs/date_time/test/posix_time/testfiletime_functions.cpp
new file mode 100644
index 000000000..d931dc1a5
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testfiletime_functions.cpp
@@ -0,0 +1,90 @@
+/* Copyright (c) 2002,2003, 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
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#include "boost/date_time/filetime_functions.hpp"
+#include <cmath>
+
+#if defined(BOOST_HAS_FTIME)
+#include <windows.h>
+#endif
+
+int main()
+{
+#if defined(BOOST_HAS_FTIME) // skip tests if no FILETIME
+
+ using namespace boost::posix_time;
+
+ // adjustor is used to truncate ptime's fractional seconds for
+ // comparison with SYSTEMTIME's milliseconds
+ const time_duration::tick_type adjustor = time_duration::ticks_per_second() / 1000;
+
+ for(int i = 0; i < 5; ++i){
+
+ FILETIME ft;
+ SYSTEMTIME st;
+ GetSystemTime(&st);
+ SystemTimeToFileTime(&st,&ft);
+
+ ptime pt = from_ftime<ptime>(ft);
+
+ check_equal("ptime year matches systemtime year",
+ st.wYear, pt.date().year());
+ check_equal("ptime month matches systemtime month",
+ st.wMonth, pt.date().month());
+ check_equal("ptime day matches systemtime day",
+ st.wDay, pt.date().day());
+ check_equal("ptime hour matches systemtime hour",
+ st.wHour, pt.time_of_day().hours());
+ check_equal("ptime minute matches systemtime minute",
+ st.wMinute, pt.time_of_day().minutes());
+ check_equal("ptime second matches systemtime second",
+ st.wSecond, pt.time_of_day().seconds());
+ check_equal("truncated ptime fractional second matches systemtime millisecond",
+ st.wMilliseconds, (pt.time_of_day().fractional_seconds() / adjustor));
+
+ // burn up a little time
+ for (int j=0; j<100000; j++)
+ {
+ SYSTEMTIME tmp;
+ GetSystemTime(&tmp);
+ }
+
+ } // for loop
+
+ // check that time_from_ftime works for pre-1970-Jan-01 dates, too
+ // zero FILETIME should represent 1601-Jan-01 00:00:00.000
+ FILETIME big_bang_by_ms;
+ big_bang_by_ms.dwLowDateTime = big_bang_by_ms.dwHighDateTime = 0;
+ ptime pt = from_ftime<ptime>(big_bang_by_ms);
+
+ check_equal("big bang ptime year matches 1601",
+ 1601, pt.date().year());
+ check_equal("big bang ptime month matches Jan",
+ 1, pt.date().month());
+ check_equal("big bang ptime day matches 1",
+ 1, pt.date().day());
+ check_equal("big bang ptime hour matches 0",
+ 0, pt.time_of_day().hours());
+ check_equal("big bang ptime minute matches 0",
+ 0, pt.time_of_day().minutes());
+ check_equal("big bang ptime second matches 0",
+ 0, pt.time_of_day().seconds());
+ check_equal("big bang truncated ptime fractional second matches 0",
+ 0, (pt.time_of_day().fractional_seconds() / adjustor));
+
+
+#else // BOOST_HAS_FTIME
+ // we don't want a forced failure here, not a shortcoming
+ check("FILETIME not available for this compiler/platform", true);
+#endif // BOOST_HAS_FTIME
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testformatters.cpp b/src/boost/libs/date_time/test/posix_time/testformatters.cpp
new file mode 100644
index 000000000..74dae8888
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testformatters.cpp
@@ -0,0 +1,18 @@
+/* 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, Bart Garst
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+ //This has been deprecated for testtime_formatters.cpp
+ return 0;
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testgreg_duration_operators.cpp b/src/boost/libs/date_time/test/posix_time/testgreg_duration_operators.cpp
new file mode 100644
index 000000000..005a61711
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testgreg_duration_operators.cpp
@@ -0,0 +1,85 @@
+/* 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, Bart Garst
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+
+int main(){
+
+#if !defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
+ // do not set this test to return fail -
+ // this is not necessarily a compiler problem
+ check("Optional gregorian types not selected - no tests run", true);
+#else
+
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+
+
+ /*** months ***/
+ {
+ ptime p(date(2001, Oct, 31), hours(5));
+ check("ptime + months",
+ ptime(date(2002, Feb, 28), hours(5)) == p + months(4));
+ p += months(4);
+ check("ptime += months",
+ ptime(date(2002, Feb, 28), hours(5)) == p);
+ }
+ {
+ ptime p(date(2001, Oct, 31), hours(5));
+ check("ptime - months",
+ ptime(date(2001, Apr, 30), hours(5)) == p - months(6));
+ p -= months(6);
+ check("ptime -= months",
+ ptime(date(2001, Apr, 30), hours(5)) == p);
+ }
+
+ /*** years ***/
+ {
+ ptime p(date(2001, Feb, 28), hours(5));
+ check("ptime + years",
+ ptime(date(2004, Feb, 29), hours(5)) == p + years(3));
+ p += years(3);
+ check("ptime += years",
+ ptime(date(2004, Feb, 29), hours(5)) == p);
+ }
+ {
+ ptime p(date(2000, Feb, 29), hours(5));
+ check("ptime - years",
+ ptime(date(1998, Feb, 28), hours(5)) == p - years(2));
+ p -= years(2);
+ check("ptime -= years",
+ ptime(date(1998, Feb, 28), hours(5)) == p);
+ }
+
+
+ /*** weeks ***/
+ // shouldn't need many tests, it is nothing more than a date_duration
+ // so all date_duration tests should prove this class
+ {
+ ptime p(date(2001, Feb, 28), hours(5));
+ check("ptime + weeks",
+ ptime(date(2001, Mar, 21), hours(5)) == p + weeks(3));
+ p += weeks(3);
+ check("ptime += weeks",
+ ptime(date(2001, Mar, 21), hours(5)) == p);
+ }
+ {
+ ptime p(date(2001, Feb, 28), hours(5));
+ check("ptime - weeks",
+ ptime(date(2001, Feb, 14), hours(5)) == p - weeks(2));
+ p -= weeks(2);
+ check("ptime -= weeks",
+ ptime(date(2001, Feb, 14), hours(5)) == p);
+ }
+
+#endif // BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
+
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/posix_time/testiterator.cpp b/src/boost/libs/date_time/test/posix_time/testiterator.cpp
new file mode 100644
index 000000000..47ebb603c
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testiterator.cpp
@@ -0,0 +1,135 @@
+/* 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, Bart Garst
+ * $Date$
+ */
+
+#include <iostream>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+#include "boost/date_time/gregorian/formatters_limited.hpp"
+#else
+#include "boost/date_time/gregorian/formatters.hpp"
+#endif
+
+void iterate_backward(const boost::posix_time::ptime *answers, int ary_len,
+ const boost::posix_time::time_duration& td)
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ int i = ary_len -1;
+ ptime end = answers[i];
+ time_iterator titr(end,td);
+
+ std::cout << "counting down by previous duration..." << std::endl;
+ for (; titr >= answers[0]; --titr) {
+ std::cout << *titr << std::endl;
+ check("iterating backward", answers[i] == *titr);
+ --i;
+ }
+ check("iterating backward count", i == -1); // check the number of iterations
+ std::cout << std::endl;
+}
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date d(2000,Jan,20);
+ ptime start(d);
+ const ptime answer1[] = {ptime(d), ptime(d,seconds(1)),
+ ptime(d,seconds(2)), ptime(d,seconds(3))};
+ int i=0;
+ time_iterator titr(start,seconds(1));
+ for (; titr < ptime(d,seconds(4)); ++titr) {
+ std::cout << *titr << std::endl;
+ check("iterator -- 1 sec", answer1[i] == *titr);
+ i++;
+ }
+ check("iterator -- 1 sec", i == 4); // check the number of iterations
+
+ iterate_backward(answer1, 4, seconds(1));
+
+ //iterate by hours
+ const ptime answer2[] = {ptime(d), ptime(d,hours(1)),
+ ptime(d,hours(2)), ptime(d,hours(3))};
+ i=0;
+ time_iterator titr2(start,hours(1));
+ for (; titr2 < ptime(d,hours(4)); ++titr2) {
+ std::cout << *titr2 << std::endl;
+ check("iterator -- 1 hour", answer2[i] == *titr2);
+ i++;
+ }
+ check("iterator -- 1 hour", i == 4); // check the number of iterations
+
+ iterate_backward(answer2, 4, hours(1));
+
+
+ //iterate by 15 mintues
+ const ptime answer3[] = {ptime(d), ptime(d,minutes(15)),
+ ptime(d,minutes(30)), ptime(d,minutes(45)),
+ ptime(d,minutes(60)), ptime(d,minutes(75))};
+ i=0;
+ time_iterator titr3(start,minutes(15));
+ for (; titr3 < ptime(d,time_duration(1,20,0)); ++titr3) {
+ std::cout << *titr3 << std::endl;
+ check("iterator -- 15 min", answer3[i] == *titr3);
+ i++;
+ }
+ check("iterator -- 15 min", i == 6); // check the number of iterations
+
+ iterate_backward(answer3, 6, minutes(15));
+
+ //iterate by .1 seconds
+ const ptime answer4[] = {ptime(d), ptime(d,time_duration(0,0,0,1000)),
+ ptime(d,time_duration(0,0,0,2000)),
+ ptime(d,time_duration(0,0,0,3000))};
+ i=0;
+ time_iterator titr4(start,time_duration(0,0,0,1000));
+ for (; titr4 < ptime(d,time_duration(0,0,0,4000)); ++titr4) {
+ std::cout << *titr4 << std::endl;
+ check("iterator -- tenth sec", answer4[i] == *titr4);
+ i++;
+ }
+ check("iterator -- tenth sec", i == 4); // check the number of iterations
+
+ iterate_backward(answer4, 4, time_duration(0,0,0,1000));
+
+ //iterate by crazy duration
+ time_duration crzyd = duration_from_string("2:18:32.423");
+ const ptime answer5[] = {ptime(d), ptime(d,crzyd),
+ ptime(d, crzyd * 2),
+ ptime(d, crzyd * 3)};
+ i=0;
+ time_iterator titr5(start,crzyd);
+ for (; titr5 < ptime(d,crzyd * 4); ++titr5) {
+ std::cout << *titr5 << std::endl;
+ check("iterator -- crazy duration", answer5[i] == *titr5);
+ i++;
+ }
+ check("iterator -- crazy duration", i == 4); // check the number of iterations
+
+ iterate_backward(answer5, 4, crzyd);
+
+ //iterate up by neg_dur
+ time_duration pos_dur = minutes(3);
+ time_duration neg_dur = -pos_dur;
+ time_iterator up_itr(start, neg_dur), dn_itr(start, pos_dur);
+
+ for(i=0; i < 10; ++i)
+ {
+ check("up-by-neg == backward iterate", *up_itr == *dn_itr);
+ ++up_itr; // up by -3
+ --dn_itr; // down by 3
+ }
+
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testlocal_adjustor.cpp b/src/boost/libs/date_time/test/posix_time/testlocal_adjustor.cpp
new file mode 100644
index 000000000..a9f434079
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testlocal_adjustor.cpp
@@ -0,0 +1,175 @@
+/* Copyright (c) 2002,2003, 2007 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 "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/local_time_adjustor.hpp"
+#include "boost/date_time/local_timezone_defs.hpp"
+#include "../testfrmwk.hpp"
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date dst_start(2002,Apr, 7);
+ date dst_end_day(2002,Oct, 27);
+
+ typedef boost::date_time::utc_adjustment<time_duration,-5> us_eastern_offset_adj;
+ //Type that embeds rules for UTC-5 plus DST offset
+ typedef boost::date_time::static_local_time_adjustor<ptime,
+ us_dst,
+ us_eastern_offset_adj> us_eastern;
+
+ //test some times clearly not in DST
+ date d3(2002,Feb,1);
+ ptime t10(d3, hours(4));
+ ptime t10_check(d3, hours(9)); //utc is 5 hours ahead
+ time_duration td = us_eastern::local_to_utc_offset(t10);//dst flag is defaulted
+ check("check local calculation", td == hours(5));
+ ptime t10_local = t10 + td;
+ std::cout << t10_local << std::endl;
+ check("check local calculation", t10_local == t10_check);
+ check("check utc is dst",
+ us_eastern::utc_to_local_offset(t10) == hours(-5));
+
+
+ //something clearly IN dst
+ date d4(2002,May,1);
+ ptime t11(d4, hours(3));
+ check("check local offset",us_eastern::local_to_utc_offset(t11) == hours(4));
+ std::cout << us_eastern::local_to_utc_offset(t11) << std::endl;
+ ptime t11_check(d4, hours(7));//now utc offset is only 4 hours
+ ptime t11_local = t11 + us_eastern::local_to_utc_offset(t11);
+ std::cout << t11_local << " " << t11_check << std::endl;
+ check("check local calculation", t11_local == t11_check);
+ //should get same offset with DST flag set
+ check("check local offset-dst flag on",
+ us_eastern::local_to_utc_offset(t11, boost::date_time::is_dst) == hours(4));
+ check("check local offset-dst flag override",
+ us_eastern::local_to_utc_offset(t11, boost::date_time::not_dst) == hours(5));
+
+
+ //Check the start of dst boundary
+ ptime l_not_dst(dst_start, time_duration(1,59,59)); //2002-Apr-07 01:59:59
+ check("check local dst start boundary case",
+ us_eastern::local_to_utc_offset(l_not_dst) == hours(5));
+ ptime u_not_dst(dst_start, time_duration(6,59,59));
+ check("check utc dst start boundary case",
+ us_eastern::utc_to_local_offset(u_not_dst) == hours(-5));
+ ptime l_in_dst(dst_start, hours(3)); //2002-Apr-07 03:00:00 1st sec of dst
+ check("check local dst start boundary case",
+ us_eastern::local_to_utc_offset(l_in_dst, boost::date_time::is_dst) == hours(4));
+ ptime u_in_dst(dst_start, hours(7));
+ check("check utc dst start boundary case",
+ us_eastern::utc_to_local_offset(u_in_dst) == hours(-4));
+
+
+ //Check the end of dst boundary
+ ptime dst_end(dst_end_day, time_duration(1,59,59)); //2002-Oct-27 01:00:00 DST
+ check("check local dst end boundary case - still dst",
+ us_eastern::local_to_utc_offset(dst_end, boost::date_time::is_dst) == hours(4));
+ check("check local dst end boundary case - still dst",
+ us_eastern::local_to_utc_offset(dst_end, boost::date_time::not_dst) == hours(5));
+ ptime u_dst_end1(dst_end_day, time_duration(5,59,59));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end1) == hours(-4));
+ ptime u_dst_end2(dst_end_day, time_duration(6,0,0));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end2) == hours(-5));
+ ptime u_dst_end3(dst_end_day, time_duration(6,59,59));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end3) == hours(-5));
+ ptime u_dst_end4(dst_end_day, time_duration(7,0,0));
+ check("check utc dst end boundary case",
+ us_eastern::utc_to_local_offset(u_dst_end4) == hours(-5));
+
+
+ //Now try a local adjustments without dst
+ typedef boost::date_time::utc_adjustment<time_duration,-7> us_az_offset_adj;
+ typedef boost::date_time::null_dst_rules<date, time_duration> us_az_dst_adj;
+ //Type that embeds rules for UTC-7 with no dst
+ typedef boost::date_time::static_local_time_adjustor<ptime,
+ us_az_dst_adj,
+ us_az_offset_adj> us_az;
+
+ check("check local offset - no dst",
+ us_az::local_to_utc_offset(t10) == hours(7));
+ check("check local offset - no dst",
+ us_az::local_to_utc_offset(t11) == hours(7));
+ check("check local offset - no dst",
+ us_az::utc_to_local_offset(t10) == hours(-7));
+ check("check local offset - no dst",
+ us_az::utc_to_local_offset(t11) == hours(-7));
+
+
+ //Arizona timezone is utc-7 with no dst
+ typedef boost::date_time::local_adjustor<ptime, -7, no_dst> us_arizona;
+
+ ptime t7(date(2002,May,31), hours(17));
+ ptime t8 = us_arizona::local_to_utc(t7);
+ ptime t9 = us_arizona::utc_to_local(t8);
+ //converted to local then back ot utc
+ check("check us_local_adjustor", t9 == t7);
+
+ typedef boost::date_time::local_adjustor<ptime, -5, us_dst> us_eastern2;
+
+ {
+ ptime t7a(date(2002,May,31), hours(17));
+ ptime t7b = us_eastern2::local_to_utc(t7a);
+ ptime t7c = us_eastern2::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor", t7c == t7a);
+ }
+
+ typedef boost::date_time::us_dst_trait<date> us_dst_traits;
+ typedef boost::date_time::dst_calc_engine<date, time_duration, us_dst_traits>
+ us_dst_calc2;
+
+ typedef boost::date_time::local_adjustor<ptime, -5, us_dst_calc2> us_eastern3;
+ {
+ ptime t7a(date(2002,May,31), hours(17));
+ ptime t7b = us_eastern3::local_to_utc(t7a);
+ ptime t7c = us_eastern3::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor3", t7c == t7a);
+ }
+
+ {
+ ptime t7a(date(2007,Mar,11), hours(4));
+ ptime t7b = us_eastern3::local_to_utc(t7a);
+ ptime t7c = us_eastern3::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor3 2007", t7c == t7a);
+ }
+
+ {
+ ptime t7a(date(2007,Mar,11), hours(3));
+ ptime t7b = us_eastern3::local_to_utc(t7a);
+ ptime t7c = us_eastern3::utc_to_local(t7b);
+ //converted to local then back ot utc
+ check("check us_local_adjustor3 2007 a", t7c == t7a);
+ }
+
+ //still experimental
+ typedef boost::date_time::dynamic_local_time_adjustor<ptime, us_dst> lta;
+// lta adjustor(hours(-7));
+ check("dst start", lta::local_dst_start_day(2002) == dst_start);
+ check("dst end", lta::local_dst_end_day(2002) == dst_end_day);
+ check("dst boundary", lta::is_dst_boundary_day(dst_start));
+ check("dst boundary", lta::is_dst_boundary_day(dst_end_day));
+// check("check non-dst offset", adjustor.utc_offset(false)==hours(-7));
+// check("check dst offset", adjustor.utc_offset(true)==hours(-6));
+
+
+ check("dst start", lta::local_dst_start_day(2007) == date(2007,Mar,11));
+ check("dst end", lta::local_dst_end_day(2007) == date(2007,Nov,4));
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp b/src/boost/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp
new file mode 100644
index 000000000..8f0553ab3
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp
@@ -0,0 +1,139 @@
+/* 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)
+
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/microsec_time_clock.hpp"
+#include "../testfrmwk.hpp"
+#if defined(BOOST_HAS_FTIME)
+#include <windows.h>
+#endif
+
+void
+sync_to_next_second()
+{
+ using namespace boost::posix_time;
+
+ ptime t_prev;
+ ptime t_now = second_clock::local_time();
+
+ // Wait the next seconds
+ do
+ {
+ t_prev = t_now;
+ t_now = second_clock::local_time();
+ } while (t_now.time_of_day().seconds() == t_prev.time_of_day().seconds());
+
+ // Wait 300ms in order to avoid seconds of second_clock > microsec_clock.
+ t_now = microsec_clock::local_time();
+ t_prev = t_now;
+ do
+ {
+ t_now = microsec_clock::local_time();
+ } while (t_now - t_prev < milliseconds(300));
+
+}
+
+
+int
+main()
+{
+#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+
+ using namespace boost::posix_time;
+
+ std::cout << "Check local time of microsec_clock against second_clock" << std::endl;
+
+ ptime last = microsec_clock::local_time();
+ int max = 30;
+ for (int i=0; i<max; i++)
+ {
+ // Some systems loop too fast so "last is less" tests fail due to
+ // 'last' & 't2' being equal. These calls slow it down enough to
+ // make 'last' & 't2' different. Moreover, we must wait the next
+ // second to avoid a change in hour, minute or second field
+ // between acquisition of t1 and t2.
+ sync_to_next_second();
+
+ ptime t1 = second_clock::local_time();
+ std::cout << t1 << std::endl;
+
+ ptime t2 = microsec_clock::local_time();
+ std::cout << t2 << std::endl;
+
+ check("check equality of hours "
+ "between second_clock and microsec_clock timestamps",
+ t1.time_of_day().hours() == t2.time_of_day().hours());
+
+ check("check equality of minutes "
+ "between second_clock and microsec_clock timestamps",
+ t1.time_of_day().minutes() == t2.time_of_day().minutes());
+
+ check("check equality of seconds "
+ "between second_clock and microsec_clock timestamps",
+ t1.time_of_day().seconds() == t2.time_of_day().seconds());
+
+ check("check equality of date"
+ "between second_clock and microsec_clock timestamps",
+ t1.date() == t2.date());
+
+ if( !check("check that previous microsec_clock timestamp "
+ "is less than the current", last < t2) ) {
+ std::cout << last << " < " << t2 << std::endl;
+ }
+
+ last = t2;
+ }
+
+
+ std::cout << "Check universal time of microsec_clock against second_clock" << std::endl;
+ max = 10;
+ last = microsec_clock::universal_time();
+ for (int i=0; i<max; i++)
+ {
+ // Some systems loop too fast so "last is less" tests fail due to
+ // 'last' & 't2' being equal. These calls slow it down enough to
+ // make 'last' & 't2' different. Moreover, we must wait the next
+ // second to avoid a change in hour, minute or second field
+ // between acquisition of t1 and t2.
+ sync_to_next_second();
+
+ ptime t1 = second_clock::universal_time();
+ std::cout << t1 << std::endl;
+
+ ptime t2 = microsec_clock::universal_time();
+ std::cout << t2 << std::endl;
+
+ check("check equality of hours "
+ "between second_clock and microsec_clock timestamps",
+ t1.time_of_day().hours() == t2.time_of_day().hours());
+
+ check("check equality of minutes "
+ "between second_clock and microsec_clock timestamps",
+ t1.time_of_day().minutes() == t2.time_of_day().minutes());
+
+ check("check equality of seconds "
+ "between second_clock and microsec_clock timestamps",
+ t1.time_of_day().seconds() == t2.time_of_day().seconds());
+
+ check("check equality of date"
+ "between second_clock and microsec_clock timestamps",
+ t1.date() == t2.date());
+
+ if( !check("check that previous microsec_clock timestamp "
+ "is less than the current", last < t2) ) {
+ std::cout << last << " < " << t2 << std::endl;
+ }
+
+ last = t2;
+ }
+
+#else
+ check("Get time of day micro second clock not supported due to inadequate compiler/platform", false);
+#endif
+ return printTestStats();
+
+}
diff --git a/src/boost/libs/date_time/test/posix_time/testparse_time.cpp b/src/boost/libs/date_time/test/posix_time/testparse_time.cpp
new file mode 100644
index 000000000..faa5a8640
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testparse_time.cpp
@@ -0,0 +1,280 @@
+/* Copyright (c) 2002,2003,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
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+
+int
+main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ {
+ std::string s1("12:11:10.123456789");
+ time_duration td1= duration_from_string(s1);
+ check("parse time duration: " + s1,
+ td1 == time_duration(12,11,10,123456789));
+ std::string s2("12:11:10,123456789");
+ time_duration td2= boost::date_time::parse_delimited_time_duration<time_duration>(s2);
+ check("parse time duration: " + s2,
+ td2 == time_duration(12,11,10,123456789));
+ std::string s3("12:11:10");
+ time_duration td3= boost::date_time::parse_delimited_time_duration<time_duration>(s3);
+ check("parse time duration: " + s3,
+ td3 == time_duration(12,11,10,0));
+ std::string s4("23:59:59.000000001");
+ time_duration td4= boost::date_time::parse_delimited_time_duration<time_duration>(s4);
+ check("parse time duration: " + s4,
+ td4 == time_duration(23,59,59)+nanosec(1));
+ std::string s5("23:59:59.999999999");
+ time_duration td5= boost::date_time::parse_delimited_time_duration<time_duration>(s5);
+ check("parse time duration: " + s5,
+ td5 == time_duration(23,59,59)+nanosec(999999999));
+ std::string s5b("-23:59:59.999999999");
+ time_duration td5b= boost::date_time::parse_delimited_time_duration<time_duration>(s5b);
+ check("parse time duration: " + s5b,
+ td5b == time_duration(-23,59,59)-nanosec(999999999));
+
+ std::string s6b("1:00:00.1"); // we want 1/10th
+ time_duration td6b= boost::date_time::parse_delimited_time_duration<time_duration>(s6b);
+ check("parse time duration: " + s6b,
+ td6b == time_duration(1,0,0)+nanosec(100000000)); // we want 1/10th
+
+ std::string s7b("-1:00:00.0010"); // we want 1/1000th
+ time_duration td7b= boost::date_time::parse_delimited_time_duration<time_duration>(s7b);
+ check("parse time duration: " + s7b,
+ td7b == time_duration(-1,0,0)-nanosec(1000000)); // we want 1/1000th
+
+ std::string s8b("1:22:33.123456789321"); // too many digits
+ time_duration td8b= boost::date_time::parse_delimited_time_duration<time_duration>(s8b);
+ check("parse time duration: " + s8b,
+ td8b == time_duration(1,22,33,123456789)); // excess digits should be dropped
+ }
+ {
+
+ std::string s3("12:11:10");
+ time_duration td3= boost::date_time::parse_delimited_time_duration<time_duration>(s3);
+ check("parse time duration: " + s3,
+ td3 == time_duration(12,11,10,0));
+ std::string s4("23:59:59.000001");
+ time_duration td4= boost::date_time::parse_delimited_time_duration<time_duration>(s4);
+ check("parse time duration: " + s4,
+ td4 == time_duration(23,59,59)+microsec(1));
+ std::string s5("23:59:59.999999");
+ time_duration td5= boost::date_time::parse_delimited_time_duration<time_duration>(s5);
+ check("parse time duration: " + s5,
+ td5 == time_duration(23,59,59)+microsec(999999));
+ std::string s5b("-23:59:59.999999");
+ time_duration td5b= boost::date_time::parse_delimited_time_duration<time_duration>(s5b);
+ check("parse time duration: " + s5b,
+ td5b == time_duration(-23,59,59)-microsec(999999));
+
+ std::string s6b("1:00:00.1"); // we want 1/10th
+ time_duration td6b= boost::date_time::parse_delimited_time_duration<time_duration>(s6b);
+ check("parse time duration: " + s6b,
+ td6b == time_duration(1,0,0)+microsec(100000)); // we want 1/10th
+
+ std::string s7b("-1:00:00.0010"); // we want 1/1000th
+ time_duration td7b= boost::date_time::parse_delimited_time_duration<time_duration>(s7b);
+ check("parse time duration: " + s7b,
+ td7b == time_duration(-1,0,0)-microsec(1000)); // we want 1/1000th
+
+ }
+
+ {
+ std::string ts2("2002-12-31 00:00:00.999999999");
+ ptime t2 = time_from_string(ts2);
+ check("parse time: " + ts2,
+ t2 == ptime(date(2002,12,31),time_duration(0,0,0)+nanosec(999999999)));
+ }
+ {
+ std::string ts2("2002-12-31 00:00:00.");
+ ptime t2 = time_from_string(ts2);
+ check("parse time (decimal but no digits): " + ts2,
+ t2 == ptime(date(2002,12,31),time_duration(0,0,0)));
+ }
+#endif
+
+ if (time_duration::resolution() != boost::date_time::nano)
+ {
+
+ std::string s1("12:11:10.123456");
+ time_duration td1= duration_from_string(s1);
+ check("parse time duration: " + s1,
+ td1 == time_duration(12,11,10,123456));
+ std::cout << "td1: " << td1 << std::endl;
+
+ std::string s2("12:11:10,123456");
+ time_duration td2= boost::date_time::parse_delimited_time_duration<time_duration>(s2);
+ check("parse time duration: " + s2,
+ td2 == time_duration(12,11,10,123456));
+ std::cout << "td2: " << td2 << std::endl;
+
+ //truncate for non-nanosecond case
+ std::string s8b("1:22:33.123456321"); // too many digits
+ time_duration td8b= boost::date_time::parse_delimited_time_duration<time_duration>(s8b);
+ check("parse time duration: " + s8b,
+ td8b == time_duration(1,22,33,123456)); // excess digits should be dropped
+ }
+
+
+ std::string date_1, tod_1;
+ std::string ts1("2002-01-20 23:59:59.000");
+ boost::date_time::split(ts1, ' ', date_1, tod_1);
+ check("split function date part of " + ts1,
+ date_1 == std::string("2002-01-20"));
+ check("time part of " + ts1,
+ tod_1 == std::string("23:59:59.000"));
+// std::cout << date_1 << "|" << std::endl;
+// std::cout << tod_1 << "|" << std::endl;
+
+
+ {
+ ptime t1 = time_from_string(ts1);
+ check("parse time: " + ts1,
+ t1 == ptime(date(2002,1,20),time_duration(23,59,59)));
+ }
+ {
+ std::string ts1x("2002-01-20 23:59:59.");
+ ptime t1 = time_from_string(ts1x);
+ check("parse time (decimal but no digits): " + ts1x,
+ t1 == ptime(date(2002,1,20),time_duration(23,59,59)));
+ }
+
+ std::string s6("235859");
+ time_duration td6= boost::date_time::parse_undelimited_time_duration<time_duration>(s6);
+ check("parse time duration: " + s6,
+ td6 == time_duration(23,58,59));
+
+ s6 = "-235859";
+ td6= boost::date_time::parse_undelimited_time_duration<time_duration>(s6);
+ check("parse negative time duration: " + s6,
+ td6 == time_duration(-23,58,59));
+
+ {
+ std::string ts3("20020120T235859");
+ ptime t20 = from_iso_string(ts3);
+ check("parse iso time: " + ts3,
+ t20 == ptime(date(2002,1,20),time_duration(23,58,59)));
+ }
+
+ {
+ std::string ts4("19001231T000000");
+ ptime t21 = from_iso_string(ts4);
+ check("parse iso time: " + ts4,
+ t21 == ptime(date(1900,12,31),time_duration(0,0,0)));
+ }
+
+ {
+ std::string ts5("19001231T23");
+ ptime t22 = from_iso_string(ts5);
+ check("parse iso time: " + ts5,
+ t22 == ptime(date(1900,12,31),time_duration(23,0,0)));
+ }
+
+ {
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ std::string ts3("20020120T235859.123456789");
+ ptime t20 = from_iso_string(ts3);
+ check("parse iso time w/ frac sec: " + ts3,
+ t20 == ptime(date(2002,1,20),time_duration(23,58,59,123456789)));
+
+ std::string ts4("19001231T000000.123");
+ ptime t21 = from_iso_string(ts4);
+ check("parse iso time w/ frac sec (too short): " + ts4,
+ t21 == ptime(date(1900,12,31),time_duration(0,0,0,123000000)));
+
+ std::string ts5("19001231T230000.123456789876");
+ ptime t22 = from_iso_string(ts5);
+ check("parse iso time w/ frac sec (too long): " + ts5,
+ t22 == ptime(date(1900,12,31),time_duration(23,0,0,123456789)));
+
+ std::string ts6("19001231T230000.");
+ ptime t23 = from_iso_string(ts6);
+ check("parse iso time w/ frac sec (dec only): " + ts6,
+ t23 == ptime(date(1900,12,31),time_duration(23,0,0,0)));
+
+ std::string ts7("2002-01-20T23:58:59.123456789");
+ ptime t24 = from_iso_extended_string(ts7);
+ check("parse iso extended time w/ frac sec: " + ts7,
+ t24 == ptime(date(2002,1,20),time_duration(23,58,59,123456789)));
+
+ std::string ts8("1900-12-31T00:00:00.123");
+ ptime t25 = from_iso_extended_string(ts8);
+ check("parse iso extended time w/ frac sec (too short): " + ts8,
+ t25 == ptime(date(1900,12,31),time_duration(0,0,0,123000000)));
+
+ std::string ts9("1900-12-31T23:00:00.123456789876");
+ ptime t26 = from_iso_extended_string(ts9);
+ check("parse iso extended time w/ frac sec (too long): " + ts9,
+ t26 == ptime(date(1900,12,31),time_duration(23,0,0,123456789)));
+
+ std::string ts10("1900-12-31T23:00:00.");
+ ptime t27 = from_iso_extended_string(ts10);
+ check("parse iso extended time w/ frac sec (dec only): " + ts10,
+ t27 == ptime(date(1900,12,31),time_duration(23,0,0,0)));
+#else
+ std::string ts3("20020120T235859.123456");
+ ptime t20 = from_iso_string(ts3);
+ check("parse iso time w/ frac sec: " + ts3,
+ t20 == ptime(date(2002,1,20),time_duration(23,58,59,123456)));
+
+ std::string ts4("19001231T000000.123");
+ ptime t21 = from_iso_string(ts4);
+ check("parse iso time w/ frac sec (too short): " + ts4,
+ t21 == ptime(date(1900,12,31),time_duration(0,0,0,123000)));
+
+ std::string ts5("19001231T230000.123456789876");
+ ptime t22 = from_iso_string(ts5);
+ check("parse iso time w/ frac sec (too long): " + ts5,
+ t22 == ptime(date(1900,12,31),time_duration(23,0,0,123456)));
+
+ std::string ts6("19001231T230000.");
+ ptime t23 = from_iso_string(ts6);
+ check("parse iso time w/ frac sec (dec only): " + ts6,
+ t23 == ptime(date(1900,12,31),time_duration(23,0,0,0)));
+
+ std::string ts7("2002-01-20T23:58:59.123456");
+ ptime t24 = from_iso_extended_string(ts7);
+ check("parse iso extended time w/ frac sec: " + ts7,
+ t24 == ptime(date(2002,1,20),time_duration(23,58,59,123456)));
+
+ std::string ts8("1900-12-31T00:00:00.123");
+ ptime t25 = from_iso_extended_string(ts8);
+ check("parse iso extended time w/ frac sec (too short): " + ts8,
+ t25 == ptime(date(1900,12,31),time_duration(0,0,0,123000)));
+
+ std::string ts9("1900-12-31T23:00:00.123456789876");
+ ptime t26 = from_iso_extended_string(ts9);
+ check("parse iso extended time w/ frac sec (too long): " + ts9,
+ t26 == ptime(date(1900,12,31),time_duration(23,0,0,123456)));
+
+ std::string ts10("1900-12-31T23:00:00.");
+ ptime t27 = from_iso_extended_string(ts10);
+ check("parse iso extended time w/ frac sec (dec only): " + ts10,
+ t27 == ptime(date(1900,12,31),time_duration(23,0,0,0)));
+#endif // BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ }
+
+ std::string s7("-01:25:00"), s8("-00:40:00"), s9("0:45"), s10("0:-40");
+ time_duration tds1 = duration_from_string(s7);
+ time_duration tds2 = duration_from_string(s8);
+ time_duration tds3 = duration_from_string(s9);
+ time_duration tds4 = duration_from_string(s10);
+ check("from string construct", tds1 == time_duration(-1,25,0));
+ check("from string construct", tds2 == minutes(-40));
+ check("from string construct", tds3 == minutes(45));
+ // '-' in middle of string s10 should be ignored resulting in pos duration
+ check("from string construct", tds4 == minutes(40));
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testperiod.cpp b/src/boost/libs/date_time/test/posix_time/testperiod.cpp
new file mode 100644
index 000000000..211412e60
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testperiod.cpp
@@ -0,0 +1,22 @@
+/* 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 <iostream>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/posix_time/time_period.hpp"
+#include "../testfrmwk.hpp"
+
+int main()
+{
+
+ //FILE OBSOLETE: replace by testtime_period.cpp
+
+ return 1;
+ // return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/teststreams.cpp b/src/boost/libs/date_time/test/posix_time/teststreams.cpp
new file mode 100644
index 000000000..c772faebe
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/teststreams.cpp
@@ -0,0 +1,179 @@
+/* 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, Bart Garst
+ */
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "../testfrmwk.hpp"
+
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+
+const char* const de_short_month_names[]={"Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez", "NAM"};
+
+const char* const de_long_month_names[]={"Januar","Februar","Marz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember","NichtDerMonat"};
+const char* const de_special_value_names[]={"NichtDatumzeit","-unbegrenztheit", "+unbegrenztheit"};
+
+const char* const de_short_weekday_names[]={"Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"};
+
+const char* const de_long_weekday_names[]={"Sonntag", "Montag", "Dienstag","Mittwoch", "Donnerstag", "Freitag", "Samstag"};
+
+#endif
+
+int
+main()
+{
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ std::stringstream ss;
+ date d1(2002,May,1);
+ ptime t1(d1, hours(12)+minutes(10)+seconds(5));
+ time_duration td0(12,10,5,123);
+ ptime t0(d1, td0);
+ ss << t0;
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ check("check time output: "+ss.str(),
+ ss.str() == std::string("2002-May-01 12:10:05.000000123"));
+#else
+ check("check time output: "+ss.str(),
+ ss.str() == std::string("2002-May-01 12:10:05.000123"));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ // ss.imbue(global);
+ time_period tp(t1, ptime(d1, hours(23)+time_duration::unit()));
+ ss.str("");
+ ss << tp;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("[2002-May-01 12:10:05/2002-May-01 23:00:00]"));
+
+ //Send out the same time with german
+ typedef boost::date_time::all_date_names_put<greg_facet_config> date_facet;
+
+ ss.imbue(std::locale(std::locale::classic(),
+ new date_facet(de_short_month_names,
+ de_long_month_names,
+ de_special_value_names,
+ de_short_weekday_names,
+ de_long_weekday_names,
+ '.',
+ boost::date_time::ymd_order_dmy,
+ boost::date_time::month_as_short_string)));
+ ss.str("");
+ ss << t1;
+ check("check time output: "+ ss.str(),
+ ss.str() == std::string("01.Mai.2002 12:10:05"));
+
+
+ time_duration td(5,4,3);
+ time_duration td1(-1,25,0), td2(0,-40,0);
+ ss.str("");
+ ss << td;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("05:04:03"));
+ ss.str("");
+ ss << td1;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("-01:25:00"));
+ ss.str("");
+ ss << td2;
+ check("check time period output: "+ ss.str(),
+ ss.str() == std::string("-00:40:00"));
+
+
+ ss.str("");
+ ss << tp;
+ check("check time period output - german: "+ ss.str(),
+ ss.str() == std::string("[01.Mai.2002 12:10:05/01.Mai.2002 23:00:00]"));
+
+ /* Input streaming is only available for compilers that
+ * do not have BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS defined */
+#ifndef BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
+
+ /****** test streaming in for time classes ******/
+ {
+ std::istringstream iss("01:02:03.000004 garbage");
+ iss >> td;
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ check("Stream in time_duration", td == time_duration(1,2,3,4000));
+#else
+ check("Stream in time_duration", td == time_duration(1,2,3,4));
+#endif
+ }
+#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) // vc6 & vc7
+ {
+ std::istringstream iss("2003-May-13 01:02:03");
+ iss >> t1;
+ check("Stream in ptime", t1 == ptime(date(2003,May,13), time_duration(1,2,3)));
+ std::istringstream iss2("2003-January-13 01:02:03");
+ iss2 >> t1;
+ check("Stream in ptime2", t1 == ptime(date(2003,Jan,13), time_duration(1,2,3)));
+ std::istringstream iss3("2003-feb-13 11:10:09");
+ iss3 >> t1;
+ check("Stream in ptime3", t1 == ptime(date(2003,Feb,13), time_duration(11,10,9)));
+
+ try {
+ std::istringstream iss4("2003-xxx-13 11:10:09");
+ iss3 >> t1;
+ check("Stream bad ptime", false); //never reach here, bad month exception
+ }
+ catch(std::exception& e) {
+ std::cout << "Got expected exception: " << e.what() << std::endl;
+ check("Stream bad ptime", true);
+ }
+
+ }
+ {
+ date d1x(2001,Aug,1), d2x(2003,May,13);
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ time_duration td1x(15,32,18,20304000), td2x(1,2,3);
+#else
+ time_duration td1x(15,32,18,20304), td2x(1,2,3);
+#endif
+
+ time_period result(ptime(d1x,td1x), ptime(d2x,td2x));
+ std::istringstream iss("[2001-Aug-01 15:32:18.020304/2003-May-13 01:02:03]");
+ iss >> tp;
+ check("Stream in time_period", tp == result);
+ }
+
+#if !defined(BOOST_NO_STD_WSTRING)
+ /*** wide streaming ***/
+ {
+ std::wistringstream wiss1(L"01:02:03");//.000004");
+ wiss1 >> td;
+ check("Wide stream in time_duration", td == time_duration(1,2,3));
+
+ std::wistringstream wiss2(L"2003-May-23 03:20:10");
+ wiss2 >> t1;
+ check("Wide stream in ptime", t1 == ptime(date(2003,May,23), time_duration(3,20,10)));
+
+ std::wistringstream wiss3(L"[2004-Jan-01 02:03:04/2004-May-13 01:00:00]");
+ wiss3 >> tp;
+ date d1x = date(2004,Jan,1);
+ date d2x = date(2004,May,13);
+ time_duration td1x = time_duration(2,3,4);
+ time_duration td2x = time_duration(1,0,0);
+ time_period result = time_period(ptime(d1x,td1x), ptime(d2x,td2x));
+ check("Wide stream in time_period", tp == result);
+ }
+#else
+ check("Wide streaming not available for this compiler", false);
+#endif // BOOST_NO_STD_WSTRING
+
+#else // BOOST_NO_STD_ITERATOR_TRAITS
+ check("Streaming in of alphabetic dates (Ex: 2003-Aug-21) \
+ not supported by this compiler", false);
+#endif // BOOST_NO_STD_ITERATOR_TRAITS
+
+#else // BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
+ check("Streaming in of time classes not supported by this compiler", false);
+#endif // BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
+
+#else //BOOST_DATE_TIME_NO_LOCALE
+ check("No tests executed - Locales not supported by this compiler", false);
+#endif //BOOST_DATE_TIME_NO_LOCALE
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testtime.cpp b/src/boost/libs/date_time/test/posix_time/testtime.cpp
new file mode 100644
index 000000000..f66c8692c
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime.cpp
@@ -0,0 +1,336 @@
+/* Copyright (c) 2002,2003,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
+ */
+
+#include <iostream>
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+void special_values_tests()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ time_duration td_pi(pos_infin), td_ni(neg_infin), td_ndt(not_a_date_time);
+ date_duration dd_pi(pos_infin), dd_ni(neg_infin), dd_ndt(not_a_date_time);
+ date d_pi(pos_infin), d_ni(neg_infin), d_ndt(not_a_date_time);
+ time_duration td(1,2,3,4);
+ date_duration dd(1234);
+ date d(2003,Oct,31);
+
+#if !defined(DATE_TIME_NO_DEFAULT_CONSTRUCTOR)
+ { // default constructor
+ ptime def;
+ check("Default constructor", def == ptime(not_a_date_time));
+ }
+#endif // DATE_TIME_NO_DEFAULT_CONSTRUCTOR
+
+ { // special values construction tests
+ ptime p_sv1(pos_infin);
+ std::string s("+infinity");
+ check("from special value +infinity", to_simple_string(p_sv1) == s);
+ ptime result = p_sv1 + dd;
+ check("Special value (pos infin) + date_duration = +infinity", to_iso_extended_string(result) == s);
+ check("is_special function - pos infin", result.is_special());
+ result = p_sv1 - dd;
+ check("Special value (pos infin) - date_duration = +infinity", to_iso_extended_string(result) == s);
+ result = p_sv1 - dd_ni;
+ check("Special value (pos infin) - date_duration (neg infin) = +infinity", to_iso_extended_string(result) == s);
+ ptime p_sv2(neg_infin);
+ s = "-infinity";
+ check("from special value -infinity", to_iso_string(p_sv2) == s);
+ result = p_sv2 - td_pi;
+ check("Special value (neg infin) - special time_duration (pos infin) = -infinity", to_iso_extended_string(result) == s);
+ ptime p_sv3(not_a_date_time);
+ check("is_special function - not_a_date_time", p_sv3.is_special());
+ s = "not-a-date-time";
+ check("from special value NADT", to_iso_extended_string(p_sv3) == s);
+ result = p_sv3 + td;
+ check("Special value (NADT) + time_duration = NADT", to_iso_extended_string(result) == s);
+ result = p_sv3 - td;
+ check("Special value (NADT) - time_duration = NADT", to_iso_extended_string(result) == s);
+ result = p_sv2 + td_pi;
+ check("Special value (neg infin) + special time_duration (pos infin) = NADT", to_iso_extended_string(result) == s);
+ result = p_sv1 + dd_ni;
+ check("Special value (pos infin) + date_duration (neg infin) = NADT", to_iso_extended_string(result) == s);
+ result = p_sv1 + dd_ndt;
+ check("Special value (pos infin) - date_duration (NADT) = NADT", to_iso_extended_string(result) == s);
+ }
+ { // special values construction tests
+ ptime p_sv1(d_pi, td);
+ std::string s("+infinity");
+ check("duration & special_date", to_simple_string(p_sv1) == s);
+ ptime p_sv2(d_ni, td);
+ s = "-infinity";
+ check("duration & special_date", to_iso_string(p_sv2) == s);
+ ptime p_sv3(d_ndt, td);
+ s = "not-a-date-time";
+ check("duration & special_date", to_iso_extended_string(p_sv3) == s);
+ }
+ { // special values construction tests
+ ptime p_sv1(d_ndt, td);
+ std::string s("not-a-date-time");
+ check("NADT & duration", to_simple_string(p_sv1) == s);
+ ptime p_sv2(d, td_ndt);
+ check("date & NADT", to_iso_string(p_sv2) == s);
+ ptime p_sv3(d_pi, td_ni);
+ check("+infinity_date & -infinity_duration",
+ to_iso_extended_string(p_sv3) == s);
+
+ }
+ { // special values tests
+ ptime p_sv1(d, td_pi), pt(d,td);
+ std::string s("+infinity");
+ check("special_duration & date", to_simple_string(p_sv1) == s);
+ check("ptime::date() +infinity", to_simple_string(p_sv1.date()) == s);
+ ptime p_sv2(d, td_ni);
+ s = "-infinity";
+ check("special_duration & date", to_iso_string(p_sv2) == s);
+ check("ptime::time_of_day() -infinity",
+ to_simple_string(p_sv2.time_of_day()) == s);
+ ptime p_sv3(d, td_ndt);
+ s = "not-a-date-time";
+ check("special_duration & date", to_iso_extended_string(p_sv3) == s);
+ check("ptime::date() - NADT", to_simple_string(p_sv3.date()) == s);
+ check("ptime::time_of_day() - NADT",
+ to_simple_string(p_sv3.time_of_day()) == s);
+ check("-infinity less than ...", p_sv2 < p_sv1);
+ check("-infinity less than ...", p_sv2 < pt);
+ check("+infinity greater than ...", pt < p_sv1);
+ check("-infinity less than equal to ...", p_sv2 <= p_sv2);
+ check("-infinity less than equal to ...", p_sv2 <= pt);
+ check("+infinity greater than equal to ...", p_sv1 >= pt);
+ check("not equal", p_sv1 != p_sv2);
+ check("not equal", p_sv3 != p_sv2);
+ check("not equal", pt != p_sv1);
+
+ check("is_pos_infinity", p_sv1.is_infinity() && p_sv1.is_pos_infinity());
+ check("is_neg_infinity", p_sv2.is_infinity() && p_sv2.is_neg_infinity());
+ check("is_not_a_date_time", !p_sv3.is_infinity() && p_sv3.is_not_a_date_time());
+
+ check("special_ptime + date_duration", p_sv1 + dd == p_sv1);
+ check("ptime - special_date_duration", pt - dd_pi == p_sv2);
+ check("ptime - special_date_duration", pt - dd_ndt == p_sv3);
+
+ check("special_ptime + time_duration", p_sv2 + td == p_sv2);
+ check("special_ptime - time_duration", pt - td_ni == p_sv1);
+ check("ptime + special_time_duration", pt + td_ndt == p_sv3);
+ check("ptime - special_ptime", pt - p_sv1 == td_ni);
+ check("ptime - special_ptime", pt - p_sv2 == td_pi);
+ check("ptime - special_ptime", pt - p_sv3 == td_ndt);
+ check("special_ptime - special_ptime", p_sv2 - p_sv2 == td_ndt);
+ }
+}
+
+int
+main()
+{
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+
+ date d(2001,Dec,1);
+ time_duration td(5,4,3);
+ ptime t1(d, td); //2001-Dec-1 05:04:03
+ check("date part check", t1.date() == d);
+ check("time part check", t1.time_of_day() == td);
+ check("ptime with more than 24 hours", ptime(date(2005,10,30), hours(25)) == ptime(date(2005,10,31),hours(1)));
+ ptime t2(t1); //copy constructor
+ ptime t3 = t2; //assignment
+ check("date part check", t3.date() == d);
+ check("time part check", t3.time_of_day() == td);
+ check("equality", t1 == t3);
+ date d2(2001,Jan,1);
+ ptime t4(d2, td); //2001-Jan-1 05:04:03
+ check("equality - not equal", !(t1 == t4));
+ time_duration td1(5,4,0);
+ ptime t5(d, td1); //2001-Dec-1 05:04:00
+ check("equality - not equal", !(t1 == t5));
+ check("not equal - not equal", t1 != t5);
+
+ check("less - not less", !(t1 < t1));
+ check("less - less", t4 < t1);
+ check("less - less", t5 < t1);
+ check("less equal - equal", t1 <= t1);
+ check("greater equal - equal", t1 >= t1);
+
+ date_duration twodays(2);
+ ptime t6 = t1 + twodays;
+ date d3(2001,Dec,3);
+ check("operator+(date_duration)", t6 == ptime(d3,td));
+ ptime t7 = t1 - twodays;
+ check("operator-(date_duration)", t7 == ptime(date(2001,Nov,29),td));
+ {
+ ptime t6b(date(2003,Oct,31),time_duration(10,0,0,0));
+ t6b += date_duration(55);
+ check("operator +=(date_duration)", t6b ==
+ ptime(date(2003,Dec,25), time_duration(10,0,0,0)));
+ t6b += hours(6);
+ check("operator +=(time_duration)", t6b ==
+ ptime(date(2003,Dec,25), time_duration(16,0,0,0)));
+ t6b -= date_duration(55);
+ check("operator -=(date_duration)", t6b ==
+ ptime(date(2003,Oct,31), time_duration(16,0,0,0)));
+ t6b -= hours(6);
+ check("operator -=(time_duration)", t6b ==
+ ptime(date(2003,Oct,31), time_duration(10,0,0,0)));
+ t6b += hours(25);
+ check("operator +=(time_duration, more than 24 hours)", t6b ==
+ ptime(date(2003,Nov,1), time_duration(11,0,0,0)));
+ t6b -= hours(49);
+ check("operator -=(time_duration, more than 48 hours)", t6b ==
+ ptime(date(2003,Oct,30), time_duration(10,0,0,0)));
+ }
+ time_duration td2(1,2,3);
+ ptime t8(date(2001,Dec,1)); //midnight
+ ptime t9 = t8 + td2; //Dec 2 at 01:02:03
+ ptime t10(date(2001,Dec,1),time_duration(1,2,3));
+ std::cout << to_simple_string(t9) << std::endl;
+ std::cout << to_simple_string(t10) << std::endl;
+ std::cout << to_simple_string(td2) << std::endl;
+ check("add 2001-Dec-01 0:0:0 + 01:02:03", t9 == t10);
+ {
+ ptime t9x(date(2001,Dec,1), time_duration(12,0,0)); //Dec 1 at Noon
+ time_duration td3(-4,0,0);
+ check("add 2001-Dec-01 12:00:00 + (-04:00:00)",
+ t9x+td3 == ptime(date(2001,Dec,1), time_duration(8,0,0)) );
+ std::cout << to_simple_string(t9x-td3) << std::endl;
+ }
+ time_duration td3(24,0,0); // a day
+ check("add 2001-Dec-01 0:0:0 + 24:00:00", t8+td3 == ptime(date(2001,Dec,2)));
+ time_duration td4(24,0,1); // a day, 1 second
+ check("add 2001-Dec-01 0:0:0 + 24:00:01", t8+td4
+ == ptime(date(2001,Dec,2), time_duration(0,0,1)));
+ //looks like this fails b/c limits are exceeded now that we have subseconds..
+ time_duration td5(168,0,1); //one week 24X7
+ check("add 2001-Dec-01 0:0:0 + 168:00:01", t8+td5
+ == ptime(date(2001,Dec,8), time_duration(0,0,1)));
+
+ // ptime t10a = t8+td5;
+ // std::cout << to_simple_string(t10a) << std::endl;
+
+ //Subtraction of time duration -- add more!!
+ ptime t11(date(2001,Dec,1), time_duration(12,0,0)); //noon
+ time_duration td6(12,0,1);
+ ptime t12 = t11-td6;
+ check("sub 2001-Dec-01 12:0:0 - 12:00:01",
+ t12 == ptime(date(2001,Nov,30), time_duration(23,59,59)));
+
+ check("sub 2001-Dec-01 12:0:0 - 13:00:00",
+ (t11-time_duration(13,0,0))== ptime(date(2001,Nov,30),
+ time_duration(23,0,0)));
+ check("sub 2001-Dec-01 12:0:0 - (-13:00:00)",
+ (t11-time_duration(-13,0,0))== ptime(date(2001,Dec,2),
+ time_duration(1,0,0)));
+ // std::cout << to_simple_string(t12.date()) << std::endl;
+
+ ptime t13(d, hours(3));
+ ptime t14(d, hours(4));
+ ptime t14a(d+date_duration(1), hours(4));
+ //Subtract 2 times
+ std::cout << to_simple_string(t14-t13) << std::endl;
+ // time_duration td7 =
+ check("time subtraction positive result",
+ t14-t13 == hours(1));
+ std::cout << to_simple_string(t13-t14) << std::endl;
+ check("time subtraction negative result",
+ t13-t14 == hours(-1));
+ check("time subtraction positive result",
+ t14a-t14 == hours(24));
+
+
+ ptime t15(d, time_duration(0,0,0,1));
+ ptime t16(d, time_duration(0,0,0,2));
+ check("time subsecond add test",
+ t15 + time_duration::unit() == t16);
+ check("time subsecond sub test",
+ t16 - time_duration::unit() == t15);
+
+ ptime t17 = ptime(d) - time_duration::unit();
+ std::cout << to_simple_string(t17) << std::endl;
+
+ ptime t18(d, hours(25));
+ std::cout << to_simple_string(t18) << std::endl;
+
+ //time_t conversions:
+ t18 = from_time_t(0); //1970-1-1 0:0:0
+ check("time_t conversion of 0", t18 == ptime(date(1970,1,1)));
+ check("time_t conversion from 0", to_time_t(t18) == 0);
+
+ std::time_t tt(500000000);
+ t18 = from_time_t(tt); //1985-11-5 0:53:20
+ check("time_t conversion of 500000000",
+ t18 == ptime(date(1985,11,5), time_duration(0,53,20)));
+ check("time_t conversion from 500000000", to_time_t(t18) == tt);
+
+ std::time_t tt1(1060483634);
+ t18 = from_time_t(tt1); //2003-08-10 2:47:14
+ check("time_t conversion of 1060483634",
+ t18 == ptime(date(2003,8,10), time_duration(2,47,14)));
+ check("time_t conversion from 1060483634", to_time_t(t18) == tt1);
+
+ std::time_t tt2(1760483634);
+ t18 = from_time_t(tt2); //2025-10-14 23:13:54
+ check("time_t conversion of 1760483634",
+ t18 == ptime(date(2025,10,14), time_duration(23,13,54)));
+ check("time_t conversion from 1760483634", to_time_t(t18) == tt2);
+
+ std::time_t tt3(1960483634);
+ t18 = from_time_t(tt3); //2032-2-15 18:47:14
+ check("time_t conversion of 1960483634",
+ t18 == ptime(date(2032,2,15), time_duration(18,47,14)));
+ check("time_t conversion from 1960483634", to_time_t(t18) == tt3);
+
+ special_values_tests();
+
+ //min and max constructors
+ ptime min_ptime(min_date_time);
+ check("check min time constructor", min_ptime == ptime(date(1400,1,1), time_duration(0,0,0,0)));
+ // std::cout << min_ptime << std::endl;
+ ptime max_ptime(max_date_time);
+ check("check max time constructor", max_ptime == ptime(date(9999,12,31),
+ hours(24)-time_duration::unit()));
+ // std::cout << max_ptime << std::endl;
+
+ //tm conversion checks
+ //converts to date and back -- should get same result -- note no fractional seconds in these times
+ check("tm conversion functions 2001-12-1 05:04:03", ptime_from_tm(to_tm(t1)) == t1);
+ check("tm conversion functions min date 1400-1-1 ", ptime_from_tm(to_tm(min_ptime)) == min_ptime);
+ //this conversion will drop fractional seconds
+ check("tm conversion functions max date 9999-12-31 23:59:59.9999 - truncated frac seconds",
+ ptime_from_tm(to_tm(max_ptime)) == ptime(date(max_date_time), time_duration(23,59,59)));
+
+ try{
+ ptime pt(pos_infin);
+ tm pt_tm = to_tm(pt);
+ check("Exception not thrown (special_value to_tm)", false);
+ //following code does nothing useful but stops compiler from complaining about unused pt_tm
+ std::cout << pt_tm.tm_sec << std::endl;
+ }catch(std::out_of_range&){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+ try{
+ // exception is only thrown from gregorian::to_tm. Needed to
+ // be sure it always gets thrown.
+ ptime pt(date(2002,Oct,31), hours(1));
+ pt += time_duration(pos_infin);
+ tm pt_tm = to_tm(pt);
+ check("Exception not thrown (special_value to_tm)", false);
+ //following code does nothing useful but stops compiler from complaining about unused pt_tm
+ std::cout << pt_tm.tm_sec << std::endl;
+ }catch(std::out_of_range&){
+ check("Caught expected exception (special_value to_tm)", true);
+ }catch(...){
+ check("Caught un-expected exception (special_value to_tm)", false);
+ }
+
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testtime_facet.cpp b/src/boost/libs/date_time/test/posix_time/testtime_facet.cpp
new file mode 100644
index 000000000..f912f8d73
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime_facet.cpp
@@ -0,0 +1,458 @@
+
+/* 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$
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#include <fstream>
+#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);
+}
+
+
+#if !defined(BOOST_NO_STD_WSTRING)
+static const wchar_t* long_month_names[] =
+ {L"Januar",L"Februar",L"Marz",L"April",L"Mai",L"Juni",L"Juli",L"August",
+ L"September",L"Oktober",L"November",L"Dezember"};
+static const wchar_t* short_month_names[]=
+ {L"Jan",L"Feb",L"Mar",L"Apr",L"Mai",L"Jun",L"Jul",L"Aug",
+ L"Sep",L"Okt",L"Nov",L"Dez"};
+
+std::vector<std::basic_string<wchar_t> > de_short_month_names;
+std::vector<std::basic_string<wchar_t> > de_long_month_names;
+#endif //
+
+int main() {
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+
+ try {
+ date d(2004,Oct,13);
+ date min_date(min_date_time);
+ date max_date(max_date_time);
+
+ date_period dp(d, d + date_duration(7));
+ ptime t(d, time_duration(18,01,56));
+ ptime tf = t + microseconds(3);
+ time_period tp(t, tf + days(7) + time_duration(1,1,1));
+ time_duration td = hours(3) + minutes(2) + seconds(1) + milliseconds(9);
+ time_duration longer_td = hours(10) + minutes(22) + seconds(15) + milliseconds(980); // two characters in hours
+ time_duration long_td = hours(300) + minutes(2) + seconds(1) + milliseconds(9); // more than two characters in hours
+ {
+ std::stringstream ss;
+ ss << t;
+ check("Stream and to_string formats match (ptime)",
+ to_simple_string(t) == ss.str());
+ std::cout << t << ' ' << td << std::endl;
+ ss.str("");
+ ss << tf;
+ check("Stream and to_string formats match (ptime w/ fracsec)",
+ to_simple_string(tf) == ss.str());
+ ss.str("");
+ ss << tp;
+ check("Stream and to_string formats match (time_period)",
+ to_simple_string(tp) == ss.str());
+ ss.str("");
+ ss << td;
+ check("Stream and to_string formats match (time_duration)",
+ to_simple_string(td) == ss.str());
+ std::cout << ss.str() << std::endl;
+
+ time_facet* f = new time_facet();
+ ss.imbue(std::locale(ss.getloc(), f));
+ ss.str("");
+
+ f->format("%Y-%b-%d %H:%M:%S %%d");
+ f->time_duration_format("%H:%M:%S %%S");
+ ss << t;
+ check("Literal '%' in format", ss.str() == std::string("2004-Oct-13 18:01:56 %d"));
+ ss.str("");
+ ss << td;
+ check("Literal '%' in time_duration format", ss.str() == std::string("03:02:01 %S"));
+ ss.str("");
+ f->format("%Y-%b-%d %H:%M:%S %%%d");
+ f->time_duration_format("%H:%M:%S %%%S");
+ ss << t;
+ check("Multiple literal '%'s in format", ss.str() == std::string("2004-Oct-13 18:01:56 %13"));
+ ss.str("");
+ ss << td;
+ check("Multiple literal '%'s in time_duration format", ss.str() == std::string("03:02:01 %01"));
+ ss.str("");
+
+ // Longer time durations
+ f->time_duration_format("%H:%M:%S");
+ ss << longer_td;
+ check("Longer time durations", ss.str() == std::string("10:22:15"));
+ ss.str("");
+
+ // Long time durations
+ f->time_duration_format("%O:%M:%S");
+ ss << long_td;
+ check("Long time durations", ss.str() == std::string("300:02:01"));
+ ss.str("");
+
+ // Short-hand format specifiers
+ f->format("%T");
+ f->time_duration_format("%T");
+ ss << t;
+ check("Short-hand '%T' in time format", ss.str() == std::string("18:01:56"));
+ ss.str("");
+ ss << td;
+ check("Short-hand '%T' in time_duration format", ss.str() == std::string("03:02:01"));
+ ss.str("");
+
+ f->format("%R");
+ f->time_duration_format("%R");
+ ss << t;
+ check("Short-hand '%R' in time format", ss.str() == std::string("18:01"));
+ ss.str("");
+ ss << td;
+ check("Short-hand '%R' in time_duration format", ss.str() == std::string("03:02"));
+ ss.str("");
+ }
+ { // negative time_duration tests
+ std::string result;
+ std::stringstream ss;
+ time_duration td1(2,0,0);
+ time_duration td2(1,0,0);
+ ss << td2 - td1;
+ result = "-01:00:00";
+ check("Negative time_duration", result == ss.str());
+ ss.str("");
+
+ time_duration td3(0,2,0);
+ time_duration td4(0,1,0);
+ ss << td4 - td3;
+ result = "-00:01:00";
+ check("Negative time_duration", result == ss.str());
+ ss.str("");
+
+ time_duration td5(0,0,2);
+ time_duration td6(0,0,1);
+ ss << td6 - td5;
+ result = "-00:00:01";
+ check("Negative time_duration", result == ss.str());
+ ss.str("");
+
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ result = "-00:00:00.000000001";
+#else
+ result = "-00:00:00.000001";
+#endif
+ time_duration td7(0,0,0,123);
+ time_duration td8(0,0,0,122);
+ ss << td8 - td7;
+ check("Negative time_duration: " + ss.str(), result == ss.str());
+
+ //reset the sign to always print
+ time_facet* f = new time_facet();
+ ss.imbue(std::locale(ss.getloc(), f));
+ f->time_duration_format("%+%H:%M:%S""%F");
+
+ ss.str("");
+ ss << td4 - td3;
+ result = "-00:01:00";
+ check("Negative time_duration sign always: " + ss.str(), result == ss.str());
+
+ ss.str("");
+ ss << td3 - td4;
+ result = "+00:01:00";
+ check("time_duration sign always: " + ss.str(), result == ss.str());
+
+
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ result = "-00:00:00.000000001";
+#else
+ result = "-00:00:00.000001";
+#endif
+ ss.str("");
+ ss << td8 - td7;
+ check("Negative time_duration: " + ss.str(), result == ss.str());
+
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ result = "+00:00:00.000000001";
+#else
+ result = "+00:00:00.000001";
+#endif
+ ss.str("");
+ ss << td7 - td8;
+ check("time_duration sign bit always: " + ss.str(), result == ss.str());
+
+ f->time_duration_format("%-%H hours and %-%M minutes");
+ ss.str("");
+ ss << td4 - td3;
+ result = "-00 hours and -01 minutes";
+ check("Negative time_duration two sign flags" + ss.str(), result == ss.str());
+ ss.str("");
+
+ // Longer time durations
+ f->time_duration_format("%-%H:%M:%S");
+ ss << -longer_td;
+ check("Longer negative time durations", ss.str() == std::string("-10:22:15"));
+ ss.str("");
+
+ // Long time durations
+ f->time_duration_format("%-%O:%M:%S");
+ ss << -long_td;
+ check("Long negative time durations", ss.str() == std::string("-300:02:01"));
+ ss.str("");
+ }
+
+ // The test verifies that #2698 is fixed. That is, the time and date facet should
+ // not dereference end() iterator for the format string in do_put_tm.
+ {
+ boost::gregorian::date date(2009, 1, 1);
+ boost::posix_time::time_duration tdx(0, 0, 0, 0);
+ boost::posix_time::ptime boost_time(date, tdx);
+ std::stringstream sstr;
+
+ boost::posix_time::time_facet* pFacet = new boost::posix_time::time_facet("");
+ sstr.imbue(std::locale(std::locale::classic(), pFacet));
+
+ sstr << boost_time;
+ }
+
+#if !defined(BOOST_NO_STD_WSTRING)
+ std::copy(&short_month_names[0],
+ &short_month_names[12],
+ std::back_inserter(de_short_month_names));
+
+ std::copy(&long_month_names[0],
+ &long_month_names[12],
+ std::back_inserter(de_long_month_names));
+
+
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+ teststreaming("widestream default classic time", t,
+ //std::wstring(L"Wed Oct 13 18:01:56 2004"),
+ std::wstring(L"10/13/04 18:01:56"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+ teststreaming("widestream default classic time with fractional seconds truncated", t,
+ //std::wstring(L"Wed Oct 13 18:01:56 2004"),
+ std::wstring(L"10/13/04 18:01:56"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+ teststreaming("widestream default time period with fractional seconds truncated", tp,
+ //std::wstring(L"[Wed Oct 13 18:01:56 2004/Wed Oct 20 19:02:57 2004]"),
+ std::wstring(L"[10/13/04 18:01:56/10/20/04 19:02:57]"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(L"%Y-%b-%d %I:%M:%S %p");
+ teststreaming("widestream time in 12 hours format w/ (AM/PM)", tp.begin(),
+ std::wstring(L"2004-Oct-13 06:01:56 PM"),
+ std::locale(std::locale::classic(), timefacet));
+ }
+ {
+ wtime_facet *timefacet = new wtime_facet(wtime_facet::standard_format);
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000000"),
+ std::locale(std::locale::classic(), timefacet));
+#else
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000"),
+ std::locale(std::locale::classic(), timefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000000"));
+#else
+ teststreaming("widestream time duration", td,
+ std::wstring(L"03:02:01.009000"));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+
+ //wtime_facet *timefacet = new wtime_facet();
+ //std::locale cloc = std::locale(std::locale::classic(), timefacet);
+ //ss.imbue(cloc);
+// ss << L"classic date: " << d << std::endl;
+// ss << L"classic dateperiod: " << dp << std::endl;
+ //ss << L"classic time: " << t << std::endl;
+ //ss << L"classic timefrac: " << tf << std::endl;
+ //ss << L"classic timeperiod: " << tp << std::endl;
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"day: %j date: %Y-%b-%d weekday: %A time: %H:%M:%s");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time facet narly format", t,
+ std::wstring(L"day: 287 date: 2004-Oct-13 weekday: Wednesday time: 18:01:56.000000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time facet narly format", t,
+ std::wstring(L"day: 287 date: 2004-Oct-13 weekday: Wednesday time: 18:01:56.000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif
+ }
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S,%f");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time fractional seconds: %Y-%b-%d %H:%M:%S,%f", t,
+ std::wstring(L"2004-Oct-13 18:01:56,000000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time fractional seconds: %Y-%b-%d %H:%M:%S,%f", t,
+ std::wstring(L"2004-Oct-13 18:01:56,000000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S");
+ teststreaming("widestream custom time no frac seconds: %Y-%b-%d %H:%M:%S", t,
+ std::wstring(L"2004-Oct-13 18:01:56"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S");
+ wtimefacet->short_month_names(de_short_month_names);
+ teststreaming("widestream custom time no frac seconds, german months: %Y-%b-%d %H:%M:%S", t,
+ std::wstring(L"2004-Okt-13 18:01:56"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet();
+ wtimefacet->format(L"%B %b %Y");
+ wtimefacet->short_month_names(de_short_month_names);
+ wtimefacet->long_month_names(de_long_month_names);
+ teststreaming("widestream custom time no frac seconds, german months: %B %b %Y", t,
+ std::wstring(L"Oktober Okt 2004"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S" L"%F");
+ teststreaming("widestream custom time no frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", t,
+ std::wstring(L"2004-Oct-13 18:01:56"),
+ std::locale(std::locale::classic(), wtimefacet));
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S" L"%F");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time with frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tf,
+ std::wstring(L"2004-Oct-13 18:01:56.000003000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time with frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tf,
+ std::wstring(L"2004-Oct-13 18:01:56.000003"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+ {
+ wtime_facet* wtimefacet = new wtime_facet();
+ wtimefacet->set_iso_format();
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time iso format", tf,
+ std::wstring(L"20041013T180156.000003000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time iso format", tf,
+ std::wstring(L"20041013T180156.000003"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+ {
+ wtime_facet* wtimefacet = new wtime_facet();
+ wtimefacet->set_iso_extended_format();
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time iso extended format", tf,
+ std::wstring(L"2004-10-13 18:01:56.000003000"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time iso extended format", tf,
+ std::wstring(L"2004-10-13 18:01:56.000003"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%S" L"%F");
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream time period frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tp,
+ std::wstring(L"[2004-Oct-13 18:01:56/2004-Oct-20 19:02:57.000002999]"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream time period frac seconds %F operator: %Y-%b-%d %H:%M:%S""%F", tp,
+ std::wstring(L"[2004-Oct-13 18:01:56/2004-Oct-20 19:02:57.000002]"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+ {
+ wtime_facet* wtimefacet = new wtime_facet(L"%Y-%b-%d %H:%M:%s");
+ wperiod_formatter pf(wperiod_formatter::AS_OPEN_RANGE, L" / ", L"[ ", L" )", L" ]");
+ wtimefacet->period_formatter(pf);
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ teststreaming("widestream custom time : %Y-%b-%d %H:%M:%s", tp,
+ std::wstring(L"[ 2004-Oct-13 18:01:56.000000000 / 2004-Oct-20 19:02:57.000003000 )"),
+ std::locale(std::locale::classic(), wtimefacet));
+#else
+ teststreaming("widestream custom time : %Y-%b-%d %H:%M:%s", tp,
+ std::wstring(L"[ 2004-Oct-13 18:01:56.000000 / 2004-Oct-20 19:02:57.000003 )"),
+ std::locale(std::locale::classic(), wtimefacet));
+#endif // BOOST_DATE_TIME_HAS_NANOSECONDS
+ }
+
+
+ {
+ ptime nt(not_a_date_time);
+ teststreaming("widestream custom time : not a datetime", nt,
+ std::wstring(L"not-a-date-time"));
+ }
+
+
+
+
+// //Denmark English has iso extended default format...
+// std::locale gloc("en_DK");
+// ss.imbue(gloc);
+// ss << L"default english-denmark date: " << d << std::endl;
+// ss << L"default english-denmark dateperiod: " << dp << std::endl;
+// ss << L"default english-denmark time: " << t << std::endl;
+// ss << L"default english-denmark timefrac: " << tf << std::endl;
+// ss << L"default english-denmark timeperiod: " << tp << std::endl;
+
+
+
+#endif
+ }
+ catch(std::exception& e) {
+ std::cout << "Caught std::exception: " << e.what() << std::endl;
+ }
+ catch(...) {
+ std::cout << "bad exception" << std::endl;
+ }
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testtime_formatters.cpp b/src/boost/libs/date_time/test/posix_time/testtime_formatters.cpp
new file mode 100644
index 000000000..bf628d11b
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime_formatters.cpp
@@ -0,0 +1,116 @@
+/* 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, Bart Garst
+ */
+
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+
+#define CHECK_ROUNDTRIP(_PT) check_equal("from_iso_string(to_iso_string()) roundtrip of \"" + to_iso_string(_PT) + "\"", from_iso_string(to_iso_string(_PT)), _PT)
+
+int
+main()
+{
+
+ using namespace boost::posix_time;
+ using namespace boost::gregorian;
+ date d1(2002,Jan,1);
+ std::string d1_string("2002-Jan-01");
+ std::string t1_string("01:02:03");
+ std::string t1_result = d1_string + " " + t1_string;
+ ptime t1(d1,time_duration(1,2,3)); //2002-Jan-1 01:02:03
+ std::cout << to_simple_string(t1) << std::endl;
+ check("simple: " + t1_result, t1_result == to_simple_string(t1));
+ std::string iso_result = "20020101T010203";
+ check("iso: " + iso_result, iso_result == to_iso_string(t1));
+ std::string iso_ext_result = "2002-01-01T01:02:03";
+ check("iso ext: " + iso_ext_result, iso_ext_result == to_iso_extended_string(t1));
+
+ CHECK_ROUNDTRIP(t1);
+
+ if (time_duration::resolution() == boost::date_time::milli) {
+ ptime t4(d1,hours(1)+minutes(2)+seconds(3)+millisec(4));
+ std::string r3 = to_simple_string(t4);
+ check("simple subsecond: "+r3 ,
+ std::string("2002-Jan-01 01:02:03.004000") == r3);
+ CHECK_ROUNDTRIP(t4);
+ }
+
+
+ if (time_duration::resolution() == boost::date_time::micro) {
+ ptime t3(d1,hours(1)+minutes(2)+seconds(3)+microsec(4));
+ std::string result = to_simple_string(t3);
+ check("microsecond: "+result ,
+ std::string("2002-Jan-01 01:02:03.000004") == to_simple_string(t3));
+
+ time_duration td2 = hours(-12)+minutes(4)+seconds(2)+microsec(1);
+ // time_duration td2 = hours(-12)+minutes(4)+seconds(2)+millisec(1);
+ std::string r2 = to_simple_string(td2);
+ check("microseond neg subsecond duration: "+r2 ,
+ std::string("-11:55:57.999999") == r2);
+
+ std::string s1("-01:25:00"), s2("-00:40:00"), is1("-012500"), is2("-004000");
+ time_duration td1(-1,25,0);
+ time_duration tds2(0,-40,0);
+ check("to string: " + to_simple_string(td1), to_simple_string(td1) == s1);
+ check("to string: " + to_simple_string(tds2), to_simple_string(tds2) == s2);
+ check("to string: " + to_iso_string(td1), to_iso_string(td1) == is1);
+ check("to string: " + to_iso_string(tds2), to_iso_string(tds2) == is2);
+
+ CHECK_ROUNDTRIP(t3);
+ }
+
+
+
+ if (time_duration::resolution() == boost::date_time::nano) {
+ ptime t2(d1,hours(12) + minutes(5) + seconds(1));
+ time_period p1(t1,t2); //last value in period is 12:05:00 1/10000 sec less than t2
+ std::string period_result("["+t1_result + "/" + d1_string + " " + "12:05:00.999999999]" );
+ check("simple: " + period_result + "==" + to_simple_string(p1), period_result == to_simple_string(p1));
+
+ ptime t3(d1,hours(1)+minutes(2)+seconds(3)+nanosec(4));
+ std::string result = to_simple_string(t3);
+ check("simple subsecond: "+result ,
+ std::string("2002-Jan-01 01:02:03.000000004") == to_simple_string(t3));
+
+
+ std::string s1("-01:25:00"), s2("-00:40:00"), is1("-012500"), is2("-004000");
+ time_duration td1(-1,25,0);
+ time_duration tds2(0,-40,0);
+ check("to string: " + to_simple_string(td1), to_simple_string(td1) == s1);
+ check("to string: " + to_simple_string(tds2), to_simple_string(tds2) == s2);
+ check("to string: " + to_iso_string(td1), to_iso_string(td1) == is1);
+ check("to string: " + to_iso_string(tds2), to_iso_string(tds2) == is2);
+
+ time_duration td2 = hours(-12)+minutes(4)+seconds(2)+nanosec(100);
+ std::string r2 = to_simple_string(td2);
+ check("neg subsecond duration: "+r2 ,
+ std::string("-11:55:57.999999900") == r2);
+
+ ptime t4(d1,hours(1)+minutes(2)+seconds(3)+millisec(4));
+ std::string r3 = to_simple_string(t4);
+ check("simple subsecond: "+r3 ,
+ std::string("2002-Jan-01 01:02:03.004000000") == r3);
+
+ CHECK_ROUNDTRIP(t3);
+}
+
+
+ // Boost Trac 1078 (https://svn.boost.org/trac10/ticket/1078)
+ // from_iso_string should be able to parse output of to_iso_string
+ CHECK_ROUNDTRIP(ptime());
+ CHECK_ROUNDTRIP(ptime(not_a_date_time)); // should be same as previous
+ CHECK_ROUNDTRIP(ptime(pos_infin));
+ CHECK_ROUNDTRIP(ptime(neg_infin));
+
+ // when min_date_time is formatted out, it is done so as an actual date/time
+ // i.e. it is not "special" in that sense
+ check_equal("from_iso_string(\"minimum-date-time\")", from_iso_string("minimum-date-time"), ptime(min_date_time));
+ check_equal("from_iso_string(\"maximum-date-time\")", from_iso_string("maximum-date-time"), ptime(max_date_time));
+
+ return printTestStats();
+}
+
+
diff --git a/src/boost/libs/date_time/test/posix_time/testtime_input_facet.cpp b/src/boost/libs/date_time/test/posix_time/testtime_input_facet.cpp
new file mode 100644
index 000000000..126810c62
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime_input_facet.cpp
@@ -0,0 +1,453 @@
+/* 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$
+ */
+
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "../testfrmwk.hpp"
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+// for tests that are expected to fail and throw exceptions
+template<class temporal_type, class exception_type>
+bool failure_test(temporal_type component,
+ const std::string& input,
+ exception_type const& /*except*/,
+ boost::posix_time::time_input_facet* facet)
+{
+ using namespace boost::posix_time;
+ 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 quietly
+template<class temporal_type>
+bool failure_test(temporal_type& component,
+ const std::string& input,
+ boost::posix_time::time_input_facet* facet)
+{
+ using namespace boost::posix_time;
+ 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
+}
+
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
+
+void
+do_all_tests()
+{
+
+#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO) // skip this file
+ check("No tests run for this compiler. Incompatible IO", true);
+#else
+
+ // set up initial objects
+ time_duration td = hours(0);
+ ptime pt(not_a_date_time);
+ time_period tp(pt, td);
+ // exceptions for failure_tests
+ std::ios_base::failure e_failure("default");
+
+ /* test ptime, time_duration, time_period.
+ * test all formats.
+ * test for bad input.
+ * test special values.
+ * do not test custom names (done in gregorian).
+ *
+ * format flags to test H,M,S,s,F,f,j
+ */
+
+ // default format tests: time_duration, ptime
+ std::istringstream iss("09:59:01.321987654321 2005-Jan-15 10:15:03.123456789123");
+ iss >> td;
+ iss >> pt;
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ check_equal("Default format time_duration", td, time_duration(9,59,1,321987654));
+ check_equal("Default format ptime", pt, ptime(date(2005,01,15),time_duration(10,15,3,123456789)));
+#else
+ check_equal("Default format time_duration", td, time_duration(9,59,1,321987));
+ check_equal("Default format ptime", pt, ptime(date(2005,01,15),time_duration(10,15,3,123456)));
+#endif
+
+ // test all flags that appear in time_input_facet
+ iss.str("12:34:56 2005-Jan-15 12:34:56");
+ iss >> td;
+ iss >> pt;
+ check_equal("Default format time_duration no frac_sec", td, time_duration(12,34,56));
+ // the following test insures %F parsing stops at the appropriate point
+ check_equal("Default format ptime", pt, ptime(date(2005,01,15),time_duration(12,34,56)));
+
+ iss.str("14:13:12 extra stuff"); // using default %H:%M:%S%F format
+ iss >> td;
+ check_equal("Default frac_sec format time_duration", td, time_duration(14,13,12));
+
+ time_input_facet* facet = new time_input_facet();
+ std::locale loc(std::locale::classic(), facet);
+ facet->time_duration_format("%H:%M:%S""%f");
+ iss.imbue(loc);
+
+ iss.str("14:13:12.0 extra stuff");
+ iss >> td;
+ check_equal("Required-frac_sec format time_duration", td, time_duration(14,13,12));
+
+ iss.str("12");
+ facet->time_duration_format("%H");
+ iss >> td;
+ check_equal("Hours format", td, hours(12));
+
+ iss.str("05");
+ facet->time_duration_format("%M");
+ iss >> td;
+ check_equal("Minutes format", td, minutes(5));
+
+ iss.str("45");
+ facet->time_duration_format("%S");
+ iss >> td;
+ check_equal("Seconds w/o frac_sec format", td, seconds(45));
+
+ iss.str("10.01");
+ facet->time_duration_format("%s");
+ iss >> td;
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ check_equal("Seconds w/ frac_sec format", td, time_duration(0,0,10,10000000));
+#else
+ check_equal("Seconds w/ frac_sec format", td, time_duration(0,0,10,10000));
+#endif
+
+ iss.str("2005-105T23:59");
+ facet->format("%Y-%jT%H:%M"); // extended ordinal format
+ iss >> pt;
+ check_equal("Extended Ordinal format", pt, ptime(date(2005,4,15),time_duration(23,59,0)));
+
+ /* this is not implemented yet. The flags: %I & %p are not parsed
+ iss.str("2005-Jun-14 03:15:00 PM");
+ facet->format("%Y-%b-%d %I:%M:%S %p");
+ iss >> pt;
+ check_equal("12 hour time format (AM/PM)", pt, ptime(date(2005,6,14),time_duration(15,15,0)));
+ */
+
+ iss.str("2005-Jun-14 15:15:00 %d");
+ facet->format("%Y-%b-%d %H:%M:%S %%d");
+ iss >> pt;
+ check_equal("Literal '%' in format", pt, ptime(date(2005,6,14),time_duration(15,15,0)));
+ iss.str("15:15:00 %d");
+ facet->time_duration_format("%H:%M:%S %%d");
+ iss >> td;
+ check_equal("Literal '%' in time_duration format", td, time_duration(15,15,0));
+ iss.str("2005-Jun-14 15:15:00 %14");
+ facet->format("%Y-%b-%d %H:%M:%S %%%d"); // %% => % & %d => day_of_month
+ iss >> pt;
+ check_equal("Multiple literal '%'s in format", pt, ptime(date(2005,6,14),time_duration(15,15,0)));
+ iss.str("15:15:00 %15");
+ facet->time_duration_format("%H:%M:%S %%%M");
+ iss >> td;
+ check_equal("Multiple literal '%'s in time_duration format", td, time_duration(15,15,0));
+
+ { /****** iso format tests (and custom 'scrunched-together formats) ******/
+ time_input_facet *facet2 = new time_input_facet();
+ facet2->set_iso_format();
+ facet2->time_duration_format("%H""%M""%S""%F"); // iso format
+ std::stringstream ss;
+ ss.imbue(std::locale(std::locale::classic(), facet2));
+ ptime pt2(not_a_date_time);
+ time_duration tdx(not_a_date_time);
+ date dx(2002,Oct,17);
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ time_duration td2(23,12,17,123450000);
+#else
+ time_duration td2(23,12,17,123450);
+#endif
+ ptime result(dx, td2);
+
+ ss.str("20021017T231217.12345");
+ ss >> pt2;
+ check_equal("iso_format ptime", pt2, result);
+ ss.str("");
+ facet2->set_iso_extended_format();
+ ss.str("2002-10-17 23:12:17.12345");
+ ss >> pt2;
+ check_equal("iso_extended_format ptime", pt2, result);
+ ss.str("");
+ ss.str("231217.12345");
+ ss >> tdx;
+ check_equal("iso_format time_duration", tdx, td2);
+ ss.str("");
+ ss.str("-infinity");
+ ss >> tdx;
+ check_equal("iso_format time_duration (special_value)",
+ tdx, time_duration(neg_infin));
+ ss.str("");
+ // the above tests prove correct parsing of time values in these formats.
+ // these tests show they also handle special_values & exceptions properly
+ time_duration nadt(not_a_date_time);
+ ss.exceptions(std::ios_base::failbit); // we need exceptions turned on here
+ int count = 0;
+ try {
+ facet2->time_duration_format("%H""%M""%S""%F");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> tdx;
+ check_equal("special value w/ hours flag", tdx, nadt);
+ ss.str("");
+ facet2->time_duration_format("%M""%S""%F");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> tdx;
+ check_equal("special value w/ minutes flag", tdx, nadt);
+ ss.str("");
+ facet2->time_duration_format("%S""%F");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> tdx;
+ check_equal("special value w/ seconds flag", tdx, nadt);
+ ss.str("");
+ facet2->time_duration_format("%s");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> tdx;
+ check_equal("special value w/ sec w/frac_sec (always) flag", tdx, nadt);
+ ss.str("");
+ facet2->time_duration_format("%f");
+ ss.str("not-a-date-time");
+ ++count;
+ ss >> tdx;
+ check_equal("special value w/ frac_sec (always) flag", tdx, nadt);
+ ss.str("");
+ }
+ catch(...) {
+ // any exception is a failure
+ std::stringstream msg;
+ msg << "special_values with scrunched formats failed at test" << count;
+ check(msg.str(), false);
+ }
+ // exception tests
+ std::ios_base::failure exc("failure");
+ check("failure test w/ hours flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%H""%M""%S""%F")));
+ check("silent failure test w/ hours flag",
+ failure_test(td, "bad_input", new time_input_facet("%H""%M""%S""%F")));
+ check("failure test w/ minute flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%M""%S""%F")));
+ check("silent failure test w/ minute flag",
+ failure_test(td, "bad_input", new time_input_facet("%M""%S""%F")));
+ check("failure test w/ second flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%S""%F")));
+ check("silent failure test w/ second flag",
+ failure_test(td, "bad_input", new time_input_facet("%S""%F")));
+ check("failure test w/ sec w/frac (always) flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%s")));
+ check("silent failure test w/ sec w/frac (always) flag",
+ failure_test(td, "bad_input", new time_input_facet("%s")));
+ check("failure test w/ frac_sec flag",
+ failure_test(td, "bad_input", exc, new time_input_facet("%f")));
+ check("silent failure test w/ frac_sec flag",
+ failure_test(td, "bad_input", new time_input_facet("%f")));
+
+ }
+ // special_values tests. prove the individual flags catch special_values
+ // NOTE: these flags all by themselves will not parse a complete ptime,
+ // these are *specific* special_values tests
+ iss.str("+infinity -infinity");
+ facet->format("%H");
+ facet->time_duration_format("%H");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %H flag", pt, ptime(pos_infin));
+ check_equal("Special value: time_duration %H flag", td, time_duration(neg_infin));
+
+ iss.str("not-a-date-time +infinity");
+ facet->format("%M");
+ facet->time_duration_format("%M");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %M flag", pt, ptime(not_a_date_time));
+ check_equal("Special value: time_duration %M flag", td, time_duration(pos_infin));
+
+ iss.str("-infinity not-a-date-time ");
+ facet->format("%S");
+ facet->time_duration_format("%S");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %S flag", pt, ptime(neg_infin));
+ check_equal("Special value: time_duration %S flag", td, time_duration(not_a_date_time));
+
+ iss.str("+infinity -infinity");
+ facet->format("%s");
+ facet->time_duration_format("%s");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %s flag", pt, ptime(pos_infin));
+ check_equal("Special value: time_duration %s flag", td, time_duration(neg_infin));
+
+ iss.str("not-a-date-time +infinity");
+ facet->format("%j");
+ facet->time_duration_format("%f");
+ iss >> pt;
+ iss >> td;
+ check_equal("Special value: ptime %j flag", pt, ptime(not_a_date_time));
+ check_equal("Special value: time_duration %f flag", td, time_duration(pos_infin));
+
+ // time_period tests - the time_period_parser is thoroughly tested in gregorian tests
+ // default period format is closed range so last ptime is included in peiod
+ iss.str("[2005-Jan-01 00:00:00/2005-Dec-31 23:59:59]");
+ facet->format(time_input_facet::default_time_input_format); // reset format
+ iss >> tp;
+ check("Time period, default formats",
+ (tp.begin() == ptime(date(2005,1,1),hours(0))) &&
+ (tp.last() == ptime(date(2005,12,31),time_duration(23,59,59))) &&
+ (tp.end() == ptime(date(2005,12,31),time_duration(23,59,59,1))) );
+ {
+ std::stringstream ss;
+ ptime ptx(not_a_date_time);
+ ptime pt2 = second_clock::local_time();
+ ptime pt3(neg_infin);
+ ptime pt4(pos_infin);
+ time_period tpx(pt2, ptx); // ptime/nadt
+ time_period tp2(ptx, ptx); // nadt/nadt
+ time_period tp3(pt3, pt4);
+ ss << tpx;
+ ss >> tp2;
+ check_equal("Special values period (reversibility test)", tpx, tp2);
+ ss.str("[-infinity/+infinity]");
+ ss >> tp2;
+ check_equal("Special values period (infinities)", tp3, tp2);
+ }
+
+ // Failure tests
+ // faliure tests for date elements tested in gregorian tests
+ time_input_facet* facet2 = new time_input_facet();
+ facet2->time_duration_format("%H:%M:%S""%f");
+ check("Failure test: Missing frac_sec with %f flag (w/exceptions)",
+ failure_test(td, "14:13:12 extra stuff", e_failure, facet2));
+ time_input_facet* facet3 = new time_input_facet();
+ facet3->time_duration_format("%H:%M:%S""%f");
+ check("Failure test: Missing frac_sec with %f flag (no exceptions)",
+ failure_test(td, "14:13:12 extra stuff", facet3));
+
+ // Reversable format tests
+ time_duration td_io(10,11,12,1234567);
+ ptime pt_io(date(2004,03,15), td_io);
+ time_facet* otp_facet = new time_facet();
+ time_input_facet* inp_facet = new time_input_facet();
+ std::stringstream ss;
+ std::locale loc2(std::locale::classic(), otp_facet);
+ ss.imbue(std::locale(loc2, inp_facet)); // imbue locale containing both facets
+
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: default format", pt_io, pt);
+ ss.str("");
+ ss << td_io; // stream out td_io
+ ss >> td;
+ check_equal("Stream out one time_duration then into another: default format", td_io, td);
+
+ td_io = time_duration(1,29,59); // no frac_sec, default format has %F
+ pt_io = ptime(date(2004,2,29), td_io); // leap year
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: default format", pt_io, pt);
+ ss.str("");
+ ss << td_io; // stream out td_io
+ ss >> td;
+ check_equal("Stream out one time_duration then into another: default format", td_io, td);
+
+ td_io = time_duration(13,05,0); // no seconds as the next formats won't use them
+ pt_io = ptime(date(2004,2,29), td_io); // leap year
+ otp_facet->format("%Y-%jT%H:%M"); // extended ordinal
+ inp_facet->format("%Y-%jT%H:%M");
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: extended ordinal format", pt_io, pt);
+
+ otp_facet->format("Time: %H:%M, Date: %B %d, %Y"); // custom format with extra words
+ inp_facet->format("Time: %H:%M, Date: %B %d, %Y");
+ ss.str("");
+ ss << pt_io; // stream out pt_io
+ ss >> pt;
+ check_equal("Stream out one ptime then into another: custom format (" + ss.str() + ")", pt_io, pt);
+
+ {
+ // fully parameterized constructor - compile only test, all other features tested in gregorian
+ boost::date_time::format_date_parser<date, char> fdp("%Y-%b-%d", std::locale::classic());
+ special_values_parser svp; // default constructor
+ period_parser pp; // default constructor
+ boost::date_time::date_generator_parser<date, char> dgp; // default constructor
+ time_input_facet tif("%Y-%m-%d %H:%M:%s", fdp, svp, pp, dgp);
+ }
+
+ // trac 13194 (https://svn.boost.org/trac10/ticket/13194)
+ {
+ const std::string value = "December 07:27:10.435945 5 2017";
+ boost::posix_time::time_input_facet* facet4 = new boost::posix_time::time_input_facet("%B %H:%M:%s %e %Y");
+ boost::posix_time::ptime ptx;
+ check("trac 13194 %e on \"5\" failbit set", !failure_test(ptx, value, facet4)); // proves failbit was not set
+ check_equal("trac 13194 %e on \" 5\" valid value", "2017-12-05T07:27:10.435945000", to_iso_extended_string(ptx));
+ }
+
+ // trac 12910
+ {
+ const std::string value = "263-08:09:10";
+ boost::posix_time::time_input_facet* facet = new boost::posix_time::time_input_facet("%j-%H:%M:%S");
+ boost::posix_time::ptime pt;
+ check("trac 12910 %j without %Y no failbit", !failure_test(pt, value, facet)); // proves failbit was not set
+ check_equal("trac 12910 %j without %Y value", "1400-09-20T08:09:10", to_iso_extended_string(pt));
+ }
+
+#endif // USE_DATE_TIME_PRE_1_33_FACET_IO
+}
+
+
+
+int main(){
+
+ try { //wrap all the tests -- we don't expect an exception
+ do_all_tests();
+ }
+ catch(std::exception& e) {
+ std::string failure("std::exception caught: ");
+ failure += e.what();
+ check(failure, false);
+ }
+ catch(...) {
+ check("Unknown exception caught -- failing", false);
+ }
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testtime_period.cpp b/src/boost/libs/date_time/test/posix_time/testtime_period.cpp
new file mode 100644
index 000000000..72b065277
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime_period.cpp
@@ -0,0 +1,77 @@
+/* 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 <iostream>
+#include "boost/date_time/posix_time/posix_time.hpp"
+#include "boost/date_time/posix_time/time_period.hpp"
+#include "../testfrmwk.hpp"
+
+int main()
+{
+ using namespace boost::gregorian;
+ using namespace boost::posix_time;
+ date d1(2001,Jan, 1);
+ ptime t1 (d1,hours(2));//2001-Jan-1 02:00:00
+ ptime t2 (d1,hours(3));//2001-Jan-1 03:00:00
+ time_period p1(t1,t2); //2001-Jan-1 02:59:59
+ time_period p2(p1);
+ check("copy construct & ==", p1 == p2);
+ time_period p3 = p2;
+ check("assignment", p3 == p2);
+ time_period p4(t1,hours(1));
+ check("length", p4.length() == hours(1));
+ std::cout << t1 << std::endl;
+ std::cout << p4 << std::endl;
+ std::cout << p1 << std::endl;
+ check("construction and ==", p1 == p4);
+ check("begin", p1.begin() == t1);
+ check("last", p1.end() == t2);
+ check("end", p1.last() == t2-time_duration::unit());
+
+ std::cout << p1 << std::endl;
+ // check("last", p1.() == t2);
+ check("contains begin", p1.contains(t1));
+ check("contains end-not", !p1.contains(t2));
+ check("contains last", p1.contains(t2-seconds(1)));
+ ptime t3(date(2001,Jan,1),hours(4));
+ time_period p5(t2,t3);
+ check("check contains", !p1.contains(p5.begin()));
+ check("check contains", !p5.contains(p1.begin()));
+ check("operator== not equal case", !(p1 == p5));
+ check("less than order", p1 < p5);
+ check("greater than order", p5 > p1);
+ check("not equal", p5 != p1);
+ check("intersects with myself", p1.intersects(p1));
+ check("not intersects", !(p1.intersects(p5)));
+ check("not intersects", !(p5.intersects(p1)));
+
+ time_period p6(p5);
+ p6.shift(minutes(30));
+ std::cout << p5 << std::endl;
+ std::cout << p6 << std::endl;
+ check("shifted intersects", p5.intersects(p6));
+ check("shifted intersects", p6.intersects(p5));
+ check("contains begin", p5.contains(p6.begin()));
+ p6.shift(minutes(30));
+ std::cout << p5 << std::endl;
+ std::cout << p6 << std::endl;
+ check("shifted !intersects", !p5.intersects(p6));
+ check("shifted !intersects", !p6.intersects(p5));
+ p6.shift(minutes(-30));
+ std::cout << p5 << std::endl;
+ std::cout << p6 << std::endl;
+ time_period p7 = p5.intersection(p6);
+ std::cout << p7 << std::endl;
+ check("shifted intersection",
+ p7 == time_period(ptime(d1,time_duration(3,30,0)),
+ ptime(d1,time_duration(4,0,0))));
+
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/posix_time/testtime_serialize.cpp b/src/boost/libs/date_time/test/posix_time/testtime_serialize.cpp
new file mode 100644
index 000000000..4d50534a0
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime_serialize.cpp
@@ -0,0 +1,125 @@
+/* Copyright (c) 2002-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
+ */
+
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/posix_time/time_serialize.hpp>
+#include "../testfrmwk.hpp"
+#include <sstream>
+
+using namespace boost;
+using namespace posix_time;
+using namespace gregorian;
+
+template<class archive_type, class temporal_type>
+void save_to(archive_type& ar, const temporal_type& tt)
+{
+ ar << tt;
+}
+
+int main(){
+ // originals
+ date d(2002, Feb, 14);
+#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+ time_duration td(12,13,52,123456789);
+#else
+ time_duration td(12,13,52,123456);
+#endif
+ ptime pt(d, td);
+ time_period tp(pt, ptime(date(2002, Oct, 31), hours(19)));
+ ptime sv_pt1(not_a_date_time);
+ ptime sv_pt2(pos_infin);
+ time_duration sv_td(neg_infin);
+
+ // for loading in from archive
+ date d2(not_a_date_time);
+ time_duration td2(1,0,0);
+ ptime pt2(d2, td2);
+ time_period tp2(pt2, hours(1));
+ ptime sv_pt3(min_date_time);
+ ptime sv_pt4(min_date_time);
+ time_duration sv_td2(0,0,0);
+
+ std::ostringstream oss;
+
+ {
+ // NOTE: DATE_TIME_XML_SERIALIZE is only used in testing and is
+ // defined in the testing Jamfile
+#if defined(DATE_TIME_XML_SERIALIZE)
+ std::cout << "Running xml archive tests" << std::endl;
+ archive::xml_oarchive oa(oss);
+#else
+ std::cout << "Running text archive tests" << std::endl;
+ archive::text_oarchive oa(oss);
+#endif // DATE_TIME_XML_SERIALIZE
+
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ save_to(oa, BOOST_SERIALIZATION_NVP(pt));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_pt1));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_pt2));
+ save_to(oa, BOOST_SERIALIZATION_NVP(tp));
+ save_to(oa, BOOST_SERIALIZATION_NVP(td));
+ save_to(oa, BOOST_SERIALIZATION_NVP(sv_td));
+#else
+ save_to(oa, pt);
+ save_to(oa, sv_pt1);
+ save_to(oa, sv_pt2);
+ save_to(oa, tp);
+ save_to(oa, td);
+ save_to(oa, sv_td);
+#endif // DATE_TIME_XML_SERIALIZE
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error writing to archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+ }
+
+ {
+ std::istringstream iss(oss.str());
+#if defined(DATE_TIME_XML_SERIALIZE)
+ archive::xml_iarchive ia(iss);
+#else
+ archive::text_iarchive ia(iss);
+#endif // DATE_TIME_XML_SERIALIZE
+
+ try{
+#if defined(DATE_TIME_XML_SERIALIZE)
+ ia >> BOOST_SERIALIZATION_NVP(pt2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_pt3);
+ ia >> BOOST_SERIALIZATION_NVP(sv_pt4);
+ ia >> BOOST_SERIALIZATION_NVP(tp2);
+ ia >> BOOST_SERIALIZATION_NVP(td2);
+ ia >> BOOST_SERIALIZATION_NVP(sv_td2);
+#else
+ ia >> pt2;
+ ia >> sv_pt3;
+ ia >> sv_pt4;
+ ia >> tp2;
+ ia >> td2;
+ ia >> sv_td2;
+#endif // DATE_TIME_XML_SERIALIZE
+ }catch(archive::archive_exception& ae){
+ std::string s(ae.what());
+ check("Error readng from archive: " + s + "\nWritten data: \"" + oss.str() + "\"", false);
+ return printTestStats();
+ }
+ }
+
+ check("ptime", pt == pt2);
+ check("special_values ptime (nadt)", sv_pt1 == sv_pt3);
+ check("special_values ptime (pos_infin)", sv_pt2 == sv_pt4);
+ check("time_period", tp == tp2);
+ check("time_duration", td == td2);
+ check("special_values time_duration (neg_infin)", sv_td == sv_td2);
+
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/posix_time/testtime_serialize_versioning.cpp b/src/boost/libs/date_time/test/posix_time/testtime_serialize_versioning.cpp
new file mode 100644
index 000000000..157627793
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime_serialize_versioning.cpp
@@ -0,0 +1,64 @@
+/* Copyright (c) 2017 James E. King III
+ * 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)
+ */
+
+#include <boost/archive/binary_oarchive.hpp>
+#include <boost/archive/binary_iarchive.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/posix_time/time_serialize.hpp>
+#include <boost/lexical_cast.hpp>
+#include "../testfrmwk.hpp"
+#include <fstream>
+
+using namespace boost;
+using namespace posix_time;
+
+void check_filesize(const std::string& filename, std::ifstream::pos_type expectedSize)
+{
+ std::ifstream in(filename.c_str(), std::ifstream::ate | std::ifstream::binary);
+ check_equal("check file size is " + boost::lexical_cast<std::string>(expectedSize), in.tellg(), expectedSize);
+}
+
+std::string get_fname(int version)
+{
+ return "time_duration_serialization." +
+ std::string((sizeof(size_t) == 4) ? "x32" : "x64") +
+ ".v" + boost::lexical_cast<std::string>(version);
+}
+
+int main() {
+ time_duration td(12, 13, 52, 123456);
+
+#if BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION == 0
+ std::ofstream ofs(get_fname(0).c_str(), std::ios_base::binary | std::ios_base::out | std::ios_base::trunc);
+ boost::archive::binary_oarchive oa(ofs);
+ oa << td;
+ ofs.close();
+
+#if defined(_MSC_VER)
+ check_filesize(get_fname(0), 58 + sizeof(size_t));
+#endif
+
+#else // BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION > 0
+ std::ifstream ifs(get_fname(0).c_str(), std::ios_base::binary | std::ios_base::in);
+ boost::archive::binary_iarchive ia(ifs);
+ time_duration tmp;
+ ia >> tmp;
+ ifs.close();
+ check_equal("read older version structure ok", td, tmp);
+
+ std::ofstream ofs(get_fname(1).c_str(), std::ios_base::binary | std::ios_base::out | std::ios_base::trunc);
+ boost::archive::binary_oarchive oa(ofs);
+ oa << td;
+ ofs.close();
+
+#if defined(_MSC_VER)
+ check_filesize(get_fname(1), 70 + sizeof(size_t));
+#endif
+
+#endif // BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION
+
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/posix_time/testtime_wstream.cpp b/src/boost/libs/date_time/test/posix_time/testtime_wstream.cpp
new file mode 100644
index 000000000..f2b0c45c0
--- /dev/null
+++ b/src/boost/libs/date_time/test/posix_time/testtime_wstream.cpp
@@ -0,0 +1,89 @@
+/* Copyright (c) 2003-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: Bart Garst
+ * $Date$
+ */
+#include <iostream>
+#include <sstream>
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include "../testfrmwk.hpp"
+#include <boost/lexical_cast.hpp>
+
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+using boost::lexical_cast;
+
+int main(){
+#if defined(BOOST_NO_STD_WSTRING) || \
+ defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
+ check("No wstring/wstream support for this compiler", false);
+#else
+
+ std::wstring res, ws;
+ std::wstringstream wss;
+ /* time_period was used because all the time-type objects
+ * that have operator<< can be easily accessed from it.
+ * Tose are: ptime, time_duration, time_period */
+ date d1(2003,Jan,20), d2(2003,May,10);
+ time_period tp(ptime(d1,hours(1)), ptime(d2,hours(15)));
+
+ // ptime
+ wss << tp.begin();
+ res = L"2003-Jan-20 01:00:00";
+ check("ptime op<<", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(tp.begin());
+ check("ptime to_simple_wstring", res == ws);
+ res = L"20030120T010000";
+ ws = to_iso_wstring(tp.begin());
+ check("ptime to_iso_wstring", res == ws);
+ res = L"2003-01-20T01:00:00";
+ ws = to_iso_extended_wstring(tp.begin());
+ check("ptime to_iso_extended_wstring", res == ws);
+
+ // time_duration
+ wss << tp.length();
+ res = L"2654:00:00";
+ check("time_duration", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(tp.length());
+ check("time_duration to_simple_wstring", res == ws);
+ res = L"26540000";
+ ws = to_iso_wstring(tp.length());
+ check("time_duration to_iso_wstring", res == ws);
+
+ // time_period
+ wss << tp;
+#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ res = L"[2003-Jan-20 01:00:00/2003-May-10 14:59:59.999999999]";
+#else
+ res = L"[2003-Jan-20 01:00:00/2003-May-10 14:59:59.999999]";
+#endif
+ check("time_period", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(tp);
+ check("time_period to_simple_wstring", res == ws);
+
+ // special values
+ time_duration sv_td(neg_infin);
+ date sv_d(pos_infin);
+ ptime sv_tp(sv_d,hours(1));
+ res = L"+infinity";
+ wss << sv_tp;
+ check("ptime op<< special value", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(sv_tp);
+ check("ptime to_simple_wstring special value", res == ws);
+ res = L"-infinity";
+ wss << sv_td;
+ check("time_duration op<< special value", res == wss.str());
+ wss.str(L"");
+ ws = to_simple_wstring(sv_td);
+ check("time_duration to_simple_wstring special value", res == ws);
+
+#endif
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/self_contained_header.cpp b/src/boost/libs/date_time/test/self_contained_header.cpp
new file mode 100644
index 000000000..3ff1abf4b
--- /dev/null
+++ b/src/boost/libs/date_time/test/self_contained_header.cpp
@@ -0,0 +1,22 @@
+/*
+ * Copyright Andrey Semashev 2020.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file self_contained_header.cpp
+ * \author Andrey Semashev
+ * \date 04.04.2020
+ *
+ * \brief This file contains a test boilerplate for checking that every public header is self-contained and does not have any missing #includes.
+ */
+
+#define BOOST_DATE_TIME_TEST_INCLUDE_HEADER() <boost/BOOST_DATE_TIME_TEST_HEADER>
+
+#include BOOST_DATE_TIME_TEST_INCLUDE_HEADER()
+
+int main(int, char*[])
+{
+ return 0;
+}
diff --git a/src/boost/libs/date_time/test/testconstrained_value.cpp b/src/boost/libs/date_time/test/testconstrained_value.cpp
new file mode 100644
index 000000000..f8567f031
--- /dev/null
+++ b/src/boost/libs/date_time/test/testconstrained_value.cpp
@@ -0,0 +1,74 @@
+/* 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 "boost/config.hpp"
+#include "boost/date_time/constrained_value.hpp"
+#include "testfrmwk.hpp"
+#include <iostream>
+
+class bad_day {}; //exception type
+
+
+class day_value_policies
+{
+public:
+ typedef unsigned int value_type;
+ static unsigned int min BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; };
+ static unsigned int max BOOST_PREVENT_MACRO_SUBSTITUTION () { return 31;};
+ static void on_error(unsigned int&, unsigned int, boost::CV::violation_enum)
+ {
+ throw bad_day();
+ }
+};
+
+struct range_error {}; //exception type
+typedef boost::CV::simple_exception_policy<int,1,10,range_error> one_to_ten_range_policy;
+
+int main()
+{
+ using namespace boost::CV;
+ constrained_value<day_value_policies> cv1(0), cv2(31);
+ check("not equal", cv1 != cv2);
+ check("equal", cv1 == cv1);
+ check("greater", cv2 > cv1);
+ check("greater or equal ", cv2 >= cv1);
+ //various running of the conversion operator
+ std::cout << cv1 << std::endl;
+ unsigned int i = cv1;
+ check("test conversion", i == cv1);
+
+
+ try {
+ constrained_value<one_to_ten_range_policy> cv3(11);
+ std::cout << "Not Reachable: " << cv3 << " ";
+ check("got range exception max", false);
+ }
+ catch(range_error&) {
+ check("got range exception max", true);
+ }
+
+ try {
+ constrained_value<one_to_ten_range_policy> cv3(0);
+ std::cout << "Not Reachable: " << cv3 << " ";
+ check("got range exception min", false);
+ }
+ catch(range_error&) {
+ check("got range exception min", true);
+ }
+
+ try {
+ constrained_value<one_to_ten_range_policy> cv4(1);
+ cv4 = 12;
+ check("range exception on assign", false);
+ }
+ catch(range_error&) {
+ check("range exception on assign", true);
+ }
+
+ return printTestStats();
+}
+
diff --git a/src/boost/libs/date_time/test/testfrmwk.hpp b/src/boost/libs/date_time/test/testfrmwk.hpp
new file mode 100644
index 000000000..fde39ab66
--- /dev/null
+++ b/src/boost/libs/date_time/test/testfrmwk.hpp
@@ -0,0 +1,113 @@
+
+#ifndef TEST_FRMWK_HPP___
+#define TEST_FRMWK_HPP___
+
+/* 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)
+ * $Date$
+ */
+
+
+#include <iostream>
+#include <string>
+#include <boost/config.hpp>
+
+//! Really simple test framework for counting and printing
+class TestStats
+{
+public:
+ static TestStats& instance() {static TestStats ts; return ts;}
+ void addPassingTest() {testcount_++; passcount_++;}
+ void addFailingTest() {testcount_++;}
+ unsigned int testcount() const {return testcount_;}
+ unsigned int passcount() const {return passcount_;}
+ void print(std::ostream& out = std::cout) const
+ {
+ out << testcount_ << " Tests Executed: " ;
+ if (passcount() != testcount()) {
+ out << (testcount() - passcount()) << " FAILURES";
+ }
+ else {
+ out << "All Succeeded" << std::endl;
+ }
+ out << std::endl;
+ }
+private:
+ TestStats() : testcount_(0), passcount_(0) {}
+ unsigned int testcount_;
+ unsigned int passcount_;
+};
+
+
+inline bool check(const std::string& testname, bool testcond)
+{
+ TestStats& stat = TestStats::instance();
+ if (testcond) {
+ std::cout << "Pass :: " << testname << " " << std::endl;
+ stat.addPassingTest();
+ return true;
+ }
+ else {
+ stat.addFailingTest();
+ std::cout << "FAIL :: " << testname << " " << std::endl;
+ return false;
+ }
+}
+
+// In the comparisons below, it is possible that T and U are signed and unsigned integer types, which generates warnings in some compilers.
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4389)
+#elif defined(BOOST_CLANG) && defined(__has_warning)
+# if __has_warning("-Wsign-compare")
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wsign-compare"
+# endif
+#elif defined(BOOST_GCC) && (BOOST_GCC+0) >= 40600
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wsign-compare"
+#endif
+
+template< typename T, typename U >
+inline bool check_equal(const std::string& testname, T const& left, U const& right)
+{
+ bool res = check(testname, left == right);
+ if (!res)
+ {
+ std::cout << " left = " << left << ", right = " << right << std::endl;
+ }
+ return res;
+}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#elif defined(BOOST_CLANG) && defined(__has_warning)
+# if __has_warning("-Wsign-compare")
+# pragma clang diagnostic pop
+# endif
+#elif defined(BOOST_GCC) && (BOOST_GCC+0) >= 40600
+# pragma GCC diagnostic pop
+#endif
+
+#ifndef BOOST_NO_STD_WSTRING
+inline bool check_equal(const std::string& testname, std::wstring const& left, std::wstring const& right)
+{
+ bool res = check(testname, left == right);
+ if (!res)
+ {
+ std::wcout << L" left = " << left << L", right = " << right << std::endl;
+ }
+ return res;
+}
+#endif
+
+inline int printTestStats()
+{
+ TestStats& stat = TestStats::instance();
+ stat.print();
+ return stat.testcount() - stat.passcount();
+}
+
+#endif
diff --git a/src/boost/libs/date_time/test/testfrom_facet.cpp b/src/boost/libs/date_time/test/testfrom_facet.cpp
new file mode 100644
index 000000000..79faafe2e
--- /dev/null
+++ b/src/boost/libs/date_time/test/testfrom_facet.cpp
@@ -0,0 +1,50 @@
+/* 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
+ * $Date$
+ *
+ * This file isn't part of the official regression test suite at
+ * the moment, but it is a basic test of the strings_from_facet.hpp
+ * infrastructure that can be compiled trivially.
+ */
+
+
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <vector>
+#include <fstream>
+
+#include "boost/date_time/strings_from_facet.hpp"
+#include "algorithm_ext/container_print.hpp"
+
+
+
+int
+main()
+{
+ using boost::date_time::gather_month_strings;
+ using boost::date_time::gather_weekday_strings;
+
+ std::vector<std::string> data;
+ std::vector<std::wstring> wdata;
+
+ data = gather_month_strings<char>(std::locale::classic());
+ print(data, std::cout);
+ data = gather_month_strings<char>(std::locale::classic(), false);
+ print(data, std::cout);
+ data = gather_weekday_strings<char>(std::locale::classic());
+ print(data, std::cout);
+ data = gather_weekday_strings<char>(std::locale::classic(), false);
+ print(data, std::cout);
+
+ wdata = gather_month_strings<wchar_t>(std::locale::classic());
+ std::wofstream wof("from_facet_test.out");
+ int i=0;
+ while (i < wdata.size()) {
+ wof << wdata[i] << std::endl;
+ i++;
+ }
+}
diff --git a/src/boost/libs/date_time/test/testgeneric_period.cpp b/src/boost/libs/date_time/test/testgeneric_period.cpp
new file mode 100644
index 000000000..64c1ff56a
--- /dev/null
+++ b/src/boost/libs/date_time/test/testgeneric_period.cpp
@@ -0,0 +1,273 @@
+/* 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: Bart Garst
+ */
+
+#include <iostream>
+#include "boost/date_time/period.hpp"
+#include "testfrmwk.hpp"
+
+/*! duration_rep parameter for period requires a func unit() that
+ * returns the smallest unit of measure for this type. This minimal
+ * class fulfills that, and other, requirements */
+template<class int_type>
+class duration_type {
+ public:
+ duration_type(int_type a = 0) : _val(a) {}
+ static int_type unit() { return 1; }
+ int_type get_rep() { return _val; }
+ bool operator==(duration_type<int_type> rhs) { return _val == rhs._val; }
+ bool operator<(duration_type<int_type> rhs) { return _val < rhs._val; }
+ bool operator>(duration_type<int_type> rhs) { return _val > rhs._val; }
+ private:
+ int_type _val;
+};
+//! To enable things like "cout << period.length()"
+template<class int_type>
+inline
+std::ostream& operator<<(std::ostream& os, duration_type<int_type> dt){
+ os << dt.get_rep();
+ return os;
+}
+//! this operator is needed because period adds a duration_rep to a point_rep
+template<class int_type>
+inline
+int_type operator+(int i, duration_type<int_type> dt){
+ return i + dt.get_rep();
+}
+
+//! this operator is needed because period adds a duration_rep to a point_rep
+template<class int_type>
+inline
+int_type operator-(int i, duration_type<int_type> dt){
+ return i - dt.get_rep();
+}
+
+
+int main(){
+ using namespace boost::date_time;
+ typedef period<int, duration_type<int> > a_period;
+
+ /*** check all functions - normal periods ***/
+
+ a_period p1(1, duration_type<int>(9));
+ check("Different constructors", p1 == a_period(1, 10));
+ check("First", p1.begin() == 1);
+ check("Last", p1.last() == 9);
+ check("End", p1.end() == 10);
+ check("Length", p1.length() == 9);
+ check("is_null (not)", !p1.is_null());
+
+ a_period p2(5, 30);
+ check("First", p2.begin() == 5);
+ check("Last", p2.last() == 29);
+ check("End", p2.end() == 30);
+ check("Length", p2.length() == 25);
+ check("is_null (not)", !p2.is_null());
+
+ a_period p3(35, 81);
+ check("Operator ==", p1 == a_period(1,10));
+ check("Operator !=", p1 != p2);
+ check("Operator <", p1 < p3);
+ check("Operator >", p3 > p2);
+
+ {
+ a_period p(1,10);
+ p.shift(5);
+ check("Shift (right)", p == a_period(6,15));
+ p.shift(-15);
+ check("Shift (left)", p == a_period(-9,0));
+ }
+
+ check("Contains rep", p2.contains(20));
+ check("Contains rep (not)", !p2.contains(2));
+ check("Contains period", p1.contains(a_period(2,8)));
+ check("Contains period (not)", !p1.contains(p3));
+
+ check("Intersects", p1.intersects(p2));
+ check("Intersects", p2.intersects(p1));
+
+ check("Adjacent", p1.is_adjacent(a_period(-5,1)));
+ check("Adjacent", p1.is_adjacent(a_period(10,20)));
+ check("Adjacent (not)", !p1.is_adjacent(p3));
+
+ check("Is before", p1.is_before(15));
+ check("Is after", p3.is_after(15));
+
+ check("Intersection", (p1.intersection(p2) == a_period(5,10)));
+ check("Intersection", (p1.intersection(p3).is_null()));
+
+ check("Merge", p1.merge(p2) == a_period(1,30) );
+ check("Merge", p1.merge(p3).is_null());
+
+ check("Span", p3.span(p1) == a_period(1, 81));
+
+ /*** zero length period ***/
+
+ // treat a zero length period as a point
+ a_period zero_len(3,duration_type<int>(0));
+ check("Same beg & end == zero_length",
+ a_period(1,1) == a_period(1, duration_type<int>(0)));
+ check("2 point (zero length) == 1 point zero duration",
+ a_period(3,3) == zero_len);
+
+ // zero_length period always returns false for is_before & is_after
+ check("Is Before zero period", !zero_len.is_before(5));
+ check("Is After zero period (not)", !zero_len.is_after(5));
+ check("Is Before zero period (not)", !zero_len.is_before(-5));
+ check("Is After zero period", !zero_len.is_after(-5));
+
+ check("is_null", zero_len.is_null());
+ check("Contains rep (not)", !zero_len.contains(20));
+ // a null_period cannot contain any points
+ check("Contains rep", !zero_len.contains(3));
+ check("Contains period (not)", !zero_len.contains(a_period(5,8)));
+ check("Contains period", p1.contains(zero_len));
+ check("Intersects", zero_len.intersects(p1));
+ check("Intersects", p1.intersects(zero_len));
+ check("Adjacent", zero_len.is_adjacent(a_period(-10,3)));
+ check("Adjacent", a_period(-10,3).is_adjacent(zero_len));
+ check("Intersection", (zero_len.intersection(p1) == zero_len));
+ check("Span", zero_len.span(p2) == a_period(3,30));
+
+ /*** invalid period ***/
+
+ a_period null_per(5,1);
+
+ check("Is Before invalid period (always false)", !null_per.is_before(7));
+ check("Is After invalid period (always false)", !null_per.is_after(7));
+ check("Is Before invalid period (always false)", !null_per.is_before(-5));
+ check("Is After invalid period (always false)", !null_per.is_after(-5));
+
+ check("is_null", null_per.is_null());
+ check("Contains rep larger (always false)", !null_per.contains(20));
+ check("Contains rep in-between (always false)", !null_per.contains(3));
+ check("Contains period (not)", !null_per.contains(a_period(7,9)));
+ check("Contains period", p1.contains(null_per));
+ check("Intersects", null_per.intersects(p1));
+ check("Intersects", p1.intersects(null_per));
+ check("Adjacent", null_per.is_adjacent(a_period(-10,5)));
+ check("Adjacent", null_per.is_adjacent(a_period(1,10)));
+
+ // what should this next one do?
+ //check("Intersection", (null_per.intersection(p1) == zero_len));
+ check("Span", null_per.span(p3) == a_period(5,81));
+
+ {
+ std::cout << std::endl;
+ a_period p1x(0, -2);
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == -3);
+ check("End", p1x.end() == -2);
+ check("Length", p1x.length() == -2);
+ check("is_null", p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, -1);
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == -2);
+ check("End", p1x.end() == -1);
+ check("Length", p1x.length() == -1);
+ check("is_null", p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, 0);
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == -1);
+ check("End", p1x.end() == 0);
+ check("Length", p1x.length() == 0);
+ check("is_null", p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, 1);
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == 0);
+ check("End", p1x.end() == 1);
+ check("Length", p1x.length() == 1);
+ check("is_null", !p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, 2);
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == 1);
+ check("End", p1x.end() == 2);
+ check("Length", p1x.length() == 2);
+ check("is_null", !p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, duration_type<int>(-1));
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == -2);
+ check("End", p1x.end() == -1);
+ check("Length", p1x.length() == -1);
+ check("is_null", p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, duration_type<int>(-2));
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == -3);
+ check("End", p1x.end() == -2);
+ check("Length", p1x.length() == -2);
+ check("is_null", p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, duration_type<int>(0));
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == -1);
+ check("End", p1x.end() == 0);
+ check("Length", p1x.length() == 0);
+ check("is_null", p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, duration_type<int>(1));
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == 0);
+ check("End", p1x.end() == 1);
+ check("Length", p1x.length() == 1);
+ check("is_null", !p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(0, duration_type<int>(2));
+ check("First", p1x.begin() == 0);
+ check("Last", p1x.last() == 1);
+ check("End", p1x.end() == 2);
+ check("Length", p1x.length() == 2);
+ check("is_null", !p1x.is_null());
+ }
+ {
+ std::cout << std::endl;
+ a_period p1x(1,1); // length should be 0
+ a_period p2x(1,2); // length should be 1
+ a_period p3x(1,3); // length should be 2
+ check("Length p1", p1x.length() == 0);
+ check("Length p2", p2x.length() == 1);
+ check("Length p3", p3x.length() == 2);
+ check("is_null p1 (not)", p1x.is_null());
+ check("is_null p2 (not)", !p2x.is_null());
+ }
+
+ {
+ a_period p1x(1,2); // length should be 1
+ p1x.shift(duration_type<int>(1));
+ a_period p2x(2,3); // shifted result
+ check("shift", p1x == p2x);
+ }
+ {
+ a_period p1x(5,duration_type<int>(3));
+ a_period p2x(3,10); // expanded result
+ p1x.expand(duration_type<int>(2)); //from 2000-Jan-01--2000-Jan-04
+ check("expand", p1x == p2x);
+ }
+ return printTestStats();
+}
diff --git a/src/boost/libs/date_time/test/testgregorian_calendar.cpp b/src/boost/libs/date_time/test/testgregorian_calendar.cpp
new file mode 100644
index 000000000..c0fedac09
--- /dev/null
+++ b/src/boost/libs/date_time/test/testgregorian_calendar.cpp
@@ -0,0 +1,253 @@
+/* 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 "boost/date_time/gregorian_calendar.hpp"
+#include "boost/date_time/year_month_day.hpp"
+#include "testfrmwk.hpp"
+#include <iostream>
+
+int
+main()
+{
+ typedef boost::date_time::year_month_day_base<unsigned long,
+ unsigned short,
+ unsigned short > simple_ymd_type;
+
+ typedef boost::date_time::gregorian_calendar_base<simple_ymd_type, unsigned long>
+ gregorian_calendar;
+
+ // using namespace boost::gregorian;
+ check("Day of week 2000-09-24 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,24))==0);
+ check("Day of week 2000-09-25 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,25))==1);
+ check("Day of week 2000-09-26 == 2 (Tue)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,26))==2);
+ check("Day of week 2000-09-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,27))==3);
+ check("Day of week 2000-09-28 == 4 (Thu)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,28))==4);
+ check("Day of week 2000-09-29 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,29))==5);
+ check("Day of week 2000-09-30 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,30))==6);
+ //see calendar FAQ 2.2 for reference
+ check("Day of week 1953-08-02 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,2))==0);
+ check("Day of week 1953-08-03 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,3))==1);
+ check("Day of week 1953-08-04 == 2 (Tue)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,4))==2);
+ check("Day of week 1953-08-05 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,5))==3);
+ check("Day of week 1953-08-06 == 4 (Thu)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,6))==4);
+ check("Day of week 1953-08-07 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,7))==5);
+ check("Day of week 1953-08-08 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,8))==6);
+ check("Day of week 2001-08-31 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2001,8,31))==5);
+
+ //Checked against Caledrical Calc M. Edition p 396 and www site
+ check("Day of week 1400-01-01 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1400,1,1))==3);
+ check("Day of week 1436-02-03 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1436,2,3))==3);
+ check("Day of week 1492-04-9 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1492,4,9))==6);
+ check("Day of week 1560-03-5 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1560,3,5))==6);
+ check("Day of week 1716-07-24 == 5 (Fri)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1716,7,24))==5);
+ check("Day of week 1768-06-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1768,6,19))==0);
+ check("Day of week 1839-03-27 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1839,3,27))==3);
+ check("Day of week 1819-08-02 == 1 (Mon)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1819,8,2))==1);
+ check("Day of week 1903-04-19 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1903,4,19))==0);
+ check("Day of week 1929-08-25 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1929,8,25))==0);
+ check("Day of week 2038-11-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2038,11,10))==3);
+ check("Day of week 2094-07-18 == 0 (Sun)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2094,7,18))==0);
+ //verified against website applet
+ check("Day of week 3002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(3002,7,10))==6);
+ //verified against website applet
+ check("Day of week 4002-07-10 == 3 (Wed)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(4002,7,10))==3);
+ //verified against website applet
+ check("Day of week 5002-07-10 == 6 (Sat)",
+ gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(5002,7,10))==6);
+
+ check("1404 is a leap year", gregorian_calendar::is_leap_year(1404));
+ check("2000 is a leap year", gregorian_calendar::is_leap_year(2000));
+ check("2004 is a leap year", gregorian_calendar::is_leap_year(2004));
+ check("2400 is a leap year", gregorian_calendar::is_leap_year(2400));
+ check("4000 is a leap year", gregorian_calendar::is_leap_year(4000));
+ check("1400 is NOT a leap year", !gregorian_calendar::is_leap_year(1400));
+ check("1900 is NOT a leap year", !gregorian_calendar::is_leap_year(1900));
+ check("2100 is NOT a leap year", !gregorian_calendar::is_leap_year(2100));
+ check("1999 is NOT a leap year", !gregorian_calendar::is_leap_year(1999));
+ check("5000 is NOT a leap year", !gregorian_calendar::is_leap_year(5000));
+
+ int weeknum1 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2004,10,18));
+ check("ToWeekNumber 2004-10-18 is week 43", weeknum1 == 43);
+
+ int weeknum2 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2002,1,1));
+ check("ToWeekNumber 2002-1-1 is week 1", weeknum2 == 1);
+
+ int weeknum3 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2000,12,31));
+ check("ToWeekNumber 2000-12-31 is week 52", weeknum3 == 52);
+
+ //check for week when week==0.
+ int weeknum4 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2000,1,1));
+ check("ToWeekNumber 2000-1-1 is week 52", weeknum4 == 52);
+
+ //check for week when week==53 and day==6.
+ int weeknum5 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1998,12,31));
+ check("ToWeekNumber 1998-12-31 is week 53", weeknum5 == 53);
+
+ //check for week when week==53 day==5 and the year is a leap year.
+ int weeknum6 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1992,12,31));
+ check("ToWeekNumber 1992-12-31 is week 53", weeknum6 == 53);
+
+ //check for week when week==53 1993-Jan-1
+ int weeknum7 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,1));
+ check("ToWeekNumber 1993-1-1 is week 53", weeknum7 == 53);
+
+ //check for week when week==53 1993-Jan-2
+ int weeknum8 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,2));
+ check("ToWeekNumber 1993-Jan-2 is week 53", weeknum8 == 53);
+
+ //check for week when week==53 1993-Jan-3
+ int weeknum9 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,3));
+ check("ToWeekNumber 1993-Jan-3 is week 53", weeknum9 == 53);
+
+ //check for week when week==1 1993-Jan-4
+ int weeknum10 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,4));
+ check("ToWeekNumber 1993-Jan-4 is week 1", weeknum10 == 1);
+
+ //check for week when week=53 and day != 6 and != 5.
+ int weeknum11 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2001,12,31));
+ check("ToWeekNumber 2001-12-31 is week 1", weeknum11 == 1);
+
+ //test the boundaries of week_number
+ int weeknum12 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1400,1,1));
+ check("ToWeekNumber 1400-1-1 is week 1", weeknum12 == 1);
+
+ int weeknum13 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(9999,12,31));
+ check("ToWeekNumber 9999-12-31 is week 52", weeknum13 == 52);
+
+ int weeknum14 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2003,12,29));
+ check("ToWeekNumber 2003-12-29 is week 1", weeknum14 == 1);
+
+
+ unsigned long jday1 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,1,1));
+ unsigned long jday2 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2001,1,1));
+// unsigned short year, month, day;
+// //2451545 is 2000-1-1
+ check("ToDayNumber 2000-1-1 is day 2451545", jday1 == 2451545);
+ check("ToDayNumber 2001-1-1 is day 2451911", jday2 == 2451911);
+ gregorian_calendar::ymd_type ymd = gregorian_calendar::from_day_number(jday1);
+ check("from_day_number test 2000-1-1", (ymd.year==2000)&&
+ (ymd.month==1) &&
+ (ymd.day==1) );
+
+ unsigned long julianday1 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(2000,12,31));
+ check("ToJulianDayNumber 2000-12-31 is day 2451910", julianday1 == 2451910);
+ gregorian_calendar::ymd_type ymd1 = gregorian_calendar::from_julian_day_number(julianday1);
+ std::cout << ymd1.year << "-" << ymd1.month << "-" << ymd1.day << std::endl;
+ check("from_julian_day_number test 2000-12-31", (ymd1.year==2000) &&
+ (ymd1.month==12) &&
+ (ymd1.day==31) );
+ unsigned long julianday2 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(2000,12,31));
+ std::cout << julianday2 << std::endl;
+ check("TomodJulianDayNumber 2000-12-31 is day 51909", julianday2 == 51909);
+ gregorian_calendar::ymd_type ymd2 = gregorian_calendar::from_modjulian_day_number(julianday2);
+ check("from_modjulian_day_number test 2000-12-31", (ymd2.year==2000) &&
+ (ymd2.month==12) &&
+ (ymd2.day==31) );
+ unsigned long julianday3 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1400,1,1));
+ check("ToJulianDayNumber 1400-1-1 is day 2232400", julianday3 == 2232400);
+ gregorian_calendar::ymd_type ymd3 = gregorian_calendar::from_julian_day_number(julianday3);
+ check("from_julian_day_number test 1400-1-1", (ymd3.year==1400) &&
+ (ymd3.month==1) &&
+ (ymd3.day==1) );
+ long mjd3 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(1400,1,1));
+ std::cout << "mjd3: " << mjd3 << std::endl;
+ check("mod julian day 1400-1-1 is day -167601", mjd3 == -167601);
+ gregorian_calendar::ymd_type mjd_ymd3 = gregorian_calendar::from_modjulian_day_number(mjd3);
+ check("from_julian_day_number test 1400-1-1", (mjd_ymd3.year==1400) &&
+ (mjd_ymd3.month==1) &&
+ (mjd_ymd3.day==1) );
+
+
+ unsigned long julianday4 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1900,2,28));
+ check("ToJulianDayNumber 1900-2-28 is day 2415079", julianday4 == 2415079);
+ gregorian_calendar::ymd_type ymd4 = gregorian_calendar::from_julian_day_number(julianday4);
+ check("from_julian_day_number test 1900-2-28", (ymd4.year==1900) &&
+ (ymd4.month==2) &&
+ (ymd4.day==28) );
+
+ unsigned long julianday5 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1436,2,3));
+ check("ToJulianDayNumber 1436-2-3 is day 2245581", julianday5 == 2245581);
+ gregorian_calendar::ymd_type ymd5 = gregorian_calendar::from_julian_day_number(julianday5);
+ check("from_julian_day_number test 1436-2-3", (ymd5.year==1436) &&
+ (ymd5.month==2) &&
+ (ymd5.day==3) );
+
+ unsigned long julianday6 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1996,2,25));
+ check("ToJulianDayNumber 1996-2-25 is day 2450139", julianday6 == 2450139);
+ gregorian_calendar::ymd_type ymd6 = gregorian_calendar::from_julian_day_number(julianday6);
+ check("from_julian_day_number test 1996-2-25", (ymd6.year==1996) &&
+ (ymd6.month==2) &&
+ (ymd6.day==25) );
+ long mjd6 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(1996,2,25));
+ check("ToJulianDayNumber 1996-2-25 is day 50138", mjd6 == 50138);
+ gregorian_calendar::ymd_type mjd_ymd6 = gregorian_calendar::from_modjulian_day_number(mjd6);
+ check("from_julian_day_number test 1996-2-25", (mjd_ymd6.year==1996) &&
+ (mjd_ymd6.month==2) &&
+ (mjd_ymd6.day==25) );
+
+
+ unsigned long jday3 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(1999,1,1));
+ check("366 days between 2000-1-1 and 2001-1-1", (jday2-jday1) == 366);
+ check("731 days between 1999-1-1 and 2001-1-1 ",(jday2-jday3) == 731);
+
+ unsigned long jday4 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,2,28));
+ unsigned long jday5 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,3,1));
+ check("2 days between 2000-2-28 and 2000-3-1 ",(jday5-jday4) == 2);
+
+ check("31 days in month Jan 2000", gregorian_calendar::end_of_month_day(2000,1) == 31);
+ check("29 days in month Feb 2000", gregorian_calendar::end_of_month_day(2000,2) == 29);
+ check("28 days in month Feb 1999", gregorian_calendar::end_of_month_day(1999,2) == 28);
+ check("28 days in month Feb 2001", gregorian_calendar::end_of_month_day(2001,2) == 28);
+ check("31 days in month Mar 2000", gregorian_calendar::end_of_month_day(2000,3) == 31);
+ check("30 days in month Apr 2000", gregorian_calendar::end_of_month_day(2000,4) == 30);
+ check("31 days in month May 2000", gregorian_calendar::end_of_month_day(2000,5) == 31);
+ check("30 days in month Jun 2000", gregorian_calendar::end_of_month_day(2000,6) == 30);
+ check("31 days in month Jul 2000", gregorian_calendar::end_of_month_day(2000,7) == 31);
+ check("31 days in month Aug 2000", gregorian_calendar::end_of_month_day(2000,8) == 31);
+ check("30 days in month Sep 2000", gregorian_calendar::end_of_month_day(2000,9) == 30);
+ check("31 days in month Oct 2000", gregorian_calendar::end_of_month_day(2000,10) == 31);
+ check("30 days in month Nov 2000", gregorian_calendar::end_of_month_day(2000,11) == 30);
+ check("31 days in month Dec 2000", gregorian_calendar::end_of_month_day(2000,12) == 31);
+
+
+ std::cout << gregorian_calendar::epoch().year << std::endl;
+
+
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/testint64_range.cpp b/src/boost/libs/date_time/test/testint64_range.cpp
new file mode 100644
index 000000000..fe4266348
--- /dev/null
+++ b/src/boost/libs/date_time/test/testint64_range.cpp
@@ -0,0 +1,95 @@
+/* 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 "date_time/testfrmwk.hpp"
+#include <iostream>
+#include "boost/date_time/gregorian/gregorian.hpp"
+#include "boost/cstdint.hpp"
+
+int
+main()
+{
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+ //skipping tests here due to lack of operator<< support in msvc6
+ // TODO: this is a bit misleading: using STLport, this should work.
+ std::cout << "Skipping tests on MSVC6" << std::endl;
+
+#else
+
+ std::cout << "int64_t max: "
+ << (std::numeric_limits<boost::int64_t>::max)()
+ << std::endl;
+ std::cout << "uint64_t max: "
+ << (std::numeric_limits<boost::uint64_t>::max)()
+ << std::endl;
+
+
+ boost::int64_t seconds_per_day = 60*60*24;
+ boost::int64_t microsec_per_sec = 1000000;
+ boost::int64_t microsec_per_day = seconds_per_day*microsec_per_sec;
+ std::cout << "microsec per day: "
+ << microsec_per_day
+ << std::endl;
+
+ boost::uint64_t total_days = (std::numeric_limits<boost::int64_t>::max)() / microsec_per_day;
+
+ std::cout << "Representable days: "
+ << total_days
+ << std::endl;
+
+ boost::int64_t approx_years = total_days / 366;
+
+ std::cout << "Approximate years: "
+ << approx_years
+ << std::endl;
+
+ //getting day count
+ // usec_count / (seconds_per_day*usec_per_sec);
+ boost::int64_t day_count = 1000;
+ boost::int64_t usec_count1000 = day_count*microsec_per_day + 999999;
+ std::cout << "usec count at day 1000 + 999999: "
+ << usec_count1000
+ << std::endl;
+
+ boost::int64_t day_count_calc = usec_count1000 / microsec_per_day;
+ std::cout << "calc day count at day 1000: "
+ << day_count_calc
+ << std::endl;
+
+ boost::int64_t remaining_usec_count = usec_count1000 % microsec_per_day;
+ std::cout << "remaining usec count: "
+ << remaining_usec_count
+ << std::endl;
+
+ boost::int32_t day_count3M = 3000000;
+ boost::int64_t usec_count3M = day_count3M*microsec_per_day + 999999;
+ std::cout << "usec count at day 3M + 999999: "
+ << usec_count3M
+ << std::endl;
+
+ boost::int64_t day_count_calc3M = usec_count3M / microsec_per_day;
+ std::cout << "calc day count at day 3M: "
+ << day_count_calc3M
+ << std::endl;
+
+ boost::int64_t remaining_usec_count3M = usec_count3M % microsec_per_day;
+ std::cout << "remaining usec count 3M: "
+ << remaining_usec_count3M
+ << std::endl;
+
+#endif
+
+// std::cout << "Days from: "
+// << to_simple_string(d1) << " to "
+// << to_simple_string(d2) << " = "
+// << day_count << std::endl;
+
+
+ // printTestStats();
+ return 0;
+};
+
diff --git a/src/boost/libs/date_time/test/testint_adapter.cpp b/src/boost/libs/date_time/test/testint_adapter.cpp
new file mode 100644
index 000000000..b5657f6a7
--- /dev/null
+++ b/src/boost/libs/date_time/test/testint_adapter.cpp
@@ -0,0 +1,158 @@
+/* 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, Bart Garst
+ */
+
+#include "boost/date_time/int_adapter.hpp"
+#include "testfrmwk.hpp"
+#include "boost/cstdint.hpp"
+#include <iostream>
+#include <sstream>
+
+template<typename int_type>
+void print()
+{
+ //MSVC 6 has problems with this, but it's not really important
+ //so we will just skip them....
+#if (defined(BOOST_DATE_TIME_NO_LOCALE)) || (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+
+#else
+ std::cout << "min: " << (int_type::min)().as_number() << std::endl;
+ std::cout << "max: " << (int_type::max)().as_number() << std::endl;
+ std::cout << "neg_infin: " <<
+ int_type::neg_infinity().as_number() << std::endl;
+ std::cout << "pos_infin: " <<
+ int_type::pos_infinity().as_number() << std::endl;
+ std::cout << "not a number: " <<
+ int_type::not_a_number().as_number() << std::endl;
+ std::stringstream ss("");
+ std::string s("");
+ int_type i = int_type::neg_infinity();
+ ss << i;
+ s = "-infinity";
+ check("streaming -infinity", ss.str() == s);
+
+ i = int_type::pos_infinity();
+ ss.str("");
+ ss << i;
+ s = "+infinity";
+ check("streaming +infinity", ss.str() == s);
+
+ i = int_type::not_a_number();
+ ss.str("");
+ ss << i;
+ s = "not-a-number";
+ check("streaming nan", ss.str() == s);
+
+ i = 12;
+ ss.str("");
+ ss << i;
+ s = "12";
+ check("streaming digits", ss.str() == s);
+#endif
+}
+
+
+template<typename int_type>
+void test_int()
+{
+ int_type i = int_type::neg_infinity();
+
+ check("is infinity", i.is_infinity());
+ check("is special_value (neg_inf)", i.is_special());
+ check("as_special convert", boost::date_time::neg_infin == i.as_special() );
+ check("as_special convert", boost::date_time::neg_infin == int_type::to_special(i.as_number()) );
+ int_type h = int_type::neg_infinity();
+ i = int_type::pos_infinity();
+ check("is infinity", i.is_infinity());
+ check("as_special convert", boost::date_time::pos_infin == i.as_special() );
+ check("infinity less", h < i);
+ check("infinity less", h < 0);
+ check("infinity greater", i > h);
+ check("infinity greater", i > 0);
+ h = int_type::not_a_number();
+ check("nan less", !(h < 0));
+ check("nan greater", !(h > 0));
+ check("nan equal", h == int_type::not_a_number());
+ i = 1;
+ check("is infinity", !i.is_infinity());
+ int_type j = int_type::neg_infinity();
+ check("infinity less", j < i);
+ check("infinity less", !(j < j));
+ check("infinity greater", (i > j));
+ check("infinity equal", !(j == i));
+ check("infinity equal", j == j);
+ check("infinity equal", !(j == 0));
+ check("infinity not equal", j != 0);
+
+ int_type k = 1;
+ check("as_special convert", boost::date_time::not_special == k.as_special() );
+ check("equal", i == k);
+ check("infinity not equal", i != int_type::neg_infinity());
+ check("infinity not equal", i != int_type::pos_infinity());
+ int_type l = i + int_type::pos_infinity();
+ check("is special_value (pos_inf)", l.is_special());
+ check("add infinity" , l == int_type::pos_infinity());
+ { // limiting the scope for these tests was easier than recalculating l
+ int_type m = i - int_type::pos_infinity();
+ check("value - +infinity", m == int_type::neg_infinity());
+ m = i + int_type::neg_infinity();
+ check("value + -infinity", m == int_type::neg_infinity());
+ }
+ check("inf - inf = nan", (l - l) == int_type::not_a_number());
+ check("-inf + inf = nan", (j + l) == int_type::not_a_number());
+ check("add 2", (i + 2) == 3);
+ i = int_type::not_a_number();
+ check("+inf * integer", (l * 2) == l);
+ check("+inf / integer", (l / 2) == l);
+ check("+inf % -integer", (l % -2) == j);
+ check("+inf % integer", (l % 2) == l);
+ check("+inf / -integer", (l / -2) == j);
+ check("+inf * -integer", (l * -2) == j);
+ check("+inf * -inf", (l * j) == j);
+ check("+inf / +inf", (l / l) == i);
+ check("+inf % +inf", (l % l) == i);
+ check("+inf * zero", (l * 0) == i);
+ check("is special_value (nan)", i.is_special());
+ check("as_special convert", boost::date_time::not_a_date_time == i.as_special() );
+ check("add not a number", (i + 2) == int_type::not_a_number());
+ check("sub not a number", (i - 2) == int_type::not_a_number());
+ check("sub from infin", (l - 2) == int_type::pos_infinity());
+ i = 5;
+ h = 3;
+ check("add zero ", (i + 0) == 5);
+ check("sub from 5-2 ", (i - 2) == 3);
+ check("remainder from 5/2 ", (i % 2) == 1);
+ check("remainder from 5/3 ", (i % h) == 2);
+ // std::cout << i.as_number() << std::endl;
+ check("from special ",
+ int_type::from_special(boost::date_time::pos_infin) == int_type::pos_infinity());
+ check("from special ",
+ int_type::from_special(boost::date_time::neg_infin) == int_type::neg_infinity());
+ check("from special ",
+ int_type::from_special(boost::date_time::not_a_date_time) == int_type::not_a_number());
+ check("from special ",
+ int_type::from_special(boost::date_time::min_date_time) == (int_type::min)());
+ check("from special ",
+ int_type::from_special(boost::date_time::max_date_time) == (int_type::max)());
+}
+
+int
+main()
+{
+ using namespace boost::date_time;
+
+ print< int_adapter<unsigned long> >();
+ test_int< int_adapter<unsigned long> >();
+ print< int_adapter<long> >();
+ test_int< int_adapter<long> >();
+ print< int_adapter<boost::int64_t> >();
+ test_int< int_adapter<boost::int64_t> >();
+
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/testmisc.cpp b/src/boost/libs/date_time/test/testmisc.cpp
new file mode 100644
index 000000000..e648ea8ec
--- /dev/null
+++ b/src/boost/libs/date_time/test/testmisc.cpp
@@ -0,0 +1,59 @@
+/* Copyright (c) 2020 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 "boost/date_time/wrapping_int.hpp"
+
+//#include <boost/date_time.hpp>
+#include "boost/date_time/posix_time/posix_time_duration.hpp"
+
+#include "testfrmwk.hpp"
+#include <iostream>
+
+using std::cout;
+using std::endl;
+
+int
+main()
+{
+ using namespace boost::date_time;
+ using namespace boost::posix_time;
+
+#ifdef BOOST_NO_CXX14_CONSTEXPR
+ check("constexpr not configured", true);
+#else
+ constexpr wrapping_int<int, 3600> wi(3599);
+ static_assert(wi == 3599, "constexpr construction/conversion");
+ check("constexpr wrapping construct and equal", true);
+
+ constexpr microseconds ms(1000);
+ static_assert(ms.is_special() == false, "constexpr duration is_special");
+ static_assert(ms.is_positive() == true, "constexpr duration is_positive");
+ static_assert(ms.is_negative() == false, "constexpr duration is_negative");
+ static_assert(ms.total_microseconds() == 1000, "constexpr total_microseconds");
+ check("constexpr microseconds - total_microseconds", true);
+
+#endif
+
+#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
+ cout << "Standard Config" << endl;
+#else
+ cout << "NOT Standard Config" << endl;
+#endif
+
+#ifdef BOOST_DATE_TIME_HAS_NANOSECONDS
+ cout << "Has NANO: " << endl;
+#else
+ cout << "NO NANO: " << endl;
+#endif
+
+ check("success", true);
+
+ return printTestStats();
+
+}
+
+
diff --git a/src/boost/libs/date_time/test/testtime_resolution_traits.cpp b/src/boost/libs/date_time/test/testtime_resolution_traits.cpp
new file mode 100644
index 000000000..20d0ae3e7
--- /dev/null
+++ b/src/boost/libs/date_time/test/testtime_resolution_traits.cpp
@@ -0,0 +1,72 @@
+/* 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 "boost/date_time/time_resolution_traits.hpp"
+#include "testfrmwk.hpp"
+
+
+int
+main()
+{
+ using namespace boost::date_time;
+ check("milli traits num digits", milli_res::num_fractional_digits() == 3);
+ check("milli traits resolution adjust",
+ milli_res::res_adjust() == 1000);
+ check("milli tick calculations",
+ milli_res::to_tick_count(0,0,0,1) == 1);
+ check("milli tick calculations",
+ milli_res::to_tick_count(0,0,1,1) == 1001);
+ check("milli tick calculations",
+ milli_res::to_tick_count(0,1,0,0) == 60000);
+ boost::int64_t one_hour_milli = 3600*1000;
+ check("milli tick calculations",
+ milli_res::to_tick_count(1,0,0,0) == one_hour_milli);
+
+ check("micro traits num digits", micro_res::num_fractional_digits() == 6);
+ check("micro traits resolution adjust",
+ micro_res::res_adjust() == 1000000);
+ check("micro tick calculations",
+ micro_res::to_tick_count(0,0,0,1) == 1);
+ check("micro tick calculations",
+ micro_res::to_tick_count(0,0,1,1) == 1000001);
+ check("micro tick calculations",
+ micro_res::to_tick_count(0,1,0,0) == 60000000);
+ boost::int64_t one_hour_micro = 3600*1000;
+ one_hour_micro = one_hour_micro*1000; //avoid compiler overflow!
+ check("micro tick calculations",
+ micro_res::to_tick_count(1,0,0,0) == one_hour_micro);
+
+ check("nano traits num digits", nano_res::num_fractional_digits() == 9);
+ check("nano traits resolution adjust",
+ nano_res::res_adjust() == 1000000000);
+ check("nano tick calculations",
+ nano_res::to_tick_count(0,0,0,1) == 1);
+ check("nano tick calculations",
+ nano_res::to_tick_count(0,0,1,1) == 1000000001);
+ boost::int64_t one_minute_nano = 60*1000*1000;
+ one_minute_nano = one_minute_nano*1000;
+ check("nano tick calculations",
+ nano_res::to_tick_count(0,1,0,0) == one_minute_nano);
+
+ //skip io on VC6 b/c of lack of operator<< for int64
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+#else
+ std::cout << one_hour_micro << std::endl;
+#endif
+ boost::int64_t one_hour_nano = one_hour_micro*1000;
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+#else
+ std::cout << one_hour_nano << std::endl;
+#endif
+ check("nano tick calculations",
+ nano_res::to_tick_count(1,0,0,0) == one_hour_nano);
+
+
+ return printTestStats();
+
+}
+
diff --git a/src/boost/libs/date_time/test/testwrapping_int.cpp b/src/boost/libs/date_time/test/testwrapping_int.cpp
new file mode 100644
index 000000000..b33a9d256
--- /dev/null
+++ b/src/boost/libs/date_time/test/testwrapping_int.cpp
@@ -0,0 +1,138 @@
+/* Copyright (c) 2002,2003,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
+ */
+
+#include "boost/date_time/wrapping_int.hpp"
+//#define BOOST_INCLUDE_MAIN
+//#include <boost/test/test_tools.hpp>
+#include "testfrmwk.hpp"
+#include "boost/cstdint.hpp"
+#include <iostream>
+
+
+int
+main()
+// int
+// test_main(int, char*[])
+{
+ using namespace boost::date_time;
+
+ wrapping_int<int, 3600> wi(3599);
+ check("construction/conversion", wi == 3599);
+ check("add with wrap", wi.add(1) == 1);
+ check("added value ok", wi == 0);
+ check("add with 2 wraps", wi.add(7201) == 2);
+ check("added value ok", wi == 1);
+ check("add with 3 wraps", wi.add(10800) == 3);
+ check("added value ok", wi == 1);
+ check("subtract no wrap", wi.subtract(1) == 0);
+ check("subtract val ok", wi == 0);
+ check("subtract no wrap", wi.subtract(3601) == 2);
+ check("subtract val ok", wi == 3599);
+ check("add again", (wi.add(2) == 1) && (wi == 1));
+ check("subtract again", (wi.subtract(2) == 1) && (wi == 3599));
+ check("add again", (wi.add(2) == 1) && (wi == 1));
+ check("subtract again", (wi.subtract(3600) == 1) && (wi == 1));
+ check("subtract again", (wi.subtract(3599) == 1) && (wi == 2));
+ check("subtract again", (wi.subtract(1) == 0) && (wi == 1));
+ std::cout << wi << std::endl;
+
+ wrapping_int<short, 60> wi2(0);
+ check("add with wrap - return", wi2.add(121) == 2);
+ check("add with wrap - value", wi2 == 1);
+
+ wrapping_int<short, 60> wi3(-5);
+ check("signed int - add return", wi3.add(5) == 0);
+ check("signed int - value", wi3 == 0);
+
+ { // subtracting negative values
+ wrapping_int<short, 10> wi4(5);
+ check("subtract negative value to cause wrap",
+ (wi4.subtract(-8) == -1 && wi4 == 3));
+ check("reset", wi4.add(2) == 0 && wi4 ==5);
+ check("add negative value to cause wrap",
+ (wi4.add(-8) == -1 && wi4 == 7));
+ }
+
+ wrapping_int2<short, 1, 5> wi4(1);
+ check("construct", wi4 == 1);
+ check("add up to wrap value", (wi4.add(4) == 0 && wi4 == 5));
+ check("add over the wrap value", (wi4.add(1) == 1 && wi4 == 1));
+ check("add over the wrap value X 2", (wi4.add(10) == 2 && wi4 == 1));
+ check("add over the wrap value X 3", (wi4.add(15) == 3 && wi4 == 1));
+
+ wrapping_int2<short, 1, 12> wi5(12);
+ check("construct", wi5 == 12);
+ check("add over the wrap value", (wi5.add(1) == 1 && wi5 == 1));
+
+ check("subtract of the wrap value", (wi5.subtract(1) == -1 && wi5 == 12));
+ check("subtract of the wrap value", (wi5.subtract(13) == -1 && wi5 == 11));
+
+ // min_values other than 1
+ wrapping_int2<short, 2, 6> wi6(2);
+ check("construct", wi6 == 2);
+ check("add up to wrap value", (wi6.add(4) == 0 && wi6 == 6));
+ check("add over the wrap value", (wi6.add(1) == 1 && wi6 == 2));
+ check("add over the wrap value X 2", wi6.add(11) == 2);
+ check("add over the wrap value X 2", wi6 == 3);
+ check("sub down to wrap value", wi6.subtract(1) == 0 && wi6 == 2);
+ check("sub under the wrap value", wi6.subtract(1) == -1 && wi6 == 6);
+ check("sub under the wrap value X 2", wi6.subtract(11) == -2 && wi6 == 5);
+ //std::cout << wi6 << std::endl;
+
+ // adding & subtracting negative values
+ wrapping_int2<short, 1, 12> wi7(6);
+ wrapping_int2<short, -5, 5> wi8(0);
+ check("add negative value", (wi7.add(-2) == 0 && wi7 == 4));
+ check("add negative value", (wi8.add(-2) == 0 && wi8 == -2));
+ check("add negative value to cause single wrap",
+ (wi7.add(-6) == -1 && wi7 == 10));
+ check("add negative value to cause single wrap",
+ (wi8.add(-5) == -1 && wi8 == 4));
+ check("add negative value to cause multiple wrap",
+ (wi7.add(-22) == -2 && wi7 == 12));
+ check("add negative value to cause multiple wrap",
+ (wi8.add(-22) == -2 && wi8 == 4));
+ // reset values to mid range
+ wi7.subtract(6);
+ check("reset", wi7 == 6);
+ wi8.subtract(4);
+ check("reset", wi8 == 0);
+ check("subtract negative value", (wi7.subtract(-2) == 0 && wi7 == 8));
+ check("subtract negative value", (wi8.subtract(-2) == 0 && wi8 == 2));
+ check("subtract negative value to cause single wrap",
+ (wi7.subtract(-6) == 1 && wi7 == 2));
+ check("subtract negative value to cause single wrap",
+ (wi8.subtract(-5) == 1 && wi8 == -4));
+ check("subtract negative value to cause multiple wrap",
+ (wi7.subtract(-23) == 2 && wi7 == 1));
+ check("subtract negative value to cause multiple wrap",
+ (wi8.subtract(-22) == 2 && wi8 == -4));
+
+// #ifdef BOOST_HAS_LONG_LONG
+// wrapping_int<boost::int64_t, 86400*100000LL> wi4(0);
+// check("construction/conversion", wi4 == 0);
+// boost::int64_t off2 = 372300000;
+// boost::int64_t wrap = 86400LL*100000LL;
+// boost::int64_t wrap2 = 86400000000;
+// wrapping_int<boost::int64_t,86400000000LL> wi5((3600*1 + 60*2 + 3)*100000);
+// std::cout << wi5 << std::endl;
+// boost::int64_t over = wi4.add(off2);
+// std::cout << over << std::endl;
+// std::cout << wrap << std::endl;
+// std::cout << wrap2 << std::endl;
+// // check("construction/conversion", wi4 == 0);
+// #endif
+
+// wrapping_int<int, 60> wi(121);
+// check("construction/conversion", wi == 121);
+// check("add with wrap", wi.add(1) == 1);
+
+ return printTestStats();
+
+}
+
+