test_ncbitime.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:29k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbitime.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:10:23  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.22
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbitime.cpp,v 1000.3 2004/06/01 19:10:23 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Anton Butanayev, Denis Vakatov, Vladimir Ivanov
  35.  *
  36.  * File Description:
  37.  *   Test for CTime - the standard Date/Time class
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbitime.hpp>
  42. #include <stdio.h>
  43. #include <test/test_assert.h>  /* This header must go last */
  44. USING_NCBI_SCOPE;
  45. //============================================================================
  46. //
  47. // TestMisc
  48. //
  49. //============================================================================
  50. static void s_TestMisc(void)
  51. {
  52.     cout << "---------------------------" << endl;
  53.     cout << "Test Misc" << endl;
  54.     cout << "---------------------------" << endl << endl;
  55.     // Print current time
  56.     {{
  57.         CTime t(CTime::eCurrent);
  58.         cout << "[" << t.AsString() << "]" << endl;
  59.         cout << "[" << (t++).AsString() << "]" << endl;
  60.         cout << "[" << (t++).AsString() << "]" << endl;
  61.         cout << "[" << (t++).AsString() << "]" << endl;
  62.         cout << "[" << (++t).AsString() << "]" << endl;
  63.         cout << "[" << (++t).AsString() << "]" << endl;
  64.     }}
  65.     // Month and Day name<->num conversion
  66.     {{
  67.         assert(CTime::MonthNameToNum("Jan")              == CTime::eJanuary); 
  68.         assert(CTime::MonthNameToNum("January")          == 1); 
  69.         assert(CTime::MonthNameToNum("Dec")              == CTime::eDecember); 
  70.         assert(CTime::MonthNameToNum("December")         == 12); 
  71.         assert(CTime::MonthNumToName(CTime::eJanuary)    == "January"); 
  72.         assert(CTime::MonthNumToName(1, CTime::eAbbr)    == "Jan"); 
  73.         assert(CTime::MonthNumToName(CTime::eDecember,
  74.                                      CTime::eFull)       == "December"); 
  75.         assert(CTime::MonthNumToName(12,CTime::eAbbr)    == "Dec"); 
  76.         assert(CTime::DayOfWeekNameToNum("Sun")          == CTime::eSunday); 
  77.         assert(CTime::DayOfWeekNameToNum("Sunday")       == 0); 
  78.         assert(CTime::DayOfWeekNameToNum("Sat")          == CTime::eSaturday);
  79.         assert(CTime::DayOfWeekNameToNum("Saturday")     == 6); 
  80.         assert(CTime::DayOfWeekNumToName(CTime::eSunday) == "Sunday"); 
  81.         assert(CTime::DayOfWeekNumToName(0,CTime::eAbbr) == "Sun"); 
  82.         assert(CTime::DayOfWeekNumToName(CTime::eSaturday,
  83.                                        CTime::eFull)     == "Saturday"); 
  84.         assert(CTime::DayOfWeekNumToName(6,CTime::eAbbr) == "Sat"); 
  85.         cout << "Throw exception below:" << endl;
  86.         try {
  87.             CTime::MonthNameToNum("Month"); 
  88.         } catch (CTimeException& e) {
  89.             NCBI_REPORT_EXCEPTION("", e);
  90.         }
  91.     }}
  92.     // String <-> CTime conversion
  93.     {{
  94.         {{
  95.             CTime t;
  96.             cout << "[" << t.AsString() << "]" << endl;
  97.             assert(t.AsString() == "");
  98.         }}
  99.         {{
  100.             CTime t(2000, 365 / 2);
  101.             CTime::SetFormat("M/D/Y h:m:s");
  102.             cout << "[" << t.AsString() << "]" << endl;
  103.             assert(t.AsString() == "06/30/2000 00:00:00");
  104.         }}
  105.         cout << endl;
  106.         {{
  107.             CTime::SetFormat("M/D/Y");
  108.             cout << "Year 2000 problem:" << endl << endl;
  109.             CTime t(1999, 12, 30); 
  110.             t++; cout << "[" << t.AsString() << "] " << endl;
  111.             assert(t.AsString() == "12/31/1999");
  112.             t++; cout << "[" << t.AsString() << "] " << endl;
  113.             assert(t.AsString() == "01/01/2000");
  114.             t++; cout << "[" << t.AsString() << "] " << endl;
  115.             assert(t.AsString() == "01/02/2000");
  116.             t="02/27/2000";
  117.             t++; cout << "[" << t.AsString() << "] " << endl;
  118.             assert(t.AsString() == "02/28/2000");
  119.             t++; cout << "[" << t.AsString() << "] " << endl;
  120.             assert(t.AsString() == "02/29/2000");
  121.             t++; cout << "[" << t.AsString() << "] " << endl;
  122.             assert(t.AsString() == "03/01/2000");
  123.             t++; cout << "[" << t.AsString() << "] " << endl;
  124.             assert(t.AsString() == "03/02/2000");
  125.         }}
  126.         cout << endl;
  127.         {{
  128.             CTime::SetFormat("M/D/Y h:m:s");
  129.             cout << "String assignment:" << endl;
  130.             try {
  131.                 CTime t("02/15/2000 01:12:33");
  132.                 cout << "[" << t.AsString() << "]" << endl;
  133.                 assert(t.AsString() == "02/15/2000 01:12:33");
  134.                 t = "3/16/2001 02:13:34";
  135.                 cout << "[" << t.AsString() << "]" << endl;
  136.                 assert(t.AsString() == "03/16/2001 02:13:34");
  137.             } catch (CException& e) {
  138.                 NCBI_REPORT_EXCEPTION("",e);
  139.             }
  140.         }}
  141.         cout << endl;
  142.     }}
  143.     // Addition
  144.     {{
  145.         CTime::SetFormat("M/D/Y h:m:s.S");
  146.         {{
  147.             cout << "Adding Nanoseconds:" << endl;
  148.             CTime t;
  149.             for (CTime tmp(1999, 12, 31, 23, 59, 59, 999999995);
  150.                  tmp <= CTime(2000, 1, 1, 0, 0, 0, 000000003);
  151.                  t = tmp, tmp.AddNanoSecond(2)) {
  152.                  cout << "[" << tmp.AsString() << "] " << endl;
  153.             }
  154.             assert(t.AsString() == "01/01/2000 00:00:00.000000003");
  155.         }}
  156.         cout << endl;
  157.         {{
  158.             cout << "Current time with NS (10 cicles)" << endl;
  159.             CTime t;
  160.             for (int i = 0; i < 10; i++) {
  161.                  t.SetCurrent();
  162.                  cout << "[" << t.AsString() << "] " << endl;
  163.             }
  164.         }}
  165.         cout << endl;
  166.         CTime::SetFormat("M/D/Y h:m:s");
  167.         {{
  168.             cout << "Adding seconds:" << endl;
  169.             CTime t;
  170.             for (CTime tmp(1999, 12, 31, 23, 59, 5);
  171.                  tmp <= CTime(2000, 1, 1, 0, 1, 20);
  172.                  t = tmp, tmp.AddSecond(11)) {
  173.                  cout << "[" << tmp.AsString() << "] " << endl;
  174.             }
  175.             assert(t.AsString() == "01/01/2000 00:01:17");
  176.         }}
  177.         cout << endl;
  178.         {{
  179.             cout << "Adding minutes:" << endl;
  180.             for (CTime t(1999, 12, 31, 23, 45);
  181.                  t <= CTime(2000, 1, 1, 0, 15);
  182.                  t.AddMinute(11)) {
  183.                  cout << "[" << t.AsString() << "] " << endl;
  184.             }
  185.         }}
  186.         cout << endl;
  187.         {{
  188.             cout << "Adding hours:" << endl;
  189.             for (CTime t(1999, 12, 31);
  190.                  t <= CTime(2000, 1, 1, 15);
  191.                  t.AddHour(11)) {
  192.                  cout << "[" << t.AsString() << "] " << endl;
  193.             }
  194.         }}
  195.         cout << endl;
  196.         {{
  197.             cout << "Adding months:" << endl;
  198.             for (CTime t(1998, 12, 29);
  199.                  t <= CTime(1999, 4, 1);
  200.                  t.AddMonth()) {
  201.                  cout << "[" << t.AsString() << "] " << endl;
  202.             }
  203.         }}
  204.         cout << endl;
  205.     }}
  206.     // Difference
  207.     {{
  208.         CTime t7(2000, 10, 1, 12, 3, 45,1);
  209.         CTime t8(2000, 10, 2, 14, 55, 1,2);
  210.         cout << "[" << t7.AsString() << " - " << t8.AsString() << "]" << endl;
  211.         printf("DiffDay        = %.2fn", t8.DiffDay   (t7));
  212.         assert((t8.DiffDay(t7)-1.12) < 0.01);
  213.         printf("DiffHour       = %.2fn", t8.DiffHour  (t7));
  214.         assert((t8.DiffHour(t7)-26.85) < 0.01);
  215.         printf("DiffMinute     = %.2fn", t8.DiffMinute(t7));
  216.         assert((t8.DiffMinute(t7)-1611.27) < 0.01);
  217.         printf("DiffSecond     = %dn",   t8.DiffSecond(t7));
  218.         assert(t8.DiffSecond(t7) == 96676);
  219.         printf("DiffNanoSecond = %.0fn", t8.DiffNanoSecond(t7));
  220.     }}
  221.     // Datebase formats conversion
  222.     {{
  223.         CTime t1(2000, 1, 1, 1, 1, 1, 10000000);
  224.         CTime::SetFormat("M/D/Y h:m:s.S");
  225.         cout << endl << "DB time formats [" << t1.AsString() << "]" << endl;
  226.         TDBTimeU dbu = t1.GetTimeDBU();
  227.         TDBTimeI dbi = t1.GetTimeDBI();
  228.         cout << "DBU days             = " << dbu.days << endl;
  229.         cout << "DBU time (min)       = " << dbu.time << endl;
  230.         cout << "DBI days             = " << dbi.days << endl;
  231.         cout << "DBI time (1/300 sec) = " << dbi.time << endl;
  232.         cout << endl;
  233.         CTime t2;
  234.         t2.SetTimeDBU(dbu);
  235.         cout << "Time from DBU        = " << t2.AsString() << endl;
  236.         t2.SetTimeDBI(dbi);
  237.         cout << "Time from DBI        = " << t2.AsString() << endl;
  238.         CTime::SetFormat("M/D/Y h:m:s");
  239.         dbi.days = 37093;
  240.         dbi.time = 12301381;
  241.         t2.SetTimeDBI(dbi);
  242.         cout << "Time from DBI        = " << t2.AsString() << endl;
  243.         assert(t2.AsString() == "07/23/2001 11:23:24");
  244.     }}
  245.     // Set* functions
  246.     {{
  247.         CTime::SetFormat("M/D/Y h:m:s");
  248.         CTime t(2000, 1, 31);
  249.         t.SetMonth(2);
  250.         assert(t.AsString() == "02/29/2000 00:00:00");
  251.         t.SetYear(2001);
  252.         assert(t.AsString() == "02/28/2001 00:00:00");
  253.         t.SetMonth(4);
  254.         assert(t.AsString() == "04/28/2001 00:00:00");
  255.         t.SetDay(31);
  256.         assert(t.AsString() == "04/30/2001 00:00:00");
  257.         t.SetHour(6);
  258.         assert(t.AsString() == "04/30/2001 06:00:00");
  259.         t.SetMinute(37);
  260.         assert(t.AsString() == "04/30/2001 06:37:00");
  261.         t.SetSecond(59);
  262.         assert(t.AsString() == "04/30/2001 06:37:59");
  263.     }}
  264.     // Day of week
  265.     {{   
  266.         CTime t(1900, 1, 1);
  267.         int i;
  268.         for (i = 1; t <= CTime(2030, 12, 31); t++,i++) {
  269.             assert(t.DayOfWeek() == (i%7));
  270.         }
  271.     }}
  272.     // Number of days in the month
  273.     {{
  274.         CTime t(2000, 1, 31);
  275.         assert(t.DaysInMonth() == 31);
  276.         t.SetMonth(2);
  277.         assert(t.DaysInMonth() == 29);
  278.         t.SetYear(2001);
  279.         assert(t.DaysInMonth() == 28);
  280.         t.SetMonth(4);
  281.         assert(t.DaysInMonth() == 30);
  282.     }}
  283.     // Week number in the year/month
  284.     {{
  285.         CTime t(1970, 1, 1);
  286.         int i;
  287.         char buf[3];
  288.         time_t gt = t.GetTimeT();
  289.         for (i = 1; t <= CTime(2030, 12, 31); i++, t++, gt += 24*3600) {
  290.             struct tm *today = gmtime(&gt);
  291.             assert(today != 0);
  292.             int week_num_rtl, week_num, month_week_num;
  293.             // Sunday-based weeks
  294.             strftime(buf, sizeof(buf), "%U", today);
  295.             week_num_rtl   = NStr::StringToInt(buf) + 1;
  296.             week_num       = t.YearWeekNumber(/*CTime::eSunday*/);
  297.             assert(week_num_rtl == week_num);
  298.             month_week_num = t.MonthWeekNumber(/*CTime::eSunday*/);
  299.             assert(month_week_num >= 1  &&  month_week_num <= 6);
  300.             // Monday-based weeks
  301.             strftime(buf, sizeof(buf), "%W", today);
  302.             week_num_rtl   = NStr::StringToInt(buf) + 1;
  303.             week_num       = t.YearWeekNumber(CTime::eMonday);
  304.             assert(week_num_rtl == week_num);
  305.             month_week_num = t.MonthWeekNumber(CTime::eMonday);
  306.             assert(month_week_num >= 1  &&  month_week_num <= 6);
  307.         }
  308.     }}
  309.     cout << endl;
  310. }
  311. //============================================================================
  312. //
  313. // TestFormats
  314. //
  315. //============================================================================
  316. static void s_TestFormats(void)
  317. {
  318.     static const char* s_Fmt[] = {
  319.         "w, D b Y h:m:s Z",
  320.         "M/D/Y h:m:s",
  321.         "M/D/Y h:m:s.S",
  322.         "M/D/y h:m:s",
  323.         "M/DY  h:m:s",
  324.         "M/Dy  h:m:s",
  325.         "M/D/Y hm:s",
  326.         "M/D/Y h:ms",
  327.         "M/D/Y hms",
  328.         "MD/y  h:m:s",
  329.         "MD/Y  h:m:s",
  330.         "MYD   m:h:s",
  331.         "M/D/Y smh",
  332.         "YMD   h:sm",
  333.         "yDM   h:ms",
  334.         "yMD   h:ms",
  335.         "D B Y h:m:s",
  336.         "D b Y h:m:s",
  337.         "M/D/Y h:m:s z",
  338.         "M/D/Y Z h:m:s",
  339.         "smhyMD",
  340.         "y||||M++++D   h===ms",
  341.         "   yM[][D   h:,.,.,ms  ",
  342.         "tkkkMy++D   h:msn",
  343.         0
  344.     };
  345.     cout << "---------------------------" << endl;
  346.     cout << "Test Formats" << endl;
  347.     cout << "---------------------------" << endl << endl;
  348.     for (const char** fmt = s_Fmt;  *fmt;  fmt++) {
  349.         CTime t1(2001, 4, 2, 3, 4, 5, 0,
  350.                  strchr(*fmt, 'Z') ? CTime::eGmt : CTime::eLocal);
  351.         CTime::SetFormat(*fmt);
  352.         string t1_str = t1.AsString();
  353.         cout << "[" << t1_str << "]";
  354.         CTime::SetFormat("MDY__s");
  355.         CTime t2(t1_str, *fmt);
  356.         cout << " --> [" << t1_str << "]" << endl;
  357.         assert(t1 == t2);
  358.         CTime::SetFormat(*fmt);
  359.         string t2_str = t2;
  360.         assert(t1_str.compare(t2_str) == 0);
  361.     }
  362.     // Check against well-known dates
  363.     const char fmtstr[] = "M/D/Y h:m:s Z W";
  364.     {{
  365.         CTime t(2003, 2, 10, 20, 40, 30, 0, CTime::eGmt);
  366.         t.SetFormat(fmtstr);
  367.         string s = t.AsString();
  368.         assert(s.compare("02/10/2003 20:40:30 GMT Monday") == 0);
  369.     }}
  370.     {{
  371.         CTime t(1998, 2, 10, 20, 40, 30, 0, CTime::eGmt);
  372.         t.SetFormat(fmtstr);
  373.         string s = t.AsString();
  374.         assert(s.compare("02/10/1998 20:40:30 GMT Tuesday") == 0);
  375.     }}
  376.     {{
  377.         CTime t(2003, 3, 13, 15, 49, 30, 0, CTime::eGmt);
  378.         t.SetFormat(fmtstr);
  379.         string s = t.AsString();
  380.         assert(s.compare("03/13/2003 15:49:30 GMT Thursday") == 0);
  381.     }}
  382.     {{
  383.         CTime t(2001, 3, 13, 15, 49, 30, 0, CTime::eGmt);
  384.         t.SetFormat(fmtstr);
  385.         string s = t.AsString();
  386.         assert(s.compare("03/13/2001 15:49:30 GMT Tuesday") == 0);
  387.     }}
  388.     {{
  389.         CTime t(2002, 12, 31, 23, 59, 59, 0, CTime::eGmt);
  390.         t.SetFormat(fmtstr);
  391.         string s = t.AsString();
  392.         assert(s.compare("12/31/2002 23:59:59 GMT Tuesday") == 0);
  393.     }}
  394.     {{
  395.         CTime t(2003, 1, 1, 0, 0, 0, 0, CTime::eGmt);
  396.         t.SetFormat(fmtstr);
  397.         string s = t.AsString();
  398.         assert(s.compare("01/01/2003 00:00:00 GMT Wednesday") == 0);
  399.     }}
  400.     {{
  401.         CTime t(2002, 12, 13, 12, 34, 56, 0, CTime::eGmt);
  402.         t.SetFormat(fmtstr);
  403.         string s = t.AsString();
  404.         assert(s.compare("12/13/2002 12:34:56 GMT Friday") == 0);
  405.     }}
  406. }
  407. //============================================================================
  408. //
  409. // TestGMT
  410. //
  411. //============================================================================
  412. static void s_TestGMT(void)
  413. {
  414.     cout << "---------------------------" << endl;
  415.     cout << "Test GMT and Local time"     << endl;
  416.     cout << "---------------------------" << endl << endl;
  417.     {{
  418.         cout << "Write time in timezone format" << endl;
  419.         CTime::SetFormat("M/D/Y h:m:s Z");
  420.         CTime t1(2001, 3, 12, 11, 22, 33, 999, CTime::eGmt);
  421.         cout << "[" << t1.AsString() << "]" << endl;
  422.         assert(t1.AsString() == "03/12/2001 11:22:33 GMT");
  423.         CTime t2(2001, 3, 12, 11, 22, 33, 999, CTime::eLocal);
  424.         cout << "[" << t2.AsString() << "]" << endl;
  425.         assert(t2.AsString() == "03/12/2001 11:22:33 ");
  426.         CTime t3(CTime::eCurrent, CTime::eLocal);
  427.         cout << "Local time [" << t3.AsString() << "]" << endl;
  428.         CTime t4(CTime::eCurrent, CTime::eGmt);
  429.         cout << "GMT time   [" << t4.AsString() << "]" << endl;
  430.         cout << endl;
  431.     }}
  432.     {{   
  433.         cout << "Process timezone string" << endl;
  434.         CTime t;
  435.         t.SetFormat("M/D/Y h:m:s Z");
  436.         t="03/12/2001 11:22:33 GMT";
  437.         cout << "[" << t.AsString() << "]" << endl;
  438.         assert(t.AsString() == "03/12/2001 11:22:33 GMT");
  439.         t="03/12/2001 11:22:33 ";
  440.         cout << "[" << t.AsString() << "]" << endl;
  441.         assert(t.AsString() == "03/12/2001 11:22:33 ");
  442.         cout << endl;
  443.     }}
  444.     {{   
  445.         cout << "Day of week" << endl;
  446.         CTime t(2001, 4, 1);
  447.         t.SetFormat("M/D/Y h:m:s w");
  448.         int i;
  449.         for (i = 0; t <= CTime(2001, 4, 10); t++,i++) {
  450.             cout << t.AsString() << " is " << t.DayOfWeek() << endl;
  451.             assert(t.DayOfWeek() == (i%7));
  452.         }
  453.         cout << endl;
  454.     }}
  455.     //------------------------------------------------------------------------
  456.     {{   
  457.         cout << "Test GetTimeT" << endl;
  458.         time_t timer=time(0);
  459.         CTime tg(CTime::eCurrent, CTime::eGmt, CTime::eTZPrecisionDefault);
  460.         CTime tl(CTime::eCurrent, CTime::eLocal, CTime::eTZPrecisionDefault);
  461.         CTime t(timer);
  462.         cout << "[" << t.AsString() << "] " << endl;
  463.         cout << tg.GetTimeT()/3600 << " - " << tl.GetTimeT()/3600 << " - ";
  464.         cout << t.GetTimeT()/3600 << " - " << timer/3600 << endl;
  465.         assert(timer == tg.GetTimeT());
  466.         assert(timer == tl.GetTimeT());
  467.         assert(timer == t.GetTimeT());
  468.         cout << endl;
  469.         for (int i = 0; i < 2; i++) {
  470.             CTime tt(2001, 4, 1, i>0 ? 2 : 1, i>0 ? (i-1) : 59, 
  471.                      0, 0, CTime::eLocal, CTime::eHour);
  472.             cout << tt.AsString() << " - " << tt.GetTimeT() / 3600 << endl; 
  473.         }
  474.         for (int i = 0; i < 2; i++) {
  475.             CTime tt(2001, 10, 28, i > 0 ? 1 : 0, i > 0 ? (i-1) : 59,
  476.                      0, 0, CTime::eLocal, CTime::eHour);
  477.             cout << tt.AsString() << " - " << tt.GetTimeT() / 3600 << endl; 
  478.         }
  479.         cout << endl;
  480.     }}
  481.     //------------------------------------------------------------------------
  482.     {{   
  483.         cout << "Test TimeZoneDiff (1)" << endl;
  484.         CTime tw(2001, 1, 1, 12); 
  485.         CTime ts(2001, 6, 1, 12);
  486.         cout << "[" << tw.AsString() << "] diff from GMT = " << 
  487.             tw.TimeZoneDiff() / 3600 << endl;
  488.         assert(tw.TimeZoneDiff() / 3600 == -5);
  489.         cout << "[" << ts.AsString() << "] diff from GMT = " << 
  490.             ts.TimeZoneDiff() / 3600 << endl;
  491.         assert(ts.TimeZoneDiff()/3600 == -4);
  492.         for (; tw < ts; tw++) {
  493.             if ((tw.TimeZoneDiff() / 3600) == -4) {
  494.                 cout << "First daylight saving day = [" << 
  495.                     tw.AsString() << "]" << endl;
  496.                 break;
  497.             }
  498.         }
  499.         cout << endl;
  500.     }}
  501.     //------------------------------------------------------------------------
  502.     {{   
  503.         cout << "Test TimeZoneDiff (2)" << endl;
  504.         CTime tw(2001, 6, 1, 12); 
  505.         CTime ts(2002, 1, 1, 12);
  506.         cout << "[" << tw.AsString() << "] diff from GMT = " << 
  507.             tw.TimeZoneDiff() / 3600 << endl;
  508.         assert(tw.TimeZoneDiff() / 3600 == -4);
  509.         cout << "[" << ts.AsString() << "] diff from GMT = " << 
  510.             ts.TimeZoneDiff() / 3600 << endl;
  511.         assert(ts.TimeZoneDiff() / 3600 == -5);
  512.         for (; tw < ts; tw++) {
  513.             if ((tw.TimeZoneDiff() / 3600) == -5) {
  514.                 cout << "First non daylight saving day = [" << 
  515.                     tw.AsString() << "]" << endl;
  516.                 break;
  517.              
  518.             }
  519.         }
  520.         cout << endl;
  521.     }}
  522.     //------------------------------------------------------------------------
  523.     {{   
  524.         cout << "Test AdjustTime" << endl;
  525.         CTime::SetFormat("M/D/Y h:m:s");
  526.         CTime t("04/01/2001 01:01:00");
  527.         CTime tn;
  528.         t.SetTimeZonePrecision(CTime::eTZPrecisionDefault);
  529.         cout << "init  [" << t.AsString() << "]" << endl;
  530.         t.SetTimeZoneFormat(CTime::eGmt);
  531.         cout << "GMT" << endl;
  532.         tn = t + 5;  
  533.         cout << "+5d   [" << tn.AsString() << "]" << endl;
  534.         assert(tn.AsString() == "04/06/2001 01:01:00");
  535.         tn = t + 40; 
  536.         cout << "+40d  [" << tn.AsString() << "]" << endl;
  537.         assert(tn.AsString() == "05/11/2001 01:01:00");
  538.         t.SetTimeZoneFormat(CTime::eLocal);
  539.         cout << "Local eNone" << endl;
  540.         t.SetTimeZonePrecision(CTime::eNone);
  541.         tn=t+5;  cout << "+5d   [" << tn.AsString() << "]" << endl;
  542.         assert(tn.AsString() == "04/06/2001 01:01:00");
  543.         tn=t+40; cout << "+40d  [" << tn.AsString() << "]" << endl;
  544.         assert(tn.AsString() == "05/11/2001 01:01:00");
  545.         t.SetTimeZonePrecision(CTime::eMonth);
  546.         cout << "Local eMonth" << endl;
  547.         tn = t + 5;
  548.         cout << "+5d   [" << tn.AsString() << "]" << endl;
  549.         tn = t; 
  550.         tn.AddMonth(-1);
  551.         cout << "-1m   [" << tn.AsString() << "]" << endl;
  552.         assert(tn.AsString() == "03/01/2001 01:01:00");
  553.         tn = t; 
  554.         tn.AddMonth(+1);
  555.         cout << "+1m   [" << tn.AsString() << "]" << endl;
  556.         assert(tn.AsString() == "05/01/2001 02:01:00");
  557.         t.SetTimeZonePrecision(CTime::eDay);
  558.         cout << "Local eDay" << endl;
  559.         tn = t - 1; 
  560.         cout << "-1d   [" << tn.AsString() << "]" << endl;
  561.         assert(tn.AsString() == "03/31/2001 01:01:00");
  562.         tn++;   
  563.         cout << "+0d   [" << tn.AsString() << "]" << endl;
  564.         assert(tn.AsString() == "04/01/2001 01:01:00");
  565.         tn = t + 1; 
  566.         cout << "+1d   [" << tn.AsString() << "]" << endl;
  567.         assert(tn.AsString() == "04/02/2001 02:01:00");
  568.         cout << "Local eHour" << endl;
  569.         t.SetTimeZonePrecision(CTime::eHour);
  570.         tn = t; 
  571.         tn.AddHour(-3);
  572.         CTime te = t; 
  573.         te.AddHour(3);
  574.         cout << "-3h   [" << tn.AsString() << "]" << endl;
  575.         assert(tn.AsString() == "03/31/2001 22:01:00");
  576.         cout << "+3h   [" << te.AsString() << "]" << endl;
  577.         assert(te.AsString() == "04/01/2001 05:01:00");
  578.         CTime th = tn; 
  579.         th.AddHour(49);
  580.         cout << "+49h  [" << th.AsString() << "]" << endl;
  581.         assert(th.AsString() == "04/03/2001 00:01:00");
  582.         for (int i = 0;  i < 8;  i++,  tn.AddHour()) {
  583.             cout << (((tn.TimeZoneDiff()/3600) == -4) ? " ":"*") 
  584.                  << " [" <<  tn.AsString() << "]" << endl;
  585.         }
  586.         cout << endl;
  587.         tn.AddHour(-1);
  588.         for (int i = 0;  i < 8;  i++,  tn.AddHour(-1)) {
  589.             cout << (((tn.TimeZoneDiff()/3600) == -4) ? " ":"*") 
  590.                  << " [" <<  tn.AsString() << "]" << endl;
  591.         }
  592.         cout << endl;
  593.         tn = "10/28/2001 00:01:00"; 
  594.         cout << "init  [" << tn.AsString() << "]" << endl;
  595.         tn.SetTimeZonePrecision(CTime::eHour);
  596.         te = tn; 
  597.         tn.AddHour(-3); 
  598.         te.AddHour(9);
  599.         cout << "-3h   [" << tn.AsString() << "]" << endl;
  600.         assert(tn.AsString() == "10/27/2001 21:01:00");
  601.         cout << "+9h   [" << te.AsString() << "]" << endl;
  602.         assert(te.AsString() == "10/28/2001 08:01:00");
  603.         th = tn; 
  604.         th.AddHour(49);
  605.         cout << "+49h  [" << th.AsString() << "]" << endl;
  606.         assert(th.AsString() == "10/29/2001 21:01:00");
  607.         tn.AddHour(+2);
  608.         for (int i = 0;  i < 10;  i++,  tn.AddHour()) {
  609.             cout << (((tn.TimeZoneDiff()/3600) == -4) ? " ":"*") 
  610.                  << " [" <<  tn.AsString() << "]" << endl;
  611.         }
  612.         cout << endl;
  613.         tn.AddHour(-1);
  614.         for (int i = 0;  i < 10;  i++,  tn.AddHour(-1)) {
  615.             cout << (((tn.TimeZoneDiff()/3600) == -4) ? " ":"*") 
  616.                  << " [" <<  tn.AsString() << "]" << endl;
  617.         }
  618.         cout << endl;
  619.         tn = "10/28/2001 09:01:00"; 
  620.         cout << "init  [" << tn.AsString() << "]" << endl;
  621.         tn.SetTimeZonePrecision(CTime::eHour);
  622.         te = tn; 
  623.         tn.AddHour(-10); 
  624.         te.AddHour(+10);
  625.         cout << "-10h  [" << tn.AsString() << "]" << endl;
  626.         assert(tn.AsString() == "10/28/2001 00:01:00");
  627.         cout << "+10h  [" << te.AsString() << "]" << endl;
  628.         assert(te.AsString() == "10/28/2001 19:01:00");
  629.         
  630.         cout << endl; 
  631.         cout << endl;
  632.     }}
  633. }
  634. //============================================================================
  635. //
  636. // TestGMTSpeedRun
  637. //
  638. //============================================================================
  639. static void s_TestGMTSpeedRun(string comment, CTime::ETimeZone tz, 
  640.                               CTime::ETimeZonePrecision tzp)
  641. {
  642.     CTime t(CTime::eCurrent, tz, tzp);
  643.     CStopWatch timer;
  644.     double duration;
  645. #if defined    NCBI_OS_MSWIN
  646.     const long kCount=100000L;
  647. #elif defined  NCBI_OS_UNIX
  648.     const long kCount=10000L;
  649. #else       // NCBI_OS_MAC
  650.     const long kCount=100000L;
  651. #endif
  652.     t.SetFormat("M/D/Y h:m:s");
  653.     t = "03/31/2001 00:00:00"; 
  654.     cout << "Minute add, "<< comment << endl;
  655.     cout << "Iterations  = " << kCount << endl;
  656.     timer.Start();
  657.     for (long i = 0; i < kCount; i++) {
  658.         t.AddMinute();
  659.     }
  660.     duration = timer.Elapsed();
  661.     cout << "Duration    = " << duration << " sec." << endl;
  662.     cout << endl;
  663. }
  664. //============================================================================
  665. //
  666. // TestGMTSpeed
  667. //
  668. //============================================================================
  669. static void s_TestGMTSpeed(void)
  670. {
  671.     cout << "---------------------------" << endl;
  672.     cout << "Test CTime Speed"            << endl;
  673.     cout << "---------------------------" << endl << endl;
  674.     s_TestGMTSpeedRun("eLocal - eMinute", CTime::eLocal, CTime::eMinute);
  675.     s_TestGMTSpeedRun("eLocal - eHour"  , CTime::eLocal, CTime::eHour);
  676.     s_TestGMTSpeedRun("eLocal - eMonth" , CTime::eLocal, CTime::eMonth);
  677.     s_TestGMTSpeedRun("eLocal - eNone"  , CTime::eLocal, CTime::eNone);
  678.     s_TestGMTSpeedRun("eGmt   - eNone"  , CTime::eGmt, CTime::eNone);
  679. }
  680. //============================================================================
  681. //
  682. // MAIN
  683. //
  684. //============================================================================
  685. int main()
  686. {
  687.     // Set err.-posting and tracing to maximum
  688.     SetDiagTrace(eDT_Enable);
  689.     SetDiagPostFlag(eDPF_All);
  690.     SetDiagPostLevel(eDiag_Info);
  691.     // Reinit global timezone variables
  692.     tzset();
  693.     
  694.     // Run tests
  695.     try {
  696.         s_TestMisc();
  697.         s_TestFormats();
  698.         s_TestGMT();
  699.         s_TestGMTSpeed();
  700.     } catch (CException& e) {
  701.         ERR_POST(Fatal << e);
  702.     }
  703.     // Success
  704.     return 0;
  705. }
  706. /*
  707.  * ===========================================================================
  708.  * $Log: test_ncbitime.cpp,v $
  709.  * Revision 1000.3  2004/06/01 19:10:23  gouriano
  710.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.22
  711.  *
  712.  * Revision 6.22  2004/05/14 13:59:51  gorelenk
  713.  * Added include of ncbi_pch.hpp
  714.  *
  715.  * Revision 6.21  2004/03/25 17:35:17  ivanov
  716.  * Added tests for 'z' time format
  717.  *
  718.  * Revision 6.20  2003/11/25 20:03:56  ivanov
  719.  * Fixed misspelled eTZPrecisionDefault
  720.  *
  721.  * Revision 6.19  2003/11/25 19:56:38  ivanov
  722.  * Renamed eDefault to eTZPrecisionDefault.
  723.  * Some cosmetic changes.
  724.  *
  725.  * Revision 6.18  2003/10/03 18:27:20  ivanov
  726.  * Added tests for month and day of week names conversion functions
  727.  *
  728.  * Revision 6.17  2003/07/15 19:37:50  vakatov
  729.  * Added test with weekday and timezone
  730.  *
  731.  * Revision 6.16  2003/04/16 20:29:26  ivanov
  732.  * Using class CStopWatch instead clock()
  733.  *
  734.  * Revision 6.15  2003/02/10 17:46:25  lavr
  735.  * Added more checks for well-known dates
  736.  *
  737.  * Revision 6.14  2002/10/17 16:56:03  ivanov
  738.  * Added tests for 'b' and 'B' time format symbols
  739.  *
  740.  * Revision 6.13  2002/07/15 18:17:26  gouriano
  741.  * renamed CNcbiException and its descendents
  742.  *
  743.  * Revision 6.12  2002/07/11 14:18:29  gouriano
  744.  * exceptions replaced by CNcbiException-type ones
  745.  *
  746.  * Revision 6.11  2002/04/16 18:49:09  ivanov
  747.  * Centralize threatment of assert() in tests.
  748.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  749.  *
  750.  * Revision 6.10  2001/09/27 18:02:45  ivanov
  751.  * Fixed division at zero in test of speed CTime class on fast computers.
  752.  *
  753.  * Revision 6.9  2001/07/23 15:51:46  ivanov
  754.  * Changed test for work with DB-time formats
  755.  *
  756.  * Revision 6.8  2001/07/06 15:08:36  ivanov
  757.  * Added tests for DataBase-time's
  758.  *
  759.  * Revision 6.7  2001/05/29 16:14:02  ivanov
  760.  * Return to nanosecond-revision. Corrected mistake of the work with local
  761.  * time on Linux. Polish and improvement source code.
  762.  * Renamed AsTimeT() -> GetTimerT().
  763.  *
  764.  * Revision 6.6  2001/04/30 22:01:31  lavr
  765.  * Rollback to pre-nanosecond-revision due to necessity to use
  766.  * configure to figure out names of global variables governing time zones
  767.  *
  768.  * Revision 6.5  2001/04/29 03:06:10  lavr
  769.  * #include <time.h>" moved from .cpp to ncbitime.hpp
  770.  *
  771.  * Revision 6.4  2001/04/27 20:39:47  ivanov
  772.  * Tests for check Local/UTC time and Nanoseconds added.
  773.  * Also speed test added.
  774.  *
  775.  * Revision 6.3  2000/11/21 18:15:05  butanaev
  776.  * Fixed bug in operator ++/-- (int)
  777.  *
  778.  * Revision 6.2  2000/11/21 15:22:57  vakatov
  779.  * Do not enforce "_DEBUG" -- it messes up the MSVC++ compilation
  780.  *
  781.  * Revision 6.1  2000/11/20 22:17:49  vakatov
  782.  * Added NCBI date/time class CTime ("ncbitime.[ch]pp") and
  783.  * its test suite ("test/test_ncbitime.cpp")
  784.  *
  785.  * ===========================================================================
  786.  */