⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findfile_sequence_unittest_.h

📁 用STL的方式封装了WindowsAPI、COM调用、ACE、ATL、MFC、WTL等多种组件
💻 H
📖 第 1 页 / 共 3 页
字号:

// 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 + -