Files
Project_CTR/ctrtool/deps/libtoolchain/test/io_VirtualFileSystem_TestClass.cpp
2022-03-12 16:00:33 +08:00

2543 lines
104 KiB
C++

#include <tc/Exception.h>
#include <fmt/core.h>
#include <tc/io/VirtualFileSystem.h>
#include <tc/io/PathUtil.h>
#include "io_VirtualFileSystem_TestClass.h"
#include "StreamTestUtil.h"
void io_VirtualFileSystem_TestClass::runAllTests(void)
{
fmt::print("[tc::io::VirtualFileSystem] START\n");
test_CreateUninitializedFs_DefaultConstructor();
test_BadFsSnapshot_CreateConstructor();
test_CreateFs_CreateConstructor();
test_ThrowsOnBadPermissions_OpenFile();
test_ThrowsOnBadFileEntry_OpenFile();
test_ThrowsOnBadFileEntry_GetDirectoryListing();
test_ThrowsOnBadFileEntry_SetWorkingDirectory();
test_WorksForAllValidPaths_OpenFile();
test_WorksForAllValidPaths_GetDirectoryListing();
test_WorksForAllValidPaths_SetWorkingDirectory();
test_WorksForAllValidPaths_GetWorkingDirectory();
test_DisposeWillChangeStateToUninitialized();
fmt::print("[tc::io::VirtualFileSystem] END\n");
}
void io_VirtualFileSystem_TestClass::test_CreateUninitializedFs_DefaultConstructor()
{
fmt::print("[tc::io::VirtualFileSystem] test_CreateUninitializedFs_DefaultConstructor : ");
try
{
try
{
// create filesystem
auto filesystem = tc::io::VirtualFileSystem();
// Test .state() returns correct
uint64_t state_ulong = filesystem.state().to_ulong();
uint64_t expected_state_ulong = (1 << tc::RESFLAG_NOINIT);
if (state_ulong != expected_state_ulong)
{
throw tc::Exception(fmt::format(".state().to_ulong() returned 0x{:x} (expected 0x{:x})", state_ulong, expected_state_ulong));
}
bool state_test_ready = filesystem.state().test(tc::RESFLAG_READY);
bool expected_state_test_ready = false;
if (state_test_ready != expected_state_test_ready)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_READY) returned {} (expected {})", state_test_ready, expected_state_test_ready));
}
bool state_test_error = filesystem.state().test(tc::RESFLAG_ERROR);
bool expected_state_test_error = false;
if (state_test_error != expected_state_test_error)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_ERROR) returned {} (expected {})", state_test_error, expected_state_test_error));
}
bool state_test_noinit = filesystem.state().test(tc::RESFLAG_NOINIT);
bool expected_state_test_noinit = true;
if (state_test_noinit != expected_state_test_noinit)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_NOINIT) returned {} (expected {})", state_test_noinit, expected_state_test_noinit));
}
// Test using methods that should throw ObjectDisposedException, as this is not initialized
try
{
filesystem.createFile(tc::io::Path());
throw tc::Exception(".createFile() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.removeFile(tc::io::Path());
throw tc::Exception(".removeFile() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
tc::io::Path file_path;
std::shared_ptr<tc::io::IStream> file_stream;
filesystem.openFile(file_path, tc::io::FileMode::Open, tc::io::FileAccess::Read, file_stream);
throw tc::Exception(".openFile() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.createDirectory(tc::io::Path());
throw tc::Exception(".createDirectory() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.removeDirectory(tc::io::Path());
throw tc::Exception(".removeDirectory() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
tc::io::Path path;
filesystem.getWorkingDirectory(path);
throw tc::Exception(".getWorkingDirectory() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.setWorkingDirectory(tc::io::Path());
throw tc::Exception(".setWorkingDirectory() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(tc::io::Path(), info);
throw tc::Exception(".setWorkingDirectory() did not throw tc::ObjectDisposedException for uninitialized VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_BadFsSnapshot_CreateConstructor()
{
fmt::print("[tc::io::VirtualFileSystem] test_BadFsSnapshot_CreateConstructor : ");
try
{
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
throw tc::Exception("Create Constructor did not throw tc::InvalidOperationException for an unpopulated fs snapshot.");
}
catch (tc::InvalidOperationException&) {
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
/* // omit including dir_entry
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
*/
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
throw tc::Exception("Create Constructor did not throw tc::InvalidOperationException for a fs snapshot that did not have a root directory.");
}
catch (tc::InvalidOperationException&) {
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, -1)); // invalid index for root entry
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
throw tc::Exception("Create Constructor did not throw tc::InvalidOperationException for a fs snapshot that had an invalid root directory index.");
}
catch (tc::InvalidOperationException&) {
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_CreateFs_CreateConstructor()
{
fmt::print("[tc::io::VirtualFileSystem] test_CreateFs_CreateConstructor : ");
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// Test .state() returns correct
uint64_t state_ulong = filesystem.state().to_ulong();
uint64_t expected_state_ulong = (1 << tc::RESFLAG_READY);
if (state_ulong != expected_state_ulong)
{
throw tc::Exception(fmt::format(".state().to_ulong() returned 0x{:x} (expected 0x{:x})", state_ulong, expected_state_ulong));
}
bool state_test_ready = filesystem.state().test(tc::RESFLAG_READY);
bool expected_state_test_ready = true;
if (state_test_ready != expected_state_test_ready)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_READY) returned {} (expected {})", state_test_ready, expected_state_test_ready));
}
bool state_test_error = filesystem.state().test(tc::RESFLAG_ERROR);
bool expected_state_test_error = false;
if (state_test_error != expected_state_test_error)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_ERROR) returned {} (expected {})", state_test_error, expected_state_test_error));
}
bool state_test_noinit = filesystem.state().test(tc::RESFLAG_NOINIT);
bool expected_state_test_noinit = false;
if (state_test_noinit != expected_state_test_noinit)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_NOINIT) returned {} (expected {})", state_test_noinit, expected_state_test_noinit));
}
// Test using methods that should throw NotImplementedException, since this is initialized
try
{
filesystem.createFile(tc::io::Path());
throw tc::Exception(".createFile() did not throw tc::NotImplementedException for initialized VirtualFileSystem");
}
catch (tc::NotImplementedException&) {
// do nothing
}
try
{
filesystem.removeFile(tc::io::Path());
throw tc::Exception(".removeFile() did not throw tc::NotImplementedException for initialized VirtualFileSystem");
}
catch (tc::NotImplementedException&) {
// do nothing
}
try
{
filesystem.createDirectory(tc::io::Path());
throw tc::Exception(".createDirectory() did not throw tc::NotImplementedException for initialized VirtualFileSystem");
}
catch (tc::NotImplementedException&) {
// do nothing
}
try
{
filesystem.removeDirectory(tc::io::Path());
throw tc::Exception(".removeDirectory() did not throw tc::NotImplementedException for initialized VirtualFileSystem");
}
catch (tc::NotImplementedException&) {
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_ThrowsOnBadPermissions_OpenFile()
{
fmt::print("[tc::io::VirtualFileSystem] test_ThrowsOnBadPermissions_OpenFile : ");
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// test openFile throws exceptions for bad permissions
/* tc::io::FileMode // only open is allowed
CreateNew = 1,
Create = 2,
Open = 3,
OpenOrCreate = 4,
Truncate = 5,
Append = 6
*/
/* tc::io::FileAccess // only read is allowed
Read = 1,
Write = 2,
ReadWrite = Read|Write, // (1|2 == 3)
*/
// CreateNew,Read
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::CreateNew, tc::io::FileAccess::Read, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "CreateNew", "Read"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// CreateNew,Write
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::CreateNew, tc::io::FileAccess::Write, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "CreateNew", "Write"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// CreateNew,ReadWrite
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::CreateNew, tc::io::FileAccess::ReadWrite, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "CreateNew", "ReadWrite"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Create,Read
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Create, tc::io::FileAccess::Read, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Create", "Read"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Create,Write
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Create, tc::io::FileAccess::Write, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Create", "Write"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Create,ReadWrite
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Create, tc::io::FileAccess::ReadWrite, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Create", "ReadWrite"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Open,Read (this is the only supported combination)
/*
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Open", "Read"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
*/
// Open,Write
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Open, tc::io::FileAccess::Write, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Open", "Write"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Open,ReadWrite
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Open, tc::io::FileAccess::ReadWrite, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Open", "ReadWrite"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// OpenOrCreate,Read
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::OpenOrCreate, tc::io::FileAccess::Read, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "OpenOrCreate", "Read"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// OpenOrCreate,Write
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::OpenOrCreate, tc::io::FileAccess::Write, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "OpenOrCreate", "Write"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// OpenOrCreate,ReadWrite
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::OpenOrCreate, tc::io::FileAccess::ReadWrite, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "OpenOrCreate", "ReadWrite"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Truncate,Read
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Truncate, tc::io::FileAccess::Read, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Truncate", "Read"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Truncate,Write
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Truncate, tc::io::FileAccess::Write, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Truncate", "Write"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Truncate,ReadWrite
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Truncate, tc::io::FileAccess::ReadWrite, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Truncate", "ReadWrite"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Append,Read
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Append, tc::io::FileAccess::Read, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Append", "Read"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Append,Write
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Append, tc::io::FileAccess::Write, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Append", "Write"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
// Append,ReadWrite
try
{
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Append, tc::io::FileAccess::ReadWrite, stream);
throw tc::Exception(fmt::format(".openFile() did not throw tc::NotSupportedException where unsupported mode ({:s}) and access ({:s}) were used.", "Append", "ReadWrite"));
}
catch (const tc::NotSupportedException&)
{
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_ThrowsOnBadFileEntry_OpenFile()
{
fmt::print("[tc::io::VirtualFileSystem] test_ThrowsOnBadFileEntry_OpenFile : ");
try
{
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
// error: file entry not created
//snapshot.file_entries.push_back(fileB_entry);
//snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// open file
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
throw tc::Exception(".openFile() did not throw tc::io::FileNotFoundException where file entry did not exist");
}
catch (tc::io::FileNotFoundException&)
{
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
// error: file entry not created but not mapped to a path
snapshot.file_entries.push_back(fileB_entry);
//snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// open file
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
throw tc::Exception(".openFile() did not throw tc::io::FileNotFoundException where file entry did exist, but not mapped to a path");
}
catch (tc::io::FileNotFoundException&)
{
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
// error: file entry created, but not mapped correctly (index == -1)
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), -1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// open file
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
throw tc::Exception(".openFile() did not throw tc::io::FileNotFoundException where file entry did exist, but had a bad mapping");
}
catch (tc::io::FileNotFoundException&)
{
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
// error: file entry created and mapped, but stream is null
fileB_entry.stream.reset(); // <- null the pointer here
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// open file
tc::io::Path path = tc::io::Path("/fileB");
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(path, tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
throw tc::Exception(".openFile() did not throw tc::io::FileNotFoundException where file entry did exist, but stream was null");
}
catch (tc::io::FileNotFoundException&)
{
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_ThrowsOnBadFileEntry_GetDirectoryListing()
{
fmt::print("[tc::io::VirtualFileSystem] test_ThrowsOnBadFileEntry_GetDirectoryListing : ");
try
{
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
// error: dir entry not created
//snapshot.dir_entries.push_back(dirC_entry);
//snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// get directory listing
tc::io::Path path = tc::io::Path("/dirC");
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(path, info);
throw tc::Exception(".getDirectoryListing() did not throw tc::io::DirectoryNotFoundException where dir entry did not exist");
}
catch (tc::io::DirectoryNotFoundException&)
{
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
// error: dir entry created, but not mapped to a path
snapshot.dir_entries.push_back(dirC_entry);
//snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// get directory listing
tc::io::Path path = tc::io::Path("/dirC");
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(path, info);
throw tc::Exception(".getDirectoryListing() did not throw tc::io::DirectoryNotFoundException where dir entry did exist, but not mapped to a path");
}
catch (tc::io::DirectoryNotFoundException&)
{
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
// error: dir entry created, but not mapped correctly (index == -1)
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, -1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// get directory listing
tc::io::Path path = tc::io::Path("/dirC");
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(path, info);
throw tc::Exception(".getDirectoryListing() did not throw tc::io::DirectoryNotFoundException where dir entry did exist, but not mapped correctly.");
}
catch (tc::io::DirectoryNotFoundException&)
{
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_ThrowsOnBadFileEntry_SetWorkingDirectory()
{
fmt::print("[tc::io::VirtualFileSystem] test_ThrowsOnBadFileEntry_SetWorkingDirectory : ");
try
{
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
// error: dir entry not created
//snapshot.dir_entries.push_back(dirC_entry);
//snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// set working directory
tc::io::Path path = tc::io::Path("/dirC");
filesystem.setWorkingDirectory(path);
throw tc::Exception(".setWorkingDirectory() did not throw tc::io::DirectoryNotFoundException where dir entry did not exist");
}
catch (tc::io::DirectoryNotFoundException&)
{
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
// error: dir entry created, but not mapped to a path
snapshot.dir_entries.push_back(dirC_entry);
//snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// set working directory
tc::io::Path path = tc::io::Path("/dirC");
filesystem.setWorkingDirectory(path);
throw tc::Exception(".setWorkingDirectory() did not throw tc::io::DirectoryNotFoundException where dir entry did exist, but not mapped to a path");
}
catch (tc::io::DirectoryNotFoundException&)
{
// do nothing
}
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
// error: dir entry created, but not mapped correctly (index == -1)
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, -1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// set working directory
tc::io::Path path = tc::io::Path("/dirC");
filesystem.setWorkingDirectory(path);
throw tc::Exception(".setWorkingDirectory() did not throw tc::io::DirectoryNotFoundException where dir entry did exist, but not mapped correctly.");
}
catch (tc::io::DirectoryNotFoundException&)
{
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_WorksForAllValidPaths_OpenFile()
{
fmt::print("[tc::io::VirtualFileSystem] test_WorksForAllValidPaths_OpenFile : ");
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {"fileD"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileD_entry;
fileD_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xD, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileD_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path + tc::io::Path("fileD"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// test that openFile works for all valid paths
std::string literal_path;
literal_path = "/fileA";
try
{
// open file
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(tc::io::Path(literal_path), tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
if (stream == nullptr)
{
throw tc::Exception(fmt::format(".openFile() returned a null stream for file \"{:s}\".", literal_path));
}
if (stream->canRead() == false)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canRead() was false for file \"{:s}\".", literal_path));
}
if (stream->canWrite() == true)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canWrite() was true for file \"{:s}\".", literal_path));
}
int64_t expected_length = 0xA;
int64_t actual_length = stream->length();
if (actual_length != expected_length)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where length was 0x{:x} (expected 0x{:x}) for file \"{:s}\".", actual_length, expected_length, literal_path));
}
}
catch (tc::io::FileNotFoundException&)
{
throw tc::Exception(fmt::format(".openFile() threw tc::io::FileNotFoundException where file (\"{:s}\") did exist.", literal_path));
}
literal_path = "/fileB";
try
{
// open file
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(tc::io::Path(literal_path), tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
if (stream == nullptr)
{
throw tc::Exception(fmt::format(".openFile() returned a null stream for file \"{:s}\".", literal_path));
}
if (stream->canRead() == false)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canRead() was false for file \"{:s}\".", literal_path));
}
if (stream->canWrite() == true)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canWrite() was true for file \"{:s}\".", literal_path));
}
int64_t expected_length = 0xB;
int64_t actual_length = stream->length();
if (actual_length != expected_length)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where length was 0x{:x} (expected 0x{:x}) for file \"{:s}\".", actual_length, expected_length, literal_path));
}
}
catch (tc::io::FileNotFoundException&)
{
throw tc::Exception(fmt::format(".openFile() threw tc::io::FileNotFoundException where file (\"{:s}\") did exist.", literal_path));
}
literal_path = "/fileC";
try
{
// open file
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(tc::io::Path(literal_path), tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
if (stream == nullptr)
{
throw tc::Exception(fmt::format(".openFile() returned a null stream for file \"{:s}\".", literal_path));
}
if (stream->canRead() == false)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canRead() was false for file \"{:s}\".", literal_path));
}
if (stream->canWrite() == true)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canWrite() was true for file \"{:s}\".", literal_path));
}
int64_t expected_length = 0xC;
int64_t actual_length = stream->length();
if (actual_length != expected_length)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where length was 0x{:x} (expected 0x{:x}) for file \"{:s}\".", actual_length, expected_length, literal_path));
}
}
catch (tc::io::FileNotFoundException&)
{
throw tc::Exception(fmt::format(".openFile() threw tc::io::FileNotFoundException where file (\"{:s}\") did exist.", literal_path));
}
literal_path = "/dirB/fileD";
try
{
// open file
std::shared_ptr<tc::io::IStream> stream;
filesystem.openFile(tc::io::Path(literal_path), tc::io::FileMode::Open, tc::io::FileAccess::Read, stream);
if (stream == nullptr)
{
throw tc::Exception(fmt::format(".openFile() returned a null stream for file \"{:s}\".", literal_path));
}
if (stream->canRead() == false)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canRead() was false for file \"{:s}\".", literal_path));
}
if (stream->canWrite() == true)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where canWrite() was true for file \"{:s}\".", literal_path));
}
int64_t expected_length = 0xD;
int64_t actual_length = stream->length();
if (actual_length != expected_length)
{
throw tc::Exception(fmt::format(".openFile() returned a stream where length was 0x{:x} (expected 0x{:x}) for file \"{:s}\".", actual_length, expected_length, literal_path));
}
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".openFile() threw tc::io::DirectoryNotFoundException where file (\"{:s}\") did exist.", literal_path));
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_WorksForAllValidPaths_GetDirectoryListing()
{
fmt::print("[tc::io::VirtualFileSystem] test_WorksForAllValidPaths_GetDirectoryListing : ");
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {"fileD"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileD_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xD, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileD_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path + tc::io::Path("fileD"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// test that getDirectoryListing works for all valid paths
std::string literal_path;
literal_path = "/";
try
{
// get directory listing
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(tc::io::Path(literal_path), info);
if (info.abs_path != dirRoot_entry.dir_listing.abs_path)
{
throw tc::Exception(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong absolute path).", literal_path);
}
if (info.dir_list != dirRoot_entry.dir_listing.dir_list)
{
throw tc::Exception(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path);
}
if (info.file_list != dirRoot_entry.dir_listing.file_list)
{
throw tc::Exception(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path);
}
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".getDirectoryListing() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
literal_path = "/dirA/";
try
{
// get directory listing
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(tc::io::Path(literal_path), info);
if (info.abs_path != dirA_entry.dir_listing.abs_path)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong absolute path).", literal_path));
}
if (info.dir_list != dirA_entry.dir_listing.dir_list)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path));
}
if (info.file_list != dirA_entry.dir_listing.file_list)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path));
}
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".getDirectoryListing() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
literal_path = "/dirB/";
try
{
// get directory listing
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(tc::io::Path(literal_path), info);
if (info.abs_path != dirB_entry.dir_listing.abs_path)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong absolute path).", literal_path));
}
if (info.dir_list != dirB_entry.dir_listing.dir_list)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path));
}
if (info.file_list != dirB_entry.dir_listing.file_list)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path));
}
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".getDirectoryListing() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
literal_path = "/dirC/";
try
{
// get directory listing
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(tc::io::Path(literal_path), info);
if (info.abs_path != dirC_entry.dir_listing.abs_path)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong absolute path).", literal_path));
}
if (info.dir_list != dirC_entry.dir_listing.dir_list)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path));
}
if (info.file_list != dirC_entry.dir_listing.file_list)
{
throw tc::Exception(fmt::format(".getDirectoryListing() did not return the correct DirectoryListing for directory \"{:s}\" (wrong dir list).", literal_path));
}
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".getDirectoryListing() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_WorksForAllValidPaths_SetWorkingDirectory()
{
fmt::print("[tc::io::VirtualFileSystem] test_WorksForAllValidPaths_SetWorkingDirectory : ");
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// test that setWorkingDirectory works for all valid paths
std::string literal_path;
literal_path = "/";
try
{
// set working directory
filesystem.setWorkingDirectory(tc::io::Path(literal_path));
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".setWorkingDirectory() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
literal_path = "/dirA/";
try
{
// set working directory
filesystem.setWorkingDirectory(tc::io::Path(literal_path));
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".setWorkingDirectory() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
literal_path = "/dirB/";
try
{
// set working directory
filesystem.setWorkingDirectory(tc::io::Path(literal_path));
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".setWorkingDirectory() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
literal_path = "/dirC/";
try
{
// set working directory
filesystem.setWorkingDirectory(tc::io::Path(literal_path));
}
catch (tc::io::DirectoryNotFoundException&)
{
throw tc::Exception(fmt::format(".setWorkingDirectory() threw tc::io::DirectoryNotFoundException where directory (\"{:s}\") did exist.", literal_path));
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_WorksForAllValidPaths_GetWorkingDirectory()
{
fmt::print("[tc::io::VirtualFileSystem] test_WorksForAllValidPaths_GetWorkingDirectory : ");
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
// test that working directory at point of filesystem creation is root
{
tc::io::Path expected_working_directory = tc::io::Path("/");
tc::io::Path working_directory;
filesystem.getWorkingDirectory(working_directory);
if (expected_working_directory != working_directory)
{
std::string expected_working_directory_string;
std::string working_directory_string;
tc::io::PathUtil::pathToUnixUTF8(expected_working_directory, expected_working_directory_string);
tc::io::PathUtil::pathToUnixUTF8(working_directory, working_directory_string);
throw tc::Exception(fmt::format("getWorkingDirectory() returned a path that was not root after the filesystem was created. (returned: \"{:s}\", expected: \"{:s}\")", working_directory_string, expected_working_directory_string));
}
}
// test that setWorkingDirectory works for all valid paths
std::string literal_path;
literal_path = "/";
{
tc::io::Path expected_working_directory = tc::io::Path(literal_path);
tc::io::Path working_directory;
filesystem.setWorkingDirectory(expected_working_directory);
filesystem.getWorkingDirectory(working_directory);
if (expected_working_directory != working_directory)
{
std::string expected_working_directory_string;
std::string working_directory_string;
tc::io::PathUtil::pathToUnixUTF8(expected_working_directory, expected_working_directory_string);
tc::io::PathUtil::pathToUnixUTF8(working_directory, working_directory_string);
throw tc::Exception(fmt::format("getWorkingDirectory() did not return the expected path. (returned: \"{:s}\", expected: \"{:s}\")", working_directory_string, expected_working_directory_string));
}
}
literal_path = "/dirA/";
{
tc::io::Path expected_working_directory = tc::io::Path(literal_path);
tc::io::Path working_directory;
filesystem.setWorkingDirectory(expected_working_directory);
filesystem.getWorkingDirectory(working_directory);
if (expected_working_directory != working_directory)
{
std::string expected_working_directory_string;
std::string working_directory_string;
tc::io::PathUtil::pathToUnixUTF8(expected_working_directory, expected_working_directory_string);
tc::io::PathUtil::pathToUnixUTF8(working_directory, working_directory_string);
throw tc::Exception(fmt::format("getWorkingDirectory() did not return the expected path. (returned: \"{:s}\", expected: \"{:s}\")", working_directory_string, expected_working_directory_string));
}
}
literal_path = "/dirB/";
{
tc::io::Path expected_working_directory = tc::io::Path(literal_path);
tc::io::Path working_directory;
filesystem.setWorkingDirectory(expected_working_directory);
filesystem.getWorkingDirectory(working_directory);
if (expected_working_directory != working_directory)
{
std::string expected_working_directory_string;
std::string working_directory_string;
tc::io::PathUtil::pathToUnixUTF8(expected_working_directory, expected_working_directory_string);
tc::io::PathUtil::pathToUnixUTF8(working_directory, working_directory_string);
throw tc::Exception(fmt::format("getWorkingDirectory() did not return the expected path. (returned: \"{:s}\", expected: \"{:s}\")", working_directory_string, expected_working_directory_string));
}
}
literal_path = "/dirC/";
{
tc::io::Path expected_working_directory = tc::io::Path(literal_path);
tc::io::Path working_directory;
filesystem.setWorkingDirectory(expected_working_directory);
filesystem.getWorkingDirectory(working_directory);
if (expected_working_directory != working_directory)
{
std::string expected_working_directory_string;
std::string working_directory_string;
tc::io::PathUtil::pathToUnixUTF8(expected_working_directory, expected_working_directory_string);
tc::io::PathUtil::pathToUnixUTF8(working_directory, working_directory_string);
throw tc::Exception(fmt::format("getWorkingDirectory() did not return the expected path. (returned: \"{:s}\", expected: \"{:s}\")", working_directory_string, expected_working_directory_string));
}
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}
void io_VirtualFileSystem_TestClass::test_DisposeWillChangeStateToUninitialized()
{
fmt::print("[tc::io::VirtualFileSystem] test_DisposeWillChangeStateToUninitialized : ");
try
{
try
{
tc::io::VirtualFileSystem::FileSystemSnapshot snapshot;
// create snapshot data
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirRoot_entry;
dirRoot_entry.dir_listing.abs_path = tc::io::Path("/");
dirRoot_entry.dir_listing.dir_list = {"dirA", "dirB", "dirC"};
dirRoot_entry.dir_listing.file_list = {"fileA", "fileB", "fileC"};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirA_entry;
dirA_entry.dir_listing.abs_path = tc::io::Path("/dirA/");
dirA_entry.dir_listing.dir_list = {};
dirA_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirB_entry;
dirB_entry.dir_listing.abs_path = tc::io::Path("/dirB/");
dirB_entry.dir_listing.dir_list = {};
dirB_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::DirEntry dirC_entry;
dirC_entry.dir_listing.abs_path = tc::io::Path("/dirC/");
dirC_entry.dir_listing.dir_list = {};
dirC_entry.dir_listing.file_list = {};
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileA_entry;
fileA_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xA, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileB_entry;
fileB_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xB, true, false, true, false, false));
tc::io::VirtualFileSystem::FileSystemSnapshot::FileEntry fileC_entry;
fileC_entry.stream = std::make_shared<StreamTestUtil::DummyStreamBase>(StreamTestUtil::DummyStreamBase(0xC, true, false, true, false, false));
// add data to snapshot
snapshot.dir_entries.push_back(dirRoot_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirA_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirA_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirB_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirB_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.dir_entries.push_back(dirC_entry);
snapshot.dir_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirC_entry.dir_listing.abs_path, snapshot.dir_entries.size()-1));
snapshot.file_entries.push_back(fileA_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileA"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileB_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileB"), snapshot.file_entries.size()-1));
snapshot.file_entries.push_back(fileC_entry);
snapshot.file_entry_path_map.insert(std::pair<tc::io::Path, size_t>(dirRoot_entry.dir_listing.abs_path + tc::io::Path("fileC"), snapshot.file_entries.size()-1));
// create filesystem
auto filesystem = tc::io::VirtualFileSystem(snapshot);
filesystem.dispose();
// Test .state() returns correct
uint64_t state_ulong = filesystem.state().to_ulong();
uint64_t expected_state_ulong = (1 << tc::RESFLAG_NOINIT);
if (state_ulong != expected_state_ulong)
{
throw tc::Exception(fmt::format(".state().to_ulong() returned 0x{:x} (expected 0x{:x})", state_ulong, expected_state_ulong));
}
bool state_test_ready = filesystem.state().test(tc::RESFLAG_READY);
bool expected_state_test_ready = false;
if (state_test_ready != expected_state_test_ready)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_READY) returned {} (expected {})", state_test_ready, expected_state_test_ready));
}
bool state_test_error = filesystem.state().test(tc::RESFLAG_ERROR);
bool expected_state_test_error = false;
if (state_test_error != expected_state_test_error)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_ERROR) returned {} (expected {})", state_test_error, expected_state_test_error));
}
bool state_test_noinit = filesystem.state().test(tc::RESFLAG_NOINIT);
bool expected_state_test_noinit = true;
if (state_test_noinit != expected_state_test_noinit)
{
throw tc::Exception(fmt::format(".state().test(tc::RESFLAG_NOINIT) returned {} (expected {})", state_test_noinit, expected_state_test_noinit));
}
// Test using methods that should throw ObjectDisposedException, as this is not initialized
try
{
filesystem.createFile(tc::io::Path());
throw tc::Exception(".createFile() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.removeFile(tc::io::Path());
throw tc::Exception(".removeFile() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
tc::io::Path file_path;
std::shared_ptr<tc::io::IStream> file_stream;
filesystem.openFile(file_path, tc::io::FileMode::Open, tc::io::FileAccess::Read, file_stream);
throw tc::Exception(".openFile() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.createDirectory(tc::io::Path());
throw tc::Exception(".createDirectory() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.removeDirectory(tc::io::Path());
throw tc::Exception(".removeDirectory() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
tc::io::Path path;
filesystem.getWorkingDirectory(path);
throw tc::Exception(".getWorkingDirectory() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
filesystem.setWorkingDirectory(tc::io::Path());
throw tc::Exception(".setWorkingDirectory() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
try
{
tc::io::sDirectoryListing info;
filesystem.getDirectoryListing(tc::io::Path(), info);
throw tc::Exception(".setWorkingDirectory() did not throw tc::ObjectDisposedException for disposed VirtualFileSystem");
}
catch (tc::ObjectDisposedException&) {
// do nothing
}
fmt::print("PASS\n");
}
catch (const tc::Exception& e)
{
fmt::print("FAIL ({:s})\n", e.error());
}
}
catch (const std::exception& e)
{
fmt::print("UNHANDLED EXCEPTION ({:s})\n", e.what());
}
}