datetimetest.cpp

来自「C++ class libraries for network-centric,」· C++ 代码 · 共 869 行 · 第 1/2 页

CPP
869
字号
        //-------   -----  -----  -----  -------  -----  -----  -----         { __LINE__,       1,     1,     1,      1,      1,     1,     2 },        { __LINE__,      10,     2,    28,      1,     10,     3,     1 },        { __LINE__,     100,     3,    31,      2,    100,     4,     2 },        { __LINE__,    1000,     4,    30,      4,   1000,     5,     4 },        { __LINE__,    1000,     6,     1,    -31,   1000,     5,     1 },        { __LINE__,    1001,     1,     1,   -365,   1000,     1,     1 },        { __LINE__,    1100,     5,    31,     30,   1100,     6,    30 },        { __LINE__,    1200,     6,    30,     32,   1200,     8,     1 },        { __LINE__,    1996,     2,    28,    367,   1997,     3,     1 },        { __LINE__,    1997,     2,    28,    366,   1998,     3,     1 },        { __LINE__,    1998,     2,    28,    365,   1999,     2,    28 },        { __LINE__,    1999,     2,    28,    364,   2000,     2,    27 },        { __LINE__,    1999,     2,    28,   1096,   2002,     2,    28 },        { __LINE__,    2002,     2,    28,  -1096,   1999,     2,    28 },    };    const int num_data = sizeof data / sizeof *data;    for (int di = 0; di < num_data; ++di)     {        const int line     = data[di].lineNum;        const int num_days = data[di].numDays;        DateTime x = DateTime(data[di].year1, data[di].month1, data[di].day1);        const DateTime& X = x;        x += Timespan(num_days, 0, 0, 0, 0);        loop_1_assert(line, data[di].year2 == X.year());        loop_1_assert(line, data[di].month2 == X.month());        loop_1_assert(line, data[di].day2 == X.day());    }}void DateTimeTest::testIncrementDecrement(){    static const struct     {        int lineNum;		// source line number        int year1;			// (first) date year        int month1;			// (first) date month        unsigned int day1;	// (first) date day        int year2;			// (second) date year        int month2;			// (second) date month        unsigned int day2;	// (second) date day    } data[] =     {       //          - - - -first- - - -    - - - second - - -        //line no.  year   month   day     year   month   day       //-------   -----  -----  -----    -----  -----  -----       { __LINE__,       1,     1,     1,       1,     1,     2 },      { __LINE__,      10,     2,    28,      10,     3,     1 },      { __LINE__,     100,     3,    31,     100,     4,     1 },      { __LINE__,    1000,     4,    30,    1000,     5,     1 },      { __LINE__,    1100,     5,    31,    1100,     6,     1 },      { __LINE__,    1200,     6,    30,    1200,     7,     1 },      { __LINE__,    1300,     7,    31,    1300,     8,     1 },      { __LINE__,    1400,     8,    31,    1400,     9,     1 },      { __LINE__,    1500,     9,    30,    1500,    10,     1 },      { __LINE__,    1600,    10,    31,    1600,    11,     1 },      { __LINE__,    1700,    11,    30,    1700,    12,     1 },      { __LINE__,    1800,    12,    31,    1801,     1,     1 },      { __LINE__,    1996,     2,    28,    1996,     2,    29 },      { __LINE__,    1997,     2,    28,    1997,     3,     1 },      { __LINE__,    1998,     2,    28,    1998,     3,     1 },      { __LINE__,    1999,     2,    28,    1999,     3,     1 },      { __LINE__,    2000,     2,    28,    2000,     2,    29 },      { __LINE__,    2001,     2,    28,    2001,     3,     1 },      { __LINE__,    2004,     2,    28,    2004,     2,    29 },      { __LINE__,    2100,     2,    28,    2100,     3,     1 },      { __LINE__,    2400,     2,    28,    2400,     2,    29 },    };    const int num_data = sizeof data / sizeof *data;    int di;    for (di = 0; di < num_data; ++di)     {        const int line = data[di].lineNum;        DateTime x = DateTime(data[di].year1, data[di].month1,                               data[di].day1);        // Would do pre-increment of x here.        const DateTime& X = x;        x = x + Timespan(1,0,0,0,0);          DateTime y = x; const DateTime& Y = y;        loop_1_assert(line, data[di].year2  == X.year());        loop_1_assert(line, data[di].month2 == X.month());        loop_1_assert(line, data[di].day2   == X.day());        loop_1_assert(line, data[di].year2  == Y.year());        loop_1_assert(line, data[di].month2 == Y.month());        loop_1_assert(line, data[di].day2   == Y.day());    }    for (di = 0; di < num_data; ++di)     {        const int line = data[di].lineNum;        DateTime x = DateTime(data[di].year1, data[di].month1, data[di].day1);        DateTime x1 = DateTime(data[di].year1, data[di].month1, data[di].day1);        DateTime x2 = DateTime(data[di].year2, data[di].month2, data[di].day2);        DateTime y = x; const DateTime& Y = y;        // Would do post increment of x here.        const DateTime& X = x;        x = x + Timespan(1,0,0,0,0);          loop_1_assert(line, data[di].year2  == X.year());        loop_1_assert(line, data[di].month2 == X.month());        loop_1_assert(line, data[di].day2   == X.day());        loop_1_assert(line, data[di].year1  == Y.year());        loop_1_assert(line, data[di].month1 == Y.month());        loop_1_assert(line, data[di].day1   == Y.day());    }                for (di = 0; di < num_data; ++di)     {        const int line = data[di].lineNum;        DateTime x = DateTime(data[di].year2, data[di].month2, data[di].day2);        const DateTime& X = x;        x = x - Timespan(1,0,0,0,0);          DateTime y = x; DateTime Y = y;        loop_1_assert(line, data[di].year1  == X.year());        loop_1_assert(line, data[di].month1 == X.month());        loop_1_assert(line, data[di].day1   == X.day());        loop_1_assert(line, data[di].year1  == Y.year());        loop_1_assert(line, data[di].month1 == Y.month());        loop_1_assert(line, data[di].day1   == Y.day());    }    for (di = 0; di < num_data; ++di)     {        const int line = data[di].lineNum;        DateTime x1 = DateTime(data[di].year1, data[di].month1, data[di].day1);        DateTime x = DateTime(data[di].year2, data[di].month2, data[di].day2);        DateTime y = x; DateTime Y = y;        const DateTime& X = x;        // would post-decrement x here.        x = x - Timespan(1,0,0,0,0);          loop_1_assert(line, data[di].year1  == X.year());        loop_1_assert(line, data[di].month1 == X.month());        loop_1_assert(line, data[di].day1   == X.day());        loop_1_assert(line, data[di].year2  == Y.year());        loop_1_assert(line, data[di].month2 == Y.month());        loop_1_assert(line, data[di].day2   == Y.day());    }}void DateTimeTest::testSwap(){	DateTime dt1(2005, 1, 1, 0, 15, 30);	DateTime dt2(2005, 1, 2, 0, 15, 30);	DateTime dt3(2005, 1, 1, 0, 15, 30);	DateTime dt4(2005, 1, 2, 0, 15, 30);		dt1.swap(dt2);	assert (dt2 == dt3);	assert (dt1 == dt4);}void DateTimeTest::testUsage(){    DateTime dt1(1776, 7, 4);    assert (dt1.year() == 1776);    assert (dt1.month() == 7);    assert (dt1.day() == 4);    DateTime dt2(dt1);    dt2 += Timespan(6, 0, 0, 0, 0);    assert (dt2.year() == 1776);    assert (dt2.month() == 7);    assert (dt2.day() == 10);    Timespan span = dt2 - dt1;    assert (span.days() == 6);    // TODO - When adding months and years we need to be    // able to specify the end-end convention.    // We cannot do this in POCO at the moment.}void DateTimeTest::testSetYearDay(){    static const struct     {        int d_lineNum;			// source line number        int d_year;				// year under test        unsigned int d_day;		// day-of-year under test        int d_expMonth;			// expected month        unsigned int d_expDay;	// expected day    } data[] =     {		//line no.  year   dayOfYr     exp. month   exp. day		//-------   -----  -------     ----------   --------		{ __LINE__,          1,       1,          1,         1 },   		{ __LINE__,          1,       2,          1,         2 },		{ __LINE__,          1,     365,         12,        31 },		{ __LINE__,       1996,       1,          1,         1 },   		{ __LINE__,       1996,       2,          1,         2 },		{ __LINE__,       1996,     365,         12,        30 },		{ __LINE__,       1996,     366,         12,        31 }    };    const int num_data = sizeof data / sizeof *data;    for (int di = 0; di < num_data; ++di)     {        const int line      = data[di].d_lineNum;        const int year      = data[di].d_year;        const unsigned int day = data[di].d_day;        const int exp_month = data[di].d_expMonth;        const unsigned int exp_day   = data[di].d_expDay;        const DateTime r(year, exp_month, exp_day);        DateTime x;        const DateTime& X = x;#if 0        // TODO - need to be able to assign a day number in the year        // but POCO is not able to do this.        x.assign(year, day);                        // TODO - need to be able to assert with the loop counter        // but cppUnit is not able to do this.        assert (r   == x);        assert (day == X.dayOfYear());#endif    }    static const struct     {        int d_lineNum;  // source line number        int d_year;     // year under test        int d_day;      // day-of-year under test        int d_exp;      // expected status    } data2[] =     {        //line no.  year   dayOfYr     expected value        //-------   -----  -------     --------------        { __LINE__,          1,       1,          1 },           { __LINE__,          1,      -1,          0 },        { __LINE__,          1,       0,          0 },        { __LINE__,          1,     365,          1 },        { __LINE__,          1,     366,          0 },        { __LINE__,          1,     367,          0 },        { __LINE__,          0,       0,          0 },           { __LINE__,         -1,      -1,          0 },           { __LINE__,       1996,       1,          1 },           { __LINE__,       1996,       2,          1 },        { __LINE__,       1996,      32,          1 },        { __LINE__,       1996,     365,          1 },        { __LINE__,       1996,     366,          1 },        { __LINE__,       1996,     367,          0 },	};    const int num_data2 = sizeof data2 / sizeof *data2;    for (int di = 0; di < num_data2; ++di)     {        const int line  = data2[di].d_lineNum;        const int year  = data2[di].d_year;        const int day   = data2[di].d_day;        const int exp   = data2[di].d_exp;        DateTime x;          const DateTime& X = x;        if (1 == exp)        {            DateTime r;            const DateTime& r2 = r;#if 0            r.set(year, day);#endif        }    }}void DateTimeTest::testIsValid(){    static const struct     {        int  d_lineNum;  // source line number        int  d_year;     // year under test        int  d_month;    // month under test        int  d_day;      // day under test        bool d_exp;      // expected value    } data[] =     {		//line no.  year   month   day     expected value		//-------   -----  -----  -----    --------------		{ __LINE__,    0,     0,     0,      false },   		{ __LINE__,    1,     1,     0,      false },   		{ __LINE__,    1,     0,     1,      false },   		{ __LINE__,    0,     1,     1,      true },   		{ __LINE__,    1,     1,    -1,      false },   		{ __LINE__,    1,    -1,     1,      false },   		{ __LINE__, 2004,     1,    32,      false },   		{ __LINE__, 2004,     2,    30,      false },   		{ __LINE__, 2004,     3,    32,      false },   		{ __LINE__, 2004,     4,    31,      false },   		{ __LINE__, 2004,     5,    32,      false },   		{ __LINE__, 2004,     6,    31,      false },   		{ __LINE__, 2004,     7,    32,      false },   		{ __LINE__, 2004,     8,    32,      false },   		{ __LINE__, 2004,     9,    31,      false },   		{ __LINE__, 2004,    10,    32,      false },   		{ __LINE__, 2004,    11,    31,      false },   		{ __LINE__, 2004,    12,    32,      false },   		{ __LINE__,    0,    12,    31,      true },		{ __LINE__,    0,     2,    29,      true },		{ __LINE__,    1,     1,     1,      true }, 		{ __LINE__, 2010,     1,     2,      true }, 		{ __LINE__, 2011,     2,     5,      true }, 		{ __LINE__, 2012,     3,    10,      true }, 		{ __LINE__, 2013,     4,    17,      true }, 		{ __LINE__, 2014,     5,    23,      true }, 		{ __LINE__, 1600,     2,    29,      true },   		{ __LINE__, 1700,     2,    29,      false },   		{ __LINE__, 1800,     2,    29,      false },   		{ __LINE__, 1900,     2,    29,      false },   		{ __LINE__, 2000,     2,    29,      true },   		{ __LINE__, 2100,     2,    29,      false },   	};    const int num_data = sizeof data / sizeof *data;    for (int di = 0; di < num_data; ++di)     {        const int  line  = data[di].d_lineNum;        const int  year  = data[di].d_year;        const int  month = data[di].d_month;        const int  day   = data[di].d_day;        const bool exp   = data[di].d_exp;		bool isValid = DateTime::isValid(year, month, day);        loop_1_assert(line, exp == isValid);    }}void DateTimeTest::testDayOfWeek(){    typedef DateTime::DaysOfWeek DOW;    static const struct     {        int d_lineNum;	// source line number        int d_year;		// year under test        int d_month;	// month under test        int d_day;		// day under test        DOW d_expDay;	// number of days to be added    } data[] =     {		//Line no.    year   month   day    expDay		//-------   -----  -----  -----   -------		{ __LINE__,  1600,   1,       1,   DateTime::SATURDAY  },		{ __LINE__,  1600,   1,       2,   DateTime::SUNDAY    },         		{ __LINE__,  1600,   1,       3,   DateTime::MONDAY    },		{ __LINE__,  1600,   1,       4,   DateTime::TUESDAY   },		{ __LINE__,  1600,   1,       5,   DateTime::WEDNESDAY },     		{ __LINE__,  1600,   1,       6,   DateTime::THURSDAY  },		{ __LINE__,  1600,   1,       7,   DateTime::FRIDAY    },		{ __LINE__,  1600,   1,       8,   DateTime::SATURDAY  },		{ __LINE__,  1752,   8,      27,   DateTime::SUNDAY    },		{ __LINE__,  1752,   8,      28,   DateTime::MONDAY    },		{ __LINE__,  1752,   8,      29,   DateTime::TUESDAY   },		{ __LINE__,  1752,   8,      30,   DateTime::WEDNESDAY },		{ __LINE__,  1752,   8,      31,   DateTime::THURSDAY  },		{ __LINE__,  1752,   9,       1,   DateTime::FRIDAY    },		{ __LINE__,  1752,   9,       2,   DateTime::SATURDAY  },         		{ __LINE__,  1752,   9,      14,   DateTime::THURSDAY  },		{ __LINE__,  1752,   9,      15,   DateTime::FRIDAY    },		{ __LINE__,  1752,   9,      16,   DateTime::SATURDAY  },     		{ __LINE__,  1752,   9,      17,   DateTime::SUNDAY    },		{ __LINE__,  1752,   9,      18,   DateTime::MONDAY    },		{ __LINE__,  1752,   9,      19,   DateTime::TUESDAY   },		{ __LINE__,  1999,  12,      28,   DateTime::TUESDAY   },		{ __LINE__,  1999,  12,      29,   DateTime::WEDNESDAY },         		{ __LINE__,  1999,  12,      30,   DateTime::THURSDAY  },		{ __LINE__,  1999,  12,      31,   DateTime::FRIDAY    },		{ __LINE__,  2000,   1,       1,   DateTime::SATURDAY  },     		{ __LINE__,  2000,   1,       2,   DateTime::SUNDAY    },		{ __LINE__,  2000,   1,       3,   DateTime::MONDAY    },		{ __LINE__,  2000,   1,       4,   DateTime::TUESDAY   },    };                const int num_data = sizeof data / sizeof *data;    for (int di = 0; di < num_data ; ++di)     {        const int line = data[di].d_lineNum;        DateTime x = DateTime(data[di].d_year, data[di].d_month, data[di].d_day);        const DateTime& X = x;        loop_1_assert(line, data[di].d_expDay == X.dayOfWeek());    }}void DateTimeTest::setUp(){}void DateTimeTest::tearDown(){}CppUnit::Test* DateTimeTest::suite(){	CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("DateTimeTest");	CppUnit_addTest(pSuite, DateTimeTest, testTimestamp);	CppUnit_addTest(pSuite, DateTimeTest, testJulian);	CppUnit_addTest(pSuite, DateTimeTest, testGregorian);	CppUnit_addTest(pSuite, DateTimeTest, testConversions);	CppUnit_addTest(pSuite, DateTimeTest, testStatics);	CppUnit_addTest(pSuite, DateTimeTest, testCalcs);	CppUnit_addTest(pSuite, DateTimeTest, testAMPM);	CppUnit_addTest(pSuite, DateTimeTest, testRelational);	CppUnit_addTest(pSuite, DateTimeTest, testArithmetics);	CppUnit_addTest(pSuite, DateTimeTest, testSwap);	CppUnit_addTest(pSuite, DateTimeTest, testUsage);	CppUnit_addTest(pSuite, DateTimeTest, testSetYearDay);	CppUnit_addTest(pSuite, DateTimeTest, testIsValid);	CppUnit_addTest(pSuite, DateTimeTest, testDayOfWeek);	CppUnit_addTest(pSuite, DateTimeTest, testIncrementDecrement);	return pSuite;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?