📄 findfile_sequence_unittest_.h
字号:
// Updated: 1st June 2006
#if !defined(WINSTL_INCL_WINSTL_FILESYSTEM_HPP_FINDFILE_SEQUENCE)
# error This file cannot be directly included, and should only be included within winstl/filesystem/findfile_sequence.hpp
#endif /* !WINSTL_INCL_WINSTL_FILESYSTEM_HPP_FINDFILE_SEQUENCE */
#if !defined(STLSOFT_UNITTEST)
# error This file cannot be included when not unit-testing STLSoft
#endif /* !STLSOFT_UNITTEST */
namespace unittest
{
namespace
{
// Test files/directories:
//
// ./ffs-test/dir0.ffs
// ./ffs-test/dir0.ffs/file00.ffs
// ./ffs-test/dir0.ffs/file01.ffs
// ./ffs-test/dir1.ffs
// ./ffs-test/dir1.ffs/file10.ffs
// ./ffs-test/dir1.ffs/file11.ffs
namespace
{
const char FFS_TEST[] = "ffs-test";
const char FFS_DIR0[] = "dir0.ffs";
const char FFS_DIR1[] = "dir1.ffs";
const char *FFS_DIRS[] =
{
FFS_DIR0
, FFS_DIR1
};
const char FFS_FILE00[] = "file00.ffs";
const char FFS_FILE01[] = "file01.ffs";
const char FFS_FILE10[] = "file10.ffs";
const char FFS_FILE11[] = "file11.ffs";
const char *FFS_DIR0_FILES[] =
{
FFS_FILE00
, FFS_FILE01
};
} // anonymous namespace
ss_bool_t ffs_create_test_fs_entries(basic_file_path_buffer<char> const &dir)
{
typedef filesystem_traits<char> traits_t;
basic_file_path_buffer<char> subDir;
basic_file_path_buffer<char> file;
HANDLE hfile;
// ./ffs-test
//fprintf(stderr, "Creating directory: %s\n", dir.c_str()); ::Sleep(2 * 1000);
if( !::CreateDirectory(dir.c_str(), NULL) &&
ERROR_ALREADY_EXISTS != ::GetLastError())
{
return false;
}
// ./ffs-test/dir0.ffs
::lstrcpyA(&subDir[0], dir.c_str());
traits_t::ensure_dir_end(&subDir[0]);
::lstrcatA(&subDir[0], FFS_DIR0);
//fprintf(stderr, "Creating directory: %s\n", subDir.c_str()); ::Sleep(2 * 1000);
if( !::CreateDirectory(subDir.c_str(), NULL) &&
ERROR_ALREADY_EXISTS != ::GetLastError())
{
return false;
}
// ./ffs-test/dir0.ffs/file00.ffs
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE00);
//fprintf(stderr, "Creating file: %s\n", file.c_str()); ::Sleep(2 * 1000);
if( INVALID_HANDLE_VALUE == (hfile = ::CreateFile(file.c_str(), 0, 0, NULL, CREATE_ALWAYS, 0, NULL)) &&
ERROR_ALREADY_EXISTS != ::GetLastError())
{
return false;
}
::CloseHandle(hfile);
// ./ffs-test/dir0.ffs/file01.ffs
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE01);
//fprintf(stderr, "Creating file: %s\n", file.c_str()); ::Sleep(2 * 1000);
if( INVALID_HANDLE_VALUE == (hfile = ::CreateFile(file.c_str(), 0, 0, NULL, CREATE_ALWAYS, 0, NULL)) &&
ERROR_ALREADY_EXISTS != ::GetLastError())
{
return false;
}
::CloseHandle(hfile);
// ./ffs-test/dir1.ffs
::lstrcpyA(&subDir[0], dir.c_str());
traits_t::ensure_dir_end(&subDir[0]);
::lstrcatA(&subDir[0], FFS_DIR1);
//fprintf(stderr, "Creating directory: %s\n", subDir.c_str()); ::Sleep(2 * 1000);
if( !::CreateDirectory(subDir.c_str(), NULL) &&
ERROR_ALREADY_EXISTS != ::GetLastError())
{
return false;
}
// ./ffs-test/dir1.ffs/file10.ffs
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE10);
//fprintf(stderr, "Creating file: %s\n", file.c_str()); ::Sleep(2 * 1000);
if( INVALID_HANDLE_VALUE == (hfile = ::CreateFile(file.c_str(), 0, 0, NULL, CREATE_ALWAYS, 0, NULL)) &&
ERROR_ALREADY_EXISTS != ::GetLastError())
{
return false;
}
::CloseHandle(hfile);
// ./ffs-test/dir1.ffs/file11.ffs
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE11);
//fprintf(stderr, "Creating file: %s\n", file.c_str()); ::Sleep(2 * 1000);
if( INVALID_HANDLE_VALUE == (hfile = ::CreateFile(file.c_str(), 0, 0, NULL, CREATE_ALWAYS, 0, NULL)) &&
ERROR_ALREADY_EXISTS != ::GetLastError())
{
return false;
}
::CloseHandle(hfile);
return true;
}
void ffs_delete_test_fs_entries(basic_file_path_buffer<char> const &dir)
{
typedef filesystem_traits<char> traits_t;
basic_file_path_buffer<char> subDir;
basic_file_path_buffer<char> file;
::lstrcpyA(&subDir[0], dir.c_str());
::lstrcatA(&subDir[0], FFS_DIR1);
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE10);
//fprintf(stderr, "Deleting file: %s\n", file.c_str()); ::Sleep(2 * 1000);
::DeleteFile(file.c_str());
//fprintf(stderr, "%lu\n", ::GetLastError()); ::Sleep(2 * 1000);
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE11);
//fprintf(stderr, "Deleting file: %s\n", file.c_str()); ::Sleep(2 * 1000);
::DeleteFile(file.c_str());
//fprintf(stderr, "Removing directory: %s\n", subDir.c_str()); ::Sleep(2 * 1000);
::RemoveDirectory(subDir.c_str());
::lstrcpyA(&subDir[0], dir.c_str());
::lstrcatA(&subDir[0], FFS_DIR0);
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE00);
//fprintf(stderr, "Deleting file: %s\n", file.c_str()); ::Sleep(2 * 1000);
::DeleteFile(file.c_str());
::lstrcpyA(&file[0], &subDir[0]);
traits_t::ensure_dir_end(&file[0]);
::lstrcatA(&file[0], FFS_FILE01);
//fprintf(stderr, "Deleting file: %s\n", file.c_str()); ::Sleep(2 * 1000);
::DeleteFile(file.c_str());
//fprintf(stderr, "Removing directory: %s\n", subDir.c_str()); ::Sleep(2 * 1000);
::RemoveDirectory(subDir.c_str());
//fprintf(stderr, "Removing directory: %s\n", dir.c_str()); ::Sleep(2 * 1000);
::RemoveDirectory(dir.c_str());
}
ss_bool_t ffs_is_entry_path_equal_ffs_directory_plus_entry_name(findfile_sequence_a const &ffs, findfile_sequence_a::value_type const &entry)
{
typedef filesystem_traits<char> traits_t;
basic_file_path_buffer<char> path0;
basic_file_path_buffer<char> path1;
traits_t::str_copy(&path0[0], ffs.get_directory());
traits_t::ensure_dir_end(&path0[0]);
traits_t::str_cat(&path0[0], entry.get_filename());
traits_t::str_copy(&path1[0], entry.get_path());
return 0 == traits_t::str_compare_no_case(path0.c_str(), path1.c_str());
}
ss_bool_t ffs_test_dot_special_case(unittest_reporter *r)
{
ss_bool_t bSuccess = true;
typedef filesystem_traits<char> traits_t;
findfile_sequence_a ffs(".", ".", findfile_sequence_a::directories);
findfile_sequence_a::const_iterator b = ffs.begin();
findfile_sequence_a::const_iterator e = ffs.end();
{
findfile_sequence_a::const_iterator b = ffs.begin();
findfile_sequence_a::const_iterator b2;
b2 = b;
b2 = b2;
b = b;
b2 = ffs.begin();
}
if(b == e)
{
r->report("findfile_sequence '.' special-case: search returned empty sequence", __LINE__);
bSuccess = false;
}
else
{
(*b).is_directory();
(*b).is_file();
(*b).is_compressed();
#ifdef FILE_ATTRIBUTE_REPARSE_POINT
(*b).is_reparse_point();
#endif /* FILE_ATTRIBUTE_REPARSE_POINT */
(*b).is_read_only();
(*b).is_system();
(*b).is_hidden();
// Filename should be "."
if(0 != ::lstrcmpA(".", (*b).get_filename()))
{
//fprintf(stderr, "get_filename(): \"%s\"\n", (*b).get_filename());
r->report("findfile_sequence '.' special-case: (*).get_filename() does not equal \".\"", __LINE__);
bSuccess = false;
}
// Pathname should be "$(cwd)\."
basic_file_path_buffer<char> cwd;
size_t cwdLen = ::GetCurrentDirectoryA(cwd.size(), &cwd[0]);
if(0 != cwdLen)
{
traits_t::ensure_dir_end(&cwd[0]);
traits_t::str_cat(&cwd[0], ".");
//fprintf(stderr, "cwd: \"%p\"\n", cwd.c_str());
//fprintf(stderr, "get_path(): \"%p\"\n", (*b).get_path());
//fprintf(stderr, "cwd: \"%s\"\n", cwd.c_str());
//fprintf(stderr, "get_path(): \"%s\"\n", (*b).get_path());
if(0 != ::lstrcmpA(cwd.c_str(), (*b).get_path()))
{
r->report("findfile_sequence '.' special-case: (*).get_path() does not equal \"$(cwd)\\.\"", __LINE__);
bSuccess = false;
}
}
}
return bSuccess;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -