mirror of
https://github.com/CLIUtils/CLI11.git
synced 2025-04-29 04:03:52 +00:00
Compare commits
2 Commits
34bfa38691
...
5ecb61599a
Author | SHA1 | Date | |
---|---|---|---|
|
5ecb61599a | ||
|
51a0efcbbc |
2
.github/actions/cmake_config/entrypoint.sh
vendored
2
.github/actions/cmake_config/entrypoint.sh
vendored
@ -10,7 +10,7 @@ rm -rf cmake_dir/* build_tmp/*
|
|||||||
v=$1
|
v=$1
|
||||||
fn=cmake-$v-Linux-x86_64.tar.gz
|
fn=cmake-$v-Linux-x86_64.tar.gz
|
||||||
|
|
||||||
if [ ! -f cmake_souces/$fn ]; then
|
if [ ! -f cmake_sources/$fn ]; then
|
||||||
wget -qO cmake_sources/$fn "https://cmake.org/files/v${v%.*}/$fn"
|
wget -qO cmake_sources/$fn "https://cmake.org/files/v${v%.*}/$fn"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -333,7 +333,7 @@ This is a quick patch release that makes LICENSE part of the single header file,
|
|||||||
|
|
||||||
### Version 1.5.1: Access
|
### Version 1.5.1: Access
|
||||||
|
|
||||||
This patch release adds better access to the App progromatically, to assist with writing custom converters to other formats. It also improves the help output, and uses a new feature in CLI11 1.5 to fix an old "quirk" in the way unlimited options and positionals interact.
|
This patch release adds better access to the App programmatically, to assist with writing custom converters to other formats. It also improves the help output, and uses a new feature in CLI11 1.5 to fix an old "quirk" in the way unlimited options and positionals interact.
|
||||||
|
|
||||||
* Make mixing unlimited positionals and options more intuitive [#102]
|
* Make mixing unlimited positionals and options more intuitive [#102]
|
||||||
* Add missing getters `get_options` and `get_description` to App [#105]
|
* Add missing getters `get_options` and `get_description` to App [#105]
|
||||||
@ -360,7 +360,7 @@ Note: This is the final release with `requires`, please switch to `needs`.
|
|||||||
* Support for `std::optional`, `std::experimental::optional`, and `boost::optional` added if `__has_include` is supported [#95]
|
* Support for `std::optional`, `std::experimental::optional`, and `boost::optional` added if `__has_include` is supported [#95]
|
||||||
* All macros/CMake variables now start with `CLI11_` instead of just `CLI_` [#95]
|
* All macros/CMake variables now start with `CLI11_` instead of just `CLI_` [#95]
|
||||||
* The internal stream was not being cleared before use in some cases. Fixed. [#95]
|
* The internal stream was not being cleared before use in some cases. Fixed. [#95]
|
||||||
* Using an emum now requires explicit conversion overload [#97]
|
* Using an enum now requires explicit conversion overload [#97]
|
||||||
* The separator `--` now is removed when it ends unlimited arguments [#100]
|
* The separator `--` now is removed when it ends unlimited arguments [#100]
|
||||||
|
|
||||||
Other, non-user facing changes:
|
Other, non-user facing changes:
|
||||||
@ -551,7 +551,7 @@ Lots of cleanup and docs additions made it into this release. Parsing is simpler
|
|||||||
## Version 0.3: Plumbum compatibility
|
## Version 0.3: Plumbum compatibility
|
||||||
|
|
||||||
* Added `->requires`, `->excludes`, and `->envname` from [Plumbum](http://plumbum.readthedocs.io/en/latest/)
|
* Added `->requires`, `->excludes`, and `->envname` from [Plumbum](http://plumbum.readthedocs.io/en/latest/)
|
||||||
* Supports `->mandatory` from Plubmum
|
* Supports `->mandatory` from Plumbum
|
||||||
* More tests for help strings, improvements in formatting
|
* More tests for help strings, improvements in formatting
|
||||||
* Support type and set syntax in positionals help strings
|
* Support type and set syntax in positionals help strings
|
||||||
* Added help groups, with `->group("name")` syntax
|
* Added help groups, with `->group("name")` syntax
|
||||||
|
@ -51,7 +51,7 @@ list(APPEND build-docs "EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/docs")
|
|||||||
option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)")
|
option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)")
|
||||||
option(CLI11_SINGLE_FILE "Generate a single header file")
|
option(CLI11_SINGLE_FILE "Generate a single header file")
|
||||||
cmake_dependent_option(CLI11_SANITIZERS
|
cmake_dependent_option(CLI11_SANITIZERS
|
||||||
"Download the sanatizers CMake config" OFF
|
"Download the sanitizers CMake config" OFF
|
||||||
"NOT CMAKE_VERSION VERSION_LESS 3.11" OFF)
|
"NOT CMAKE_VERSION VERSION_LESS 3.11" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(CLI11_BUILD_DOCS
|
cmake_dependent_option(CLI11_BUILD_DOCS
|
||||||
@ -89,7 +89,7 @@ cmake_dependent_option(CLI11_CUDA_TESTS
|
|||||||
cmake_dependent_option(CLI11_CLANG_TIDY
|
cmake_dependent_option(CLI11_CLANG_TIDY
|
||||||
"Look for and use Clang-Tidy" OFF
|
"Look for and use Clang-Tidy" OFF
|
||||||
"CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME;NOT CMAKE_VERSION VERSION_LESS 3.6" OFF)
|
"CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME;NOT CMAKE_VERSION VERSION_LESS 3.6" OFF)
|
||||||
set(CLI11_CLANG_TIDY_OPTIONS "" CACHE STRING "Clang tidy options, such as -fix, simicolon separated")
|
set(CLI11_CLANG_TIDY_OPTIONS "" CACHE STRING "Clang tidy options, such as -fix, semicolon separated")
|
||||||
|
|
||||||
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND NOT DEFINED CMAKE_CXX_STANDARD)
|
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND NOT DEFINED CMAKE_CXX_STANDARD)
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
@ -3,11 +3,11 @@ linelength=120 # As in .clang-format
|
|||||||
|
|
||||||
# Non-used filters
|
# Non-used filters
|
||||||
filter=-build/include_order # Requires unusual include order that encourages creating not self-contained headers
|
filter=-build/include_order # Requires unusual include order that encourages creating not self-contained headers
|
||||||
filter=-readability/nolint # Conficts with clang-tidy
|
filter=-readability/nolint # Conflicts with clang-tidy
|
||||||
filter=-runtime/references # Requires fundamental change of API, don't see need for this
|
filter=-runtime/references # Requires fundamental change of API, don't see need for this
|
||||||
filter=-whitespace/blank_line # Unnecessarily strict with blank lines that otherwise help with readability
|
filter=-whitespace/blank_line # Unnecessarily strict with blank lines that otherwise help with readability
|
||||||
filter=-whitespace/parens,-whitespace/braces # Conflict with clang-format
|
filter=-whitespace/parens,-whitespace/braces # Conflict with clang-format
|
||||||
|
|
||||||
# Filters to be included in future
|
# Filters to be included in future
|
||||||
filter=-whitespace/indent,-whitespace/comments,-readability/braces
|
filter=-whitespace/indent,-whitespace/comments
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ CLI::Option* opt = app.add_flag("--opt");
|
|||||||
CLI11_PARSE(app, argv, argc);
|
CLI11_PARSE(app, argv, argc);
|
||||||
|
|
||||||
if(* opt)
|
if(* opt)
|
||||||
std::cout << "Flag recieved " << opt->count() << " times." << std::endl;
|
std::cout << "Flag received " << opt->count() << " times." << std::endl;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Inheritance of defaults
|
## Inheritance of defaults
|
||||||
|
@ -280,7 +280,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
|
|||||||
# parses. With this tag you can assign which parser to use for a given
|
# parses. With this tag you can assign which parser to use for a given
|
||||||
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
||||||
# using this tag. The format is ext=language, where ext is a file extension, and
|
# using this tag. The format is ext=language, where ext is a file extension, and
|
||||||
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
|
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
|
||||||
# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
|
# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
|
||||||
# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
|
# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
|
||||||
# Fortran. In the later case the parser tries to guess whether the code is fixed
|
# Fortran. In the later case the parser tries to guess whether the code is fixed
|
||||||
@ -1508,7 +1508,7 @@ FORMULA_FONTSIZE = 10
|
|||||||
FORMULA_TRANSPARENT = YES
|
FORMULA_TRANSPARENT = YES
|
||||||
|
|
||||||
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
||||||
# http://www.mathjax.org) which uses client side Javascript for the rendering
|
# http://www.mathjax.org) which uses client side JavaScript for the rendering
|
||||||
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
|
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
|
||||||
# installed or if you want to formulas look prettier in the HTML output. When
|
# installed or if you want to formulas look prettier in the HTML output. When
|
||||||
# enabled you may also need to install MathJax separately and configure the path
|
# enabled you may also need to install MathJax separately and configure the path
|
||||||
@ -1578,7 +1578,7 @@ MATHJAX_CODEFILE =
|
|||||||
SEARCHENGINE = YES
|
SEARCHENGINE = YES
|
||||||
|
|
||||||
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
|
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
|
||||||
# implemented using a web server instead of a web client using Javascript. There
|
# implemented using a web server instead of a web client using JavaScript. There
|
||||||
# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
|
# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
|
||||||
# setting. When disabled, doxygen will generate a PHP script for searching and
|
# setting. When disabled, doxygen will generate a PHP script for searching and
|
||||||
# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
|
# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
|
||||||
|
@ -17,7 +17,7 @@ int main(int argc, char **argv) {
|
|||||||
auto foo = app.add_option("--foo,-f", foos, "Some unlimited argument");
|
auto foo = app.add_option("--foo,-f", foos, "Some unlimited argument");
|
||||||
|
|
||||||
std::vector<int> bars;
|
std::vector<int> bars;
|
||||||
auto bar = app.add_option("--bar", bars, "Some unlimited arggument");
|
auto bar = app.add_option("--bar", bars, "Some unlimited argument");
|
||||||
|
|
||||||
app.add_flag("--z,--x", "Random other flags");
|
app.add_flag("--z,--x", "Random other flags");
|
||||||
|
|
||||||
|
@ -984,7 +984,7 @@ class App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
///@}
|
///@}
|
||||||
/// @name Subcommmands
|
/// @name Subcommands
|
||||||
///@{
|
///@{
|
||||||
|
|
||||||
/// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag
|
/// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag
|
||||||
@ -1246,8 +1246,9 @@ class App {
|
|||||||
name_ = nstr.first;
|
name_ = nstr.first;
|
||||||
}
|
}
|
||||||
commandline = std::move(nstr.second);
|
commandline = std::move(nstr.second);
|
||||||
} else
|
} else {
|
||||||
detail::trim(commandline);
|
detail::trim(commandline);
|
||||||
|
}
|
||||||
// the next section of code is to deal with quoted arguments after an '=' or ':' for windows like operations
|
// the next section of code is to deal with quoted arguments after an '=' or ':' for windows like operations
|
||||||
if(!commandline.empty()) {
|
if(!commandline.empty()) {
|
||||||
commandline = detail::find_and_modify(commandline, "=", detail::escape_detect);
|
commandline = detail::find_and_modify(commandline, "=", detail::escape_detect);
|
||||||
|
@ -246,11 +246,11 @@ class RequiredError : public ParseError {
|
|||||||
class ArgumentMismatch : public ParseError {
|
class ArgumentMismatch : public ParseError {
|
||||||
CLI11_ERROR_DEF(ParseError, ArgumentMismatch)
|
CLI11_ERROR_DEF(ParseError, ArgumentMismatch)
|
||||||
CLI11_ERROR_SIMPLE(ArgumentMismatch)
|
CLI11_ERROR_SIMPLE(ArgumentMismatch)
|
||||||
ArgumentMismatch(std::string name, int expected, std::size_t recieved)
|
ArgumentMismatch(std::string name, int expected, std::size_t received)
|
||||||
: ArgumentMismatch(expected > 0 ? ("Expected exactly " + std::to_string(expected) + " arguments to " + name +
|
: ArgumentMismatch(expected > 0 ? ("Expected exactly " + std::to_string(expected) + " arguments to " + name +
|
||||||
", got " + std::to_string(recieved))
|
", got " + std::to_string(received))
|
||||||
: ("Expected at least " + std::to_string(-expected) + " arguments to " + name +
|
: ("Expected at least " + std::to_string(-expected) + " arguments to " + name +
|
||||||
", got " + std::to_string(recieved)),
|
", got " + std::to_string(received)),
|
||||||
ExitCodes::ArgumentMismatch) {}
|
ExitCodes::ArgumentMismatch) {}
|
||||||
|
|
||||||
static ArgumentMismatch AtLeast(std::string name, int num, std::size_t received) {
|
static ArgumentMismatch AtLeast(std::string name, int num, std::size_t received) {
|
||||||
|
@ -42,9 +42,9 @@ constexpr int expected_max_vector_size{1 << 29};
|
|||||||
inline std::vector<std::string> split(const std::string &s, char delim) {
|
inline std::vector<std::string> split(const std::string &s, char delim) {
|
||||||
std::vector<std::string> elems;
|
std::vector<std::string> elems;
|
||||||
// Check to see if empty string, give consistent result
|
// Check to see if empty string, give consistent result
|
||||||
if(s.empty())
|
if(s.empty()) {
|
||||||
elems.emplace_back();
|
elems.emplace_back();
|
||||||
else {
|
} else {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss.str(s);
|
ss.str(s);
|
||||||
std::string item;
|
std::string item;
|
||||||
@ -264,8 +264,9 @@ inline std::ptrdiff_t find_member(std::string name,
|
|||||||
it = std::find_if(std::begin(names), std::end(names), [&name](std::string local_name) {
|
it = std::find_if(std::begin(names), std::end(names), [&name](std::string local_name) {
|
||||||
return detail::remove_underscore(local_name) == name;
|
return detail::remove_underscore(local_name) == name;
|
||||||
});
|
});
|
||||||
} else
|
} else {
|
||||||
it = std::find(std::begin(names), std::end(names), name);
|
it = std::find(std::begin(names), std::end(names), name);
|
||||||
|
}
|
||||||
|
|
||||||
return (it != std::end(names)) ? (it - std::begin(names)) : (-1);
|
return (it != std::end(names)) ? (it - std::begin(names)) : (-1);
|
||||||
}
|
}
|
||||||
|
@ -107,14 +107,14 @@ class Validator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return retstring;
|
return retstring;
|
||||||
};
|
}
|
||||||
|
|
||||||
/// This is the required operator for a Validator - provided to help
|
/// This is the required operator for a Validator - provided to help
|
||||||
/// users (CLI11 uses the member `func` directly)
|
/// users (CLI11 uses the member `func` directly)
|
||||||
std::string operator()(const std::string &str) const {
|
std::string operator()(const std::string &str) const {
|
||||||
std::string value = str;
|
std::string value = str;
|
||||||
return (active_) ? func_(value) : std::string{};
|
return (active_) ? func_(value) : std::string{};
|
||||||
};
|
}
|
||||||
|
|
||||||
/// Specify the type string
|
/// Specify the type string
|
||||||
Validator &description(std::string validator_desc) {
|
Validator &description(std::string validator_desc) {
|
||||||
@ -168,13 +168,13 @@ class Validator {
|
|||||||
Validator &application_index(int app_index) {
|
Validator &application_index(int app_index) {
|
||||||
application_index_ = app_index;
|
application_index_ = app_index;
|
||||||
return *this;
|
return *this;
|
||||||
};
|
}
|
||||||
/// Specify the application index of a validator
|
/// Specify the application index of a validator
|
||||||
Validator application_index(int app_index) const {
|
Validator application_index(int app_index) const {
|
||||||
Validator newval(*this);
|
Validator newval(*this);
|
||||||
newval.application_index_ = app_index;
|
newval.application_index_ = app_index;
|
||||||
return newval;
|
return newval;
|
||||||
};
|
}
|
||||||
/// Get the current value of the application index
|
/// Get the current value of the application index
|
||||||
int get_application_index() const { return application_index_; }
|
int get_application_index() const { return application_index_; }
|
||||||
/// Get a boolean if the validator is active
|
/// Get a boolean if the validator is active
|
||||||
@ -282,7 +282,7 @@ class CustomValidator : public Validator {
|
|||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
/// CLI enumeration of different file types
|
/// CLI enumeration of different file types
|
||||||
enum class path_type { nonexistant, file, directory };
|
enum class path_type { nonexistent, file, directory };
|
||||||
|
|
||||||
#if defined CLI11_HAS_FILESYSTEM && CLI11_HAS_FILESYSTEM > 0
|
#if defined CLI11_HAS_FILESYSTEM && CLI11_HAS_FILESYSTEM > 0
|
||||||
/// get the type of the path from a file name
|
/// get the type of the path from a file name
|
||||||
@ -290,12 +290,12 @@ inline path_type check_path(const char *file) noexcept {
|
|||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
auto stat = std::filesystem::status(file, ec);
|
auto stat = std::filesystem::status(file, ec);
|
||||||
if(ec) {
|
if(ec) {
|
||||||
return path_type::nonexistant;
|
return path_type::nonexistent;
|
||||||
}
|
}
|
||||||
switch(stat.type()) {
|
switch(stat.type()) {
|
||||||
case std::filesystem::file_type::none:
|
case std::filesystem::file_type::none:
|
||||||
case std::filesystem::file_type::not_found:
|
case std::filesystem::file_type::not_found:
|
||||||
return path_type::nonexistant;
|
return path_type::nonexistent;
|
||||||
case std::filesystem::file_type::directory:
|
case std::filesystem::file_type::directory:
|
||||||
return path_type::directory;
|
return path_type::directory;
|
||||||
case std::filesystem::file_type::symlink:
|
case std::filesystem::file_type::symlink:
|
||||||
@ -323,7 +323,7 @@ inline path_type check_path(const char *file) noexcept {
|
|||||||
return ((buffer.st_mode & S_IFDIR) != 0) ? path_type::directory : path_type::file;
|
return ((buffer.st_mode & S_IFDIR) != 0) ? path_type::directory : path_type::file;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return path_type::nonexistant;
|
return path_type::nonexistent;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/// Check for an existing file (returns error message if check fails)
|
/// Check for an existing file (returns error message if check fails)
|
||||||
@ -332,7 +332,7 @@ class ExistingFileValidator : public Validator {
|
|||||||
ExistingFileValidator() : Validator("FILE") {
|
ExistingFileValidator() : Validator("FILE") {
|
||||||
func_ = [](std::string &filename) {
|
func_ = [](std::string &filename) {
|
||||||
auto path_result = check_path(filename.c_str());
|
auto path_result = check_path(filename.c_str());
|
||||||
if(path_result == path_type::nonexistant) {
|
if(path_result == path_type::nonexistent) {
|
||||||
return "File does not exist: " + filename;
|
return "File does not exist: " + filename;
|
||||||
}
|
}
|
||||||
if(path_result == path_type::directory) {
|
if(path_result == path_type::directory) {
|
||||||
@ -349,7 +349,7 @@ class ExistingDirectoryValidator : public Validator {
|
|||||||
ExistingDirectoryValidator() : Validator("DIR") {
|
ExistingDirectoryValidator() : Validator("DIR") {
|
||||||
func_ = [](std::string &filename) {
|
func_ = [](std::string &filename) {
|
||||||
auto path_result = check_path(filename.c_str());
|
auto path_result = check_path(filename.c_str());
|
||||||
if(path_result == path_type::nonexistant) {
|
if(path_result == path_type::nonexistent) {
|
||||||
return "Directory does not exist: " + filename;
|
return "Directory does not exist: " + filename;
|
||||||
}
|
}
|
||||||
if(path_result == path_type::file) {
|
if(path_result == path_type::file) {
|
||||||
@ -366,7 +366,7 @@ class ExistingPathValidator : public Validator {
|
|||||||
ExistingPathValidator() : Validator("PATH(existing)") {
|
ExistingPathValidator() : Validator("PATH(existing)") {
|
||||||
func_ = [](std::string &filename) {
|
func_ = [](std::string &filename) {
|
||||||
auto path_result = check_path(filename.c_str());
|
auto path_result = check_path(filename.c_str());
|
||||||
if(path_result == path_type::nonexistant) {
|
if(path_result == path_type::nonexistent) {
|
||||||
return "Path does not exist: " + filename;
|
return "Path does not exist: " + filename;
|
||||||
}
|
}
|
||||||
return std::string();
|
return std::string();
|
||||||
@ -380,7 +380,7 @@ class NonexistentPathValidator : public Validator {
|
|||||||
NonexistentPathValidator() : Validator("PATH(non-existing)") {
|
NonexistentPathValidator() : Validator("PATH(non-existing)") {
|
||||||
func_ = [](std::string &filename) {
|
func_ = [](std::string &filename) {
|
||||||
auto path_result = check_path(filename.c_str());
|
auto path_result = check_path(filename.c_str());
|
||||||
if(path_result != path_type::nonexistant) {
|
if(path_result != path_type::nonexistent) {
|
||||||
return "Path already exists: " + filename;
|
return "Path already exists: " + filename;
|
||||||
}
|
}
|
||||||
return std::string();
|
return std::string();
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
CLI::App app("Some nice discription");
|
CLI::App app("Some nice description");
|
||||||
|
|
||||||
int x = 0;
|
int x = 0;
|
||||||
app.add_option("-x", x, "an integer value", true /* show default */);
|
app.add_option("-x", x, "an integer value", true /* show default */);
|
||||||
|
@ -1394,7 +1394,7 @@ TEST_F(TApp, RequireOptPriorityShort) {
|
|||||||
EXPECT_EQ(remain, std::vector<std::string>({"two", "three"}));
|
EXPECT_EQ(remain, std::vector<std::string>({"two", "three"}));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TApp, NotRequiedExpectedDouble) {
|
TEST_F(TApp, NotRequiredExpectedDouble) {
|
||||||
|
|
||||||
std::vector<std::string> strs;
|
std::vector<std::string> strs;
|
||||||
app.add_option("--str", strs)->expected(2);
|
app.add_option("--str", strs)->expected(2);
|
||||||
@ -1404,7 +1404,7 @@ TEST_F(TApp, NotRequiedExpectedDouble) {
|
|||||||
EXPECT_THROW(run(), CLI::ArgumentMismatch);
|
EXPECT_THROW(run(), CLI::ArgumentMismatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TApp, NotRequiedExpectedDoubleShort) {
|
TEST_F(TApp, NotRequiredExpectedDoubleShort) {
|
||||||
|
|
||||||
std::vector<std::string> strs;
|
std::vector<std::string> strs;
|
||||||
app.add_option("-s", strs)->expected(2);
|
app.add_option("-s", strs)->expected(2);
|
||||||
@ -2338,7 +2338,7 @@ TEST_F(TApp, OptionWithDefaults) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Added to test ->transform
|
// Added to test ->transform
|
||||||
TEST_F(TApp, OrderedModifingTransforms) {
|
TEST_F(TApp, OrderedModifyingTransforms) {
|
||||||
std::vector<std::string> val;
|
std::vector<std::string> val;
|
||||||
auto m = app.add_option("-m", val);
|
auto m = app.add_option("-m", val);
|
||||||
m->transform([](std::string x) { return x + "1"; });
|
m->transform([](std::string x) { return x + "1"; });
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
using ::testing::HasSubstr;
|
using ::testing::HasSubstr;
|
||||||
using ::testing::Not;
|
using ::testing::Not;
|
||||||
|
|
||||||
TEST(Deprecated, Emtpy) {
|
TEST(Deprecated, Empty) {
|
||||||
// No deprecated features at this time.
|
// No deprecated features at this time.
|
||||||
EXPECT_TRUE(true);
|
EXPECT_TRUE(true);
|
||||||
}
|
}
|
||||||
|
@ -731,7 +731,7 @@ struct CapturedHelp : public ::testing::Test {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(CapturedHelp, Sucessful) {
|
TEST_F(CapturedHelp, Successful) {
|
||||||
EXPECT_EQ(run(CLI::Success()), 0);
|
EXPECT_EQ(run(CLI::Success()), 0);
|
||||||
EXPECT_EQ(out.str(), "");
|
EXPECT_EQ(out.str(), "");
|
||||||
EXPECT_EQ(err.str(), "");
|
EXPECT_EQ(err.str(), "");
|
||||||
@ -825,7 +825,7 @@ TEST_F(CapturedHelp, AllOnlyError) {
|
|||||||
EXPECT_THAT(err.str(), Not(HasSubstr("Usage")));
|
EXPECT_THAT(err.str(), Not(HasSubstr("Usage")));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CapturedHelp, RepacedError) {
|
TEST_F(CapturedHelp, ReplacedError) {
|
||||||
app.failure_message(CLI::FailureMessage::help);
|
app.failure_message(CLI::FailureMessage::help);
|
||||||
|
|
||||||
EXPECT_EQ(run(CLI::ExtrasError({"Thing"})), static_cast<int>(CLI::ExitCodes::ExtrasError));
|
EXPECT_EQ(run(CLI::ExtrasError({"Thing"})), static_cast<int>(CLI::ExitCodes::ExtrasError));
|
||||||
@ -995,7 +995,7 @@ TEST(THelp, CombinedValidatorsText) {
|
|||||||
app.add_option("--f1", filename)->check(CLI::ExistingFile | CLI::ExistingDirectory);
|
app.add_option("--f1", filename)->check(CLI::ExistingFile | CLI::ExistingDirectory);
|
||||||
|
|
||||||
// This would be nice if it put something other than string, but would it be path or file?
|
// This would be nice if it put something other than string, but would it be path or file?
|
||||||
// Can't programatically tell!
|
// Can't programmatically tell!
|
||||||
// (Users can use ExistingPath, by the way)
|
// (Users can use ExistingPath, by the way)
|
||||||
std::string help = app.help();
|
std::string help = app.help();
|
||||||
EXPECT_THAT(help, HasSubstr("TEXT:(FILE) OR (DIR)"));
|
EXPECT_THAT(help, HasSubstr("TEXT:(FILE) OR (DIR)"));
|
||||||
|
@ -104,7 +104,7 @@ TEST_F(TApp, CrazyNameSubcommand) {
|
|||||||
EXPECT_EQ(sub1->count(), 1u);
|
EXPECT_EQ(sub1->count(), 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TApp, RequiredAndSubcoms) { // #23
|
TEST_F(TApp, RequiredAndSubcommands) { // #23
|
||||||
|
|
||||||
std::string baz;
|
std::string baz;
|
||||||
app.add_option("baz", baz, "Baz Description", true)->required();
|
app.add_option("baz", baz, "Baz Description", true)->required();
|
||||||
@ -719,7 +719,7 @@ TEST_F(TApp, Required1SubCom) {
|
|||||||
EXPECT_THROW(run(), CLI::ExtrasError);
|
EXPECT_THROW(run(), CLI::ExtrasError);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TApp, BadSubcomSearch) {
|
TEST_F(TApp, BadSubcommandSearch) {
|
||||||
|
|
||||||
auto one = app.add_subcommand("one");
|
auto one = app.add_subcommand("one");
|
||||||
auto two = one->add_subcommand("two");
|
auto two = one->add_subcommand("two");
|
||||||
|
@ -104,7 +104,7 @@ TEST_F(TApp, EnumCheckedTransform) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// from jzakrzewski Issue #330
|
// from jzakrzewski Issue #330
|
||||||
TEST_F(TApp, EnumCheckedDefualtTransform) {
|
TEST_F(TApp, EnumCheckedDefaultTransform) {
|
||||||
enum class existing : std::int16_t { abort, overwrite, remove };
|
enum class existing : std::int16_t { abort, overwrite, remove };
|
||||||
app.add_option("--existing", "What to do if file already exists in the destination")
|
app.add_option("--existing", "What to do if file already exists in the destination")
|
||||||
->transform(
|
->transform(
|
||||||
@ -541,7 +541,7 @@ TEST_F(TApp, BoundTests) {
|
|||||||
EXPECT_TRUE(help.find("[3.4 - 5.9]") != std::string::npos);
|
EXPECT_TRUE(help.find("[3.4 - 5.9]") != std::string::npos);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TApp, NumberWithUnitCorrecltySplitNumber) {
|
TEST_F(TApp, NumberWithUnitCorrectlySplitNumber) {
|
||||||
std::map<std::string, int> mapping{{"a", 10}, {"b", 100}, {"cc", 1000}};
|
std::map<std::string, int> mapping{{"a", 10}, {"b", 100}, {"cc", 1000}};
|
||||||
|
|
||||||
int value = 0;
|
int value = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user