Files
DevilutionX/test/file_util_test.cpp
Gleb Mazovetskiy f2cb9f0fa0 file_util: Implement RecursivelyCreateDir
With this, we no longer require `std::filesystem` support to create the
save file directory when it does not exist.

Note that by default the save file directory exists because it is
created by SDL, so this is mostly useful on platforms that override the
save directory or use `UNPACKED_SAVES`.
2023-03-11 17:47:29 +00:00

86 lines
2.4 KiB
C++

#include <gtest/gtest.h>
#include <cstdio>
#include "utils/file_util.h"
using namespace devilution;
namespace {
void WriteDummyFile(const char *name, std::uintmax_t size)
{
std::printf("Writing test file %s\n", name);
FILE *test_file = std::fopen(name, "wb");
ASSERT_TRUE(test_file != nullptr);
const char c = '\0';
for (std::uintmax_t i = 0; i < size; ++i) {
std::fwrite(&c, sizeof(c), 1, test_file);
ASSERT_EQ(std::ferror(test_file), 0);
}
std::fclose(test_file);
}
std::string GetTmpPathName(const char *suffix = ".tmp")
{
const auto *current_test = ::testing::UnitTest::GetInstance()->current_test_info();
std::string result = "Test_";
result.append(current_test->test_case_name());
result += '_';
result.append(current_test->name());
result.append(suffix);
return result;
}
TEST(FileUtil, GetFileSize)
{
const std::string path = GetTmpPathName();
WriteDummyFile(path.c_str(), 42);
std::uintmax_t result;
ASSERT_TRUE(GetFileSize(path.c_str(), &result));
EXPECT_EQ(result, 42);
}
TEST(FileUtil, FileExists)
{
EXPECT_FALSE(FileExists("this-file-should-not-exist"));
const std::string path = GetTmpPathName();
WriteDummyFile(path.c_str(), 42);
EXPECT_TRUE(FileExists(path.c_str()));
}
TEST(FileUtil, ResizeFile)
{
const std::string path = GetTmpPathName();
WriteDummyFile(path.c_str(), 42);
std::uintmax_t size;
ASSERT_TRUE(GetFileSize(path.c_str(), &size));
EXPECT_EQ(size, 42);
ASSERT_TRUE(ResizeFile(path.c_str(), 30));
ASSERT_TRUE(GetFileSize(path.c_str(), &size));
EXPECT_EQ(size, 30);
}
TEST(FileUtil, Dirname)
{
EXPECT_EQ(Dirname(""), ".");
EXPECT_EQ(Dirname("abc"), ".");
EXPECT_EQ(Dirname(DIRECTORY_SEPARATOR_STR), DIRECTORY_SEPARATOR_STR);
EXPECT_EQ(Dirname(DIRECTORY_SEPARATOR_STR DIRECTORY_SEPARATOR_STR), DIRECTORY_SEPARATOR_STR);
EXPECT_EQ(Dirname("a" DIRECTORY_SEPARATOR_STR "b"), "a");
EXPECT_EQ(Dirname("a" DIRECTORY_SEPARATOR_STR "b" DIRECTORY_SEPARATOR_STR "c"),
"a" DIRECTORY_SEPARATOR_STR "b");
EXPECT_EQ(Dirname("a" DIRECTORY_SEPARATOR_STR "b" DIRECTORY_SEPARATOR_STR "c"),
"a" DIRECTORY_SEPARATOR_STR "b");
}
TEST(FileUtil, RecursivelyCreateDir)
{
const std::string path = GetTmpPathName(/*suffix=*/"") + DIRECTORY_SEPARATOR_STR
+ "a" + DIRECTORY_SEPARATOR_STR + "b" + DIRECTORY_SEPARATOR_STR + "c";
RecursivelyCreateDir(path.c_str());
EXPECT_TRUE(DirectoryExists(path.c_str()));
}
} // namespace