Commit 3061782d3ffcd9b49fa3c7ac1d33f5c2340fbd91
1 parent
fb16cb93
Adding check for Nonexistent
Showing
2 changed files
with
40 additions
and
2 deletions
include/CLI.hpp
| ... | ... | @@ -115,8 +115,11 @@ bool _ExistingDirectory(std::string filename) { |
| 115 | 115 | } |
| 116 | 116 | |
| 117 | 117 | bool _NonexistentPath(std::string filename) { |
| 118 | + std::cout << "Validating: " << filename << std::endl; | |
| 118 | 119 | struct stat buffer; |
| 119 | - return stat(filename.c_str(), &buffer) != 0; | |
| 120 | + bool out = stat(filename.c_str(), &buffer) != 0; | |
| 121 | + std::cout << (out ? "Passed" : "Failed") << std::endl; | |
| 122 | + return out; | |
| 120 | 123 | } |
| 121 | 124 | |
| 122 | 125 | struct Error : public std::runtime_error { |
| ... | ... | @@ -235,6 +238,12 @@ public: |
| 235 | 238 | |
| 236 | 239 | /// Process the callback |
| 237 | 240 | bool run_callback() const { |
| 241 | + if(opts.validators.size()>0) { | |
| 242 | + for(const std::string & result : flatten_results()) | |
| 243 | + for(const std::function<bool(std::string)> &vali : opts.validators) | |
| 244 | + if(!vali(result)) | |
| 245 | + return false; | |
| 246 | + } | |
| 238 | 247 | return callback(results); |
| 239 | 248 | } |
| 240 | 249 | |
| ... | ... | @@ -315,6 +324,13 @@ public: |
| 315 | 324 | return out.str(); |
| 316 | 325 | } |
| 317 | 326 | |
| 327 | + std::vector<std::string> flatten_results() const { | |
| 328 | + std::vector<std::string> output; | |
| 329 | + for(const std::vector<std::string> result : results) | |
| 330 | + output.insert(std::end(output), std::begin(result), std::end(result)); | |
| 331 | + return output; | |
| 332 | + } | |
| 333 | + | |
| 318 | 334 | }; |
| 319 | 335 | |
| 320 | 336 | ... | ... |
tests/CLITest.cpp
| 1 | 1 | |
| 2 | 2 | #include "CLI.hpp" |
| 3 | 3 | #include "gtest/gtest.h" |
| 4 | - | |
| 4 | +#include <fstream> | |
| 5 | 5 | |
| 6 | 6 | typedef std::vector<std::string> input_t; |
| 7 | 7 | |
| ... | ... | @@ -205,6 +205,28 @@ TEST_F(TApp, Reset) { |
| 205 | 205 | } |
| 206 | 206 | |
| 207 | 207 | |
| 208 | +TEST_F(TApp, FileNotExists) { | |
| 209 | + std::string myfile{"TestNonFileNotUsed.txt"}; | |
| 210 | + EXPECT_TRUE(CLI::_NonexistentPath(myfile)); | |
| 211 | + | |
| 212 | + std::string filename; | |
| 213 | + app.add_option("file", filename, "", CLI::NonexistentPath); | |
| 214 | + args = {"--file", myfile}; | |
| 215 | + | |
| 216 | + run(); | |
| 217 | + EXPECT_EQ(myfile, filename); | |
| 218 | + | |
| 219 | + app.reset(); | |
| 220 | + | |
| 221 | + | |
| 222 | + bool ok = static_cast<bool>(std::ofstream(myfile.c_str()).put('a')); // create file | |
| 223 | + EXPECT_TRUE(ok); | |
| 224 | + EXPECT_THROW(run(), CLI::ParseError); | |
| 225 | + | |
| 226 | + std::remove(myfile.c_str()); | |
| 227 | + EXPECT_FALSE(CLI::_ExistingFile(myfile)); | |
| 228 | +} | |
| 229 | + | |
| 208 | 230 | TEST_F(TApp, Basic) { |
| 209 | 231 | auto sub1 = app.add_subcommand("sub1"); |
| 210 | 232 | auto sub2 = app.add_subcommand("sub2"); | ... | ... |