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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbitime_mt.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:10:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbitime_mt.cpp,v 1000.2 2004/06/01 19:10:26 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.  * Author:  Vladimir Ivanov
  35.  *
  36.  * File Description:  Test for CTime class in multithreaded environment
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbitime.hpp>
  41. #include <corelib/ncbimtx.hpp>
  42. #include <corelib/test_mt.hpp>
  43. #include <test/test_assert.h>  /* This header must go last */
  44. USING_NCBI_SCOPE;
  45. DEFINE_STATIC_FAST_MUTEX(s_OutMutex);
  46. static void OUTS(int idx, long line, string value, const char* check) 
  47. {
  48.     CFastMutexGuard LOCK(s_OutMutex);
  49.     cout << idx << " (" << line << ") - " << value << 'n';
  50.     if ( check  &&  value != string(check) ) {
  51.         cout << "LINE: " << line << " - "<< value << " != " << string(check) << endl;
  52.         abort();
  53.     }
  54. }
  55. //=============================================================================
  56. //
  57. // TestMisc
  58. //
  59. //=============================================================================
  60. static void s_TestMisc(int idx)
  61. {
  62.     // AsString()
  63.     {{
  64.         CTime t1;
  65.         assert(t1.AsString() == "");
  66.         CTime t2(2000, 365 / 2);
  67.         t2.SetFormat("M/D/Y h:m:s");
  68.         assert(t2.AsString() == "06/30/2000 00:00:00");
  69.     }}
  70.     
  71.     // Year 2000 problem
  72.     {{
  73.         CTime t(1999, 12, 30); 
  74.         t.SetFormat("M/D/Y");
  75.         t++;
  76.         OUTS( idx, __LINE__, t.AsString(), "12/31/1999");
  77.         t++;
  78.         OUTS( idx, __LINE__, t.AsString(), "01/01/2000");
  79.         t++;
  80.         OUTS( idx, __LINE__, t.AsString(), "01/02/2000");
  81.         t="02/27/2000";
  82.         t++;
  83.         OUTS( idx, __LINE__, t.AsString(), "02/28/2000");
  84.         t++;
  85.         OUTS( idx, __LINE__, t.AsString(), "02/29/2000");
  86.         t++;
  87.         OUTS( idx, __LINE__, t.AsString(), "03/01/2000");
  88.         t++;
  89.         OUTS( idx, __LINE__, t.AsString(), "03/02/2000");
  90.     }}
  91.     // String assignment
  92.     {{
  93.         CTime::SetFormat("M/D/Y h:m:s");
  94.         CTime t("02/15/2000 01:12:33");
  95.         OUTS( idx, __LINE__,  t.AsString(), "02/15/2000 01:12:33");
  96.         t = "3/16/2001 02:13:34";
  97.         OUTS( idx, __LINE__,  t.AsString(), "03/16/2001 02:13:34");
  98.     }}
  99.     CTime::SetFormat("M/D/Y h:m:s.S");
  100.     // Adding Nanoseconds
  101.     {{
  102.         CTime t;
  103.         for (CTime ti(1999, 12, 31, 23, 59, 59, 999999995);
  104.              ti <= CTime(2000, 1, 1, 0, 0, 0, 000000003);
  105.              t = ti, ti.AddNanoSecond(2)) {
  106.         }
  107.         OUTS( idx, __LINE__, t.AsString(), "01/01/2000 00:00:00.000000003");
  108.     }}
  109.     CTime::SetFormat("M/D/Y h:m:s");
  110.     // Adding seconds
  111.     {{
  112.         CTime t;
  113.         for (CTime ti(1999, 12, 31, 23, 59, 5);
  114.              ti <= CTime(2000, 1, 1, 0, 1, 20);
  115.              t = ti, ti.AddSecond(11)) {
  116.         }
  117.         OUTS( idx, __LINE__, t.AsString(), "01/01/2000 00:01:17");
  118.     }}
  119.     // Adding minutes
  120.     {{
  121.         CTime t;
  122.         for (CTime ti(1999, 12, 31, 23, 45);
  123.              ti <= CTime(2000, 1, 1, 0, 15);
  124.              t = ti, ti.AddMinute(11)) {
  125.         }
  126.         OUTS( idx, __LINE__, t.AsString(), "01/01/2000 00:07:00");
  127.     }}
  128.     // Adding hours
  129.     {{
  130.         CTime t;
  131.         for (CTime ti(1999, 12, 31); ti <= CTime(2000, 1, 1, 15);
  132.              t = ti, ti.AddHour(11)) {
  133.         }
  134.         OUTS( idx, __LINE__, t.AsString(), "01/01/2000 09:00:00");
  135.     }}
  136.     // Adding months
  137.     {{
  138.         CTime t;
  139.         for (CTime ti(1998, 12, 29); ti <= CTime(1999, 4, 1);
  140.              t = ti, ti.AddMonth()) {
  141.         }
  142.         OUTS( idx, __LINE__, t.AsString(), "03/28/1999 00:00:00");
  143.     }}
  144.     
  145.     // Difference
  146.     {{
  147.         CTime t1(2000, 10, 1, 12, 3, 45,1);
  148.         CTime t2(2000, 10, 2, 14, 55, 1,2);
  149.         assert((t2.DiffDay(t1)-1.12) < 0.01);
  150.         assert((t2.DiffHour(t1)-26.85) < 0.01);
  151.         assert((t2.DiffMinute(t1)-1611.27) < 0.01);
  152.         assert(t2.DiffSecond(t1) == 96676);
  153.     }}
  154.     // Database time formats
  155.     {{
  156.         CTime t(2000, 1, 1, 1, 1, 1, 10000000);
  157.         CTime::SetFormat("M/D/Y h:m:s.S");
  158.         
  159.         TDBTimeI dbi = t.GetTimeDBI();
  160.         CTime::SetFormat("M/D/Y h:m:s");
  161.         dbi.days = 37093;
  162.         dbi.time = 12301381;
  163.         t.SetTimeDBI(dbi);
  164.         OUTS( idx, __LINE__, t.AsString(), "07/23/2001 11:23:24");
  165.     }}
  166. }
  167. //=============================================================================
  168. //
  169. // TestFormats
  170. //
  171. //=============================================================================
  172. static void s_TestFormats(void)
  173. {
  174.     static const char* s_Fmt[] = {
  175.         "M/D/Y h:m:s",
  176.         "M/D/Y h:m:s.S",
  177.         "M/D/y h:m:s",
  178.         "M/DY  h:m:s",
  179.         "M/Dy  h:m:s",
  180.         "M/D/Y hm:s",
  181.         "M/D/Y h:ms",
  182.         "M/D/Y hms",
  183.         "MD/y  h:m:s",
  184.         "MD/Y  h:m:s",
  185.         "MYD   m:h:s",
  186.         "M/D/Y smh",
  187.         "YMD   h:sm",
  188.         "yDM   h:ms",
  189.         "yMD   h:ms",
  190.         "D B Y h:m:s",
  191.         "D b Y h:m:s",
  192.         "smhyMD",
  193.         "y||||M++++D   h===ms",
  194.         "   yM[][D   h:,.,.,ms  ",
  195.         "tkkkMy++D   h:msn",
  196.         0
  197.     };
  198.     for (const char** fmt = s_Fmt;  *fmt;  fmt++) {
  199.         CTime t1(2001, 1, 2, 3, 4, 0);
  200.         CTime::SetFormat(*fmt);
  201.         string t1_str = t1.AsString();
  202.         
  203.         CTime::SetFormat("MDY__s");
  204.         CTime t2(t1_str, *fmt);
  205.         assert(t1 == t2);
  206.         CTime::SetFormat(*fmt);
  207.         string t2_str = t2;
  208.         assert(t1_str.compare(t2_str) == 0);
  209.     }
  210. }
  211. //=============================================================================
  212. //
  213. // TestGMT
  214. //
  215. //=============================================================================
  216. static void s_TestGMT(int idx)
  217. {
  218.     // Write time in timezone format
  219.     {{   
  220.         CTime::SetFormat("M/D/Y h:m:s Z");
  221.         CTime t1(2001, 3, 12, 11, 22, 33, 999, CTime::eGmt);
  222.         OUTS( idx, __LINE__,  t1.AsString(), "03/12/2001 11:22:33 GMT");
  223.         CTime t2(2001, 3, 12, 11, 22, 33, 999, CTime::eLocal);
  224.         OUTS( idx, __LINE__,  t2.AsString(), "03/12/2001 11:22:33 ");
  225.     }}
  226.     // Process timezone string
  227.     {{   
  228.         CTime t;
  229.         t.SetFormat("M/D/Y h:m:s Z");
  230.         t="03/12/2001 11:22:33 GMT";
  231.         OUTS( idx, __LINE__,  t.AsString(), "03/12/2001 11:22:33 GMT");
  232.         t="03/12/2001 11:22:33 ";
  233.         OUTS( idx, __LINE__,  t.AsString(), "03/12/2001 11:22:33 ");
  234.     }}
  235.     // Day of week
  236.     {{   
  237.         CTime t(2001, 4, 1);
  238.         t.SetFormat("M/D/Y h:m:s w");
  239.         int i;
  240.         for (i=0; t<=CTime(2001, 4, 10); t++,i++) {
  241.             assert(t.DayOfWeek() == (i%7));
  242.         }
  243.     }}
  244.     // Test GetTimeT
  245.     {{  
  246.         time_t timer=time(0);
  247.         CTime tg(CTime::eCurrent, CTime::eGmt, CTime::eTZPrecisionDefault);
  248.         CTime tl(CTime::eCurrent, CTime::eLocal, CTime::eTZPrecisionDefault);
  249.         CTime t(timer);
  250.         tg.SetTimeT(timer);
  251.         tl.SetTimeT(timer);
  252.         assert(timer == tg.GetTimeT());
  253.         assert(timer == tl.GetTimeT());
  254.         assert(timer == t.GetTimeT());
  255.     }}
  256.     // Test TimeZoneDiff (1)
  257.     {{   
  258.         CTime tw(2001, 1, 1, 12); 
  259.         CTime ts(2001, 6, 1, 12);
  260.         assert(tw.TimeZoneDiff() / 3600 == -5);
  261.         assert(ts.TimeZoneDiff()/3600 == -4);
  262.     }}
  263.     // Test TimeZoneDiff (2)
  264.     {{   
  265.         CTime tw(2001, 6, 1, 12); 
  266.         CTime ts(2002, 1, 1, 12);
  267.         assert(tw.TimeZoneDiff() / 3600 == -4);
  268.         assert(ts.TimeZoneDiff() / 3600 == -5);
  269.     }}
  270.     // Test AdjustTime
  271.     {{   
  272.         CTime::SetFormat("M/D/Y h:m:s");
  273.         CTime t("04/01/2001 01:01:00");
  274.         CTime tn;
  275.         t.SetTimeZonePrecision(CTime::eTZPrecisionDefault);
  276.         // GMT
  277.         t.SetTimeZoneFormat(CTime::eGmt);
  278.         tn = t + 5;  
  279.         OUTS( idx, __LINE__,  tn.AsString(), "04/06/2001 01:01:00");
  280.         tn = t + 40; 
  281.         OUTS( idx, __LINE__,  tn.AsString(), "05/11/2001 01:01:00");
  282.         // Local eNone
  283.         t.SetTimeZoneFormat(CTime::eLocal);
  284.         t.SetTimeZonePrecision(CTime::eNone);
  285.         tn=t+5;
  286.         OUTS( idx, __LINE__,  tn.AsString(), "04/06/2001 01:01:00");
  287.         tn=t+40;
  288.         OUTS( idx, __LINE__,  tn.AsString(), "05/11/2001 01:01:00");
  289.         //Local eMonth
  290.         t.SetTimeZonePrecision(CTime::eMonth);
  291.         tn = t + 5;
  292.         tn = t; 
  293.         tn.AddMonth(-1);
  294.         OUTS( idx, __LINE__,  tn.AsString(), "03/01/2001 01:01:00");
  295.         tn = t; 
  296.         tn.AddMonth(+1);
  297.         OUTS( idx, __LINE__,  tn.AsString(), "05/01/2001 02:01:00");
  298.         // Local eDay
  299.         t.SetTimeZonePrecision(CTime::eDay);
  300.         tn = t - 1; 
  301.         OUTS( idx, __LINE__,  tn.AsString(), "03/31/2001 01:01:00");
  302.         tn++;   
  303.         OUTS( idx, __LINE__,  tn.AsString(), "04/01/2001 01:01:00");
  304.         tn = t + 1; 
  305.         OUTS( idx, __LINE__,  tn.AsString(), "04/02/2001 02:01:00");
  306.         // Local eHour
  307.         t.SetTimeZonePrecision(CTime::eHour);
  308.         tn = t; 
  309.         tn.AddHour(-3);
  310.         CTime te = t; 
  311.         te.AddHour(3);
  312.         OUTS( idx, __LINE__,  tn.AsString(), "03/31/2001 22:01:00");
  313.         OUTS( idx, __LINE__,  te.AsString(), "04/01/2001 05:01:00");
  314.         CTime th = tn; 
  315.         th.AddHour(49);
  316.         OUTS( idx, __LINE__,  th.AsString(), "04/03/2001 00:01:00");
  317.         tn = "10/28/2001 00:01:00"; 
  318.         tn.SetTimeZonePrecision(CTime::eHour);
  319.         te = tn; 
  320.         tn.AddHour(-3); 
  321.         te.AddHour(9);
  322.         OUTS( idx, __LINE__,  tn.AsString(), "10/27/2001 21:01:00");
  323.         OUTS( idx, __LINE__,  te.AsString(), "10/28/2001 08:01:00");
  324.         th = tn; 
  325.         th.AddHour(49);
  326.         OUTS( idx, __LINE__,  th.AsString(), "10/29/2001 21:01:00");
  327.         tn = "10/28/2001 09:01:00"; 
  328.         tn.SetTimeZonePrecision(CTime::eHour);
  329.         te = tn; 
  330.         tn.AddHour(-10); 
  331.         te.AddHour(+10);
  332.         OUTS( idx, __LINE__,  tn.AsString(), "10/28/2001 00:01:00");
  333.         OUTS( idx, __LINE__,  te.AsString(), "10/28/2001 19:01:00");
  334.     }}
  335. }
  336. /////////////////////////////////////////////////////////////////////////////
  337. //  Test application
  338. class CTestRegApp : public CThreadedApp
  339. {
  340. public:
  341.     virtual bool Thread_Run(int idx);
  342. protected:
  343.     virtual bool TestApp_Init(void);
  344.     virtual bool TestApp_Exit(void);
  345. };
  346. bool CTestRegApp::Thread_Run(int idx)
  347. {
  348.     // Run tests
  349.     try {
  350.         for (int i=0; i<10; i++) {
  351.             s_TestMisc(idx);
  352.             s_TestFormats();
  353.             s_TestGMT(idx);
  354.         }
  355.         OUTS( idx, __LINE__, "n", 0);
  356.         OUTS( idx, __LINE__,  "============ End thread =============" , 0);
  357.         OUTS( idx, __LINE__, "n", 0);
  358.     } catch (CException& e) {
  359.         ERR_POST(Fatal << e);
  360.         return false;
  361.     }
  362.     return true;
  363. }
  364. bool CTestRegApp::TestApp_Init(void)
  365. {
  366.     NcbiCout << NcbiEndl
  367.              << "Testing NCBITIME "
  368.              << NStr::IntToString(s_NumThreads)
  369.              << " threads..."
  370.              << NcbiEndl;
  371.     // Set err.-posting and tracing to maximum
  372.     SetDiagTrace(eDT_Enable);
  373.     SetDiagPostFlag(eDPF_All);
  374.     SetDiagPostLevel(eDiag_Info);
  375.     return true;
  376. }
  377. bool CTestRegApp::TestApp_Exit(void)
  378. {
  379.     NcbiCout << "Test completed successfully!"
  380.              << NcbiEndl << NcbiEndl;
  381.     return true;
  382. }
  383. /////////////////////////////////////////////////////////////////////////////
  384. //  MAIN
  385. int main(int argc, const char* argv[]) 
  386. {
  387.     CTestRegApp app;
  388.     return app.AppMain(argc, argv, 0, eDS_Default, 0);
  389. }
  390. /*
  391.  * ===========================================================================
  392.  * $Log: test_ncbitime_mt.cpp,v $
  393.  * Revision 1000.2  2004/06/01 19:10:26  gouriano
  394.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.9
  395.  *
  396.  * Revision 6.9  2004/05/14 13:59:51  gorelenk
  397.  * Added include of ncbi_pch.hpp
  398.  *
  399.  * Revision 6.8  2003/11/25 20:03:56  ivanov
  400.  * Fixed misspelled eTZPrecisionDefault
  401.  *
  402.  * Revision 6.7  2003/11/25 19:56:39  ivanov
  403.  * Renamed eDefault to eTZPrecisionDefault.
  404.  * Some cosmetic changes.
  405.  *
  406.  * Revision 6.6  2002/10/18 13:25:15  ivanov
  407.  * Fixed typo in the time formats list
  408.  *
  409.  * Revision 6.5  2002/09/19 20:05:43  vasilche
  410.  * Safe initialization of static mutexes
  411.  *
  412.  * Revision 6.4  2002/07/15 18:17:26  gouriano
  413.  * renamed CNcbiException and its descendents
  414.  *
  415.  * Revision 6.3  2002/07/11 14:18:29  gouriano
  416.  * exceptions replaced by CNcbiException-type ones
  417.  *
  418.  * Revision 6.2  2002/05/14 20:08:20  ucko
  419.  * Make last argument to OUTS const; we don't modify it, and without
  420.  * const we may get compiler warnings when passing string literals.
  421.  *
  422.  * Revision 6.1  2002/05/13 13:58:45  ivanov
  423.  * Initial revision
  424.  *
  425.  *
  426.  * ===========================================================================
  427.  */