mxlib
c++ tools for analyzing astronomical data and other tasks by Jared R. Males. [git repo]
Loading...
Searching...
No Matches
fileUtils_test.cpp
Go to the documentation of this file.
1/** \file fileUtils_test.cpp
2 */
3#include "../../catch2/catch.hpp"
4
5#define MX_NO_ERROR_REPORTS
6
7#include <fstream>
8#include "../../../include/ioutils/fileUtils.hpp"
9
10#undef ioutils_fileUtils_hpp
11#define MXLIBTEST_NAMESPACE MXLIBTEST_DIREXISTSIS_ISEXISTSERR_ns
12#define MXLIBTEST_DIREXISTSIS_ISEXISTSERR
13#include "../../../include/ioutils/fileUtils.hpp"
14#undef MXLIBTEST_NAMESPACE
15#undef MXLIBTEST_DIREXISTSIS_ISEXISTSERR
16
17#undef ioutils_fileUtils_hpp
18#define MXLIBTEST_NAMESPACE MXLIBTEST_DIREXISTSIS_ISDIRERR_ns
19#define MXLIBTEST_DIREXISTSIS_ISDIRERR
20#include "../../../include/ioutils/fileUtils.hpp"
21#undef MXLIBTEST_NAMESPACE
22#undef MXLIBTEST_DIREXISTSIS_ISDIRERR
23
24namespace unitTest
25{
26namespace ioutilsTest
27{
28namespace fileUtilsTest
29{
30
31/// Checking existence and whether or not a path is a directory
32/**
33 * \ingroup fileUtils_unit_tests
34 */
35TEST_CASE( "Checking existence and whether or not a path is a directory", "[ioutils::fileUtils]" )
36{
37 SECTION( "directory exists and is a directory" )
38 {
39 std::filesystem::create_directories( "/tmp/fileUtils_test/dir_is_exists/" );
40
41 mx::error_t errc;
42 bool isdir = mx::ioutils::dir_exists_is( "/tmp/fileUtils_test/dir_is_exists/", errc );
43
44 REQUIRE( errc == mx::error_t::noerror );
45 REQUIRE( isdir == true );
46 }
47
48 SECTION( "directory does not exist" )
49 {
50 mx::error_t errc;
51 bool isdir = mx::ioutils::dir_exists_is( "/tmp/fileUtils_test/dir_is_exists0/", errc );
52
53 REQUIRE( errc == mx::error_t::noerror );
54 REQUIRE( isdir == false );
55 }
56
57 SECTION( "directory is a file does not exist" )
58 {
59 std::filesystem::create_directories( "/tmp/fileUtils_test/dir_is_exists/" );
60 std::ofstream fout;
61 fout.open( "/tmp/fileUtils_test/dir_is_exists/test.txt" );
62 fout << "test";
63 fout.close();
64
65 mx::error_t errc;
66 bool isdir = mx::ioutils::dir_exists_is( "/tmp/fileUtils_test/dir_is_exists/test.txt", errc );
67
68 REQUIRE( errc == mx::error_t::noerror );
69 REQUIRE( isdir == false );
70 }
71
72 SECTION( "error from exists" )
73 {
74 mx::error_t errc;
75 bool isdir =
76 mx::ioutils::MXLIBTEST_DIREXISTSIS_ISEXISTSERR_ns::dir_exists_is( "/tmp/fileUtils_test/dir_is_exists/",
77 errc );
78
79 REQUIRE( errc == mx::error_t::eexist );
80 REQUIRE( isdir == false );
81 }
82
83 SECTION( "error from is_directory" )
84 {
85 mx::error_t errc;
86 bool isdir =
87 mx::ioutils::MXLIBTEST_DIREXISTSIS_ISDIRERR_ns::dir_exists_is( "/tmp/fileUtils_test/dir_is_exists/", errc );
88
89 REQUIRE( errc == mx::error_t::eacces );
90 REQUIRE( isdir == false );
91 }
92}
93
94/// Verify creation of sequential file names
95/**
96 * \ingroup fileUtils_unit_tests
97 */
98TEST_CASE( "creating sequential filenames", "[ioutils::fileUtils]" )
99{
100 SECTION( "a varying numbers of digits desired" )
101 {
102 SECTION( "default 4 digits, starting at 0" )
103 {
104 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test" );
105 REQUIRE( fname == "base0000.test" );
106 }
107
108 SECTION( "default 4 digits, starting at 1" )
109 {
110 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 1 );
111 REQUIRE( fname == "base0001.test" );
112 }
113
114 SECTION( "default 7 digits, starting at 0" )
115 {
116 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 0, 7 );
117 REQUIRE( fname == "base0000000.test" );
118 }
119
120 SECTION( "default 7 digits, starting at 1" )
121 {
122 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 1, 7 );
123 REQUIRE( fname == "base0000001.test" );
124 }
125
126 SECTION( "default 12 digits, starting at 0" )
127 {
128 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 0, 12 );
129 REQUIRE( fname == "base000000000000.test" );
130 }
131
132 SECTION( "default 12 digits, starting at 1" )
133 {
134 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 1, 12 );
135 REQUIRE( fname == "base000000000001.test" );
136 }
137 }
138}
139
140void createfiles( const std::string &basedir )
141{
142 std::filesystem::create_directories( basedir );
143
144 std::ofstream fout;
145
146 fout.open( basedir + "/file_txt_1.txt" );
147 fout.close();
148 fout.open( basedir + "/file_xtx_2.txt" );
149 fout.close();
150 fout.open( basedir + "/elif_txt_3.txt" );
151 fout.close();
152 fout.open( basedir + "/file_xtx_4.txt" );
153 fout.close();
154 fout.open( basedir + "/elif_txt_5.txt" );
155 fout.close();
156 fout.open( basedir + "/elif_xtx_1.xxx" );
157 fout.close();
158 fout.open( basedir + "/elif_txt_2.xxx" );
159 fout.close();
160 fout.open( basedir + "/file_xtx_3.xxx" );
161 fout.close();
162 fout.open( basedir + "/elif_txt_4.xxx" );
163 fout.close();
164 fout.open( basedir + "/file_xtx_5.xxx" );
165 fout.close();
166}
167
168/// Getting a list of files
169/**
170 * Tests that files are read according to the specification and sorted. Also tests basic errors.
171 *
172 * \ingroup fileUtils_unit_tests
173 */
174TEST_CASE( "Getting a list of files", "[ioutils::fileUtils]" )
175{
176 std::string basedir = "/tmp/fileUtils_test/dir";
177 createfiles( basedir );
178
179 SECTION( "a directory with files of various type and names" )
180 {
181 SECTION( "directory only" )
182 {
183 std::vector<std::string> fnames;
184 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", "" );
185
186 REQUIRE( errc == mx::error_t::noerror );
187 REQUIRE( fnames.size() == 10 );
188 }
189
190 SECTION( "single extension with ." )
191 {
192 std::vector<std::string> fnames;
193 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", ".txt" );
194
195 REQUIRE( errc == mx::error_t::noerror );
196 REQUIRE( fnames.size() == 5 );
197 REQUIRE( fnames[0] == basedir + "/elif_txt_3.txt" );
198 REQUIRE( fnames[1] == basedir + "/elif_txt_5.txt" );
199 REQUIRE( fnames[2] == basedir + "/file_txt_1.txt" );
200 REQUIRE( fnames[3] == basedir + "/file_xtx_2.txt" );
201 REQUIRE( fnames[4] == basedir + "/file_xtx_4.txt" );
202 }
203
204 SECTION( "single extension without ." )
205 {
206 std::vector<std::string> fnames;
207 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", "txt" );
208
209 REQUIRE( errc == mx::error_t::noerror );
210 REQUIRE( fnames.size() == 5 );
211 REQUIRE( fnames[0] == basedir + "/elif_txt_3.txt" );
212 REQUIRE( fnames[1] == basedir + "/elif_txt_5.txt" );
213 REQUIRE( fnames[2] == basedir + "/file_txt_1.txt" );
214 REQUIRE( fnames[3] == basedir + "/file_xtx_2.txt" );
215 REQUIRE( fnames[4] == basedir + "/file_xtx_4.txt" );
216 }
217
218 SECTION( "different extension with ." )
219 {
220 std::vector<std::string> fnames;
221 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", ".xxx" );
222
223 REQUIRE( errc == mx::error_t::noerror );
224 REQUIRE( fnames.size() == 5 );
225 REQUIRE( fnames[0] == basedir + "/elif_txt_2.xxx" );
226 REQUIRE( fnames[1] == basedir + "/elif_txt_4.xxx" );
227 REQUIRE( fnames[2] == basedir + "/elif_xtx_1.xxx" );
228 REQUIRE( fnames[3] == basedir + "/file_xtx_3.xxx" );
229 REQUIRE( fnames[4] == basedir + "/file_xtx_5.xxx" );
230 }
231
232 SECTION( "a prefix, no extension" )
233 {
234 std::vector<std::string> fnames;
235 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "", "" );
236
237 REQUIRE( errc == mx::error_t::noerror );
238 REQUIRE( fnames.size() == 5 );
239 REQUIRE( fnames[0] == basedir + "/file_txt_1.txt" );
240 REQUIRE( fnames[1] == basedir + "/file_xtx_2.txt" );
241 REQUIRE( fnames[2] == basedir + "/file_xtx_3.xxx" );
242 REQUIRE( fnames[3] == basedir + "/file_xtx_4.txt" );
243 REQUIRE( fnames[4] == basedir + "/file_xtx_5.xxx" );
244 }
245
246 SECTION( "a prefix, with extension with ." )
247 {
248 std::vector<std::string> fnames;
249 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "", ".txt" );
250
251 REQUIRE( errc == mx::error_t::noerror );
252 REQUIRE( fnames.size() == 3 );
253 REQUIRE( fnames[0] == basedir + "/file_txt_1.txt" );
254 REQUIRE( fnames[1] == basedir + "/file_xtx_2.txt" );
255 REQUIRE( fnames[2] == basedir + "/file_xtx_4.txt" );
256 }
257
258 SECTION( "a substr alone" )
259 {
260 std::vector<std::string> fnames;
261 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "xtx", "" );
262
263 REQUIRE( errc == mx::error_t::noerror );
264 REQUIRE( fnames.size() == 5 );
265 REQUIRE( fnames[0] == basedir + "/elif_xtx_1.xxx" );
266 REQUIRE( fnames[1] == basedir + "/file_xtx_2.txt" );
267 REQUIRE( fnames[2] == basedir + "/file_xtx_3.xxx" );
268 REQUIRE( fnames[3] == basedir + "/file_xtx_4.txt" );
269 REQUIRE( fnames[4] == basedir + "/file_xtx_5.xxx" );
270 }
271
272 SECTION( "a substr which is actually the prefix" )
273 {
274 std::vector<std::string> fnames;
275 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "file", "" );
276
277 REQUIRE( errc == mx::error_t::noerror );
278 REQUIRE( fnames.size() == 0 );
279 }
280
281 SECTION( "a prefix and a substr which is actually the prefix" )
282 {
283 std::vector<std::string> fnames;
284 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "file", "" );
285
286 REQUIRE( errc == mx::error_t::noerror );
287 REQUIRE( fnames.size() == 0 );
288 }
289
290 SECTION( "a prefix, and a substr, no extension" )
291 {
292 std::vector<std::string> fnames;
293 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "xtx", "" );
294
295 REQUIRE( errc == mx::error_t::noerror );
296 REQUIRE( fnames.size() == 4 );
297 REQUIRE( fnames[0] == basedir + "/file_xtx_2.txt" );
298 REQUIRE( fnames[1] == basedir + "/file_xtx_3.xxx" );
299 REQUIRE( fnames[2] == basedir + "/file_xtx_4.txt" );
300 REQUIRE( fnames[3] == basedir + "/file_xtx_5.xxx" );
301 }
302
303 SECTION( "a prefix, a substr, and an extension with ." )
304 {
305 std::vector<std::string> fnames;
306 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "xtx", ".txt" );
307
308 REQUIRE( errc == mx::error_t::noerror );
309 REQUIRE( fnames.size() == 2 );
310 REQUIRE( fnames[0] == basedir + "/file_xtx_2.txt" );
311 REQUIRE( fnames[1] == basedir + "/file_xtx_4.txt" );
312 }
313 }
314
315 SECTION( "a directory which does not exist" )
316 {
317 std::vector<std::string> fnames;
318 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir + "nf", "file", "xtx", ".txt" );
319
320 REQUIRE( errc == mx::error_t::dirnotfound );
321 }
322
323 SECTION( "a directory which is a file" )
324 {
325 std::vector<std::string> fnames;
326 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
327
328 REQUIRE( errc == mx::error_t::invalidarg );
329 }
330
331 SECTION( "a directory which does not exist, verbose = vv" )
332 {
333 std::vector<std::string> fnames;
334 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::vv>( fnames, basedir + "nf", "file", "xtx", ".txt" );
335
336 REQUIRE( errc == mx::error_t::dirnotfound );
337 }
338
339 SECTION( "a directory which is a file, verbose = vv" )
340 {
341 std::vector<std::string> fnames;
342 mx::error_t errc =
343 mx::ioutils::getFileNames<mx::verbose::vv>( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
344
345 REQUIRE( errc == mx::error_t::invalidarg );
346 }
347
348 SECTION( "a directory which does not exist, verbose = v" )
349 {
350 std::vector<std::string> fnames;
351 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::v>( fnames, basedir + "nf", "file", "xtx", ".txt" );
352
353 REQUIRE( errc == mx::error_t::dirnotfound );
354 }
355
356 SECTION( "a directory which is a file, verbose = v" )
357 {
358 std::vector<std::string> fnames;
359 mx::error_t errc =
360 mx::ioutils::getFileNames<mx::verbose::v>( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
361
362 REQUIRE( errc == mx::error_t::invalidarg );
363 }
364
365 SECTION( "a directory which does not exist, verbose = o" )
366 {
367 std::vector<std::string> fnames;
368 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::o>( fnames, basedir + "nf", "file", "xtx", ".txt" );
369
370 REQUIRE( errc == mx::error_t::dirnotfound );
371 }
372
373 SECTION( "a directory which is a file, verbose = o" )
374 {
375 std::vector<std::string> fnames;
376 mx::error_t errc =
377 mx::ioutils::getFileNames<mx::verbose::o>( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
378
379 REQUIRE( errc == mx::error_t::invalidarg );
380 }
381}
382
383} // namespace fileUtilsTest
384} // namespace ioutilsTest
385} // namespace unitTest
error_t
The mxlib error codes.
Definition error_t.hpp:26
@ noerror
No error has occurred.
@ eexist
File exists (EEXIST)
@ dirnotfound
The directory was not found.
@ eacces
Permission denied (EACCES)
@ invalidarg
An argument was invalid.
TEST_CASE("Checking existence and whether or not a path is a directory", "[ioutils::fileUtils]")
Checking existence and whether or not a path is a directory.
error_t getFileNames(std::vector< std::string > &fileNames, const std::string &directory, const std::string &prefix, const std::string &substr, const std::string &extension)
Get a list of file names from the specified directory, specifying a prefix, a substring to match,...
std::string getSequentialFilename(const std::string &basename, const std::string &extension="", const int startat=0, int ndigit=4)
Get the next file in a numbered sequence.
bool dir_exists_is(const std::string &dir, mx::error_t &errc)
Check if a path exists and is a directory.