datetimetest.cpp
来自「C++ class libraries for network-centric,」· C++ 代码 · 共 869 行 · 第 1/2 页
CPP
869 行
//// DateTimeTest.cpp//// $Id: //poco/1.2/Foundation/testsuite/src/DateTimeTest.cpp#2 $//// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.// and Contributors.//// Permission is hereby granted, free of charge, to any person or organization// obtaining a copy of the software and accompanying documentation covered by// this license (the "Software") to use, reproduce, display, distribute,// execute, and transmit the Software, and to prepare derivative works of the// Software, and to permit third-parties to whom the Software is furnished to// do so, all subject to the following:// // The copyright notices in the Software and this entire statement, including// the above license grant, this restriction and the following disclaimer,// must be included in all copies of the Software, in whole or in part, and// all derivative works of the Software, unless such copies or derivative// works are solely in the form of machine-executable object code generated by// a source language processor.// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER// DEALINGS IN THE SOFTWARE.//#include "DateTimeTest.h"#include "CppUnit/TestCaller.h"#include "CppUnit/TestSuite.h"#include "Poco/DateTime.h"#include "Poco/Timestamp.h"#include "Poco/Timespan.h"#include "Poco/Exception.h"using Poco::Timestamp;using Poco::DateTime;using Poco::Timespan;using Poco::AssertionViolationException;DateTimeTest::DateTimeTest(const std::string& name): CppUnit::TestCase(name){}DateTimeTest::~DateTimeTest(){}void DateTimeTest::testTimestamp(){ Timestamp ts(0); // Unix epoch 1970-01-01 00:00:00 Thursday DateTime dt(ts); assert (dt.year() == 1970); assert (dt.month() == 1); assert (dt.day() == 1); assert (dt.hour() == 0); assert (dt.minute() == 0); assert (dt.second() == 0); assert (dt.millisecond() == 0); assert (dt.dayOfWeek() == 4); assert (dt.julianDay() == 2440587.5); assert (dt.timestamp() == 0); ts = Timestamp::fromEpochTime(1000000000); dt = ts; // 2001-09-09 01:46:40 Sunday assert (dt.year() == 2001); assert (dt.month() == 9); assert (dt.day() == 9); assert (dt.hour() == 1); assert (dt.minute() == 46); assert (dt.second() == 40); assert (dt.millisecond() == 0); assert (dt.dayOfWeek() == 0); assert (dt.timestamp().epochTime() == 1000000000); assertEqualDelta (dt.julianDay(), 2452161.574074, 0.000001);}void DateTimeTest::testJulian(){ DateTime dt(2440587.5); // unix epoch as Julian day assert (dt.year() == 1970); assert (dt.month() == 1); assert (dt.day() == 1); assert (dt.hour() == 0); assert (dt.minute() == 0); assert (dt.second() == 0); assert (dt.millisecond() == 0); assert (dt.dayOfWeek() == 4); assert (dt.julianDay() == 2440587.5); assert (dt.timestamp() == 0); dt = 2299160.5; // 1582-10-15 00:00:00 (first day of Gregorian reform, UTC base) assert (dt.year() == 1582); assert (dt.month() == 10); assert (dt.day() == 15); assert (dt.hour() == 0); assert (dt.minute() == 0); assert (dt.second() == 0); assert (dt.millisecond() == 0); assert (dt.dayOfWeek() == 5); assert (dt.julianDay() == 2299160.5); dt = 0.0; // -4713-11-24 12:00:00 (Gregorian date of Julian day reference) assert (dt.year() == -4713); assert (dt.month() == 11); assert (dt.day() == 24); assert (dt.hour() == 12); assert (dt.minute() == 0); assert (dt.second() == 0); assert (dt.millisecond() == 0); assert (dt.dayOfWeek() == 1); assert (dt.julianDay() == 0); // Test that we can represent down to the microsecond. dt = DateTime(2010, 1, 31, 17, 30, 15, 800, 3); assert (dt.year() == 2010); assert (dt.month() == 1); assert (dt.day() == 31); assert (dt.hour() == 17); assert (dt.minute() == 30); assert (dt.second() == 15); assert (dt.millisecond() == 800); assert (dt.microsecond() == 3);}void DateTimeTest::testGregorian(){ DateTime dt(1970, 1, 1); assert (dt.year() == 1970); assert (dt.month() == 1); assert (dt.day() == 1); assert (dt.hour() == 0); assert (dt.minute() == 0); assert (dt.second() == 0); assert (dt.millisecond() == 0); assert (dt.dayOfWeek() == 4); assert (dt.julianDay() == 2440587.5); assert (dt.timestamp() == 0); dt.assign(2001, 9, 9, 1, 46, 40); assert (dt.year() == 2001); assert (dt.month() == 9); assert (dt.day() == 9); assert (dt.hour() == 1); assert (dt.minute() == 46); assert (dt.second() == 40); assert (dt.millisecond() == 0); assert (dt.dayOfWeek() == 0); assert (dt.timestamp().epochTime() == 1000000000); assertEqualDelta (dt.julianDay(), 2452161.574074, 0.000001);}void DateTimeTest::testConversions(){ DateTime dt1(2005, 1, 28, 14, 24, 44, 234); Timestamp ts1 = dt1.timestamp(); DateTime dt2(ts1); Timestamp ts2 = dt2.timestamp(); DateTime dt3; dt3 = dt1; Timestamp ts3 = dt3.timestamp(); DateTime dt4(dt2); Timestamp ts4 = dt4.timestamp(); assert (ts1 == ts2); assert (ts2 == ts3); assert (ts3 == ts4); assert (dt2.year() == 2005); assert (dt2.month() == 1); assert (dt2.day() == 28); assert (dt2.hour() == 14); assert (dt2.minute() == 24); assert (dt2.second() == 44); assert (dt2.millisecond() == 234); assert (dt2.dayOfWeek() == 5);}void DateTimeTest::testStatics(){ assert (DateTime::isLeapYear(1984)); assert (DateTime::isLeapYear(1988)); assert (DateTime::isLeapYear(1992)); assert (DateTime::isLeapYear(1996)); assert (DateTime::isLeapYear(2000)); assert (DateTime::isLeapYear(2400)); assert (!DateTime::isLeapYear(1995)); assert (!DateTime::isLeapYear(1998)); assert (!DateTime::isLeapYear(2001)); assert (!DateTime::isLeapYear(1800)); assert (!DateTime::isLeapYear(1900)); assert (DateTime::daysOfMonth(2000, 1) == 31); assert (DateTime::daysOfMonth(2000, 2) == 29); assert (DateTime::daysOfMonth(1999, 2) == 28);}void DateTimeTest::testCalcs(){ DateTime dt1(2005, 1, 1); assert (dt1.dayOfYear() == 1); assert (dt1.week(DateTime::MONDAY) == 0); dt1.assign(2005, 1, 3); assert (dt1.dayOfYear() == 3); assert (dt1.week(DateTime::MONDAY) == 1); dt1.assign(2005, 1, 9); assert (dt1.dayOfYear() == 9); assert (dt1.week(DateTime::MONDAY) == 1); dt1.assign(2005, 1, 10); assert (dt1.dayOfYear() == 10); assert (dt1.week(DateTime::MONDAY) == 2); dt1.assign(2005, 2, 1); assert (dt1.dayOfYear() == 32); assert (dt1.week(DateTime::MONDAY) == 5); dt1.assign(2005, 12, 31); assert (dt1.week(DateTime::MONDAY) == 52); dt1.assign(2007, 1, 1); assert (dt1.week(DateTime::MONDAY) == 1); dt1.assign(2007, 12, 31); assert (dt1.week(DateTime::MONDAY) == 53); // Jan 1 is Mon dt1.assign(2001, 1, 1); assert (dt1.week() == 1); dt1.assign(2001, 1, 7); assert (dt1.week() == 1); dt1.assign(2001, 1, 8); assert (dt1.week() == 2); dt1.assign(2001, 1, 21); assert (dt1.week() == 3); dt1.assign(2001, 1, 22); assert (dt1.week() == 4); // Jan 1 is Tue dt1.assign(2002, 1, 1); assert (dt1.week() == 1); dt1.assign(2002, 1, 6); assert (dt1.week() == 1); dt1.assign(2002, 1, 7); assert (dt1.week() == 2); dt1.assign(2002, 1, 20); assert (dt1.week() == 3); dt1.assign(2002, 1, 21); assert (dt1.week() == 4); // Jan 1 is Wed dt1.assign(2003, 1, 1); assert (dt1.week() == 1); dt1.assign(2003, 1, 5); assert (dt1.week() == 1); dt1.assign(2003, 1, 6); assert (dt1.week() == 2); dt1.assign(2003, 1, 19); assert (dt1.week() == 3); dt1.assign(2003, 1, 20); assert (dt1.week() == 4); // Jan 1 is Thu dt1.assign(2004, 1, 1); assert (dt1.week() == 1); dt1.assign(2004, 1, 4); assert (dt1.week() == 1); dt1.assign(2004, 1, 5); assert (dt1.week() == 2); dt1.assign(2004, 1, 18); assert (dt1.week() == 3); dt1.assign(2004, 1, 19); assert (dt1.week() == 4); // Jan 1 is Fri dt1.assign(1999, 1, 1); assert (dt1.week() == 0); dt1.assign(1999, 1, 3); assert (dt1.week() == 0); dt1.assign(1999, 1, 4); assert (dt1.week() == 1); dt1.assign(1999, 1, 17); assert (dt1.week() == 2); dt1.assign(1999, 1, 18); assert (dt1.week() == 3); // Jan 1 is Sat dt1.assign(2000, 1, 1); assert (dt1.week() == 0); dt1.assign(2000, 1, 2); assert (dt1.week() == 0); dt1.assign(2000, 1, 3); assert (dt1.week() == 1); dt1.assign(2000, 1, 16); assert (dt1.week() == 2); dt1.assign(2000, 1, 17); assert (dt1.week() == 3); // Jan 1 is Sun dt1.assign(1995, 1, 1); assert (dt1.week() == 0); dt1.assign(1995, 1, 2); assert (dt1.week() == 1); dt1.assign(1995, 1, 3); assert (dt1.week() == 1); dt1.assign(1995, 1, 15); assert (dt1.week() == 2); dt1.assign(1995, 1, 16); assert (dt1.week() == 3);}void DateTimeTest::testAMPM(){ DateTime dt1(2005, 1, 1, 0, 15, 30); assert (dt1.isAM()); assert (!dt1.isPM()); assert (dt1.hourAMPM() == 12); dt1.assign(2005, 1, 1, 12, 15, 30); assert (!dt1.isAM()); assert (dt1.isPM()); assert (dt1.hourAMPM() == 12); dt1.assign(2005, 1, 1, 13, 15, 30); assert (!dt1.isAM()); assert (dt1.isPM()); assert (dt1.hourAMPM() == 1);}void DateTimeTest::testRelational(){ DateTime dt1(2005, 1, 1, 0, 15, 30); DateTime dt2(2005, 1, 2, 0, 15, 30); DateTime dt3(dt1); assert (dt1 < dt2); assert (dt1 <= dt2); assert (dt2 > dt1); assert (dt2 >= dt1); assert (dt1 != dt2); assert (!(dt1 == dt2)); assert (dt1 == dt3); assert (!(dt1 != dt3)); assert (dt1 >= dt3); assert (dt1 <= dt3); assert (!(dt1 > dt3)); assert (!(dt1 < dt3)); static const struct { int year; int month; int day; } values[] = { { 1, 1, 1 }, { 10, 4, 5 }, { 100, 6, 7 }, { 1000, 8, 9 }, { 2000, 1, 31 }, { 2002, 7, 4 }, { 2002, 12, 31 }, { 2003, 1, 1 }, { 2003, 1, 2 }, { 2003, 8, 5 }, { 2003, 8, 6 }, { 2003, 8, 7 }, { 2004, 9, 3 }, { 2004, 9, 4 }, }; const int num_values = sizeof values / sizeof *values; for (int i = 0; i < num_values; ++i) { DateTime v; const DateTime& V = v; v.assign(values[i].year, values[i].month, values[i].day); for (int j = 0; j < num_values; ++j) { DateTime u; const DateTime& U = u; u.assign(values[j].year, values[j].month, values[j].day); loop_2_assert(i, j, j < i == U < V); loop_2_assert(i, j, j <= i == U <= V); loop_2_assert(i, j, j >= i == U >= V); loop_2_assert(i, j, j > i == U > V); } }}void DateTimeTest::testArithmetics(){ DateTime dt1(2005, 1, 1, 0, 15, 30); DateTime dt2(2005, 1, 2, 0, 15, 30); Timespan s = dt2 - dt1; assert (s.days() == 1); DateTime dt3 = dt1 + s; assert (dt3 == dt2); dt3 -= s; assert (dt3 == dt1); dt1 += s; assert (dt1 == dt2); static const struct { int lineNum; // source line number int year1; // operand/result date1 year int month1; // operand/result date1 month unsigned int day1; // operand/result date1 day int numDays; // operand/result 'int' number of days int year2; // operand/result date2 year int month2; // operand/result date2 month unsigned int day2; // operand/result date2 day } data[] = { // - - - -first- - - - - - - second - - - //line no. year month day numDays year month day
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?