boost/libs/nowide/test/test_fstream_cxx11.cpp
2021-10-05 21:37:46 +02:00

189 lines
4.1 KiB
C++

//
// Copyright (c) 2019 Alexander Grund
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#include <boost/nowide/config.hpp>
#include <boost/nowide/fstream.hpp>
#include <boost/nowide/cstdio.hpp>
#include <iterator>
#include <utility>
#include "test.hpp"
namespace nw = boost::nowide;
void create_file(const std::string& filename, const std::string& contents)
{
nw::ofstream f(filename, std::ios::trunc);
TEST(f << contents);
}
template<typename T>
std::string get_file_contents(T& stream)
{
TEST(stream);
std::string s((std::istreambuf_iterator<char>(stream)), std::istreambuf_iterator<char>());
return s;
}
std::string get_file_contents(const std::string& filename)
{
nw::ifstream f(filename);
return get_file_contents(f);
}
nw::ifstream make_ifstream(const std::string& filename)
{
nw::ifstream f(filename);
TEST(f);
std::string s;
TEST(f >> s);
TEST(s == "Hello");
return f;
}
void test_ifstream(const std::string& filename)
{
create_file(filename, "Hello\nWorld");
// Move construct
{
nw::ifstream f = make_ifstream(filename);
TEST(f);
std::string s;
TEST(f >> s);
TEST(s == "World");
}
// Move assign
{
nw::ifstream f;
{
nw::ifstream f2 = make_ifstream(filename);
f = std::move(f2);
}
TEST(f);
std::string s;
TEST(f >> s);
TEST(s == "World");
}
// Swap
{
nw::ifstream f;
{
nw::ifstream f2 = make_ifstream(filename);
swap(f, f2);
TEST(!f2.is_open());
}
TEST(f);
std::string s;
TEST(f >> s);
TEST(s == "World");
}
TEST(nw::remove(filename.c_str()) == 0);
}
nw::ofstream make_ofstream(const std::string& filename)
{
nw::ofstream f(filename);
TEST(f);
TEST(f << "Hello");
return f;
}
void test_ofstream(const std::string& filename)
{
// Move construct
{
nw::ofstream f = make_ofstream(filename);
TEST(f);
TEST(f << " world");
f.close();
TEST(get_file_contents(filename) == "Hello world");
}
// Move assign
{
nw::ofstream f;
{
nw::ofstream f2 = make_ofstream(filename);
f = std::move(f2);
}
TEST(f);
TEST(f << " world");
f.close();
TEST(get_file_contents(filename) == "Hello world");
}
// Swap
{
nw::ofstream f;
{
nw::ofstream f2 = make_ofstream(filename);
swap(f, f2);
TEST(!f2.is_open());
}
TEST(f);
TEST(f << " world");
f.close();
TEST(get_file_contents(filename) == "Hello world");
}
TEST(nw::remove(filename.c_str()) == 0);
}
nw::fstream make_fstream(const std::string& filename)
{
create_file(filename, "");
nw::fstream f(filename);
TEST(f << "Hello");
return f;
}
void test_fstream(const std::string& filename)
{
// Move construct
{
nw::fstream f = make_fstream(filename);
TEST(f);
TEST(f << " world");
f.seekg(0);
TEST(get_file_contents(f) == "Hello world");
}
// Move assign
{
nw::fstream f;
{
nw::fstream f2 = make_fstream(filename);
f = std::move(f2);
}
TEST(f);
TEST(f << " world");
f.seekg(0);
TEST(get_file_contents(f) == "Hello world");
}
// Swap
{
nw::fstream f;
{
nw::fstream f2 = make_fstream(filename);
swap(f, f2);
TEST(!f2.is_open());
}
TEST(f);
TEST(f << " world");
f.seekg(0);
TEST(get_file_contents(f) == "Hello world");
}
TEST(nw::remove(filename.c_str()) == 0);
}
void test_main(int, char** argv, char**)
{
const std::string exampleFilename = std::string(argv[0]) + "-\xd7\xa9-\xd0\xbc-\xce\xbd.txt";
test_ifstream(exampleFilename);
test_ofstream(exampleFilename);
test_fstream(exampleFilename);
}