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 "../../../include/ioutils/fileUtils.hpp"
8
9/** Verify creation of sequential file names
10 *
11 * \anchor tests_ioutils_fileUtils_getSequentialFilename
12 */
13SCENARIO( "creating sequential filenames", "[ioutils::fileUtils]" )
14{
15 GIVEN( "a varying numbers of digits desired" )
16 {
17 WHEN( "default 4 digits, starting at 0" )
18 {
19 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test" );
20 REQUIRE( fname == "base0000.test" );
21 }
22
23 WHEN( "default 4 digits, starting at 1" )
24 {
25 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 1 );
26 REQUIRE( fname == "base0001.test" );
27 }
28
29 WHEN( "default 7 digits, starting at 0" )
30 {
31 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 0, 7 );
32 REQUIRE( fname == "base0000000.test" );
33 }
34
35 WHEN( "default 7 digits, starting at 1" )
36 {
37 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 1, 7 );
38 REQUIRE( fname == "base0000001.test" );
39 }
40
41 WHEN( "default 12 digits, starting at 0" )
42 {
43 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 0, 12 );
44 REQUIRE( fname == "base000000000000.test" );
45 }
46
47 WHEN( "default 12 digits, starting at 1" )
48 {
49 std::string fname = mx::ioutils::getSequentialFilename( "base", ".test", 1, 12 );
50 REQUIRE( fname == "base000000000001.test" );
51 }
52 }
53}
54
55#include <fstream>
56#include <filesystem>
57
58void createfiles( const std::string &basedir )
59{
60 std::filesystem::create_directories( basedir );
61
62 std::ofstream fout;
63
64 fout.open( basedir + "/file_txt_1.txt" );
65 fout.close();
66 fout.open( basedir + "/file_xtx_2.txt" );
67 fout.close();
68 fout.open( basedir + "/elif_txt_3.txt" );
69 fout.close();
70 fout.open( basedir + "/file_xtx_4.txt" );
71 fout.close();
72 fout.open( basedir + "/elif_txt_5.txt" );
73 fout.close();
74 fout.open( basedir + "/elif_xtx_1.xxx" );
75 fout.close();
76 fout.open( basedir + "/elif_txt_2.xxx" );
77 fout.close();
78 fout.open( basedir + "/file_xtx_3.xxx" );
79 fout.close();
80 fout.open( basedir + "/elif_txt_4.xxx" );
81 fout.close();
82 fout.open( basedir + "/file_xtx_5.xxx" );
83 fout.close();
84}
85
86/** \test Scenario: Getting a list of files
87 *
88 * Tests that files are read according to the specification and sorted. Also tests basic errors.
89 *
90 * \anchor tests_ioutils_fileUtils_getFileNames
91 */
92SCENARIO( "Getting a list of files", "[ioutils::fileUtils]" )
93{
94 std::string basedir = "/tmp/fileUtils_test/dir";
95 createfiles( basedir );
96
97 GIVEN( "a directory with files of various type and names" )
98 {
99 WHEN( "directory only" )
100 {
101 std::vector<std::string> fnames;
102 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", "" );
103
104 REQUIRE( errc == mx::error_t::noerror );
105 REQUIRE( fnames.size() == 10 );
106 }
107
108 WHEN( "single extension with ." )
109 {
110 std::vector<std::string> fnames;
111 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", ".txt" );
112
113 REQUIRE( errc == mx::error_t::noerror );
114 REQUIRE( fnames.size() == 5 );
115 REQUIRE( fnames[0] == basedir + "/elif_txt_3.txt" );
116 REQUIRE( fnames[1] == basedir + "/elif_txt_5.txt" );
117 REQUIRE( fnames[2] == basedir + "/file_txt_1.txt" );
118 REQUIRE( fnames[3] == basedir + "/file_xtx_2.txt" );
119 REQUIRE( fnames[4] == basedir + "/file_xtx_4.txt" );
120 }
121
122 WHEN( "single extension without ." )
123 {
124 std::vector<std::string> fnames;
125 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", "txt" );
126
127 REQUIRE( errc == mx::error_t::noerror );
128 REQUIRE( fnames.size() == 5 );
129 REQUIRE( fnames[0] == basedir + "/elif_txt_3.txt" );
130 REQUIRE( fnames[1] == basedir + "/elif_txt_5.txt" );
131 REQUIRE( fnames[2] == basedir + "/file_txt_1.txt" );
132 REQUIRE( fnames[3] == basedir + "/file_xtx_2.txt" );
133 REQUIRE( fnames[4] == basedir + "/file_xtx_4.txt" );
134 }
135
136 WHEN( "different extension with ." )
137 {
138 std::vector<std::string> fnames;
139 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "", ".xxx" );
140
141 REQUIRE( errc == mx::error_t::noerror );
142 REQUIRE( fnames.size() == 5 );
143 REQUIRE( fnames[0] == basedir + "/elif_txt_2.xxx" );
144 REQUIRE( fnames[1] == basedir + "/elif_txt_4.xxx" );
145 REQUIRE( fnames[2] == basedir + "/elif_xtx_1.xxx" );
146 REQUIRE( fnames[3] == basedir + "/file_xtx_3.xxx" );
147 REQUIRE( fnames[4] == basedir + "/file_xtx_5.xxx" );
148 }
149
150 WHEN( "a prefix, no extension" )
151 {
152 std::vector<std::string> fnames;
153 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "", "" );
154
155 REQUIRE( errc == mx::error_t::noerror );
156 REQUIRE( fnames.size() == 5 );
157 REQUIRE( fnames[0] == basedir + "/file_txt_1.txt" );
158 REQUIRE( fnames[1] == basedir + "/file_xtx_2.txt" );
159 REQUIRE( fnames[2] == basedir + "/file_xtx_3.xxx" );
160 REQUIRE( fnames[3] == basedir + "/file_xtx_4.txt" );
161 REQUIRE( fnames[4] == basedir + "/file_xtx_5.xxx" );
162 }
163
164 WHEN( "a prefix, with extension with ." )
165 {
166 std::vector<std::string> fnames;
167 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "", ".txt" );
168
169 REQUIRE( errc == mx::error_t::noerror );
170 REQUIRE( fnames.size() == 3 );
171 REQUIRE( fnames[0] == basedir + "/file_txt_1.txt" );
172 REQUIRE( fnames[1] == basedir + "/file_xtx_2.txt" );
173 REQUIRE( fnames[2] == basedir + "/file_xtx_4.txt" );
174 }
175
176 WHEN( "a substr alone" )
177 {
178 std::vector<std::string> fnames;
179 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "xtx", "" );
180
181 REQUIRE( errc == mx::error_t::noerror );
182 REQUIRE( fnames.size() == 5 );
183 REQUIRE( fnames[0] == basedir + "/elif_xtx_1.xxx" );
184 REQUIRE( fnames[1] == basedir + "/file_xtx_2.txt" );
185 REQUIRE( fnames[2] == basedir + "/file_xtx_3.xxx" );
186 REQUIRE( fnames[3] == basedir + "/file_xtx_4.txt" );
187 REQUIRE( fnames[4] == basedir + "/file_xtx_5.xxx" );
188 }
189
190 WHEN( "a substr which is actually the prefix" )
191 {
192 std::vector<std::string> fnames;
193 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "", "file", "" );
194
195 REQUIRE( errc == mx::error_t::noerror );
196 REQUIRE( fnames.size() == 0 );
197 }
198
199 WHEN( "a prefix and a substr which is actually the prefix" )
200 {
201 std::vector<std::string> fnames;
202 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "file", "" );
203
204 REQUIRE( errc == mx::error_t::noerror );
205 REQUIRE( fnames.size() == 0 );
206 }
207
208 WHEN( "a prefix, and a substr, no extension" )
209 {
210 std::vector<std::string> fnames;
211 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "xtx", "" );
212
213 REQUIRE( errc == mx::error_t::noerror );
214 REQUIRE( fnames.size() == 4 );
215 REQUIRE( fnames[0] == basedir + "/file_xtx_2.txt" );
216 REQUIRE( fnames[1] == basedir + "/file_xtx_3.xxx" );
217 REQUIRE( fnames[2] == basedir + "/file_xtx_4.txt" );
218 REQUIRE( fnames[3] == basedir + "/file_xtx_5.xxx" );
219 }
220
221 WHEN( "a prefix, a substr, and an extension with ." )
222 {
223 std::vector<std::string> fnames;
224 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir, "file", "xtx", ".txt" );
225
226 REQUIRE( errc == mx::error_t::noerror );
227 REQUIRE( fnames.size() == 2 );
228 REQUIRE( fnames[0] == basedir + "/file_xtx_2.txt" );
229 REQUIRE( fnames[1] == basedir + "/file_xtx_4.txt" );
230 }
231 }
232
233 GIVEN( "a directory which does not exist" )
234 {
235 std::vector<std::string> fnames;
236 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir + "nf", "file", "xtx", ".txt" );
237
238 REQUIRE( errc == mx::error_t::dirnotfound );
239 }
240
241 GIVEN( "a directory which is a file" )
242 {
243 std::vector<std::string> fnames;
244 mx::error_t errc = mx::ioutils::getFileNames( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
245
246 REQUIRE( errc == mx::error_t::invalidarg );
247 }
248
249 GIVEN( "a directory which does not exist, verbose = vv" )
250 {
251 std::vector<std::string> fnames;
252 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::vv>( fnames, basedir + "nf", "file", "xtx", ".txt" );
253
254 REQUIRE( errc == mx::error_t::dirnotfound );
255 }
256
257 GIVEN( "a directory which is a file, verbose = vv" )
258 {
259 std::vector<std::string> fnames;
260 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::vv>( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
261
262 REQUIRE( errc == mx::error_t::invalidarg );
263 }
264
265 GIVEN( "a directory which does not exist, verbose = v" )
266 {
267 std::vector<std::string> fnames;
268 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::v>( fnames, basedir + "nf", "file", "xtx", ".txt" );
269
270 REQUIRE( errc == mx::error_t::dirnotfound );
271 }
272
273 GIVEN( "a directory which is a file, verbose = v" )
274 {
275 std::vector<std::string> fnames;
276 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::v>( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
277
278 REQUIRE( errc == mx::error_t::invalidarg );
279 }
280
281 GIVEN( "a directory which does not exist, verbose = o" )
282 {
283 std::vector<std::string> fnames;
284 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::o>( fnames, basedir + "nf", "file", "xtx", ".txt" );
285
286 REQUIRE( errc == mx::error_t::dirnotfound );
287 }
288
289 GIVEN( "a directory which is a file, verbose = o" )
290 {
291 std::vector<std::string> fnames;
292 mx::error_t errc = mx::ioutils::getFileNames<mx::verbose::o>( fnames, basedir + "/file_xtx_2.txt", "file", "xtx", ".txt" );
293
294 REQUIRE( errc == mx::error_t::invalidarg );
295 }
296}
SCENARIO("creating sequential filenames", "[ioutils::fileUtils]")
error_t
The mxlib error codes.
Definition error_t.hpp:20
@ noerror
No error has occurred.
@ dirnotfound
The directory was not found.
@ invalidarg
An argument was invalid.
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.