189 lines
4.1 KiB
C++
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);
|
|
}
|