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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbistr.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:10:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.28
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbistr.cpp,v 1000.2 2004/06/01 19:10:19 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 string-related 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. // Utilities
  51. //
  52. static void TestStrings_StrCompare(int expr_res, int valid_res)
  53. {
  54.     int res = expr_res > 0 ? 1 :
  55.         expr_res == 0 ? 0 : -1;
  56.     assert(res == valid_res);
  57. }
  58. typedef struct {
  59.     const char* s1;
  60.     const char* s2;
  61.     int case_res;      /* -1, 0, 1 */
  62.     int nocase_res;    /* -1, 0, 1 */
  63.     SIZE_TYPE n; 
  64.     int n_case_res;    /* -1, 0, 1 */
  65.     int n_nocase_res;  /* -1, 0, 1 */
  66. } SStrCompare;
  67. static const SStrCompare s_StrCompare[] = {
  68.     { "", "",  0, 0,  0,     0, 0 },
  69.     { "", "",  0, 0,  NPOS,  0, 0 },
  70.     { "", "",  0, 0,  10,    0, 0 },
  71.     { "", "",  0, 0,  1,     0, 0 },
  72.     { "a", "",  1, 1,  0,     0, 0 },
  73.     { "a", "",  1, 1,  1,     1, 1 },
  74.     { "a", "",  1, 1,  2,     1, 1 },
  75.     { "a", "",  1, 1,  NPOS,  1, 1 },
  76.     { "", "bb",  -1, -1,  0,     -1, -1 },
  77.     { "", "bb",  -1, -1,  1,     -1, -1 },
  78.     { "", "bb",  -1, -1,  2,     -1, -1 },
  79.     { "", "bb",  -1, -1,  3,     -1, -1 },
  80.     { "", "bb",  -1, -1,  NPOS,  -1, -1 },
  81.     { "ba", "bb",  -1, -1,  0,     -1, -1 },
  82.     { "ba", "bb",  -1, -1,  1,     -1, -1 },
  83.     { "ba", "b",    1,  1,  1,      0,  0 },
  84.     { "ba", "bb",  -1, -1,  2,     -1, -1 },
  85.     { "ba", "bb",  -1, -1,  3,     -1, -1 },
  86.     { "ba", "bb",  -1, -1,  NPOS,  -1, -1 },
  87.     { "a", "A",  1, 0,  0,    -1, -1 },
  88.     { "a", "A",  1, 0,  1,     1,  0 },
  89.     { "a", "A",  1, 0,  2,     1,  0 },
  90.     { "a", "A",  1, 0,  NPOS,  1,  0 },
  91.     { "A", "a",  -1, 0,  0,     -1, -1 },
  92.     { "A", "a",  -1, 0,  1,     -1,  0 },
  93.     { "A", "a",  -1, 0,  2,     -1,  0 },
  94.     { "A", "a",  -1, 0,  NPOS,  -1,  0 },
  95.     { "ba", "ba1",  -1, -1,  0,     -1, -1 },
  96.     { "ba", "ba1",  -1, -1,  1,     -1, -1 },
  97.     { "ba", "ba1",  -1, -1,  2,     -1, -1 },
  98.     { "bA", "ba",   -1,  0,  2,     -1,  0 },
  99.     { "ba", "ba1",  -1, -1,  3,     -1, -1 },
  100.     { "ba", "ba1",  -1, -1,  NPOS,  -1, -1 },
  101.     { "ba1", "ba",  1, 1,  0,    -1, -1 },
  102.     { "ba1", "ba",  1, 1,  1,    -1, -1 },
  103.     { "ba1", "ba",  1, 1,  2,     0,  0 },
  104.     { "ba",  "bA",  1, 0,  2,     1,  0 },
  105.     { "ba1", "ba",  1, 1,  3,     1,  1 },
  106.     { "ba1", "ba",  1, 1,  NPOS,  1,  1 },
  107.     { "ba1", "ba",  1, 1,  NPOS,  1,  1 }
  108. };
  109. typedef struct {
  110.     const char* pchar;    // String input
  111.     int         base;     // Radix base 
  112.     Uint8       expected; // Expected value
  113. } SRadixTest;
  114. /////////////////////////////////
  115. // Test application
  116. //
  117. class CTestApplication : public CNcbiApplication
  118. {
  119. public:
  120.     void Init(void);
  121.     int Run(void);
  122. };
  123. void CTestApplication::Init(void)
  124. {
  125.     // Set err.-posting and tracing to maximum
  126.     SetDiagTrace(eDT_Enable);
  127.     SetDiagPostFlag(eDPF_All);
  128.     SetDiagPostLevel(eDiag_Info);
  129. }
  130. //#define TEST_MEMORY_USAGE
  131. #ifdef TEST_MEMORY_USAGE
  132. enum ContainerType {
  133.     eVector,
  134.     eList,
  135.     eSet,
  136.     eRef
  137. };
  138. void DumpSize(void)
  139. {
  140.     char buffer[1024];
  141.     NcbiCout << "Press enter..." << flush;
  142.     gets(buffer);
  143. }
  144. void TestAllocate(ContainerType cont, int size, int count)
  145. {
  146.     switch ( cont ) {
  147.     case eVector:
  148.     {{
  149.         NcbiCout << "Allocating " << size <<
  150.             " vectors<int> with " << count << " elements" << NcbiEndl;
  151.         DumpSize();
  152.         vector<int>* v = new vector<int>[size];
  153.         for ( int i = 0; i < size; ++i ) {
  154.             for ( int j = 0; j < count; ++j ) {
  155.                 v[i].push_back(j);
  156.             }
  157.         }
  158.         NcbiCout << "Allocated." << NcbiEndl;
  159.         DumpSize();
  160.         delete[] v;
  161.         break;
  162.     }}
  163.     case eList:
  164.     {{
  165.         NcbiCout << "Allocating " << size <<
  166.             " list<int> with " << count << " elements" << NcbiEndl;
  167.         DumpSize();
  168.         list<int>* v = new list<int>[size];
  169.         for ( int i = 0; i < size; ++i ) {
  170.             for ( int j = 0; j < count; ++j ) {
  171.                 v[i].push_back(j);
  172.             }
  173.         }
  174.         NcbiCout << "Allocated." << NcbiEndl;
  175.         DumpSize();
  176.         delete[] v;
  177.         break;
  178.     }}
  179.     case eRef:
  180.     {{
  181.         NcbiCout << "Allocating " << size <<
  182.             " CRef<CObject> with " << count << " elements" << NcbiEndl;
  183.         DumpSize();
  184.         CRef<CObject>* v = new CRef<CObject>[size];
  185.         for ( int i = 0; i < size; ++i ) {
  186.             for ( int j = 0; j < count; ++j ) {
  187.                 v[i].Reset(new CObject);
  188.             }
  189.         }
  190.         NcbiCout << "Allocated." << NcbiEndl;
  191.         DumpSize();
  192.         delete[] v;
  193.         break;
  194.     }}
  195.     }
  196. }
  197. void Test(ContainerType cont)
  198. {
  199.     for ( int j = 0; j <= 2; ++j ) {
  200.         TestAllocate(cont, 100000, j);
  201.     }
  202.     for ( int j = 0; j <= 2; ++j ) {
  203.         TestAllocate(cont, 1000000, j);
  204.     }
  205. }
  206. #endif
  207. int CTestApplication::Run(void)
  208. {
  209. #ifdef TEST_MEMORY_USAGE
  210.     Test(eRef);
  211. #endif
  212.     static const string s_Strings[] = {
  213.         "",
  214.         ".",
  215.         "..",
  216.         ".0",
  217.         ".0.",
  218.         "..0",
  219.         ".01",
  220.         "1.",
  221.         "1.1",
  222.         "1.1.",
  223.         "1..",
  224.         "-2147483649",
  225.         "-2147483648",
  226.         "-1",
  227.         "0",
  228.         "2147483647",
  229.         "2147483648",
  230.         "4294967295",
  231.         "4294967296",
  232.         " 123 ",
  233.         "-324",
  234.         " 567",
  235.         "+890",
  236.         "zzz"
  237.     };
  238.     NcbiCout << "Test NCBISTR:" << NcbiEndl;
  239.     const size_t count = sizeof(s_Strings) / sizeof(s_Strings[0]);
  240.     //        CExceptionReporterStream reporter(cerr);
  241.     //        CExceptionReporter::SetDefault(&reporter);
  242.     //        CExceptionReporter::EnableDefault(false);
  243.     //        CExceptionReporter::EnableDefault(true);
  244.     //        CExceptionReporter::SetDefault(0);
  245.     
  246.     SetupDiag(eDS_ToStdout);
  247.     /*
  248.       
  249.     CExceptionReporter::EnableDefault(true);
  250.     cerr << endl;
  251.     NCBI_REPORT_EXCEPTION(
  252.     "****** default reporter (stream) ******",e);
  253.     CExceptionReporter::SetDefault(0);
  254.     cerr << endl;
  255.     NCBI_REPORT_EXCEPTION(
  256.     "****** default reporter (diag) ******",e);
  257.     */
  258.     
  259.     for (size_t i = 0;  i < count;  ++i) {
  260.         const string& str = s_Strings[i];
  261.         NcbiCout << "n*** Checking string '" << str << "'***" << NcbiEndl;
  262.         {{
  263.             int value = NStr::StringToNumeric(str);
  264.             NcbiCout << "numeric value: " << value << ", toString: '"
  265.                      << NStr::IntToString(value) << "'" << NcbiEndl;
  266.         }}
  267.         try {
  268.             int value = NStr::StringToInt(str);
  269.             NcbiCout << "int value: " << value << ", toString: '"
  270.                      << NStr::IntToString(value) << "'" << NcbiEndl;
  271.         }
  272.         catch (CException& e) {
  273.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  274.         }
  275.         try {
  276.             unsigned int value = NStr::StringToUInt(str);
  277.             NcbiCout << "unsigned int value: " << value << ", toString: '"
  278.                      << NStr::UIntToString(value) << "'" << NcbiEndl;
  279.         }
  280.         catch (CException& e) {
  281.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  282.         }
  283.         try {
  284.             long value = NStr::StringToLong(str);
  285.             NcbiCout << "long value: " << value << ", toString: '"
  286.                      << NStr::IntToString(value) << "'" << NcbiEndl;
  287.             NcbiCout << "      Int8ToString: '"
  288.                      << NStr::Int8ToString(value) << "'" << NcbiEndl;
  289.         }
  290.         catch (CException& e) {
  291.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  292.         }
  293.         try {
  294.             unsigned long value = NStr::StringToULong(str);
  295.             NcbiCout << "unsigned long value: " << value << ", toString: '"
  296.                      << NStr::UIntToString(value) << "'" << NcbiEndl;
  297.             NcbiCout << "      UInt8ToString: '"
  298.                      << NStr::UInt8ToString(value) << "'" << NcbiEndl;
  299.         }
  300.         catch (CException& e) {
  301.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  302.         }
  303.         try {
  304.             double value = NStr::StringToDouble(str);
  305.             NcbiCout << "double value: " << value << ", toString: '"
  306.                      << NStr::DoubleToString(value) << "'" << NcbiEndl;
  307.         }
  308.         catch (CException& e) {
  309.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  310.         }
  311.         
  312.         try {
  313.             Int8 value = NStr::StringToInt8(str);
  314.             NcbiCout << "Int8 value: " << (int)value << ", toString: '"
  315.                      << NStr::Int8ToString(value) << "'" << NcbiEndl;
  316.         }
  317.         catch (CException& e) {
  318.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  319.         }
  320.         try {
  321.             Uint8 value = NStr::StringToUInt8(str);
  322.             NcbiCout << "Uint8 value: " << (unsigned)value << ", toString: '"
  323.                      << NStr::UInt8ToString(value) << "'" << NcbiEndl;
  324.         }
  325.         catch (CException& e) {
  326.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  327.         }
  328.         
  329.     }
  330.     // Writing separate tests for StringToUInt8 because we
  331.     // need to test for different radix values such as 2, 8, and 16
  332.     // and s_Strings presents string samples with radix of 10 only.
  333.     //
  334.     static const SRadixTest s_RadixTests[] = {
  335.         {"A", 16, 10},
  336.         {"B9", 16, 185},
  337.         {"C5D", 16, 3165},
  338.         {"FFFF", 16, 65535},
  339.         {"17ABCDEF", 16, 397135343},
  340.         {"BADBADBA", 16, 3134959034U},
  341.         {"7", 8, 7},
  342.         {"17", 8, 15},
  343.         {"177", 8, 127},
  344.         {"0123", 8, 83},
  345.         {"01234567", 8, 342391},
  346.         {"0", 2, 0},
  347.         {"1", 2, 1},
  348.         {"10", 2, 2},
  349.         {"11", 2, 3},
  350.         {"100", 2, 4},
  351.         {"101", 2, 5}, 
  352.         {"110", 2, 6},
  353.         {"111", 2, 7},
  354.         // Invalid values come next
  355.         {"10ABCDEFGH", 16, 0},
  356.         {"12345A", 10, 0},
  357.         {"012345678", 8, 0},
  358.         {"012", 2, 0}
  359.     };
  360.     for (size_t i = 0;  
  361.          i < sizeof(s_RadixTests)/sizeof(s_RadixTests[0]);
  362.          ++i) {
  363.         const string& str = s_RadixTests[i].pchar;
  364.         int base = s_RadixTests[i].base;
  365.         Uint8 expected = s_RadixTests[i].expected;
  366.         NcbiCout << "Checking numeric string: '" << str 
  367.                  << "': with base " << base << NcbiEndl;
  368.         try {
  369.             Uint8 value = NStr::StringToUInt8(str, base);
  370.             NcbiCout << "Uint8 value: " << ((unsigned)value)
  371.                      << ", Expected: " << (unsigned)expected << NcbiEndl;
  372.         }
  373.         catch (CException& e) {
  374.             NCBI_REPORT_EXCEPTION("TestStrings",e);
  375.         }
  376.     } 
  377.     NcbiCout << NcbiEndl << "NStr::Replace() tests...";
  378.     string src("aaabbbaaccczzcccXX");
  379.     string dst;
  380.     string search("ccc");
  381.     string replace("RrR");
  382.     NStr::Replace(src, search, replace, dst);
  383.     assert(dst == "aaabbbaaRrRzzRrRXX");
  384.     search = "a";
  385.     replace = "W";
  386.     NStr::Replace(src, search, replace, dst, 6, 1);
  387.     assert(dst == "aaabbbWaccczzcccXX");
  388.     
  389.     search = "bbb";
  390.     replace = "BBB";
  391.     NStr::Replace(src, search, replace, dst, 50);
  392.     assert(dst == "aaabbbaaccczzcccXX");
  393.     search = "ggg";
  394.     replace = "no";
  395.     dst = NStr::Replace(src, search, replace);
  396.     assert(dst == "aaabbbaaccczzcccXX");
  397.     search = "a";
  398.     replace = "A";
  399.     dst = NStr::Replace(src, search, replace);
  400.     assert(dst == "AAAbbbAAccczzcccXX");
  401.     search = "X";
  402.     replace = "x";
  403.     dst = NStr::Replace(src, search, replace, src.size() - 1);
  404.     assert(dst == "aaabbbaaccczzcccXx");
  405.     NcbiCout << " completed successfully!" << NcbiEndl;
  406.     // NStr::PrintableString()
  407.     assert(NStr::PrintableString(kEmptyStr).empty());
  408.     assert(NStr::PrintableString("AB\CDnABrCDvABtCD'AB"").
  409.            compare("AB\\CD\nAB\rCD\vAB\tCD'AB\"") == 0);
  410.     assert(NStr::PrintableString("A20B" + string(1, '') + "CD").
  411.            compare("A\x10B\x00CD") == 0);
  412.     // NStr::ParseEscapes
  413.     assert(NStr::ParseEscapes(kEmptyStr).empty());
  414.     assert(NStr::ParseEscapes("AB\\CD\nAB\rCD\vAB\tCD'AB\"").
  415.            compare("AB\CDnABrCDvABtCD'AB"") == 0);
  416.     assert(NStr::ParseEscapes("A\x10B\x00CD").
  417.            compare("A20B" + string(1, '') + "CD") == 0);
  418.     // NStr::Compare()
  419.     NcbiCout << NcbiEndl << "NStr::Compare() tests...";
  420.     size_t j;
  421.     const SStrCompare* rec;
  422.     for (j = 0;  j < sizeof(s_StrCompare) / sizeof(s_StrCompare[0]);  j++) {
  423.         rec = &s_StrCompare[j];
  424.         string s1 = rec->s1;
  425.         TestStrings_StrCompare
  426.             (NStr::Compare(s1, rec->s2, NStr::eCase), rec->case_res);
  427.         TestStrings_StrCompare
  428.             (NStr::Compare(s1, rec->s2, NStr::eNocase), rec->nocase_res);
  429.         TestStrings_StrCompare
  430.             (NStr::Compare(s1, 0, rec->n, rec->s2, NStr::eCase),
  431.              rec->n_case_res);
  432.         TestStrings_StrCompare
  433.             (NStr::Compare(s1, 0, rec->n, rec->s2, NStr::eNocase),
  434.              rec->n_nocase_res);
  435.         string s2 = rec->s2;
  436.         TestStrings_StrCompare
  437.             (NStr::Compare(s1, s2, NStr::eCase), rec->case_res);
  438.         TestStrings_StrCompare
  439.             (NStr::Compare(s1, s2, NStr::eNocase), rec->nocase_res);
  440.         TestStrings_StrCompare
  441.             (NStr::Compare(s1, 0, rec->n, s2, NStr::eCase),
  442.              rec->n_case_res);
  443.         TestStrings_StrCompare
  444.             (NStr::Compare(s1, 0, rec->n, s2, NStr::eNocase),
  445.              rec->n_nocase_res);
  446.     }
  447.     assert(NStr::Compare("0123", 0, 2, "12") <  0);
  448.     assert(NStr::Compare("0123", 1, 2, "12") == 0);
  449.     assert(NStr::Compare("0123", 2, 2, "12") >  0);
  450.     assert(NStr::Compare("0123", 3, 2,  "3") == 0);
  451.     NcbiCout << " completed successfully!" << NcbiEndl;
  452.     NcbiCout << NcbiEndl << "NStr::Split() tests...";
  453.     static const string s_SplitStr[] = {
  454.         "ab+cd+ef",
  455.         "aaAAabBbbb",
  456.         "-abc-def--ghijk---",
  457.         "a12c3ba45acb678bc"
  458.         "nodelim",
  459.         "emptydelim",
  460.         ""
  461.     };
  462.     static const string s_SplitDelim[] = {
  463.         "+", "AB", "-", "abc", "*", "", "*"
  464.     };
  465.     static const string split_result[] = {
  466.         "ab", "cd", "ef",
  467.         "aa", "ab", "bbb",
  468.         "abc", "def", "ghijk",
  469.         "12", "3", "45", "678",
  470.         "nodelim",
  471.         "emptydelim"
  472.     };
  473.     list<string> split;
  474.     for (size_t i = 0; i < sizeof(s_SplitStr) / sizeof(s_SplitStr[0]); i++) {
  475.         NStr::Split(s_SplitStr[i], s_SplitDelim[i], split);
  476.     }
  477.     {{
  478.         int i = 0;
  479.         ITERATE(list<string>, it, split) {
  480.             assert(NStr::Compare(*it, split_result[i++]) == 0);
  481.         }
  482.     }}
  483.     
  484.     NcbiCout << " completed successfully!" << NcbiEndl;
  485.     
  486.     // NStr::Tokenize()
  487.     NcbiCout << NcbiEndl << "NStr::Tokenize() tests...";
  488.     static const string s_TokStr[] = {
  489.         "ab+cd+ef",
  490.         "123;45,78",
  491.         "1;",
  492.         ";1",
  493.         "emptydelim"
  494.     };
  495.     static const string s_TokDelim[] = {
  496.         "+", ";,", ";", ";", ""
  497.     };
  498.     static const string tok_result[] = {
  499.         "ab", "cd", "ef",
  500.         "123", "45", "78",
  501.         "1", "", 
  502.         "", "1",
  503.         "emptydelim"
  504.     };
  505.     vector<string> tok;
  506.     for (size_t i = 0; i < sizeof(s_TokStr) / sizeof(s_TokStr[0]); ++i) {
  507.         NStr::Tokenize(s_TokStr[i], s_TokDelim[i], tok);               
  508.     }
  509.     {{
  510.         int i = 0;
  511.         ITERATE(vector<string>, it, tok) {
  512.             assert(NStr::Compare(*it, tok_result[i++]) == 0);
  513.         }
  514.     }}
  515.     
  516.     NcbiCout << " completed successfully!" << NcbiEndl;
  517.     // NStr::SplitInTwo()
  518.     NcbiCout << NcbiEndl << "NStr::SplitInTwo() tests...";
  519.     static const struct {
  520.         const char* str;
  521.         const char* delim;
  522.         const char* expected_str1;
  523.         const char* expected_str2;
  524.         bool    expected_ret;
  525.     }  s_SplitInTwoTest[] = {
  526.         { "ab+cd+ef", "+", "ab", "cd+ef", true },
  527.         { "aaAAabBbbb", "AB", "aa", "AabBbbb", true },
  528.         { "aaCAabBCbbb", "ABC", "aa", "AabBCbbb", true },
  529.         { "-beg-delim-", "-", "", "beg-delim-", true },
  530.         { "end-delim:", ":", "end-delim", "", true },
  531.         { "nodelim", ".,:;-+", "nodelim", "", false },
  532.         { "emptydelim", "", "emptydelim", "", false },
  533.         { "", "emtpystring", "", "", false },
  534.         { "", "", "", "", false }
  535.     };
  536.     {{
  537.         string  string1, string2;
  538.         bool    result;
  539.         for ( size_t i = 0; 
  540.               i < sizeof(s_SplitInTwoTest) / sizeof(s_SplitInTwoTest[0]);
  541.               i++) {
  542.             result = NStr::SplitInTwo(s_SplitInTwoTest[i].str,
  543.                                       s_SplitInTwoTest[i].delim,
  544.                                       string1, string2);
  545.             assert(s_SplitInTwoTest[i].expected_ret == result);
  546.             assert(s_SplitInTwoTest[i].expected_str1 == string1);
  547.             assert(s_SplitInTwoTest[i].expected_str2 == string2);
  548.         }
  549.     }}
  550.     
  551.     NcbiCout << " completed successfully!" << NcbiEndl;
  552.     NcbiCout << NcbiEndl << "NStr::ToLower/ToUpper() tests...";
  553.     static const struct {
  554.         const char* orig;
  555.         const char* x_lower;
  556.         const char* x_upper;
  557.     } s_Tri[] = {
  558.         { "", "", "" },
  559.         { "a", "a", "A" },
  560.         { "4", "4", "4" },
  561.         { "B5a", "b5a", "B5A" },
  562.         { "baObaB", "baobab", "BAOBAB" },
  563.         { "B", "b", "B" },
  564.         { "B", "b", "B" }
  565.     };
  566.     static const char s_Indiff[] =
  567.         "#@+_)(*&^%/?"':;~`'\!v|=-0123456789.,><{}[]tnr";
  568.     {{
  569.         char indiff[sizeof(s_Indiff) + 1];
  570.         ::strcpy(indiff, s_Indiff);
  571.         assert(NStr::Compare(s_Indiff, indiff) == 0);
  572.         assert(NStr::Compare(s_Indiff, NStr::ToLower(indiff)) == 0);
  573.         ::strcpy(indiff, s_Indiff);
  574.         assert(NStr::Compare(s_Indiff, NStr::ToUpper(indiff)) == 0);
  575.         assert(NStr::Compare(s_Indiff, NStr::ToLower(indiff)) == 0);
  576.     }}
  577.     {{
  578.         string indiff;
  579.         indiff = s_Indiff;
  580.         assert(NStr::Compare(s_Indiff, indiff) == 0);
  581.         assert(NStr::Compare(s_Indiff, NStr::ToLower(indiff)) == 0);
  582.         indiff = s_Indiff;
  583.         assert(NStr::Compare(s_Indiff, NStr::ToUpper(indiff)) == 0);
  584.         assert(NStr::Compare(s_Indiff, NStr::ToLower(indiff)) == 0);
  585.     }}
  586.     for (j = 0;  j < sizeof(s_Tri) / sizeof(s_Tri[0]);  j++) {
  587.         assert(NStr::Compare(s_Tri[j].orig, s_Tri[j].x_lower, NStr::eNocase)
  588.                == 0);
  589.         assert(NStr::Compare(s_Tri[j].orig, s_Tri[j].x_upper, NStr::eNocase)
  590.                == 0);
  591.         string orig = s_Tri[j].orig;
  592.         assert(NStr::Compare(orig, s_Tri[j].x_lower, NStr::eNocase)
  593.                == 0);
  594.         assert(NStr::Compare(orig, s_Tri[j].x_upper, NStr::eNocase)
  595.                == 0);
  596.         string x_lower = s_Tri[j].x_lower;
  597.         {{
  598.             char x_str[16];
  599.             ::strcpy(x_str, s_Tri[j].orig);
  600.             assert(::strlen(x_str) < sizeof(x_str));
  601.             assert(NStr::Compare(NStr::ToLower(x_str), x_lower) == 0);
  602.             ::strcpy(x_str, s_Tri[j].orig);
  603.             assert(NStr::Compare(NStr::ToUpper(x_str), s_Tri[j].x_upper) ==0);
  604.             assert(NStr::Compare(x_lower, NStr::ToLower(x_str)) == 0);
  605.         }}
  606.         {{
  607.             string x_str;
  608.             x_lower = s_Tri[j].x_lower;
  609.             x_str = s_Tri[j].orig;
  610.             assert(NStr::Compare(NStr::ToLower(x_str), x_lower) == 0);
  611.             x_str = s_Tri[j].orig;
  612.             assert(NStr::Compare(NStr::ToUpper(x_str), s_Tri[j].x_upper) ==0);
  613.             assert(NStr::Compare(x_lower, NStr::ToLower(x_str)) == 0);
  614.         }}
  615.     }
  616.     NcbiCout << " completed successfully!" << NcbiEndl;
  617.     NcbiCout << NcbiEndl << "AStrEquiv tests...";
  618.     string as1("abcdefg ");
  619.     string as2("abcdefg ");
  620.     string as3("aBcdEfg ");
  621.     string as4("lsekfu");
  622.     assert( AStrEquiv(as1, as2, PNocase()) == true );
  623.     assert( AStrEquiv(as1, as3, PNocase()) == true );
  624.     assert( AStrEquiv(as3, as4, PNocase()) == false );
  625.     assert( AStrEquiv(as1, as2, PCase())   == true );
  626.     assert( AStrEquiv(as1, as3, PCase())   == false );
  627.     assert( AStrEquiv(as2, as4, PCase())   == false );
  628.     NcbiCout << " completed successfully!" << NcbiEndl;
  629.     NcbiCout << NcbiEndl << "Equal{Case,Nocase} tests...";
  630.     assert( NStr::EqualNocase(as1, as2) == true );
  631.     assert( NStr::EqualNocase(as1, as3) == true );
  632.     assert( NStr::EqualNocase(as3, as4) == false );
  633.     assert( NStr::EqualCase(as1, as2)   == true );
  634.     assert( NStr::EqualCase(as1, as3)   == false );
  635.     assert( NStr::EqualCase(as2, as4)   == false );
  636.     NcbiCout << " completed successfully!" << NcbiEndl;
  637.     {{
  638.         NcbiCout << NcbiEndl 
  639.                  << "Testing string reference counting properties:"
  640.                  << NcbiEndl;
  641.         string s1(10, '1');
  642.         string s2(s1);
  643.         if ( s1.data() != s2.data() ) {
  644.             NcbiCout << "BAD: string reference counting is OFF" << NcbiEndl;
  645.         }
  646.         else {
  647.             NcbiCout << "GOOD: string reference counting is ON" << NcbiEndl;
  648.             for ( int i = 0; i < 4; ++i ) {
  649.                 NcbiCout << "Restoring reference counting"<<NcbiEndl;
  650.                 s2 = s1;
  651.                 if ( s1.data() != s2.data() ) {
  652.                     NcbiCout << "BAD: cannot restore string reference " 
  653.                         "counting" << NcbiEndl;
  654.                     continue;
  655.                 }
  656.                 NcbiCout << "GOOD: reference counting is ON" << NcbiEndl;
  657.                 const char* type = i&1? "str.begin()": "str.c_str()";
  658.                 NcbiCout << "Calling "<<type<<NcbiEndl;
  659.                 if ( i&1 ) {
  660.                     s2.begin();
  661.                 }
  662.                 else {
  663.                     s1.c_str();
  664.                 }
  665.                 if ( s1.data() == s2.data() ) {
  666.                     NcbiCout << "GOOD: "<< type 
  667.                              <<" doesn't affect reference counting"<< NcbiEndl;
  668.                     continue;
  669.                 }
  670.                 NcbiCout << "OK: "<< type 
  671.                          << " turns reference counting OFF" << NcbiEndl;
  672.                 NcbiCout << "Restoring reference counting"<<NcbiEndl;
  673.                 s2 = s1;
  674.                 if ( s1.data() != s2.data() ) {
  675.                     NcbiCout << "BAD: " << type 
  676.                              <<" turns reference counting OFF completely"
  677.                              << NcbiEndl;
  678.                     continue;
  679.                 }
  680.                 NcbiCout << "GOOD: reference counting is ON" << NcbiEndl;
  681.                 if ( i&1 ) continue;
  682.                 NcbiCout << "Calling " << type << " on source" << NcbiEndl;
  683.                 s1.c_str();
  684.                 if ( s1.data() != s2.data() ) {
  685.                     NcbiCout << "BAD: "<< type
  686.                              << " on source turns reference counting OFF"
  687.                              << NcbiEndl;
  688.                 }
  689.                 NcbiCout << "Calling "<< type <<" on destination" << NcbiEndl;
  690.                 s2.c_str();
  691.                 if ( s1.data() != s2.data() ) {
  692.                     NcbiCout << "BAD: " << type
  693.                              <<" on destination turns reference counting OFF"
  694.                              << NcbiEndl;
  695.                 }
  696.             }
  697.         }
  698.     }}
  699.     NcbiCout << NcbiEndl << "NStr::FindNoCase() tests...";
  700.     assert(NStr::FindNoCase(" abcd", " xyz") == NPOS);
  701.     assert(NStr::FindNoCase(" abcd", " xyz", 0, NPOS, NStr::eLast) == NPOS);
  702.     assert(NStr::FindNoCase(" abcd", " aBc", 0, NPOS, NStr::eLast) == 0);
  703.     NcbiCout << " completed successfully!" << NcbiEndl;
  704.     NcbiCout << NcbiEndl << "TEST_NCBISTR execution completed successfully!"
  705.              << NcbiEndl << NcbiEndl << NcbiEndl;
  706.     return 0;
  707. }
  708.   
  709. /////////////////////////////////
  710. // APPLICATION OBJECT and MAIN
  711. //
  712. int main(int argc, const char* argv[] /*, const char* envp[]*/)
  713. {
  714.     CTestApplication theTestApplication;
  715.     return theTestApplication.AppMain(argc, argv, 0 /*envp*/, eDS_ToMemory);
  716. }
  717. /*
  718.  * ==========================================================================
  719.  * $Log: test_ncbistr.cpp,v $
  720.  * Revision 1000.2  2004/06/01 19:10:19  gouriano
  721.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.28
  722.  *
  723.  * Revision 6.28  2004/05/26 20:46:54  ucko
  724.  * Add tests for Equal{Case,Nocase}.
  725.  *
  726.  * Revision 6.27  2004/05/26 19:26:29  ucko
  727.  * Add a(n incomplete) set of tests for FindNoCase.
  728.  *
  729.  * Revision 6.26  2004/05/14 13:59:51  gorelenk
  730.  * Added include of ncbi_pch.hpp
  731.  *
  732.  * Revision 6.25  2003/12/02 15:23:25  ucko
  733.  * Add tests for NStr::ParseEscapes (inverted from tests for PrintableString)
  734.  *
  735.  * Revision 6.24  2003/10/01 20:43:30  ivanov
  736.  * Get rid of compilation warnings; some formal code rearrangement
  737.  *
  738.  * Revision 6.23  2003/08/19 15:17:20  rsmith
  739.  * Add NStr::SplitInTwo() function.
  740.  *
  741.  * Revision 6.22  2003/07/23 17:49:55  vasilche
  742.  * Commented out memory usage test.
  743.  *
  744.  * Revision 6.21  2003/07/22 21:45:05  vasilche
  745.  * Commented out memory usage test.
  746.  *
  747.  * Revision 6.20  2003/07/17 20:01:38  vasilche
  748.  * Added test for string reference counting.
  749.  *
  750.  * Revision 6.19  2003/07/09 20:52:20  vasilche
  751.  * Added test for string's reference counting.
  752.  *
  753.  * Revision 6.18  2003/03/25 22:16:11  lavr
  754.  * Conform to new NUL char representation from NStr::PrintableString()
  755.  *
  756.  * Revision 6.17  2003/03/10 18:57:08  kuznets
  757.  * iterate->ITERATE
  758.  *
  759.  * Revision 6.16  2003/02/27 15:34:23  lavr
  760.  * Add tests for stray dots in numbers
  761.  *
  762.  * Revision 6.15  2003/02/26 20:35:13  siyan
  763.  * Added/deleted whitespaces to conform to existing code style.
  764.  *
  765.  * Revision 6.14  2003/02/26 16:47:36  siyan
  766.  * Added test cases to test new version of NStr::StringToUInt8.
  767.  *
  768.  * Revision 6.13  2003/01/21 23:55:44  vakatov
  769.  * Get rid of a warning
  770.  *
  771.  * Revision 6.12  2003/01/14 21:17:58  kuznets
  772.  * + test for NStr::Tokenize
  773.  *
  774.  * Revision 6.11  2003/01/13 14:48:08  kuznets
  775.  * minor fix
  776.  *
  777.  * Revision 6.10  2003/01/10 22:17:39  kuznets
  778.  * Implemented test for NStr::String2Int8
  779.  *
  780.  * Revision 6.9  2003/01/10 00:08:28  vakatov
  781.  * + Int8ToString(),  UInt8ToString()
  782.  *
  783.  * Revision 6.8  2002/10/17 16:56:02  ivanov
  784.  * Added tests for 'b' and 'B' time format symbols
  785.  *
  786.  * Revision 6.7  2002/09/04 19:32:11  vakatov
  787.  * Minor change to reflect the changed handling of '"' by NStr::PrintableString
  788.  *
  789.  * Revision 6.6  2002/07/15 18:17:26  gouriano
  790.  * renamed CNcbiException and its descendents
  791.  *
  792.  * Revision 6.5  2002/07/11 14:18:29  gouriano
  793.  * exceptions replaced by CNcbiException-type ones
  794.  *
  795.  * Revision 6.4  2002/04/16 18:49:08  ivanov
  796.  * Centralize threatment of assert() in tests.
  797.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  798.  *
  799.  * Revision 6.3  2001/08/30 00:39:58  vakatov
  800.  * + NStr::StringToNumeric()
  801.  *
  802.  * Revision 6.2  2001/05/17 15:05:09  lavr
  803.  * Typos corrected
  804.  *
  805.  * Revision 6.1  2001/03/26 20:34:38  vakatov
  806.  * Initial revision (moved from "coretest.cpp")
  807.  *
  808.  * ==========================================================================
  809.  */