SFML/test/System/FileInputStream.cpp

95 lines
2.1 KiB
C++
Raw Normal View History

#include <SFML/System/FileInputStream.hpp>
2022-07-05 00:20:58 +08:00
2022-07-18 06:18:40 +08:00
#include <doctest/doctest.h>
2022-07-05 00:20:58 +08:00
2022-06-26 01:54:57 +08:00
#include <cassert>
#include <fstream>
#include <sstream>
#include <string_view>
#include <utility>
2022-06-26 01:54:57 +08:00
static std::string getTemporaryFilePath()
{
static int counter = 0;
std::ostringstream oss;
oss << "sfmltemp" << counter << ".tmp";
++counter;
std::filesystem::path result;
result /= std::filesystem::temp_directory_path();
result /= oss.str();
return result.string();
}
class TemporaryFile
{
private:
std::string m_path;
public:
// Create a temporary file with a randomly generated path, containing 'contents'.
2022-07-05 00:20:58 +08:00
TemporaryFile(const std::string& contents) : m_path(getTemporaryFilePath())
2022-06-26 01:54:57 +08:00
{
std::ofstream ofs(m_path);
assert(ofs);
ofs << contents;
assert(ofs);
}
// Close and delete the generated file.
~TemporaryFile()
{
[[maybe_unused]] const bool removed = std::filesystem::remove(m_path);
assert(removed);
}
// Prevent copies.
TemporaryFile(const TemporaryFile&) = delete;
2022-06-26 01:54:57 +08:00
TemporaryFile& operator=(const TemporaryFile&) = delete;
// Return the randomly generated path.
const std::string& getPath() const
{
return m_path;
}
};
TEST_CASE("sf::FileInputStream class - [system]")
{
SUBCASE("Empty stream")
{
sf::FileInputStream fis;
CHECK(fis.read(nullptr, 0) == -1);
CHECK(fis.seek(0) == -1);
CHECK(fis.tell() == -1);
}
SUBCASE("Temporary file stream")
{
const std::string fileContents = "hello world";
2022-07-05 00:20:58 +08:00
TemporaryFile tmpFile(fileContents);
sf::FileInputStream fis;
REQUIRE(fis.open(tmpFile.getPath()));
char buffer[32];
CHECK(fis.read(buffer, 5) == 5);
CHECK(std::string_view(buffer, 5) == std::string_view(fileContents.c_str(), 5));
SUBCASE("Move semantics")
{
sf::FileInputStream fis2 = std::move(fis);
CHECK(fis2.read(buffer, 6) == 6);
CHECK(std::string_view(buffer, 6) == std::string_view(fileContents.c_str() + 5, 6));
}
}
}