1 //
2 // Copyright (c) 2019 Alexander Grund
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //
8
9 #include <boost/nowide/config.hpp>
10
11 #include <boost/nowide/fstream.hpp>
12
13 #include <boost/nowide/cstdio.hpp>
14 #include <iterator>
15 #include <utility>
16
17 #include "test.hpp"
18
19 namespace nw = boost::nowide;
20
create_file(const std::string & filename,const std::string & contents)21 void create_file(const std::string& filename, const std::string& contents)
22 {
23 nw::ofstream f(filename, std::ios::trunc);
24 TEST(f << contents);
25 }
26
27 template<typename T>
get_file_contents(T & stream)28 std::string get_file_contents(T& stream)
29 {
30 TEST(stream);
31 std::string s((std::istreambuf_iterator<char>(stream)), std::istreambuf_iterator<char>());
32 return s;
33 }
34
get_file_contents(const std::string & filename)35 std::string get_file_contents(const std::string& filename)
36 {
37 nw::ifstream f(filename);
38 return get_file_contents(f);
39 }
40
make_ifstream(const std::string & filename)41 nw::ifstream make_ifstream(const std::string& filename)
42 {
43 nw::ifstream f(filename);
44 TEST(f);
45 std::string s;
46 TEST(f >> s);
47 TEST(s == "Hello");
48 return f;
49 }
50
test_ifstream(const std::string & filename)51 void test_ifstream(const std::string& filename)
52 {
53 create_file(filename, "Hello\nWorld");
54 // Move construct
55 {
56 nw::ifstream f = make_ifstream(filename);
57 TEST(f);
58 std::string s;
59 TEST(f >> s);
60 TEST(s == "World");
61 }
62 // Move assign
63 {
64 nw::ifstream f;
65 {
66 nw::ifstream f2 = make_ifstream(filename);
67 f = std::move(f2);
68 }
69 TEST(f);
70 std::string s;
71 TEST(f >> s);
72 TEST(s == "World");
73 }
74 // Swap
75 {
76 nw::ifstream f;
77 {
78 nw::ifstream f2 = make_ifstream(filename);
79 swap(f, f2);
80 TEST(!f2.is_open());
81 }
82 TEST(f);
83 std::string s;
84 TEST(f >> s);
85 TEST(s == "World");
86 }
87 TEST(nw::remove(filename.c_str()) == 0);
88 }
89
make_ofstream(const std::string & filename)90 nw::ofstream make_ofstream(const std::string& filename)
91 {
92 nw::ofstream f(filename);
93 TEST(f);
94 TEST(f << "Hello");
95 return f;
96 }
97
test_ofstream(const std::string & filename)98 void test_ofstream(const std::string& filename)
99 {
100 // Move construct
101 {
102 nw::ofstream f = make_ofstream(filename);
103 TEST(f);
104 TEST(f << " world");
105 f.close();
106 TEST(get_file_contents(filename) == "Hello world");
107 }
108 // Move assign
109 {
110 nw::ofstream f;
111 {
112 nw::ofstream f2 = make_ofstream(filename);
113 f = std::move(f2);
114 }
115 TEST(f);
116 TEST(f << " world");
117 f.close();
118 TEST(get_file_contents(filename) == "Hello world");
119 }
120 // Swap
121 {
122 nw::ofstream f;
123 {
124 nw::ofstream f2 = make_ofstream(filename);
125 swap(f, f2);
126 TEST(!f2.is_open());
127 }
128 TEST(f);
129 TEST(f << " world");
130 f.close();
131 TEST(get_file_contents(filename) == "Hello world");
132 }
133 TEST(nw::remove(filename.c_str()) == 0);
134 }
135
make_fstream(const std::string & filename)136 nw::fstream make_fstream(const std::string& filename)
137 {
138 create_file(filename, "");
139 nw::fstream f(filename);
140 TEST(f << "Hello");
141 return f;
142 }
143
test_fstream(const std::string & filename)144 void test_fstream(const std::string& filename)
145 {
146 // Move construct
147 {
148 nw::fstream f = make_fstream(filename);
149 TEST(f);
150 TEST(f << " world");
151 f.seekg(0);
152 TEST(get_file_contents(f) == "Hello world");
153 }
154 // Move assign
155 {
156 nw::fstream f;
157 {
158 nw::fstream f2 = make_fstream(filename);
159 f = std::move(f2);
160 }
161 TEST(f);
162 TEST(f << " world");
163 f.seekg(0);
164 TEST(get_file_contents(f) == "Hello world");
165 }
166 // Swap
167 {
168 nw::fstream f;
169 {
170 nw::fstream f2 = make_fstream(filename);
171 swap(f, f2);
172 TEST(!f2.is_open());
173 }
174 TEST(f);
175 TEST(f << " world");
176 f.seekg(0);
177 TEST(get_file_contents(f) == "Hello world");
178 }
179 TEST(nw::remove(filename.c_str()) == 0);
180 }
181
test_main(int,char ** argv,char **)182 void test_main(int, char** argv, char**)
183 {
184 const std::string exampleFilename = std::string(argv[0]) + "-\xd7\xa9-\xd0\xbc-\xce\xbd.txt";
185 test_ifstream(exampleFilename);
186 test_ofstream(exampleFilename);
187 test_fstream(exampleFilename);
188 }
189