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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: coretest.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:09:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.90
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: coretest.cpp,v 1000.1 2004/06/01 19:09:37 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:  Denis Vakatov
  35.  *
  36.  * File Description:
  37.  *   TEST for:  NCBI C++ core API
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #include <algorithm>
  45. #include <test/test_assert.h>  /* This header must go last */
  46. // This is to use the ANSI C++ standard templates without the "std::" prefix
  47. // and to use NCBI C++ entities without the "ncbi::" prefix
  48. USING_NCBI_SCOPE;
  49. /////////////////////////////////
  50. // I/O stream extensions
  51. //
  52. static void TestIostream(void)
  53. {
  54.     CNcbiIstrstream is("abcnx0123456789ny012345r tcba");
  55.     string str;
  56.     NcbiGetline(is, str, 'n');
  57.     assert( is.good() );
  58.     assert( str.compare("abc") == 0 );
  59.     is >> str;
  60.     assert( is.good() );
  61.     assert( str.compare("x0123456789") == 0 );
  62.     is >> str;
  63.     assert( is.good() );
  64.     assert( str.compare("y012345") == 0 );
  65.     is >> str;
  66.     assert( is.eof() );
  67.     assert( str.compare("cba") == 0 );
  68.     is >> str;
  69.     assert( !is.good() );
  70.     is.clear();
  71.     is >> str;
  72.     assert( !is.good() );
  73.     str = "0 1 2 3 4 5n6 7 8 9";
  74.     NcbiCout << "String output: "  << str << NcbiEndl;
  75. }
  76. /////////////////////////////////
  77. // Registry
  78. //
  79. static void TestRegistry(void)
  80. {
  81.     CNcbiRegistry reg;
  82.     assert( reg.Empty() );
  83.     list<string> sections;
  84.     reg.EnumerateSections(&sections);
  85.     assert( sections.empty() );
  86.     list<string> entries;
  87.     reg.EnumerateEntries(NcbiEmptyString, &entries);
  88.     assert( entries.empty() );
  89.     // Compose a test registry
  90.     assert(  reg.Set("Section0", "Name01", "Val01_BAD!!!") );
  91.     assert(  reg.Set("Section1 ", "nName11", "Val11_t") );
  92.     assert( !reg.Empty() );
  93.     assert(  reg.Get(" Section1", "Name11t") == "Val11_t" );
  94.     assert(  reg.Get("Section1", "Name11",
  95.                       CNcbiRegistry::ePersistent).empty() );
  96.     assert(  reg.Set("Section1", "Name11", "Val11_t") );
  97.     assert( !reg.Set("Section1", "Name11", "Val11_BAD!!!",
  98.                       CNcbiRegistry::eNoOverride) );
  99.     assert(  reg.Set("   Section2", "nName21  ", "Val21",
  100.                       CNcbiRegistry::ePersistent |
  101.                       CNcbiRegistry::eNoOverride) );
  102.     assert(  reg.Set("Section2", "Name21", "Val21_t") );
  103.     assert( !reg.Empty() );
  104.     assert(  reg.Set("Section3", "Name31", "Val31_t") );
  105.     assert( reg.Get(" nSection1", " Name11  ") == "Val11_t" );
  106.     assert( reg.Get("Section2", "Name21", CNcbiRegistry::ePersistent) ==
  107.              "Val21" );
  108.     assert( reg.Get(" Section2", " Name21n") == "Val21_t" );
  109.     assert( reg.Get("SectionX", "Name21").empty() );
  110.     assert( reg.Set("Section4", "Name41", "Val410 Val411 Val413",
  111.                      CNcbiRegistry::ePersistent) );
  112.     assert(!reg.Set("Sect ion4", "Name41", "BAD1",
  113.                      CNcbiRegistry::ePersistent) );
  114.     assert(!reg.Set("Section4", "Na me41", "BAD2") );
  115.     assert( reg.Set("SECTION4", "Name42", "V420 V421nV422 V423 "",
  116.                      CNcbiRegistry::ePersistent) );
  117.     assert( reg.Set("Section4", "NAME43",
  118.                      " tV430 V431  n V432 V433 ",
  119.                      CNcbiRegistry::ePersistent) );
  120.     assert( reg.Set("tSection4", "Name43T",
  121.                      " tV430 V431  n V432 V433 ",
  122.                      CNcbiRegistry::ePersistent | CNcbiRegistry::eTruncate) );
  123.     assert( reg.Set("Section4", "Name44", "n V440 V441 rn",
  124.                      CNcbiRegistry::ePersistent) );
  125.     assert( reg.Set("r Section4", "  trName45", "rn V450 V451  n  ",
  126.                      CNcbiRegistry::ePersistent) );
  127.     assert( reg.Set("Section4 n", "  Name46  ", "nnV460" n t nt",
  128.                      CNcbiRegistry::ePersistent) );
  129.     assert( reg.Set(" Section4", "Name46T", "nnV460" n t nt",
  130.                      CNcbiRegistry::ePersistent | CNcbiRegistry::eTruncate) );
  131.     assert( reg.Set("Section4", "Name47", "470n471\n 472\n473\",
  132.                      CNcbiRegistry::ePersistent) );
  133.     assert( reg.Set("Section4", "Name47T", "470n471\n 472\n473\",
  134.                      CNcbiRegistry::ePersistent | CNcbiRegistry::eTruncate) );
  135.     string xxx("" V481" n"V482 ");
  136.     assert( reg.Set("Section4", "Name48", xxx, CNcbiRegistry::ePersistent) );
  137.     assert( reg.Set("Section5", "Name51", "Section5/Name51",
  138.                      CNcbiRegistry::ePersistent) );
  139.     assert( reg.Set("_Section_5", "Name51", "_Section_5/Name51",
  140.                      CNcbiRegistry::ePersistent) );
  141.     assert( reg.Set("_Section_5_", "_Name52", "_Section_5_/_Name52",
  142.                      CNcbiRegistry::ePersistent) );
  143.     assert( reg.Set("_Section_5_", "Name52", "_Section_5_/Name52",
  144.                      CNcbiRegistry::ePersistent) );
  145.     assert( reg.Set("_Section_5_", "_Name53_", "_Section_5_/_Name53_",
  146.                      CNcbiRegistry::ePersistent) );
  147.     assert( reg.Set("Section-5.6", "Name-5.6", "Section-5.6/Name-5.6",
  148.                      CNcbiRegistry::ePersistent) );
  149.     assert( reg.Set("-Section_5", ".Name.5-3", "-Section_5/.Name.5-3",
  150.                      CNcbiRegistry::ePersistent) );
  151.     // Dump
  152.     CNcbiOstrstream os;
  153.     assert ( reg.Write(os) );
  154.     os << '';
  155.     const char* os_str = os.str();  os.rdbuf()->freeze(false);
  156.     NcbiCerr << "nRegistry:n" << os_str << NcbiEndl;
  157.     // "Persistent" load
  158.     CNcbiIstrstream is1(os_str);
  159.     CNcbiRegistry  reg1(is1);
  160.     assert(  reg1.Get("Section2", "Name21", CNcbiRegistry::ePersistent) ==
  161.               "Val21" );
  162.     assert(  reg1.Get("Section2", "Name21") == "Val21" );
  163.     assert( !reg1.Set("Section2", "Name21", NcbiEmptyString) );
  164.     assert( !reg1.Set("Section2", "Name21", NcbiEmptyString,
  165.                        CNcbiRegistry::ePersistent |
  166.                        CNcbiRegistry::eNoOverride) );
  167.     assert( !reg1.Empty() );
  168.     assert(  reg1.Set("Section2", "Name21", NcbiEmptyString,
  169.                        CNcbiRegistry::ePersistent) );
  170.     // "Transient" load
  171.     CNcbiIstrstream is2(os_str);
  172.     CNcbiRegistry  reg2(is2, CNcbiRegistry::eTransient);
  173.     assert(  reg2.Get("Section2", "Name21",
  174.                        CNcbiRegistry::ePersistent).empty() );
  175.     assert(  reg2.Get("Section2", "Name21") == "Val21" );
  176.     assert( !reg2.Set("Section2", "Name21", NcbiEmptyString,
  177.                        CNcbiRegistry::ePersistent) );
  178.     assert( !reg2.Set("Section2", "Name21", NcbiEmptyString,
  179.                        CNcbiRegistry::ePersistent |
  180.                        CNcbiRegistry::eNoOverride) );
  181.     assert( !reg2.Empty() );
  182.     assert(  reg2.Set("Section2", "Name21", NcbiEmptyString) );
  183.     assert( reg.Get("Sect ion4 ", "Name41 ").empty() );
  184.     assert( reg.Get("Section4 ", "Na me41 ").empty() );
  185.     assert( reg.Get("Section4 ", "Name41 ") == "Val410 Val411 Val413" );
  186.     assert( reg.Get("Section4",  " Name42") == "V420 V421nV422 V423 "" );
  187.     assert( reg.Get("Section4",  "Name43")  == " tV430 V431  n V432 V433 ");
  188.     assert( reg.Get("Section4",  "Name43T") == "V430 V431  n V432 V433" );
  189.     assert( reg.Get("Section4",  " Name44") == "n V440 V441 rn" );
  190.     assert( reg.Get(" SecTIon4", "Name45")  == "rn V450 V451  n  " );
  191.     assert( reg.Get("SecTion4 ", "Name46")  == "nnV460" n t nt" );
  192.     assert( reg.Get("Section4",  "NaMe46T") == "nnV460" n t n" );
  193.     assert( reg.Get(" Section4", "Name47")  == "470n471\n 472\n473\" );
  194.     assert( reg.Get("Section4 ", "NAme47T") == "470n471\n 472\n473\" );
  195.     assert( reg.Get("Section4",  "Name48")  == xxx );
  196.     assert( reg2.Get("Section4", "Name41")  == "Val410 Val411 Val413" );
  197.     assert( reg2.Get("Section4", "Name42")  == "V420 V421nV422 V423 "" );
  198.     assert( reg2.Get("Section4", "Name43")  == " tV430 V431  n V432 V433 ");
  199.     assert( reg2.Get("Section4", "Name43T") == "V430 V431  n V432 V433" );
  200.     assert( reg2.Get("Section4", "Name44")  == "n V440 V441 rn" );
  201.     assert( reg2.Get("Section4", "NaMe45")  == "rn V450 V451  n  " );
  202.     assert( reg2.Get("SecTIOn4", "NAme46")  == "nnV460" n t nt" );
  203.     assert( reg2.Get("Section4", "Name46T") == "nnV460" n t n" );
  204.     assert( reg2.Get("Section4", "Name47")  == "470n471\n 472\n473\" );
  205.     assert( reg2.Get("Section4", "Name47T") == "470n471\n 472\n473\" );
  206.     assert( reg2.Get("Section4", "Name48")  == xxx );
  207.     assert( reg2.Get(" Section5",    "Name51 ")   == "Section5/Name51" );
  208.     assert( reg2.Get("_Section_5",   " Name51")   == "_Section_5/Name51" );
  209.     assert( reg2.Get(" _Section_5_", " _Name52")  == "_Section_5_/_Name52");
  210.     assert( reg2.Get("_Section_5_ ", "Name52")    == "_Section_5_/Name52");
  211.     assert( reg2.Get("_Section_5_",  "_Name53_ ") == "_Section_5_/_Name53_" );
  212.     assert( reg2.Get(" Section-5.6", "Name-5.6 ") == "Section-5.6/Name-5.6");
  213.     assert( reg2.Get("-Section_5",   ".Name.5-3") == "-Section_5/.Name.5-3");
  214.     // Printout of the whole registry content
  215.     assert( reg.Set("Section0", "Name01", "") );
  216.     reg.EnumerateSections(&sections);
  217.     assert( find(sections.begin(), sections.end(), "Section0")
  218.              == sections.end() );
  219.     assert( find(sections.begin(), sections.end(), "Section1")
  220.              != sections.end() );
  221.     assert( !sections.empty() );
  222.     NcbiCout << "nRegistry Content:n";
  223.     for (list<string>::const_iterator itSection = sections.begin();
  224.          itSection != sections.end();   itSection++) {
  225.         NcbiCout << "Section: " << *itSection << NcbiEndl;
  226.         reg.EnumerateEntries(*itSection, &entries);
  227.         for (list<string>::const_iterator itEntry = entries.begin();
  228.              itEntry != entries.end();   itEntry++) {
  229.             NcbiCout << "  Entry: " << *itEntry << NcbiEndl;
  230.             NcbiCout << "    Default:    "
  231.                      << reg.Get(*itSection, *itEntry) << NcbiEndl;
  232.             NcbiCout << "    Persistent: "
  233.                      << reg.Get(*itSection, *itEntry,
  234.                                 CNcbiRegistry::ePersistent) << NcbiEndl;
  235.         }
  236.     }
  237.     reg.Clear();
  238.     assert( reg.Empty() );
  239.     
  240.     // Test read/write registry
  241.     NcbiCout << endl;
  242.     NcbiCout << "---------------------------------------------------" << endl;
  243.     CNcbiIstrstream is("n
  244. ############################################n
  245. #n
  246. #  Registry file commentn
  247. #n
  248. ############################################n
  249. n
  250. ; comment for section1n
  251. n
  252. [section1]n
  253. ; This is a comment for n11n
  254. #n
  255. #  File comment alson
  256. #n
  257. n11 = value11n
  258. n
  259. ; This is a comment for n12 line 1n
  260. ; This is a comment for n12 line 2n
  261. n
  262. n12 = value12n
  263. n
  264. ; This is a comment for n13n
  265. n13 = value13n
  266. ; new comment for n13n
  267. n13 = new_value13n
  268. n
  269. [ section2 ]n
  270. ; This is a comment for n21n
  271. n21 = value21n
  272.    ; This is a comment for n22n
  273. n22 = value22n
  274. [section3]n
  275. n31 = value31n
  276. ");
  277.     reg.Read(is);
  278.     reg.Write(NcbiCout);
  279.     NcbiCout << "---------------------------------------------------" << endl;
  280.     NcbiCout << "File comment:" << endl;
  281.     NcbiCout << reg.GetComment() << endl;
  282.     NcbiCout << "Section comment:" << endl;
  283.     NcbiCout << reg.GetComment("section1") << endl;
  284.     NcbiCout << "Entry comment:" << endl;
  285.     NcbiCout << reg.GetComment("section1","n12") << endl;
  286.     reg.SetComment(" new commentn# for registrynn  # ...nnn");
  287.     reg.SetComment(";new comment for section1n","section1");
  288.     reg.SetComment("new comment for section3","section3");
  289.     reg.SetComment("new comment for entry n11","section1","n11");
  290.     reg.SetComment("  ; new comment for entry n31","section3","n31");
  291.     reg.SetComment("","section2","n21");
  292.     NcbiCout << "---------------------------------------------------" << endl;
  293.     reg.Write(NcbiCout);
  294.     NcbiCout << "---------------------------------------------------" << endl;
  295. }
  296. /////////////////////////////////
  297. // Start-up (cmd.-line args, config file)
  298. //
  299. static void TestStartup(void)
  300. {
  301.     // Command-line arguments
  302.     SIZE_TYPE n_args = CNcbiApplication::Instance()->GetArguments().Size();
  303.     NcbiCout << NcbiEndl << "Total # of CMD.-LINE ARGS: "
  304.              << n_args << NcbiEndl;
  305.     for (SIZE_TYPE i = 0;  i < n_args;  i++) {
  306.         NcbiCout << " [" << i << "] = ""
  307.                  << CNcbiApplication::Instance()->GetArguments()[i]
  308.                  << """ << NcbiEndl;
  309.     }
  310.     NcbiCout << NcbiEndl;
  311.     // Config.file (registry) content
  312.     const CNcbiRegistry& reg = CNcbiApplication::Instance()->GetConfig();
  313.     NcbiCout << "REGISTRY (loaded from config file):" <<  NcbiEndl;
  314.     if ( reg.Empty() ) {
  315.         NcbiCout << "  <empty>"  << NcbiEndl;
  316.     } else {
  317.         reg.Write(NcbiCout);
  318.     }
  319.     NcbiCout << NcbiEndl;
  320. }
  321. /////////////////////////////////
  322. // Diagnostics
  323. //
  324. class CNcbiTestDiag {
  325. public:
  326.     int i;
  327.     CNcbiTestDiag(void) { i = 4321; }
  328. };
  329. inline CNcbiOstream& operator <<(CNcbiOstream& os, const CNcbiTestDiag& cntd) {
  330.     return os << "Output of an serializable class content = " << cntd.i;
  331. }
  332. static void s_TestDiagHandler(const SDiagMessage& mess)
  333.     NcbiCout << "<Installed Handler> " << mess << NcbiEndl;
  334. }
  335. static void TestDiag(void)
  336. {
  337.     CNcbiDiag diag;
  338.     double d = 123.45;
  339.     SetDiagPostFlag(eDPF_All);
  340.     diag << "[Unset Diag Stream]  Diagnostics double = " << d << Endm;
  341.     ERR_POST( "[Unset Diag Stream]  ERR_POST double = " << d );
  342.     _TRACE( "[Unset Diag Stream]  Trace double = " << d );
  343.     NcbiCout << NcbiEndl
  344.              << "FLUSHing memory-stored diagnostics (if any):" << NcbiEndl;
  345.     SIZE_TYPE n_flush = CNcbiApplication::Instance()->FlushDiag(&NcbiCout);
  346.     NcbiCout << "FLUSHed diag: " << n_flush << " bytes" << NcbiEndl <<NcbiEndl;
  347.     {{
  348.         CNcbiDiag diagWarning;
  349.         SetDiagHandler(s_TestDiagHandler, 0, 0);
  350.         diagWarning << "*Warning* -- must be printed by Installed Handler!";
  351.     }}
  352.     SetDiagStream(&NcbiCerr);
  353.     diag << "***ERROR*** THIS MESSAGE MUST NOT BE VISIBLE!!!nn";
  354.     SetDiagStream(0);
  355.     diag << Endm;
  356.     diag << "01234";
  357.     SetDiagStream(&NcbiCerr);
  358.     assert(  IsDiagStream(&NcbiCerr) );
  359.     assert( !IsDiagStream(&NcbiCout) );
  360.     diag << "56789" << Endm;
  361.     diag <<   "[Set Diag Stream(cerr)]  Diagnostics double = " << d << Endm;
  362.     ERR_POST("[Set Diag Stream(cerr)]  Std.Diag. double = "    << d );
  363.     _TRACE  ( "[Set Diag Stream(cerr)]  Trace double = "       << d );
  364.     CNcbiTestDiag cntd;
  365.     SetDiagPostLevel(eDiag_Error);
  366.     diag << Warning << cntd << Endm;
  367.     SetDiagPostLevel(eDiag_Info);
  368.     diag << Warning << cntd << Endm;
  369.     diag << Error << "This message has severity "Info"" << Reset
  370.          << Info  << "This message has severity "Info"" << Endm;
  371.     diag << Critical << "This message has severity "Critical"" << Endm;
  372.     diag << Trace << "1This message has severity "Trace"" << Endm;
  373.     SetDiagPostFlag(eDPF_All);
  374.     SetDiagPostPrefix("Foo-Prefix");
  375.     ERR_POST("This is the most detailed " << "error posting");
  376.     SetDiagPostPrefix(0);
  377.     UnsetDiagPostFlag(eDPF_Line);
  378.     UnsetDiagPostFlag(eDPF_LongFilename);
  379.     ERR_POST(Warning << "No line #, " << "Short filename, " << "No prefix");
  380.     _TRACE("_TRACE:  must have all possible info in the posted message");
  381.     UnsetDiagPostFlag(eDPF_Severity);
  382.     ERR_POST("...and no severity");
  383.     SetDiagPostFlag(eDPF_Line);
  384.     SetDiagPostFlag(eDPF_Severity);
  385.     SetDiagPostPrefix("Bad!!! No Prefix!!!");
  386.     UnsetDiagPostFlag(eDPF_Prefix);
  387.     ERR_POST("Short filename, " << "No prefix");
  388.     UnsetDiagPostFlag(eDPF_All);
  389.     ERR_POST("This is the least detailed error posting");
  390.     SetDiagPostFlag(eDPF_All);
  391.     UnsetDiagPostFlag(eDPF_LongFilename);
  392.     PushDiagPostPrefix("Prefix1");
  393.     ERR_POST("Message with prefix");
  394.     PushDiagPostPrefix("Prefix2");
  395.     ERR_POST("Message with prefixes");
  396.     PushDiagPostPrefix("Prefix3");
  397.     ERR_POST("Message with prefixes");
  398.     PopDiagPostPrefix();
  399.     ERR_POST("Message with prefixes");
  400.     PopDiagPostPrefix();
  401.     PopDiagPostPrefix();
  402.     PopDiagPostPrefix();
  403.     {{
  404.         CDiagAutoPrefix a("AutoPrefix");
  405.         ERR_POST("Message with auto prefix");
  406.     }}
  407.     ERR_POST("Message without prefixes");
  408.     ERR_POST_EX(8, 0, "Message without prefix");
  409.     SetDiagPostPrefix(0);
  410.     PushDiagPostPrefix("ERROR");
  411.     PopDiagPostPrefix();
  412.     ERR_POST_EX(1, 2, "Message with error code, without prefix");
  413.     PushDiagPostPrefix("ERROR");
  414.     SetDiagPostPrefix(0);
  415.     diag << Error << ErrCode(3, 4) << "Message with error code" << Endm;
  416.     UnsetDiagPostFlag(eDPF_DateTime);
  417.     diag << Warning << "Message without datetime stamp" << Endm;
  418.     SetDiagPostFlag(eDPF_DateTime);
  419.     EDiagSev prev_sev;
  420.     IgnoreDiagDieLevel(true, &prev_sev);
  421.     {{
  422.         CNcbiDiag x_diag;
  423.         x_diag << Fatal << "Fatal message w/o exit()/abort()!" << Endm;
  424.     }}
  425.     IgnoreDiagDieLevel(false);
  426.     SetDiagDieLevel(prev_sev);
  427. }
  428. static void TestDiag_ErrCodeInfo(void)
  429. {
  430.     CNcbiDiag diag;
  431.     CDiagErrCodeInfo        info;
  432.     SDiagErrCodeDescription desc;
  433.     CNcbiIstrstream is("
  434. # Comment linen
  435. n
  436. MODULE coretestn
  437. n
  438. $$ DATE, 1 : Short message for error code (1,0)n
  439. n
  440. $^   NameOfError, 1, 3 : Short message for error code (1,1)n
  441. This is a long message for error code (1,1).n
  442. $^   NameOfWarning, 2, WARNING: Some short text with ':' and ',' charactersn
  443. This is first line of the error explanation.n
  444. This is second line of the error explanation.n
  445. n
  446. $$ PRINT, 9, 2n
  447. Error with code (9,0).n
  448. $^   EmptyString, 1, info:Error with subcode 1.n
  449. $^   BadFormat, 2n
  450. Message for warning error PRINT_BadFormat.n
  451. ");
  452.     info.Read(is);
  453.     info.SetDescription(ErrCode(2,3), 
  454.                         SDiagErrCodeDescription("Err 2.3", "Error 2.3"
  455.                                                 /*, default severity */));
  456.     info.SetDescription(ErrCode(2,4), 
  457.                         SDiagErrCodeDescription("Err 2.4", "Error 2.4",
  458.                                                 eDiag_Error));
  459.     assert(info.GetDescription(ErrCode(1,1), &desc));
  460.     assert(desc.m_Message     == "Short message for error code (1,1)");
  461.     assert(desc.m_Explanation == "This is a long message for error code (1,1).");
  462.     assert(desc.m_Severity    == 3);
  463.     assert(info.GetDescription(ErrCode(9,0), &desc));
  464.     assert(desc.m_Severity    == 2);
  465.     assert(info.GetDescription(ErrCode(9,1), &desc));
  466.     assert(desc.m_Severity    == eDiag_Info);
  467.     assert(info.GetDescription(ErrCode(9,2), &desc));
  468.     assert(desc.m_Severity    == 2);
  469.     assert(info.GetDescription(ErrCode(2,4), &desc));
  470.     assert(desc.m_Message     == "Err 2.4");
  471.     assert(desc.m_Explanation == "Error 2.4");
  472.     assert(desc.m_Severity    == eDiag_Error);
  473.     assert(!info.GetDescription(ErrCode(1,3), &desc));
  474.     SetDiagErrCodeInfo(&info);
  475.     SetDiagPostFlag(eDPF_All);
  476.     SetDiagPostPrefix("Prefix");
  477.     ERR_POST("This message has default severity "Error"");
  478.     ERR_POST_EX(1,1,"This message has severity "Critical"");
  479.     diag << ErrCode(1,1) << Info << "This message has severity "Critical"" 
  480.          << Endm;
  481.     UnsetDiagPostFlag(eDPF_ErrCodeMessage);
  482.     diag << ErrCode(1,1) << Info << "This message has severity "Critical"" 
  483.          << Endm;
  484.     UnsetDiagPostFlag(eDPF_Prefix);
  485.     diag << ErrCode(1,1) << Info << "This message has severity "Critical""
  486.          << Endm;
  487.     UnsetDiagPostFlag(eDPF_ErrCode);
  488.     UnsetDiagPostFlag(eDPF_ErrCodeUseSeverity);
  489.     diag << ErrCode(1,1) << Info << "This message has severity "Info""
  490.          << Endm;
  491.     UnsetDiagPostFlag(eDPF_ErrCodeExplanation);
  492.     SetDiagPostFlag(eDPF_ErrCodeUseSeverity);
  493.     diag << ErrCode(1,1) << "This message has severity "Critical"" << Endm;
  494. }
  495. /////////////////////////////////
  496. // Exceptions
  497. //
  498. static void TE_runtime(void) {
  499.     throw runtime_error("TE_runtime::runtime_error");
  500. }
  501. static void TE_none(void) THROWS_NONE {
  502.     return;
  503. }
  504. static void TE_logic(void) THROWS((runtime_error,logic_error)) {
  505.     throw logic_error("TE_logic::logic_error");
  506. }
  507. class XXX {
  508.     string mess;
  509. public:
  510.     XXX(const XXX&    x);
  511.     XXX(const string& m);
  512.     ~XXX(void);
  513.     const string& what(void) const { return mess; }
  514. };
  515. XXX::XXX(const string& m) : mess(m) {
  516.     NcbiCerr << "XXX: " << long(this) << NcbiEndl;
  517. }
  518. XXX::XXX(const XXX&x) : mess(x.mess) {
  519.     NcbiCerr << "XXX(" << long(&x) << "): " << long(this) << NcbiEndl;
  520. }
  521. XXX::~XXX(void) {
  522.     NcbiCerr << "~XXX: " << long(this) << NcbiEndl;
  523. }
  524. static void s_ThrowXXX(void) {
  525.     NcbiCerr << NcbiEndl << "Throw class XXX" << NcbiEndl;
  526.     throw XXX("s_ThrowXXX message");
  527.    
  528. }
  529. static void TestException_Features(void)
  530. {
  531.     try {
  532.         s_ThrowXXX();
  533.     } catch (XXX& x) {
  534.         NcbiCerr << "Catch (XXX& x): " << x.what() << NcbiEndl;
  535.     }
  536.     try {
  537.         s_ThrowXXX();
  538.     } catch (XXX x) {
  539.         NcbiCerr << "Catch (XXX x): " << x.what() << NcbiEndl << NcbiEndl;
  540.     }
  541. }
  542. static void TestException_Std(void)
  543. {
  544.     try { TE_runtime(); }
  545.     catch (runtime_error& e) {
  546.         NcbiCerr << "CATCH TE_runtime::runtime_error : " << e.what()<<NcbiEndl;
  547.     }
  548.     try { TE_runtime(); }
  549.     catch (exception& e) {
  550.         NcbiCerr << "CATCH TE_runtime::exception " << e.what() << NcbiEndl;
  551.     }
  552.     try { TE_runtime(); }
  553.     STD_CATCH ("STD_CATCH" << ' ' << "TE_runtime ");
  554.     try { TE_runtime(); }
  555.     catch (logic_error& e) {
  556.         NcbiCerr << "CATCH TE_runtime::logic_error " << e.what() << NcbiEndl;
  557.         _TROUBLE; }
  558.     STD_CATCH_ALL ("STD_CATCH_ALL" << " " << "TE_runtime");
  559.     TE_none();
  560.     try { TE_logic(); }
  561.     catch (logic_error& e) {
  562.         NcbiCerr << "CATCH TE_logic " << e.what() << NcbiEndl; }
  563.     STD_CATCH_ALL ("try { TE_logic(); }  SOMETHING IS WRONG!");
  564. }
  565. static void TestException_Aux(void)
  566. {
  567.     try {
  568.         assert( !strtod("1e-999999", 0) );
  569.         NCBI_THROW(CErrnoTemplException<CCoreException>,eErrno,
  570.             "Failed strtod("1e-999999", 0)");
  571.     }
  572.     catch (CErrnoTemplException<CCoreException>& e) {
  573.         NCBI_REPORT_EXCEPTION("TEST CErrnoTemplException<CCoreException> ---> ",e);
  574.     }
  575.     try {
  576.         NCBI_THROW2(CParseTemplException<CCoreException>,eErr,
  577.             "Failed parsing (at pos. 123)",123);
  578.     }
  579.     catch (CException& e) {
  580.         NCBI_REPORT_EXCEPTION("TEST CParseTemplException<CCoreException> ---> ",e);
  581.     }
  582.     catch (...) {
  583.         // Should never be here
  584.         _TROUBLE;
  585.     }
  586. }
  587. static void TestException_AuxTrace(void)
  588. {
  589.     try {
  590.         assert( !strtod("1e-999999", 0) );
  591.         NCBI_THROW(CErrnoTemplException<CCoreException>,eErrno,
  592.             "Failed strtod('1e-999999', 0)");
  593.     }
  594.     catch (CErrnoTemplException<CCoreException>& e) {
  595.         NCBI_REPORT_EXCEPTION("throw CErrnoTemplException<CCoreException> ---> ",e);
  596.     }
  597.     try {
  598.         try {
  599.             // BW___WS53
  600.             // Sigh.  WorkShop 5.3 is stupid, and complains about
  601.             // const char* vs. const char[15] without this cast.
  602.             THROW0_TRACE((const char*) "Throw a string");
  603.         } catch (const char* _DEBUG_ARG(e)) {
  604.             _TRACE("THROW0_TRACE: " << e);
  605.             RETHROW_TRACE;
  606.         }
  607.     } catch (const char* _DEBUG_ARG(e)) {
  608.         _TRACE("RETHROW_TRACE: " << e);
  609.     }
  610.     try {
  611.         THROW_TRACE(bad_alloc, ());
  612.     }
  613.     STD_CATCH ("THROW_TRACE  bad_alloc ---> ");
  614.     try {
  615.         THROW_TRACE(runtime_error, ("Some message..."));
  616.     }
  617.     STD_CATCH ("THROW_TRACE  runtime_error ---> ");
  618.     try {
  619.         NCBI_THROW2(CParseTemplException<CCoreException>,eErr,
  620.             "Failed parsing (at pos. 123)", 123);
  621.     }
  622.     catch (CException& e) {
  623.         NCBI_REPORT_EXCEPTION("throw CParseTemplException<CCoreException> ---> ",e);
  624.     }
  625. }
  626. static void TestException(void)
  627. {
  628.     SetDiagStream(&NcbiCout);
  629.     TestException_Features();
  630.     TestException_Std();
  631.     TestException_Aux();
  632. }
  633. static void TestThrowTrace(void)
  634. {
  635.     SetDiagTrace(eDT_Enable);
  636.     NcbiCerr << "The following lines should be equal pairs:" << NcbiEndl;
  637.     try {
  638.         THROW1_TRACE(runtime_error, "Message");
  639.     }
  640.     catch (...) {
  641.         CNcbiDiag(__FILE__, __LINE__ - 3, eDiag_Trace) <<
  642.             "runtime_error: Message";
  643.     }
  644.     string mess = "ERROR";
  645.     try {
  646.         THROW1_TRACE(runtime_error, mess);
  647.     }
  648.     catch (...) {
  649.         CNcbiDiag(__FILE__, __LINE__ - 3, eDiag_Trace) <<
  650.             "runtime_error: ERROR";
  651.     }
  652.     int i = 123;
  653.     try {
  654.         THROW0p_TRACE(i);
  655.     }
  656.     catch (...) {
  657.         CNcbiDiag(__FILE__, __LINE__ - 3, eDiag_Trace) <<
  658.             "i: 123";
  659.     }
  660.     SetDiagTrace(eDT_Default);
  661. }
  662. #include <corelib/ncbiobj.hpp>
  663. class CObjectInt : public CObject
  664. {
  665. public:
  666.   CObjectInt() : m_Int(0) {}
  667.   CObjectInt(int i) : m_Int(i) {}
  668.   int m_Int;
  669. };
  670. static void TestHeapStack(void)
  671. {
  672.     SetDiagTrace(eDT_Enable);
  673.     {
  674.       NcbiCerr << "Test CObjectInt in stack:" << NcbiEndl;
  675.       CObjectInt stackObj;
  676.       assert(!stackObj.CanBeDeleted());
  677.     }
  678.     {
  679.       NcbiCerr << "Test CObjectInt on heap:" << NcbiEndl;
  680.       CObjectInt* heapObj = new CObjectInt();
  681.       assert(heapObj->CanBeDeleted());
  682.     }
  683.     {
  684.       NcbiCerr << "Test static CObjectInt:" << NcbiEndl;
  685.       static CObjectInt staticObj;
  686.       assert(!staticObj.CanBeDeleted());
  687.     }
  688.     {
  689.       NcbiCerr << "Test CRef on CObjectInt on heap:" << NcbiEndl;
  690.       CRef<CObjectInt> objRef(new CObjectInt());
  691.       assert(objRef->CanBeDeleted());
  692.     }
  693.     {
  694.       NcbiCerr << "Test CObject in stack:" << NcbiEndl;
  695.       CObject stackObj;
  696.       assert(!stackObj.CanBeDeleted());
  697.     }
  698.     {
  699.       NcbiCerr << "Test CObject on heap:" << NcbiEndl;
  700.       CObject* heapObj = new CObject();
  701.       assert(heapObj->CanBeDeleted());
  702.     }
  703.     {
  704.       NcbiCerr << "Test static CObject:" << NcbiEndl;
  705.       static CObject staticObj;
  706.       assert(!staticObj.CanBeDeleted());
  707.     }
  708.     {
  709.       NcbiCerr << "Test CRef on CObject on heap:" << NcbiEndl;
  710.       CRef<CObject> objRef(new CObject());
  711.       assert(objRef->CanBeDeleted());
  712.     }
  713.     SetDiagTrace(eDT_Default);
  714. }
  715. /////////////////////////////////
  716. // Test application
  717. //
  718. class CTestApplication : public CNcbiApplication
  719. {
  720. public:
  721.     virtual ~CTestApplication(void);
  722.     virtual int Run(void);
  723. };
  724. int CTestApplication::Run(void)
  725. {
  726.     TestStartup();
  727.     TestDiag();
  728.     TestDiag_ErrCodeInfo();
  729.     TestException();
  730.     TestException_AuxTrace();
  731.     TestIostream();
  732.     TestRegistry();
  733.     TestThrowTrace();
  734.     TestHeapStack();
  735.     NcbiCout << NcbiEndl << "CORETEST execution completed successfully!"
  736.              << NcbiEndl << NcbiEndl << NcbiEndl;
  737.     return 0;
  738. }
  739. CTestApplication::~CTestApplication()
  740. {
  741.     SetDiagStream(0);
  742.     assert( IsDiagStream(0) );
  743.     assert( !IsDiagStream(&NcbiCout) );
  744. }
  745.   
  746. /////////////////////////////////
  747. // APPLICATION OBJECT
  748. //   and
  749. // MAIN
  750. //
  751. // Note that if the application's object ("theTestApplication") was defined
  752. // inside the scope of function "main()", then its destructor could be
  753. // called *before* destructors of other statically allocated objects
  754. // defined in other modules.
  755. // It would cause a premature closure of diag. stream, and disallow the
  756. // destructors of other projects to refer to this application object:
  757. //  - the singleton method CNcbiApplication::Instance() would return NULL, and
  758. //  - if there is a "raw"(direct) pointer to "theTestApplication" then it
  759. //    might cause a real trouble.
  760. static CTestApplication theTestApplication;
  761. int main(int argc, const char* argv[] /*, const char* envp[]*/)
  762. {
  763.     // Post error message
  764.     ERR_POST("This message goes to the default diag.stream, CERR");
  765.     // Execute main application function
  766.     return theTestApplication.AppMain(argc, argv, 0 /*envp*/, eDS_ToMemory);
  767. }
  768. /*
  769.  * ===========================================================================
  770.  * $Log: coretest.cpp,v $
  771.  * Revision 1000.1  2004/06/01 19:09:37  gouriano
  772.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.90
  773.  *
  774.  * Revision 1.90  2004/05/14 13:59:51  gorelenk
  775.  * Added include of ncbi_pch.hpp
  776.  *
  777.  * Revision 1.89  2003/10/06 16:59:37  ivanov
  778.  * Use macro _TROUBLE instead assert(0)
  779.  *
  780.  * Revision 1.88  2003/04/25 20:54:40  lavr
  781.  * Add test for IgnoreDiagDieLevel() operations
  782.  *
  783.  * Revision 1.87  2003/02/24 19:56:51  gouriano
  784.  * use template-based exceptions instead of errno and parse exceptions
  785.  *
  786.  * Revision 1.86  2002/08/28 17:06:18  vasilche
  787.  * Added code for checking heap detection
  788.  *
  789.  * Revision 1.85  2002/08/16 15:02:32  ivanov
  790.  * Added test for class CDiagAutoPrefix
  791.  *
  792.  * Revision 1.84  2002/08/01 18:52:27  ivanov
  793.  * Added test for output verbose messages for error codes
  794.  *
  795.  * Revision 1.83  2002/07/15 18:53:36  gouriano
  796.  * renamed CNcbiException to CException
  797.  *
  798.  * Revision 1.82  2002/07/15 18:17:25  gouriano
  799.  * renamed CNcbiException and its descendents
  800.  *
  801.  * Revision 1.81  2002/07/11 14:18:28  gouriano
  802.  * exceptions replaced by CNcbiException-type ones
  803.  *
  804.  * Revision 1.80  2002/04/16 18:49:06  ivanov
  805.  * Centralize threatment of assert() in tests.
  806.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  807.  *
  808.  * Revision 1.79  2001/10/15 19:48:24  vakatov
  809.  * Use two #if's instead of "#if ... && ..." as KAI cannot handle #if x == y
  810.  *
  811.  * Revision 1.78  2001/09/05 18:47:12  ucko
  812.  * Work around WorkShop 5.3 type-equivalence bug.
  813.  *
  814.  * Revision 1.77  2001/07/30 14:42:27  lavr
  815.  * eDiag_Trace and eDiag_Fatal always print as much as possible
  816.  *
  817.  * Revision 1.76  2001/07/25 19:14:14  lavr
  818.  * Added test for date/time stamp in message logging
  819.  *
  820.  * Revision 1.75  2001/06/22 21:46:15  ivanov
  821.  * Added test for read/write the registry file with comments
  822.  *
  823.  * Revision 1.74  2001/06/13 23:19:39  vakatov
  824.  * Revamped previous revision (prefix and error codes)
  825.  *
  826.  * Revision 1.73  2001/06/13 20:50:00  ivanov
  827.  * Added test for stack post prefix messages and ErrCode manipulator.
  828.  *
  829.  * Revision 1.72  2001/03/26 20:59:57  vakatov
  830.  * String-related tests moved to "test_ncbistr.cpp" (by A.Grichenko)
  831.  *
  832.  * Revision 1.71  2001/01/30 00:40:28  vakatov
  833.  * Do not use arg "envp[]" in main() -- as it is not working on MAC
  834.  *
  835.  * Revision 1.70  2000/12/11 20:42:52  vakatov
  836.  * + NStr::PrintableString()
  837.  *
  838.  * Revision 1.69  2000/10/24 21:51:23  vakatov
  839.  * [DEBUG] By default, do not print file name and line into the diagnostics
  840.  *
  841.  * Revision 1.68  2000/10/24 19:54:48  vakatov
  842.  * Diagnostics to go to CERR by default (was -- disabled by default)
  843.  *
  844.  * Revision 1.67  2000/10/11 21:03:50  vakatov
  845.  * Cleanup to avoid 64-bit to 32-bit values truncation, etc.
  846.  * (reported by Forte6 Patch 109490-01)
  847.  *
  848.  * Revision 1.66  2000/08/03 20:21:35  golikov
  849.  * Added predicate PCase for AStrEquiv
  850.  * PNocase, PCase goes through NStr::Compare now
  851.  *
  852.  * Revision 1.65  2000/06/26 20:56:35  vakatov
  853.  * TestDiag() -- using user-istalled message posting handler
  854.  *
  855.  * Revision 1.64  2000/06/23 19:57:19  vakatov
  856.  * TestDiag() -- added tests for the switching diag.handlers
  857.  *
  858.  * Revision 1.63  2000/06/11 01:47:34  vakatov
  859.  * IsDiagSet(0) to return TRUE if the diag stream is unset
  860.  *
  861.  * Revision 1.62  2000/06/09 21:22:49  vakatov
  862.  * Added test for IsDiagStream()
  863.  *
  864.  * Revision 1.61  2000/05/24 20:57:13  vasilche
  865.  * Use new macro _DEBUG_ARG to avoid warning about unused argument.
  866.  *
  867.  * Revision 1.60  2000/04/19 18:36:44  vakatov
  868.  * Test NStr::Compare() for non-zero "pos"
  869.  *
  870.  * Revision 1.59  2000/04/17 04:16:25  vakatov
  871.  * Added tests for NStr::Compare() and NStr::ToLower/ToUpper()
  872.  *
  873.  * Revision 1.58  2000/04/04 22:34:32  vakatov
  874.  * Checks for the NStr:: for "long", and for the debug tracing
  875.  *
  876.  * Revision 1.57  2000/02/18 16:54:10  vakatov
  877.  * + eDiag_Critical
  878.  *
  879.  * Revision 1.56  2000/01/20 17:55:48  vakatov
  880.  * Fixes to follow the "CNcbiApplication" change.
  881.  *
  882.  * Revision 1.55  1999/11/29 17:49:12  golikov
  883.  * NStr::Replace tests modified obedience to Denis :)
  884.  *
  885.  * Revision 1.54  1999/11/26 18:45:30  golikov
  886.  * NStr::Replace tests added
  887.  *
  888.  * Revision 1.53  1999/11/12 17:33:24  vakatov
  889.  * To be more careful with _DEBUG to suit some ugly MSVC++ features
  890.  *
  891.  * Revision 1.52  1999/10/04 16:21:06  vasilche
  892.  * Added full set of macros THROW*_TRACE
  893.  *
  894.  * Revision 1.51  1999/09/29 18:21:58  vakatov
  895.  * + TestException_Features() -- to test how the thrown object is handled
  896.  *
  897.  * Revision 1.50  1999/09/02 21:54:42  vakatov
  898.  * Tests for CNcbiRegistry:: allowed '-' and '.' in the section/entry name
  899.  *
  900.  * Revision 1.49  1999/08/30 16:00:45  vakatov
  901.  * CNcbiRegistry:: Get()/Set() -- force the "name" and "section" to
  902.  * consist of alphanumeric and '_' only;  ignore leading and trailing
  903.  * spaces
  904.  *
  905.  * Revision 1.48  1999/07/07 14:17:07  vakatov
  906.  * CNcbiRegistry::  made the section and entry names be case-insensitive
  907.  *
  908.  * Revision 1.47  1999/07/06 15:26:37  vakatov
  909.  * CNcbiRegistry::
  910.  *   - allow multi-line values
  911.  *   - allow values starting and ending with space symbols
  912.  *   - introduced EFlags/TFlags for optional parameters in the class
  913.  *     member functions -- rather than former numerous boolean parameters
  914.  *
  915.  * Revision 1.46  1999/05/27 15:22:16  vakatov
  916.  * Extended and fixed tests for the StringToXXX() functions
  917.  *
  918.  * Revision 1.45  1999/05/11 14:47:38  vakatov
  919.  * Added missing <algorithm> header (for MSVC++)
  920.  *
  921.  * Revision 1.44  1999/05/11 02:53:52  vakatov
  922.  * Moved CGI API from "corelib/" to "cgi/"
  923.  *
  924.  * Revision 1.43  1999/05/10 14:26:13  vakatov
  925.  * Fixes to compile and link with the "egcs" C++ compiler under Linux
  926.  *
  927.  * Revision 1.42  1999/05/04 16:14:50  vasilche
  928.  * Fixed problems with program environment.
  929.  * Added class CNcbiEnvironment for cached access to C environment.
  930.  *
  931.  * Revision 1.41  1999/05/04 00:03:16  vakatov
  932.  * Removed the redundant severity arg from macro ERR_POST()
  933.  *
  934.  * Revision 1.40  1999/05/03 20:32:31  vakatov
  935.  * Use the (newly introduced) macro from <corelib/ncbidbg.h>:
  936.  *   RETHROW_TRACE,
  937.  *   THROW0_TRACE(exception_class),
  938.  *   THROW1_TRACE(exception_class, exception_arg),
  939.  *   THROW_TRACE(exception_class, exception_args)
  940.  * instead of the former (now obsolete) macro _TRACE_THROW.
  941.  *
  942.  * Revision 1.39  1999/04/30 19:21:06  vakatov
  943.  * Added more details and more control on the diagnostics
  944.  * See #ERR_POST, EDiagPostFlag, and ***DiagPostFlag()
  945.  *
  946.  * Revision 1.38  1999/04/27 14:50:12  vasilche
  947.  * Added FastCGI interface.
  948.  * CNcbiContext renamed to CCgiContext.
  949.  *
  950.  * Revision 1.37  1999/04/14 20:12:52  vakatov
  951.  * + <stdio.h>, <stdlib.h>
  952.  *
  953.  * Revision 1.36  1999/03/12 18:04:09  vakatov
  954.  * Added ERR_POST macro to perform a plain "standard" error posting
  955.  *
  956.  * Revision 1.35  1999/01/21 16:18:04  sandomir
  957.  * minor changes due to NStr namespace to contain string utility functions
  958.  *
  959.  * Revision 1.34  1999/01/12 17:10:16  sandomir
  960.  * test restored
  961.  *
  962.  * Revision 1.33  1999/01/12 17:06:37  sandomir
  963.  * GetLink changed
  964.  *
  965.  * Revision 1.32  1999/01/07 21:15:24  vakatov
  966.  * Changed prototypes for URL_DecodeString() and URL_EncodeString()
  967.  *
  968.  * Revision 1.31  1999/01/07 20:06:06  vakatov
  969.  * + URL_DecodeString()
  970.  * + URL_EncodeString()
  971.  *
  972.  * Revision 1.30  1999/01/04 22:41:44  vakatov
  973.  * Do not use so-called "hardware-exceptions" as these are not supported
  974.  * (on the signal level) by UNIX
  975.  * Do not "set_unexpected()" as it works differently on UNIX and MSVC++
  976.  *
  977.  * Revision 1.29  1998/12/28 17:56:43  vakatov
  978.  * New CVS and development tree structure for the NCBI C++ projects
  979.  *
  980.  * Revision 1.28  1998/12/15 15:43:24  vasilche
  981.  * Added utilities to convert string <> int.
  982.  *
  983.  * Revision 1.27  1998/12/11 18:00:56  vasilche
  984.  * Added cookies and output stream
  985.  *
  986.  * Revision 1.26  1998/12/10 22:59:49  vakatov
  987.  * CNcbiRegistry:: API is ready(and by-and-large tested)
  988.  *
  989.  * Revision 1.25  1998/12/10 18:05:40  vakatov
  990.  * CNcbiReg::  Just passed a draft test.
  991.  *
  992.  * Revision 1.24  1998/12/10 17:36:56  sandomir
  993.  * ncbires.cpp added
  994.  * 
  995.  * Revision 1.23  1998/12/09 19:38:53  vakatov
  996.  * Started with TestRegistry().  Freeze in the "compilable" state.
  997.  *
  998.  * Revision 1.22  1998/12/07 23:48:03  vakatov
  999.  * Changes in the usage of CCgiApplication class
  1000.  *
  1001.  * Revision 1.21  1998/12/03 21:24:23  sandomir
  1002.  * NcbiApplication and CgiApplication updated
  1003.  *
  1004.  * Revision 1.20  1998/12/03 16:40:15  vakatov
  1005.  * Initial revision
  1006.  * Aux. function "Getline()" to read from "istream" to a "string"
  1007.  * Adopted standard I/O "string" <--> "istream" for old-fashioned streams
  1008.  *
  1009.  * Revision 1.19  1998/12/01 00:27:21  vakatov
  1010.  * Made CCgiRequest::ParseEntries() to read ISINDEX data, too.
  1011.  * Got rid of now redundant CCgiRequest::ParseIndexesAsEntries()
  1012.  *
  1013.  * Revision 1.18  1998/11/30 21:23:20  vakatov
  1014.  * CCgiRequest:: - by default, interprete ISINDEX data as regular FORM entries
  1015.  * + CCgiRequest::ParseIndexesAsEntries()
  1016.  * Allow FORM entry in format "name1&name2....." (no '=' necessary after name)
  1017.  *
  1018.  * Revision 1.17  1998/11/27 20:55:23  vakatov
  1019.  * CCgiRequest::  made the input stream arg. be optional(std.input by default)
  1020.  *
  1021.  * Revision 1.16  1998/11/27 19:46:06  vakatov
  1022.  * TestCgi() -- test the query string passed as a cmd.-line argument
  1023.  *
  1024.  * Revision 1.15  1998/11/27 15:55:07  vakatov
  1025.  * + TestCgi(USER STDIN)
  1026.  *
  1027.  * Revision 1.14  1998/11/26 00:29:55  vakatov
  1028.  * Finished NCBI CGI API;  successfully tested on MSVC++ and SunPro C++ 5.0
  1029.  *
  1030.  * Revision 1.13  1998/11/24 23:07:31  vakatov
  1031.  * Draft(almost untested) version of CCgiRequest API
  1032.  *
  1033.  * Revision 1.12  1998/11/24 21:31:34  vakatov
  1034.  * Updated with the ISINDEX-related code for CCgiRequest::
  1035.  * TCgiEntries, ParseIndexes(), GetIndexes(), etc.
  1036.  *
  1037.  * Revision 1.11  1998/11/24 17:52:38  vakatov
  1038.  * + TestException_Aux() -- tests for CErrnoException:: and CErrnoException::
  1039.  * + TestCgi_Request()   -- tests for CCgiRequest::ParseEntries()
  1040.  *
  1041.  * Revision 1.10  1998/11/20 22:34:39  vakatov
  1042.  * Reset diag. stream to get rid of a mem.leak
  1043.  *
  1044.  * Revision 1.9  1998/11/19 23:41:14  vakatov
  1045.  * Tested version of "CCgiCookie::" and "CCgiCookies::"
  1046.  *
  1047.  * Revision 1.8  1998/11/13 00:18:08  vakatov
  1048.  * Added a test for the "unexpected" exception.
  1049.  * Turned off "hardware" exception tests for UNIX.
  1050.  *
  1051.  * Revision 1.7  1998/11/10 01:17:38  vakatov
  1052.  * Cleaned, adopted to the standard NCBI C++ framework and incorporated
  1053.  * the "hardware exceptions" code and tests(originally written by
  1054.  * V.Sandomirskiy).
  1055.  * Only tested for MSVC++ compiler yet -- to be continued for SunPro...
  1056.  *
  1057.  * Revision 1.6  1998/11/06 22:42:42  vakatov
  1058.  * Introduced BEGIN_, END_ and USING_ NCBI_SCOPE macros to put NCBI C++
  1059.  * API to namespace "ncbi::" and to use it by default, respectively
  1060.  * Introduced THROWS_NONE and THROWS(x) macros for the exception
  1061.  * specifications
  1062.  * Other fixes and rearrangements throughout the most of "corelib" code
  1063.  *
  1064.  * Revision 1.5  1998/11/04 23:48:15  vakatov
  1065.  * Replaced <ncbidiag> by <ncbistd>
  1066.  *
  1067.  * ==========================================================================
  1068.  */