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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbifile.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 19:10:13  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.38
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbifile.cpp,v 1000.5 2004/06/01 19:10:13 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 program for file's accessory functions
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbiargs.hpp>
  42. #include <corelib/ncbifile.hpp>
  43. #include <corelib/ncbitime.hpp>
  44. #include <stdio.h>
  45. #include <test/test_assert.h>  /* This header must go last */
  46. USING_NCBI_SCOPE;
  47. /////////////////////////////////
  48. // File name spliting tests
  49. //
  50. static void s_TEST_SplitPath(void)
  51. {
  52.     string path, dir, title, ext;
  53.     
  54. #if defined(NCBI_OS_MSWIN)
  55.     CFile::SplitPath("c:\windows\command\win.ini", &dir, &title, &ext);
  56.     assert( dir   == "c:\windows\command\" );
  57.     assert( title == "win" );
  58.     assert( ext   == ".ini" );
  59.     path = CFile::MakePath("c:\windows\", "win.ini");
  60.     assert( path == "c:\windows\win.ini" );
  61.     CFile::SplitPath("c:win.ini", &dir, &title, &ext);
  62.     assert( dir   == "c:" );
  63.     assert( title == "win" );
  64.     assert( ext   == ".ini" );
  65.     path = CFile::MakePath("c:", "win", "ini");
  66.     assert( path == "c:win.ini" );
  67.     CFile f("c:\dir\subdir\file.ext");
  68.     assert( f.GetDir()  == "c:\dir\subdir\" );
  69.     assert( f.GetName() == "file.ext" );
  70.     assert( f.GetBase() == "file" );
  71.     assert( f.GetExt()  == ".ext" );
  72.     assert( CFile::AddTrailingPathSeparator("dir")   == "dir\");
  73.     assert( CFile::AddTrailingPathSeparator("dir\") == "dir\");
  74.     assert( CFile::DeleteTrailingPathSeparator("dir\path\/")=="dir\path");
  75. #elif defined(NCBI_OS_UNIX)
  76.     CFile::SplitPath("/usr/lib/any.other.lib", &dir, &title, &ext);
  77.     assert( dir   == "/usr/lib/" );
  78.     assert( title == "any.other" );
  79.     assert( ext   == ".lib" );
  80.     
  81.     path = CFile::MakePath("/dir/subdir", "file", "ext");
  82.     assert( path == "/dir/subdir/file.ext" );
  83.     CFile f("/usr/lib/any.other.lib");
  84.     assert( f.GetDir()  == "/usr/lib/" );
  85.     assert( f.GetName() == "any.other.lib" );
  86.     assert( f.GetBase() == "any.other" );
  87.     assert( f.GetExt()  == ".lib" );
  88.     assert( CFile::AddTrailingPathSeparator("dir")  == "dir/");
  89.     assert( CFile::AddTrailingPathSeparator("dir/") == "dir/");
  90.     assert( CFile::DeleteTrailingPathSeparator("dir/path////")=="dir/path");
  91. #elif defined(NCBI_OS_MAC)
  92. CFile::SplitPath("Hard Disk:Folder:1984.mov", &dir, &title, &ext);
  93.     assert( dir  == "Hard Disk:Folder:" );
  94.     assert( title == "1984" );
  95.     assert( ext  == ".mov" );
  96.     
  97.     path = CFile::MakePath("Hard Disk:Folder:",  "file", "ext");
  98.     assert( path == "Hard Disk:Folder:file.ext" );
  99.     path = CFile::MakePath("Hard Disk:Folder",   "file", "ext");
  100.     assert( path == "Hard Disk:Folder:file.ext" );
  101.     assert( CFile::AddTrailingPathSeparator("dir")  == "dir:");
  102.     assert( CFile::AddTrailingPathSeparator("dir:") == "dir:");
  103.     assert( CFile::DeleteTrailingPathSeparator("dir:path:::") == "dir:path");
  104. #endif
  105.     CFile::SplitPath("name", &dir, &title, &ext);
  106.     assert( dir.empty() );
  107.     assert( title == "name" );
  108.     assert( ext.empty() );
  109.     path = CFile::MakePath(dir, title, ext);
  110.     assert( path == "name" );
  111.     CFile::SplitPath(kEmptyStr, &dir, &title, &ext);
  112.     assert( dir.empty() );
  113.     assert( title.empty() );
  114.     assert( ext.empty() );
  115.     path = CFile::MakePath(dir, title, ext);
  116.     assert( path.empty() );
  117. }
  118. /////////////////////////////////
  119. //  Path checking tests
  120. //
  121. static void s_TEST_CheckPath(void)
  122. {
  123.      CDirEntry d;
  124.     // IsAbsolutePath() test
  125. #if defined(NCBI_OS_MSWIN)
  126.     assert( d.IsAbsolutePath("c:\") );
  127.     assert( d.IsAbsolutePath("c:\file") );
  128.     assert( d.IsAbsolutePath("c:file") );
  129.     assert( d.IsAbsolutePath("\\machine\dir") );
  130.     assert( d.IsAbsolutePath("\file") );
  131.     assert(!d.IsAbsolutePath("file") );
  132.     assert(!d.IsAbsolutePath(".\file") );
  133.     assert(!d.IsAbsolutePath("..\file") );
  134.     assert(!d.IsAbsolutePath("dir\file") );
  135. #elif defined(NCBI_OS_UNIX)
  136.     assert( d.IsAbsolutePath("/") );
  137.     assert( d.IsAbsolutePath("/file") );
  138.     assert( d.IsAbsolutePath("/dir/dir") );
  139.     assert(!d.IsAbsolutePath("file") );
  140.     assert(!d.IsAbsolutePath("./file") );
  141.     assert(!d.IsAbsolutePath("../file") );
  142.     assert(!d.IsAbsolutePath("dir/file") );
  143. #elif defined(NCBI_OS_MAC)
  144.     assert( d.IsAbsolutePath("HD:") );
  145.     assert( d.IsAbsolutePath("HD:file") );
  146.     assert(!d.IsAbsolutePath("file") );
  147.     assert(!d.IsAbsolutePath(":file") );
  148.     assert(!d.IsAbsolutePath(":file:file") );
  149. #endif
  150.     // Convert path to OS dependent test
  151.     assert( d.ConvertToOSPath("")               == "" );
  152.     assert( d.ConvertToOSPath("c:\file")       == "c:\file" );
  153.     assert( d.ConvertToOSPath("/dir/file")      == "/dir/file" );
  154.     assert( d.ConvertToOSPath("dir:file")       == "dir:file" );
  155. #if defined(NCBI_OS_MSWIN)
  156.     assert( d.ConvertToOSPath("dir")            == "dir" );
  157.     assert( d.ConvertToOSPath("dir\file")      == "dir\file" );
  158.     assert( d.ConvertToOSPath("dir/file")       == "dir\file" );
  159.     assert( d.ConvertToOSPath(":dir:file")      == "dir\file" );
  160.     assert( d.ConvertToOSPath(":dir::file")     == "file" );
  161.     assert( d.ConvertToOSPath(":dir:::file")    == "..\file" );
  162.     assert( d.ConvertToOSPath("./dir/file")     == "dir\file" );
  163.     assert( d.ConvertToOSPath("../file")        == "..\file" );
  164.     assert( d.ConvertToOSPath("../../file")     == "..\..\file" );
  165. #elif defined(NCBI_OS_UNIX)
  166.     assert( d.ConvertToOSPath("dir")            == "dir" );
  167.     assert( d.ConvertToOSPath("dir\file")      == "dir/file" );
  168.     assert( d.ConvertToOSPath("dir/file")       == "dir/file" );
  169.     assert( d.ConvertToOSPath(":dir:file")      == "dir/file" );
  170.     assert( d.ConvertToOSPath(":dir::file")     == "file" );
  171.     assert( d.ConvertToOSPath(":dir:::file")    == "../file" );
  172.     assert( d.ConvertToOSPath(".\dir\file")   == "dir/file" );
  173.     assert( d.ConvertToOSPath("..\file")       == "../file" );
  174.     assert( d.ConvertToOSPath("..\..\file")   == "../../file" );
  175. #elif defined(NCBI_OS_MAC)
  176.     assert( d.ConvertToOSPath("dir")            == ":dir" );
  177.     assert( d.ConvertToOSPath("dir\file")      == ":dir:file" );
  178.     assert( d.ConvertToOSPath("dir/file")       == ":dir:file" );
  179.     assert( d.ConvertToOSPath(":dir:file")      == ":dir:file" );
  180.     assert( d.ConvertToOSPath("./dir/file")     == ":dir:file" );
  181.     assert( d.ConvertToOSPath("../file")        == "::file" );
  182.     assert( d.ConvertToOSPath("../../file")     == ":::file" );
  183.     assert( d.ConvertToOSPath("../.././../file")== "::::file" );
  184. #endif
  185.     // ConcatPath() test
  186. #if defined(NCBI_OS_MSWIN)
  187.     assert( d.ConcatPath("c:", "file")          == "c:file" );
  188.     assert( d.ConcatPath("dir", "file")         == "dir\file" );
  189.     assert( d.ConcatPath("dir", "\file")       == "dir\file" );
  190.     assert( d.ConcatPath("dir\", "file")       == "dir\file" );
  191.     assert( d.ConcatPath("\dir\", "file")     == "\dir\file" );
  192.     assert( d.ConcatPath("", "file")            == "file" );
  193.     assert( d.ConcatPath("dir", "")             == "dir\" );
  194.     assert( d.ConcatPath("", "")                == "" );
  195. #elif defined(NCBI_OS_UNIX)
  196.     assert( d.ConcatPath("dir", "file")         == "dir/file" );
  197.     assert( d.ConcatPath("dir", "/file")        == "dir/file" );
  198.     assert( d.ConcatPath("dir/", "file")        == "dir/file" );
  199.     assert( d.ConcatPath("/dir/", "file")       == "/dir/file" );
  200.     assert( d.ConcatPath("", "file")            == "file" );
  201.     assert( d.ConcatPath("dir", "")             == "dir/" );
  202.     assert( d.ConcatPath("", "")                == "" );
  203. #elif defined(NCBI_OS_MAC)
  204.     assert( d.ConcatPath("HD", "dir")           == "HD:dir" );
  205.     assert( d.ConcatPath(":dir", "file")        == ":dir:file" );
  206.     assert( d.ConcatPath("dir:", "file")        == "dir:file" );
  207.     assert( d.ConcatPath("dir", ":file")        == "dir:file" );
  208.     assert( d.ConcatPath("dir::", "file")       == "dir::file" );
  209.     assert( d.ConcatPath("dir", "::file")       == "dir::file" );
  210.     assert( d.ConcatPath("", "file")            == ":file" );
  211.     assert( d.ConcatPath(":file", "")           == ":file:" );
  212.     assert( d.ConcatPath("", "")                == ":" );
  213. #endif
  214.     // Concat any OS paths
  215.     assert( d.ConcatPathEx("dir/", "file")      == "dir/file" );
  216.     assert( d.ConcatPathEx("/dir/", "file")     == "/dir/file" );
  217.     assert( d.ConcatPathEx("dir\", ":file")    == "dir\file" );
  218.     assert( d.ConcatPathEx("dir\dir", "file")  == "dir\dir\file" );
  219.     assert( d.ConcatPathEx("dir/", ":file")     == "dir/file" );
  220.     assert( d.ConcatPathEx("dir/dir", "file")   == "dir/dir/file" );
  221.     assert( d.ConcatPathEx("dir:dir", "file")   == "dir:dir:file" );
  222.     // Normalize path test
  223. #if defined(NCBI_OS_MSWIN)
  224.     assert( d.NormalizePath("c:\")             == "c:\" );
  225.     assert( d.NormalizePath("c:\file")         == "c:\file" );
  226.     assert( d.NormalizePath("c:file")           == "c:file" );
  227.     assert( d.NormalizePath("c:\dir\..\file")== "c:\file" );
  228.     assert( d.NormalizePath("c:..\file")       == "c:..\file" );
  229.     assert( d.NormalizePath("..\file")         == "..\file" );
  230.     assert( d.NormalizePath("\..\file")       == "\file" );
  231.     assert( d.NormalizePath(".\..\dir\..")   == ".." );
  232.     assert( d.NormalizePath(".\dir\.")        == "dir" );
  233.     assert( d.NormalizePath(".\.\.\.")       == "." );
  234.     assert( d.NormalizePath("..\..\..\..")   == "..\..\..\.." );
  235.     assert( d.NormalizePath("dir\\dir\\")   == "dir\dir" );
  236.     assert( d.NormalizePath("\\machine\dir") == "\\machine\dir");
  237.     assert( d.NormalizePath("\\?\x")         == "\x" );
  238.     assert( d.NormalizePath("\\?\UNC\m\d") == "\\m\d" );
  239.     assert( d.NormalizePath("dir/file")         == "dir\file" );
  240. #elif defined(NCBI_OS_UNIX )
  241.     assert( d.NormalizePath("/file")            == "/file" );
  242.     assert( d.NormalizePath("./file")           == "file" );
  243.     assert( d.NormalizePath("dir1/dir2/../file")== "dir1/file" );
  244.     assert( d.NormalizePath("../file")          == "../file" );
  245.     assert( d.NormalizePath("/../file")         == "/file" );
  246.     assert( d.NormalizePath("./../dir/..")      == ".." );
  247.     assert( d.NormalizePath("./dir/.")          == "dir" );
  248.     assert( d.NormalizePath("./././.")          == "." );
  249.     assert( d.NormalizePath("../../../..")      == "../../../.." );
  250.     assert( d.NormalizePath("dir//dir//")       == "dir/dir" );
  251.     assert( d.NormalizePath("///dir//")         == "/dir" );
  252.     assert( d.NormalizePath("dir\file")        == "dir\file" );
  253. #elif defined(NCBI_OS_MAC)
  254.     // NOT implemented!
  255. #endif
  256. }
  257. /////////////////////////////////
  258. // File name maching test
  259. //
  260. static void s_TEST_MatchesMask(void)
  261. {
  262.     CDirEntry d;
  263.     
  264.     assert( d.MatchesMask(""        ,""));
  265.     assert( d.MatchesMask("file"    ,"*"));
  266.     assert(!d.MatchesMask("file"    ,"*.*"));
  267.     assert( d.MatchesMask("file.cpp","*.cpp"));
  268.     assert( d.MatchesMask("file.cpp","*.c*"));
  269.     assert( d.MatchesMask("file"    ,"file*"));
  270.     assert( d.MatchesMask("file"    ,"f*"));
  271.     assert( d.MatchesMask("file"    ,"f*le"));
  272.     assert( d.MatchesMask("file"    ,"f**l*e"));
  273.     assert(!d.MatchesMask("file"    ,"???"));
  274.     assert( d.MatchesMask("file"    ,"????"));
  275.     assert(!d.MatchesMask("file"    ,"?????"));
  276.     assert( d.MatchesMask("file"    ,"?i??"));
  277.     assert(!d.MatchesMask("file"    ,"?l??"));
  278.     assert(!d.MatchesMask("file"    ,"?i?"));
  279.     assert( d.MatchesMask("file"    ,"?*?"));
  280.     assert( d.MatchesMask("file"    ,"?***?"));
  281.     assert( d.MatchesMask("file"    ,"?*"));
  282.     assert( d.MatchesMask("file"    ,"*?"));
  283.     assert( d.MatchesMask("file"    ,"********?"));
  284. }
  285. /////////////////////////////////
  286. // Work with files
  287. //
  288. static void s_TEST_File(void)
  289. {
  290.     {{
  291.         // Create test file 
  292.         FILE* file = fopen("file_1", "w+");
  293.         assert( file );
  294.         fputs("test data", file);
  295.         fclose(file);
  296.     
  297.         CFile f("file_1");
  298.         // Get file size
  299.         assert( f.GetLength() == 9);
  300.         CFile("file_2").Remove();
  301.         assert( CFile("file_2").GetLength() == -1);
  302.         // Check the file exists
  303.         assert( f.Exists() );
  304.         assert( !CFile("file_2").Exists() );
  305.         // Rename the file
  306.         assert( f.Rename("file_2") );
  307.         // Status
  308.         CDirEntry::EType file_type;
  309.         file_type = f.GetType(); 
  310.         CDirEntry::TMode user, group, other;
  311.         user = group = other = 0;
  312.         assert ( f.GetMode(&user, &group, &other) );
  313.         cout << "File type : " << file_type << endl;
  314.         cout << "File mode : "
  315.              << ((user  & CDirEntry::fRead)    ? "r" : "-")
  316.              << ((user  & CDirEntry::fWrite)   ? "w" : "-")
  317.              << ((user  & CDirEntry::fExecute) ? "x" : "-")
  318.              << ((group & CDirEntry::fRead)    ? "r" : "-")
  319.              << ((group & CDirEntry::fWrite)   ? "w" : "-")
  320.              << ((group & CDirEntry::fExecute) ? "x" : "-")
  321.              << ((other & CDirEntry::fRead)    ? "r" : "-")
  322.              << ((other & CDirEntry::fWrite)   ? "w" : "-")
  323.              << ((other & CDirEntry::fExecute) ? "x" : "-")
  324.              << endl;
  325.         // Get/set file modification time
  326.         CTime::SetFormat("M/D/Y h:m:s Z");
  327.         CTime mtime, ctime, atime;
  328.         assert( f.GetTime(&mtime, &ctime , &atime) );
  329.         cout << "File creation time     : " << ctime.AsString() << endl;
  330.         cout << "File modification time : " << mtime.AsString() << endl;
  331.         cout << "File last access time  : " << atime.AsString() << endl;
  332.         assert( f.GetTime(&mtime, 0 , &atime) );
  333.         CTime mtime_new(mtime), atime_new(atime);
  334.         mtime_new.AddDay(-2);
  335.         atime_new.AddDay(-1);
  336.         assert( f.SetTime(&mtime_new, &atime_new) );
  337.         assert( f.GetTime(&mtime, &atime) );
  338.         cout << "File modification time : " << mtime.AsString() << endl;
  339.         cout << "File last access time  : " << atime.AsString() << endl;
  340.         assert( mtime == mtime_new );
  341.         // Remove the file
  342.         assert( f.Remove() );
  343.         // Check the file exists
  344.         assert( !CFile("file_1").Exists() );
  345.         assert( !CFile("file_2").Exists() );
  346.     }}
  347.     
  348.     {{
  349.         // Create temporary file
  350.         const string kTestData = "testdata";
  351.         fstream* stream = CFile::CreateTmpFile();
  352.         assert( stream );
  353.         assert( (*stream).good() );
  354.         *stream << kTestData;
  355.         assert( (*stream).good() );
  356.         (*stream).flush();
  357.         (*stream).seekg(0);
  358.         string str;
  359.         (*stream) >> str;
  360.         assert( (*stream).eof() );
  361.         assert( str == kTestData );
  362.         delete stream;
  363.         stream = CFile::CreateTmpFile("test.tmp");
  364.         assert( stream );
  365.         assert( (*stream).good() );
  366.         *stream << kTestData;
  367.         assert( (*stream).good() );
  368.         (*stream).flush();
  369.         (*stream).seekg(0);
  370.         (*stream) >> str;
  371.         assert( (*stream).eof() );
  372.         assert( str == kTestData );
  373.         delete stream;
  374.         // Get temporary file name
  375.         string fn;
  376.         fn = CFile::GetTmpName();
  377.         assert( !fn.empty() );
  378.         assert( !CFile(fn).Exists() );
  379.         fn = CFile::GetTmpNameEx(".", "tmp_");
  380.         assert( !fn.empty() );
  381.         assert( !CFile(fn).Exists() );
  382. #  if defined(NCBI_OS_MSWIN)  ||  defined(NCBI_OS_UNIX)
  383.         fn = CFile::GetTmpName(CFile::eTmpFileCreate);
  384.         assert( !fn.empty() );
  385.         assert( CFile(fn).Exists() );
  386.         CFile(fn).Remove();
  387.         fn = CFile::GetTmpNameEx(".", "tmp_", CFile::eTmpFileCreate);
  388.         assert( !fn.empty() );
  389.         assert( CFile(fn).Exists() );
  390.         CFile(fn).Remove();
  391. #  endif
  392.     }}
  393. }
  394. /////////////////////////////////
  395. // Work with directories
  396. //
  397. #if defined(NCBI_OS_MAC)
  398. #   define REL ":"
  399. #   define SEP ":"
  400. #   define CWD ":"
  401. #else
  402. #   define REL ""
  403. #   define SEP "/"
  404. #   define CWD "."
  405. #endif
  406. static void s_TEST_Dir(void)
  407. {
  408.     // Delete the directory if it exists before we start testing
  409.     CDirEntry("dir_1").Remove();
  410.     
  411.     // Create directory
  412.     assert( CDir("dir_1").Create() );
  413.     assert( !CDir("dir_1").Create() );
  414.     // Create file in the directory
  415.     FILE* file = fopen(REL "dir_1" SEP "file_1", "w+");
  416.     assert( file );
  417.     fclose(file);
  418.     // Check the directory exists
  419.     assert( CDir("dir_1").Exists() );
  420.     assert( !CDir("dir_2").Exists() );
  421.     assert( CDirEntry("dir_1").Exists() );
  422.     assert( CDirEntry(REL"dir_1" SEP "file_1").Exists() );
  423.     // Check entry type
  424.     assert( CDirEntry("dir_1").IsDir() );
  425.     assert( !CDirEntry("dir_1").IsFile() );
  426.     assert( CDirEntry(REL "dir_1" SEP "file_1").IsFile() );
  427.     assert( !CDirEntry(REL "dir_1" SEP "file_1").IsDir() );
  428.     
  429.     // Rename the directory
  430.     assert( CDir("dir_1").Rename("dir_2") );
  431.     // Remove the directory
  432.     assert( !CDirEntry("dir_2").Remove(CDirEntry::eOnlyEmpty) );
  433.     assert( CFile(REL "dir_2" SEP "file_1").Remove() );
  434.     assert( CDir("dir_2").Remove(CDir::eOnlyEmpty) );
  435.     // Check the directory exists
  436.     assert( !CDir("dir_1").Exists() );
  437.     assert( !CDir("dir_2").Exists() );
  438.     // Current directory list
  439.     CDir dir(CWD);
  440.     cout << endl;
  441.     CDir::TEntries contents = dir.GetEntries("*", CDir::eIgnoreRecursive);
  442.     ITERATE(CDir::TEntries, i, contents) {
  443.         string entry = (*i)->GetPath();
  444.         cout << entry << endl;
  445.     }
  446.     cout << endl;
  447.     vector<string> masks;
  448.     masks.push_back("*");
  449.     CDir::TEntries contents2 = dir.GetEntries(masks, CDir::eIgnoreRecursive);
  450.     assert(contents.size() == contents2.size());
  451.     vector<string> files;
  452.     vector<string> paths;
  453.     paths.push_back(".");
  454.     FindFiles(files, paths.begin(), paths.end(), 
  455.                      masks.begin(), masks.end());
  456.     for (unsigned int i = 0; i < contents.size(); ++i) {
  457.         const CDirEntry& entry1 = *contents[i];
  458.         const CDirEntry& entry2 = *contents2[i];
  459.         string ep1 = entry1.GetPath();
  460.         string ep2 = entry2.GetPath();
  461.         const string& f = files[i];
  462.         assert(ep1 == ep2);
  463.         assert(ep1 == f);
  464.     }
  465.     cout << "Recursive content" << endl;
  466.     files.clear();
  467.     FindFiles(files, paths.begin(), paths.end(), 
  468.                      masks.begin(), masks.end(), 
  469.                      fFF_File | fFF_Dir | fFF_Recursive);
  470.     ITERATE(vector<string>, fit, files) {
  471.         cout << *fit << endl;
  472.     }
  473.     cout << "-----" << endl;
  474.     // Create dir structure for deletion
  475.     assert( CDir("dir_3").Create() );
  476.     assert( CDir(REL "dir_3" SEP "subdir_1").Create() );
  477.     assert( CDir(REL "dir_3" SEP "subdir_2").Create() );
  478.     
  479.     file = fopen(REL "dir_3" SEP "file", "w+");
  480.     assert( file );
  481.     fclose(file);
  482.     file = fopen(REL "dir_3" SEP "subdir_1" SEP "file", "w+");
  483.     assert( file );
  484.     fclose(file);
  485.     // Delete dir
  486.     dir.Reset("dir_3");
  487.     assert( !dir.Remove(CDir::eOnlyEmpty) );
  488.     assert( dir.Exists() );
  489.     assert( !dir.Remove(CDir::eNonRecursive) );
  490.     assert( dir.Exists() );
  491.     assert( CDir(REL "dir_3" SEP "subdir_1").Exists() );
  492.     assert( CFile(REL "dir_3" SEP "subdir_1" SEP "file").Exists() );
  493.     assert( !CFile(REL "dir_3" SEP "file").Exists() );
  494.     assert( dir.Remove(CDir::eRecursive) );
  495.     assert( !dir.Exists() );
  496.     
  497.     // Home dir
  498.     string homedir = CDir::GetHome();
  499.     assert ( !homedir.empty() );
  500.     cout << homedir << endl;
  501.     // Creation of relative path from 2 absolute pathes:
  502.     string rel_path;
  503. #if defined(NCBI_OS_MSWIN)
  504.     assert( CDirEntry::CreateRelativePath(
  505.             "C:\x\y\z\",
  506.             "C:\x\a\b\") == "..\..\a\b\" );
  507.     assert( CDirEntry::CreateRelativePath(
  508.             "C:\x\y\z\",
  509.             "C:\x\a\b\file.txt") == "..\..\a\b\file.txt" );
  510.  
  511.     assert( CDirEntry::CreateRelativePath(
  512.             "C:\x\y\z\", 
  513.             "C:\x\y\z\").empty() );
  514.     assert( CDirEntry::CreateRelativePath(
  515.             "C:\x\y\z\", 
  516.             "C:\x\y\a\") == "..\a\" );
  517.     assert( CDirEntry::CreateRelativePath(
  518.             "\x\y\z\", 
  519.             "\x\y\") == "..\" );
  520. #elif defined(NCBI_OS_UNIX )
  521.     assert( CDirEntry::CreateRelativePath(
  522.             "/usr/bin/", "/usr/" ) == "../" );
  523.     assert( CDirEntry::CreateRelativePath(
  524.             "/usr/bin/", "/etc/" ) == "../../etc/" );
  525. #elif defined(NCBI_OS_MAC)
  526.     // NOT implemented!
  527. #endif
  528. }
  529. /////////////////////////////////
  530. // Memory mapping
  531. //
  532. static void s_TEST_MemoryFile(void)
  533. {
  534.     static const char   s_FileName[] = "test.tmp";
  535.     static const char   s_Data[]     = "test data";
  536.     static const size_t s_DataLen    = sizeof(s_Data) - 1;
  537.     // Create test file 
  538.     FILE* file = fopen(s_FileName, "w+");
  539.     assert( file );
  540.     fputs( s_Data, file);
  541.     fclose(file);
  542.     
  543.     // Check if the file exists now
  544.     CFile f(s_FileName);
  545.     assert( f.Exists() );
  546.     assert( f.GetLength() == s_DataLen );
  547.     // eMMP_Read [+ eMMS_Private]
  548.     
  549.     {{
  550.         // Map file into memory (for reading only by default)
  551.         CMemoryFile m1(s_FileName);
  552.         assert( m1.GetSize() == s_DataLen );
  553.         assert( memcmp(m1.GetPtr(), s_Data, s_DataLen) == 0 );
  554.         // Map second copy of the file into the memory
  555.         CMemoryFile m2(s_FileName);
  556.         assert( m1.GetSize() == m2.GetSize() );
  557.         assert( memcmp(m1.GetPtr(), m2.GetPtr(), (size_t)m2.GetSize()) == 0 );
  558.         // Unmap second copy
  559.         assert( m2.Unmap() );
  560.         assert( m2.GetSize() == -1 );
  561.         assert( m2.GetPtr()  ==  0 );
  562.         assert( m2.Unmap() );
  563.     }}
  564.     // eMMP_ReadWrite + eMMS_Shared
  565.     
  566.     {{
  567.         // Map file into memory
  568.         CMemoryFile m1(s_FileName, CMemoryFile::eMMP_ReadWrite,
  569.                        CMemoryFile::eMMS_Shared);
  570.         assert( m1.GetSize() == s_DataLen );
  571.         assert( memcmp(m1.GetPtr(), s_Data, s_DataLen) == 0 );
  572.         char* ptr = (char*)m1.GetPtr();
  573.         *ptr = '@';
  574.         assert( m1.Flush() );
  575.         // Map second copy of the file into the memory
  576.         CMemoryFile m2(s_FileName, CMemoryFile::eMMP_Read,
  577.                        CMemoryFile::eMMS_Shared);
  578.         assert( m1.GetSize() == m2.GetSize() );
  579.         // m2 must contain changes made via m1 
  580.         assert( memcmp(m2.GetPtr(), ptr, s_DataLen) == 0 );
  581.         // Restore previous data
  582.         memcpy(ptr, s_Data, s_DataLen);
  583.         // Flushing data to disk at memory unmapping in the destructor
  584.     }}
  585.     {{
  586.         // Checking the previous flush
  587.         CMemoryFile m1(s_FileName);
  588.         assert( m1.GetSize() == s_DataLen );
  589.         assert( memcmp(m1.GetPtr(), s_Data, s_DataLen) == 0 );
  590.     }}
  591.     // eMMP_ReadWrite + eMMS_Private
  592.     {{
  593.         // Map file into memory
  594.         CMemoryFile m1(s_FileName, CMemoryFile::eMMP_ReadWrite,
  595.                        CMemoryFile::eMMS_Private);
  596.         assert( m1.GetSize() == s_DataLen );
  597.         assert( memcmp(m1.GetPtr(), s_Data, s_DataLen) == 0 );
  598.         char* ptr = (char*)m1.GetPtr();
  599.         *ptr = '@';
  600.         assert( m1.Flush() );
  601.         // Map second copy of the file into the memory
  602.         CMemoryFile m2(s_FileName, CMemoryFile::eMMP_Read,
  603.                        CMemoryFile::eMMS_Shared);
  604.         assert( m1.GetSize() == m2.GetSize() );
  605.         // m2 must contain the original data
  606.         assert( memcmp(m2.GetPtr(), s_Data, s_DataLen) == 0 );
  607.     }}
  608.     // Remove the file
  609.     assert( f.Remove() );
  610. }
  611. ////////////////////////////////
  612. // Test application
  613. //
  614. class CTest : public CNcbiApplication
  615. {
  616. public:
  617.     void Init(void);
  618.     int Run(void);
  619. };
  620. void CTest::Init(void)
  621. {
  622.     SetDiagPostLevel(eDiag_Warning);
  623.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  624.     d->SetUsageContext("test_files",
  625.                        "test file's accessory functions");
  626.     SetupArgDescriptions(d.release());
  627. }
  628. int CTest::Run(void)
  629. {
  630.     cout << "Run test" << endl << endl;
  631.     // CDirEntry
  632.     s_TEST_SplitPath();
  633.     s_TEST_CheckPath();
  634.     s_TEST_MatchesMask();
  635.     // CFile
  636.     s_TEST_File();
  637.     // CDir
  638.     s_TEST_Dir();
  639.     // CMemoryFile
  640.     s_TEST_MemoryFile();
  641.     cout << endl;
  642.     cout << "TEST execution completed successfully!" << endl << endl;
  643.     return 0;
  644. }
  645. ///////////////////////////////////
  646. // APPLICATION OBJECT  and  MAIN
  647. //
  648. int main(int argc, const char* argv[])
  649. {
  650.     // Execute main application function
  651.     return CTest().AppMain(argc, argv, 0, eDS_Default, 0);
  652. }
  653. /*
  654.  * ===========================================================================
  655.  * $Log: test_ncbifile.cpp,v $
  656.  * Revision 1000.5  2004/06/01 19:10:13  gouriano
  657.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.38
  658.  *
  659.  * Revision 1.38  2004/05/14 13:59:51  gorelenk
  660.  * Added include of ncbi_pch.hpp
  661.  *
  662.  * Revision 1.37  2004/04/29 15:15:00  kuznets
  663.  * Modifications of FindFile test
  664.  *
  665.  * Revision 1.36  2004/03/17 15:41:28  ivanov
  666.  * Expanded temporary file name generation test
  667.  *
  668.  * Revision 1.35  2004/01/05 22:10:33  gorelenk
  669.  * += UNIX test for CDirEntry::CreateRelativePath()
  670.  *
  671.  * Revision 1.34  2004/01/05 21:41:26  gorelenk
  672.  * += Exception throwing in CDirEntry::CreateRelativePath()
  673.  *
  674.  * Revision 1.33  2004/01/05 20:05:06  gorelenk
  675.  * + Test for CDirEntry::CreateRelativePath()
  676.  *
  677.  * Revision 1.32  2003/12/15 15:42:48  ivanov
  678.  * Removed incorrect last access time check
  679.  *
  680.  * Revision 1.31  2003/12/01 12:17:35  ivanov
  681.  * Fixed comparison operator for assert( atime >= ctime )
  682.  *
  683.  * Revision 1.30  2003/11/28 16:23:42  ivanov
  684.  * Added tests for CDirEntry::SetTime()
  685.  *
  686.  * Revision 1.29  2003/11/05 16:27:45  kuznets
  687.  * + test for FindFile
  688.  *
  689.  * Revision 1.28  2003/11/05 15:38:14  kuznets
  690.  * Added test for new GetEntries()
  691.  *
  692.  * Revision 1.27  2003/10/08 15:45:53  ivanov
  693.  * Added tests for [Add|Delete]TrailingPathSeparator()
  694.  *
  695.  * Revision 1.26  2003/09/30 15:09:05  ucko
  696.  * Reworked CDirEntry::NormalizePath, which now handles .. correctly in
  697.  * all cases and optionally resolves symlinks (on Unix).
  698.  *
  699.  * Revision 1.25  2003/09/16 18:55:16  ivanov
  700.  * Added more test for NormalizePath()
  701.  *
  702.  * Revision 1.24  2003/09/16 16:28:08  ivanov
  703.  * Added tests for SplitPath(). Minor cosmetics.
  704.  *
  705.  * Revision 1.23  2003/08/08 14:30:06  meric
  706.  * Accommodate rename of CFile::GetTmpNameExt() to CFile::GetTmpNameEx()
  707.  *
  708.  * Revision 1.22  2003/03/10 18:57:08  kuznets
  709.  * iterate->ITERATE
  710.  *
  711.  * Revision 1.21  2003/03/06 21:22:30  ivanov
  712.  * Rollback to R1.19 -- accidentally commit work version
  713.  *
  714.  * Revision 1.20  2003/03/06 21:12:35  ivanov
  715.  * *** empty log message ***
  716.  *
  717.  * Revision 1.19  2003/02/14 19:26:51  ivanov
  718.  * Added more checks for CreateTmpFile()
  719.  *
  720.  * Revision 1.18  2003/02/05 22:08:26  ivanov
  721.  * Enlarged CMemoryFile test
  722.  *
  723.  * Revision 1.17  2002/06/29 06:45:50  vakatov
  724.  * Get rid of some compilation warnings
  725.  *
  726.  * Revision 1.16  2002/06/07 16:11:38  ivanov
  727.  * Chenget GetTime(): using CTime instead time_t, modification time by default
  728.  *
  729.  * Revision 1.15  2002/06/07 15:21:33  ivanov
  730.  * Added CDirEntry::GetTime() test example
  731.  *
  732.  * Revision 1.14  2002/04/16 18:49:08  ivanov
  733.  * Centralize threatment of assert() in tests.
  734.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  735.  *
  736.  * Revision 1.13  2002/04/01 18:50:18  ivanov
  737.  * Added test for class CMemoryFile
  738.  *
  739.  * Revision 1.12  2002/03/25 17:08:19  ucko
  740.  * Centralize treatment of Cygwin as Unix rather than Windows in configure.
  741.  *
  742.  * Revision 1.11  2002/03/22 20:00:24  ucko
  743.  * Tweak to work on Cygwin.  (Use Unix rather than MSWIN code).
  744.  *
  745.  * Revision 1.10  2002/03/01 16:06:24  kans
  746.  * removed erroneous __MACOS__ section
  747.  *
  748.  * Revision 1.9  2002/01/24 22:18:52  ivanov
  749.  * Changed tests for CDirEntry::Remove() and CDir::Remove()
  750.  *
  751.  * Revision 1.8  2002/01/22 19:29:09  ivanov
  752.  * Added test for ConcatPathEx()
  753.  *
  754.  * Revision 1.7  2002/01/21 04:48:15  vakatov
  755.  * Use #_MSC_VER instead of #NCBI_OS_MSWIN
  756.  *
  757.  * Revision 1.6  2002/01/20 04:42:22  vakatov
  758.  * Do not #define _DEBUG on NCBI_OS_MSWIN
  759.  *
  760.  * Revision 1.5  2002/01/10 16:48:06  ivanov
  761.  * Added test s_TEST_CheckPath()
  762.  *
  763.  * Revision 1.4  2001/11/19 18:13:10  juran
  764.  * Add s_TEST_MatchesMask().
  765.  * Use GetEntries() instead of Contents().
  766.  *
  767.  * Revision 1.3  2001/11/15 16:36:29  ivanov
  768.  * Moved from util to corelib
  769.  *
  770.  * Revision 1.2  2001/11/01 20:06:50  juran
  771.  * Replace directory streams with Contents() method.
  772.  * Implement and test Mac OS platform.
  773.  *
  774.  * Revision 1.1  2001/09/19 13:08:15  ivanov
  775.  * Initial revision
  776.  *
  777.  * ===========================================================================
  778.  */