2
0
mirror of https://github.com/boostorg/nowide.git synced 2026-02-14 00:42:53 +00:00
Files
nowide/test/test_fstream.cpp
2019-12-28 16:02:31 +01:00

196 lines
5.7 KiB
C++

//
// Copyright (c) 2015 Artyom Beilis (Tonkikh)
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include "test.hpp"
#include <boost/nowide/cstdio.hpp>
#include <boost/nowide/fstream.hpp>
#include <iostream>
int main(int, char **argv)
{
const std::string prefix = argv[0];
std::string example_str = prefix
+ "\xd7\xa9-\xd0\xbc-\xce\xbd"
".txt";
char const *example = example_str.c_str();
try
{
namespace nw = boost::nowide;
std::cout << "Testing fstream" << std::endl;
{
nw::ofstream fo;
fo.open(example);
TEST(fo);
fo << "test" << std::endl;
fo.close();
#ifdef BOOST_WINDOWS
{
FILE *tmp = _wfopen(boost::nowide::widen(example).c_str(), L"r");
TEST(tmp);
TEST(fgetc(tmp) == 't');
TEST(fgetc(tmp) == 'e');
TEST(fgetc(tmp) == 's');
TEST(fgetc(tmp) == 't');
TEST(fgetc(tmp) == '\n');
TEST(fgetc(tmp) == EOF);
fclose(tmp);
}
#endif
{
nw::ifstream fi;
fi.open(example);
TEST(fi);
std::string tmp;
fi >> tmp;
TEST(tmp == "test");
fi.close();
}
{
nw::ifstream fi(example);
TEST(fi);
std::string tmp;
fi >> tmp;
TEST(tmp == "test");
fi.close();
}
#if defined(BOOST_WINDOWS) || defined(BOOST_NOWIDE_FSTREAM_TESTS)
// C++11 interfaces aren't enabled at all platforms so need to skip
// for std::*fstream
{
std::string name = example;
nw::ifstream fi(name);
TEST(fi);
std::string tmp;
fi >> tmp;
TEST(tmp == "test");
fi.close();
}
{
nw::ifstream fi;
fi.open(std::string(example));
TEST(fi);
std::string tmp;
fi >> tmp;
TEST(tmp == "test");
fi.close();
}
#endif
{
nw::ifstream fi(example, std::ios::binary);
TEST(fi);
std::string tmp;
fi >> tmp;
TEST(tmp == "test");
fi.close();
}
{
nw::ifstream fi;
nw::remove(example);
fi.open(example);
TEST(!fi);
}
{
nw::fstream f(example, nw::fstream::in | nw::fstream::out | nw::fstream::trunc | nw::fstream::binary);
TEST(f);
f << "test2";
std::string tmp;
f.seekg(0);
f >> tmp;
TEST(tmp == "test2");
f.close();
}
{
nw::ifstream fi(example, nw::fstream::ate | nw::fstream::binary);
TEST(fi);
TEST(fi.tellg() == std::streampos(5));
fi.seekg(-2, std::ios_base::cur);
std::string tmp;
fi >> tmp;
TEST(tmp == "t2");
fi.close();
}
nw::remove(example);
}
for(int i = -1; i < 16; i++)
{
std::cout << "Complex io with buffer = " << i << std::endl;
char buf[16];
nw::fstream f;
if(i == 0)
f.rdbuf()->pubsetbuf(0, 0);
else if(i > 0)
f.rdbuf()->pubsetbuf(buf, i);
f.open(example, nw::fstream::in | nw::fstream::out | nw::fstream::trunc | nw::fstream::binary);
f.put('a');
f.put('b');
f.put('c');
f.put('d');
f.put('e');
f.put('f');
f.put('g');
f.seekg(0);
TEST(f.get() == 'a');
f.seekg(1, std::ios::cur);
TEST(f.get() == 'c');
f.seekg(-1, std::ios::cur);
TEST(f.get() == 'c');
TEST(f.seekg(1));
f.put('B');
TEST(f.flush()); // Flush or seek needed when changing out->in
TEST(f.get() == 'c');
TEST(f.seekg(1));
TEST(f.get() == 'B');
f.seekg(2);
f.put('C');
TEST(f.seekg(3)); // Flush or seek needed when changing out->in
TEST(f.get() == 'd');
f.seekg(0);
TEST(f.get() == 'a');
TEST(f.get() == 'B');
TEST(f.get() == 'C');
TEST(f.get() == 'd');
TEST(f.get() == 'e');
TEST(f.putback('e'));
TEST(f.putback('d'));
TEST(f.get() == 'd');
TEST(f.get() == 'e');
TEST(f.get() == 'f');
TEST(f.get() == 'g');
TEST(f.get() == EOF);
f.clear();
f.seekg(1);
TEST(f.get() == 'B');
TEST(f.putback('B'));
#if !defined(_LIBCPP_VERSION)
// libc++ fails this putback
TEST(f.putback('a'));
TEST(!f.putback('x'));
#endif
f.close();
TEST(boost::nowide::remove(example) == 0);
}
} catch(std::exception const &e)
{
std::cerr << e.what() << std::endl;
BOOST_NOWIDE_TEST_RETURN_FAILURE;
}
return boost::report_errors();
}