LCOV - code coverage report
Current view: top level - tests - catch_data.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1792 1792 100.0 %
Date: 2022-05-26 21:41:34 Functions: 19 19 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2006-2022  Made to Order Software Corp.  All Rights Reserved
       2             : //
       3             : // https://snapwebsites.org/project/advgetopt
       4             : // contact@m2osw.com
       5             : //
       6             : // This program is free software; you can redistribute it and/or modify
       7             : // it under the terms of the GNU General Public License as published by
       8             : // the Free Software Foundation; either version 2 of the License, or
       9             : // (at your option) any later version.
      10             : //
      11             : // This program is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU General Public License for more details.
      15             : //
      16             : // You should have received a copy of the GNU General Public License along
      17             : // with this program; if not, write to the Free Software Foundation, Inc.,
      18             : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      19             : 
      20             : // self
      21             : //
      22             : #include    "catch_main.h"
      23             : 
      24             : 
      25             : // advgetopt lib
      26             : //
      27             : #include    <advgetopt/exception.h>
      28             : #include    <advgetopt/version.h>
      29             : 
      30             : 
      31             : // snapdev lib
      32             : //
      33             : #include    <snapdev/safe_setenv.h>
      34             : 
      35             : 
      36             : // booost lib
      37             : //
      38             : #include    <boost/preprocessor/stringize.hpp>
      39             : 
      40             : 
      41             : // C++ lib
      42             : //
      43             : #include    <fstream>
      44             : 
      45             : 
      46             : // last include
      47             : //
      48             : #include    <snapdev/poison.h>
      49             : 
      50             : 
      51             : 
      52             : 
      53             : 
      54           4 : CATCH_TEST_CASE("string_access", "[arguments][valid][getopt]")
      55             : {
      56           4 :     CATCH_START_SECTION("Verify a string in a long argument")
      57           1 :         advgetopt::option const options[] =
      58             :         {
      59             :             advgetopt::define_option(
      60             :                   advgetopt::Name("user-name")
      61             :                 , advgetopt::ShortName('u')
      62             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
      63             :                 , advgetopt::Help("check specified user.")
      64             :             ),
      65             :             advgetopt::end_options()
      66             :         };
      67             : 
      68           1 :         advgetopt::options_environment environment_options;
      69           1 :         environment_options.f_project_name = "unittest";
      70           1 :         environment_options.f_options = options;
      71           1 :         environment_options.f_help_header = "Usage: user name as a string";
      72             : 
      73           1 :         char const * cargv[] =
      74             :         {
      75             :             "/usr/bin/arguments",
      76             :             "--user-name",
      77             :             "alexis",
      78             :             nullptr
      79             :         };
      80           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
      81           1 :         char ** argv = const_cast<char **>(cargv);
      82             : 
      83           2 :         advgetopt::getopt opt(environment_options, argc, argv);
      84             : 
      85             :         // check that the result is valid
      86             : 
      87             :         // an invalid parameter, MUST NOT EXIST
      88           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
      89           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
      90           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
      91           1 :         CATCH_REQUIRE_FALSE(opt.has_default("invalid-parameter"));
      92           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
      93           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
      94             : 
      95             :         // no default
      96           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
      97           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
      98           1 :         CATCH_REQUIRE_FALSE(opt.has_default("--"));
      99           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     100           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     101             : 
     102             :         // the valid parameter
     103           1 :         CATCH_REQUIRE(opt.get_option("user-name") != nullptr);
     104           1 :         CATCH_REQUIRE(opt.get_option('u') != nullptr);
     105           1 :         CATCH_REQUIRE(opt.get_string("user-name") == "alexis");
     106           1 :         CATCH_REQUIRE(opt.get_string("user-name", 0) == "alexis");
     107           1 :         CATCH_REQUIRE(opt["user-name"] == "alexis");
     108           1 :         CATCH_REQUIRE(opt.is_defined("user-name"));
     109           1 :         CATCH_REQUIRE_FALSE(opt.has_default("user-name"));
     110           1 :         CATCH_REQUIRE(opt.get_default("user-name").empty());
     111           1 :         CATCH_REQUIRE(opt.size("user-name") == 1);
     112             : 
     113             :         // other parameters
     114           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     115           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     116             :     CATCH_END_SECTION()
     117             : 
     118           4 :     CATCH_START_SECTION("Verify a string in a short argument")
     119           1 :         advgetopt::option const options[] =
     120             :         {
     121             :             advgetopt::define_option(
     122             :                   advgetopt::Name("user-name")
     123             :                 , advgetopt::ShortName('u')
     124             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     125             :                 , advgetopt::Help("check specified user.")
     126             :             ),
     127             :             advgetopt::end_options()
     128             :         };
     129             : 
     130           1 :         advgetopt::options_environment environment_options;
     131           1 :         environment_options.f_project_name = "unittest";
     132           1 :         environment_options.f_options = options;
     133           1 :         environment_options.f_help_header = "Usage: user name as a string";
     134             : 
     135           1 :         char const * cargv[] =
     136             :         {
     137             :             "/usr/bin/arguments",
     138             :             "-u",
     139             :             "alexis",
     140             :             nullptr
     141             :         };
     142           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     143           1 :         char ** argv = const_cast<char **>(cargv);
     144             : 
     145           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     146             : 
     147             :         // check that the result is valid
     148             : 
     149             :         // an invalid parameter, MUST NOT EXIST
     150           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     151           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     152           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     153           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     154           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     155             : 
     156             :         // no default
     157           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     158           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     159           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     160           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     161             : 
     162             :         // the valid parameter
     163           1 :         CATCH_REQUIRE(opt.get_option("user-name") != nullptr);
     164           1 :         CATCH_REQUIRE(opt.get_option('u') != nullptr);
     165           1 :         CATCH_REQUIRE(opt.get_string("user-name") == "alexis");
     166           1 :         CATCH_REQUIRE(opt.get_string("user-name", 0) == "alexis");
     167           1 :         CATCH_REQUIRE(opt["user-name"] == "alexis");
     168           1 :         CATCH_REQUIRE(opt.is_defined("user-name"));
     169           1 :         CATCH_REQUIRE(opt.get_default("user-name").empty());
     170           1 :         CATCH_REQUIRE(opt.size("user-name") == 1);
     171             : 
     172             :         // other parameters
     173           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     174           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     175             :     CATCH_END_SECTION()
     176           2 : }
     177             : 
     178             : 
     179           5 : CATCH_TEST_CASE("long_access", "[arguments][valid][getopt]")
     180             : {
     181           6 :     CATCH_START_SECTION("Verify an integer (long) value in a long argument")
     182           1 :         long const default_value(rand());
     183           2 :         std::string const default_value_str(std::to_string(default_value));
     184           1 :         char const * const default_val(default_value_str.c_str());
     185             : 
     186           1 :         advgetopt::option const options[] =
     187             :         {
     188             :             advgetopt::define_option(
     189             :                   advgetopt::Name("size")
     190             :                 , advgetopt::ShortName('s')
     191             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     192             :                 , advgetopt::Help("define the size.")
     193             :                 , advgetopt::DefaultValue(default_val)
     194           6 :             ),
     195             :             advgetopt::end_options()
     196           7 :         };
     197             : 
     198           1 :         advgetopt::options_environment environment_options;
     199           1 :         environment_options.f_project_name = "unittest";
     200           1 :         environment_options.f_options = options;
     201           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
     202             : 
     203           1 :         char const * cargv[] =
     204             :         {
     205             :             "/usr/bin/arguments",
     206             :             "--size",
     207             :             "9821",
     208             :             nullptr
     209             :         };
     210           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     211           1 :         char ** argv = const_cast<char **>(cargv);
     212             : 
     213           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     214             : 
     215             :         // check that the result is valid
     216             : 
     217             :         // an invalid parameter, MUST NOT EXIST
     218           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     219           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     220           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     221           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     222           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     223             : 
     224             :         // no default
     225           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     226           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     227           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     228           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     229             : 
     230             :         // the valid parameter
     231           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     232           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
     233           1 :         CATCH_REQUIRE(opt.is_defined("size"));
     234           1 :         CATCH_REQUIRE(opt.get_string("size") == "9821");
     235           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "9821");
     236           1 :         CATCH_REQUIRE(opt["size"] == "9821");
     237           1 :         CATCH_REQUIRE(opt.get_long("size") == 9821);
     238           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 9821);
     239           1 :         CATCH_REQUIRE(opt.has_default("size"));
     240           1 :         CATCH_REQUIRE(opt.get_default("size") == default_value_str);
     241           1 :         CATCH_REQUIRE(opt.size("size") == 1);
     242             : 
     243             :         // other parameters
     244           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     245           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     246             :     CATCH_END_SECTION()
     247             : 
     248           6 :     CATCH_START_SECTION("Verify an integer (long) value in a short argument")
     249           1 :         advgetopt::option const options[] =
     250             :         {
     251             :             advgetopt::define_option(
     252             :                   advgetopt::Name("size")
     253             :                 , advgetopt::ShortName('s')
     254             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     255             :                 , advgetopt::Help("define the size.")
     256             :                 , advgetopt::DefaultValue("")
     257             :             ),
     258             :             advgetopt::end_options()
     259             :         };
     260             : 
     261           1 :         advgetopt::options_environment environment_options;
     262           1 :         environment_options.f_project_name = "unittest";
     263           1 :         environment_options.f_options = options;
     264           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
     265             : 
     266           1 :         char const * cargv[] =
     267             :         {
     268             :             "/usr/bin/arguments",
     269             :             "-s",
     270             :             "9821",
     271             :             nullptr
     272             :         };
     273           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     274           1 :         char ** argv = const_cast<char **>(cargv);
     275             : 
     276           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     277             : 
     278             :         // check that the result is valid
     279             : 
     280             :         // an invalid parameter, MUST NOT EXIST
     281           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     282           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     283           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     284           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     285           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     286             : 
     287             :         // to reach the constant version `opt` has to be constant
     288           2 :         std::string const array_syntax_invalid_parameter(static_cast<advgetopt::getopt const &>(opt)["invalid-parameter"]);
     289           1 :         CATCH_REQUIRE(array_syntax_invalid_parameter == std::string());
     290             : 
     291             :         // no default
     292           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     293           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     294           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     295           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     296             : 
     297             :         // the valid parameter
     298           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     299           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
     300           1 :         CATCH_REQUIRE(opt.is_defined("size"));
     301           1 :         CATCH_REQUIRE(opt.get_string("size") == "9821");
     302           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "9821");
     303           1 :         CATCH_REQUIRE(opt["size"] == "9821");
     304           1 :         CATCH_REQUIRE(opt.get_long("size") == 9821);
     305           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 9821);
     306           1 :         CATCH_REQUIRE(opt.has_default("size"));
     307           1 :         CATCH_REQUIRE(opt.get_default("size").empty());
     308           1 :         CATCH_REQUIRE(opt.size("size") == 1);
     309             : 
     310             :         // to access the constant reference we need a constant `opt`...
     311           2 :         std::string const array_syntax1(static_cast<advgetopt::getopt const &>(opt)["size"]);
     312           1 :         CATCH_REQUIRE(array_syntax1 == "9821");
     313           1 :         bool const array_syntax2(static_cast<advgetopt::getopt const &>(opt)["size"] == std::string("9821"));
     314           1 :         CATCH_REQUIRE(array_syntax2);
     315             : 
     316             :         // other parameters
     317           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     318           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     319             :     CATCH_END_SECTION()
     320             : 
     321           6 :     CATCH_START_SECTION("Verify an integer (long) value in no arguments")
     322           1 :         advgetopt::option const options[] =
     323             :         {
     324             :             advgetopt::define_option(
     325             :                   advgetopt::Name("size")
     326             :                 , advgetopt::ShortName('s')
     327             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     328             :                 , advgetopt::Help("define the size.")
     329             :                 , advgetopt::DefaultValue("839")
     330             :             ),
     331             :             advgetopt::end_options()
     332             :         };
     333             : 
     334           1 :         advgetopt::options_environment environment_options;
     335           1 :         environment_options.f_project_name = "unittest";
     336           1 :         environment_options.f_options = options;
     337           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
     338             : 
     339           1 :         char const * cargv[] =
     340             :         {
     341             :             "/usr/bin/arguments",
     342             :             nullptr
     343             :         };
     344           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     345           1 :         char ** argv = const_cast<char **>(cargv);
     346             : 
     347           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     348             : 
     349             :         // check that the result is valid
     350             : 
     351             :         // an invalid parameter, MUST NOT EXIST
     352           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     353           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     354           1 :         CATCH_REQUIRE(opt["invalid-parameter"] == std::string());
     355           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     356           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     357           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     358             : 
     359             :         // no default
     360           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     361           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     362           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     363           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     364             : 
     365             :         // the valid parameter
     366           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     367           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
     368           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
     369           1 :         CATCH_REQUIRE(opt.get_string("size") == "839");
     370           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "839");
     371           1 :         CATCH_REQUIRE(opt.get_long("size") == 839);
     372           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 839);
     373           1 :         CATCH_REQUIRE(opt.has_default("size"));
     374           1 :         CATCH_REQUIRE(opt.get_default("size") == "839");
     375           1 :         CATCH_REQUIRE(opt.size("size") == 0);
     376             : 
     377             :         // with a constant opt, the array syntax returns the default string
     378           1 :         CATCH_REQUIRE(static_cast<advgetopt::getopt const &>(opt)["size"] == "839");
     379             : 
     380             :         // other parameters
     381           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     382           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     383             :     CATCH_END_SECTION()
     384           3 : }
     385             : 
     386             : 
     387             : 
     388           4 : CATCH_TEST_CASE("system_flags_version", "[arguments][valid][getopt][system_flags]")
     389             : {
     390           4 :     CATCH_START_SECTION("Check with the --version system flag")
     391             :     {
     392           1 :         long const major_version(rand());
     393           1 :         long const minor_version(rand());
     394           1 :         long const patch_version(rand());
     395           1 :         long const build_version(rand());
     396           3 :         std::string const version(std::to_string(major_version)
     397           3 :                                 + "."
     398           4 :                                 + std::to_string(minor_version)
     399           3 :                                 + "."
     400           4 :                                 + std::to_string(patch_version)
     401           3 :                                 + "."
     402           4 :                                 + std::to_string(build_version));
     403             : 
     404           1 :         long const default_value(rand());
     405           2 :         std::string const default_val(std::to_string(default_value));
     406           1 :         advgetopt::option const options[] =
     407             :         {
     408             :             advgetopt::define_option(
     409             :                   advgetopt::Name("size")
     410             :                 , advgetopt::ShortName('s')
     411             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     412             :                 , advgetopt::Help("define the size.")
     413             :                 , advgetopt::DefaultValue(default_val.c_str())
     414           6 :             ),
     415             :             advgetopt::end_options()
     416           7 :         };
     417             : 
     418           1 :         advgetopt::options_environment environment_options;
     419           1 :         environment_options.f_project_name = "unittest";
     420           1 :         environment_options.f_options = options;
     421           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     422           1 :         environment_options.f_help_header = "Usage: test system commands";
     423           1 :         environment_options.f_version = version.c_str();
     424             : 
     425           1 :         char const * cargv[] =
     426             :         {
     427             :             "/usr/bin/arguments",
     428             :             "--version",
     429             :             nullptr
     430             :         };
     431           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     432           1 :         char ** argv = const_cast<char **>(cargv);
     433             : 
     434           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     435             : 
     436             :         // check that the result is valid
     437             : 
     438             :         // an invalid parameter, MUST NOT EXIST
     439           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     440           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     441           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     442           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     443           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     444             : 
     445             :         // no default
     446           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     447           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     448           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     449           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     450             : 
     451             :         // valid parameter
     452           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     453           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
     454           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
     455           1 :         CATCH_REQUIRE(opt.get_string("size") == default_val);
     456           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == default_val);
     457           1 :         CATCH_REQUIRE(opt["size"] == default_val);
     458           1 :         CATCH_REQUIRE(opt.get_long("size") == default_value);
     459           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == default_value);
     460           1 :         CATCH_REQUIRE(opt.has_default("size"));
     461           1 :         CATCH_REQUIRE(opt.get_default("size") == default_val);
     462           1 :         CATCH_REQUIRE(opt.size("size") == 0);
     463             : 
     464             :         // version parameter
     465           1 :         CATCH_REQUIRE(opt.get_option("version") != nullptr);
     466           1 :         CATCH_REQUIRE(opt.get_option('V') == opt.get_option("version"));
     467           1 :         CATCH_REQUIRE(opt.is_defined("version"));
     468           1 :         CATCH_REQUIRE(opt.get_string("version") == "");
     469           1 :         CATCH_REQUIRE(opt.get_string("version", 0) == "");
     470           1 :         CATCH_REQUIRE(opt["version"] == "");
     471           1 :         CATCH_REQUIRE_FALSE(opt.has_default("version"));
     472           1 :         CATCH_REQUIRE(opt.get_default("version").empty());
     473           1 :         CATCH_REQUIRE(opt.size("version") == 1);
     474             : 
     475             :         // other parameters
     476           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     477           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     478             : 
     479             :         // process system options now
     480           2 :         std::stringstream ss;
     481           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     482           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_VERSION);
     483           1 :         CATCH_REQUIRE(ss.str() == version + '\n');
     484             :     }
     485             :     CATCH_END_SECTION()
     486             : 
     487           4 :     CATCH_START_SECTION("Check with the --version system flag, without a --version on the command line")
     488             :     {
     489           1 :         long const major_version(rand());
     490           1 :         long const minor_version(rand());
     491           1 :         long const patch_version(rand());
     492           1 :         long const build_version(rand());
     493           3 :         std::string const version(std::to_string(major_version)
     494           3 :                                 + "."
     495           4 :                                 + std::to_string(minor_version)
     496           3 :                                 + "."
     497           4 :                                 + std::to_string(patch_version)
     498           3 :                                 + "."
     499           4 :                                 + std::to_string(build_version));
     500             : 
     501           1 :         long const default_value(rand());
     502           2 :         std::string const default_val(std::to_string(default_value));
     503           1 :         advgetopt::option const options[] =
     504             :         {
     505             :             advgetopt::define_option(
     506             :                   advgetopt::Name("size")
     507             :                 , advgetopt::ShortName('s')
     508             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     509             :                 , advgetopt::Help("define the size.")
     510             :                 , advgetopt::DefaultValue(default_val.c_str())
     511           6 :             ),
     512             :             advgetopt::end_options()
     513           7 :         };
     514             : 
     515           1 :         advgetopt::options_environment environment_options;
     516           1 :         environment_options.f_project_name = "unittest";
     517           1 :         environment_options.f_options = options;
     518           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     519           1 :         environment_options.f_help_header = "Usage: test system commands";
     520           1 :         environment_options.f_version = version.c_str();
     521             : 
     522           1 :         char const * cargv[] =
     523             :         {
     524             :             "/usr/bin/arguments",
     525             :             "--size",
     526             :             "1221",
     527             :             nullptr
     528             :         };
     529           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     530           1 :         char ** argv = const_cast<char **>(cargv);
     531             : 
     532           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     533             : 
     534             :         // check that the result is valid
     535             : 
     536             :         // an invalid parameter, MUST NOT EXIST
     537           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     538           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     539           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     540           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     541           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     542             : 
     543             :         // no default
     544           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     545           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     546           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     547           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     548             : 
     549             :         // valid parameter
     550           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     551           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
     552           1 :         CATCH_REQUIRE(opt.is_defined("size"));
     553           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
     554           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
     555           1 :         CATCH_REQUIRE(opt["size"] == "1221");
     556           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
     557           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
     558           1 :         CATCH_REQUIRE(opt.has_default("size"));
     559           1 :         CATCH_REQUIRE(opt.get_default("size") == default_val);
     560           1 :         CATCH_REQUIRE(opt.size("size") == 1);
     561             : 
     562             :         // version parameter
     563           1 :         CATCH_REQUIRE(opt.get_option("version") != nullptr);
     564           1 :         CATCH_REQUIRE(opt.get_option('V') == opt.get_option("version"));
     565           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("version"));
     566           1 :         CATCH_REQUIRE_FALSE(opt.has_default("version"));
     567           1 :         CATCH_REQUIRE(opt.get_default("version").empty());
     568           1 :         CATCH_REQUIRE(opt.size("version") == 0);
     569             : 
     570             :         // other parameters
     571           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     572           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     573             : 
     574             :         // process system options now
     575           2 :         std::stringstream ss;
     576           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     577           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
     578           1 :         CATCH_REQUIRE(ss.str().empty());
     579             :     }
     580             :     CATCH_END_SECTION()
     581           2 : }
     582             : 
     583             : 
     584             : 
     585           4 : CATCH_TEST_CASE("system_flags_has_sanitizer", "[arguments][valid][getopt][system_flags]")
     586             : {
     587           4 :     CATCH_START_SECTION("Check with the --has-sanitizer system flag")
     588             :     {
     589           1 :         long const default_value(rand());
     590           2 :         std::string const default_val(std::to_string(default_value));
     591           1 :         advgetopt::option const options[] =
     592             :         {
     593             :             advgetopt::define_option(
     594             :                   advgetopt::Name("size")
     595             :                 , advgetopt::ShortName('s')
     596             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     597             :                 , advgetopt::Help("define the size.")
     598             :                 , advgetopt::DefaultValue(default_val.c_str())
     599           6 :             ),
     600             :             advgetopt::end_options()
     601           7 :         };
     602             : 
     603           1 :         advgetopt::options_environment environment_options;
     604           1 :         environment_options.f_project_name = "unittest";
     605           1 :         environment_options.f_options = options;
     606           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     607           1 :         environment_options.f_help_header = "Usage: test system commands";
     608           1 :         environment_options.f_version = "2.0.24.0";
     609             : 
     610           1 :         char const * cargv[] =
     611             :         {
     612             :             "/usr/bin/arguments",
     613             :             "--has-sanitizer",
     614             :             nullptr
     615             :         };
     616           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     617           1 :         char ** argv = const_cast<char **>(cargv);
     618             : 
     619           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     620             : 
     621             :         // check that the result is valid
     622             : 
     623             :         // an invalid parameter, MUST NOT EXIST
     624           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     625           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     626           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     627           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     628           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     629             : 
     630             :         // no default
     631           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     632           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     633           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     634           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     635             : 
     636             :         // valid parameter
     637           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     638           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
     639           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
     640           1 :         CATCH_REQUIRE(opt.get_string("size") == default_val);
     641           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == default_val);
     642           1 :         CATCH_REQUIRE(opt["size"] == default_val);
     643           1 :         CATCH_REQUIRE(opt.get_long("size") == default_value);
     644           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == default_value);
     645           1 :         CATCH_REQUIRE(opt.has_default("size"));
     646           1 :         CATCH_REQUIRE(opt.get_default("size") == default_val);
     647           1 :         CATCH_REQUIRE(opt.size("size") == 0);
     648             : 
     649             :         // has-sanitizer parameter
     650           1 :         CATCH_REQUIRE(opt.get_option("has-sanitizer") != nullptr);
     651           1 :         CATCH_REQUIRE(opt.is_defined("has-sanitizer"));
     652           1 :         CATCH_REQUIRE(opt.get_string("has-sanitizer") == "");
     653           1 :         CATCH_REQUIRE(opt.get_string("has-sanitizer", 0) == "");
     654           1 :         CATCH_REQUIRE(opt["has-sanitizer"] == "");
     655           1 :         CATCH_REQUIRE_FALSE(opt.has_default("has-sanitizer"));
     656           1 :         CATCH_REQUIRE(opt.get_default("has-sanitizer").empty());
     657           1 :         CATCH_REQUIRE(opt.size("has-sanitizer") == 1);
     658             : 
     659             :         // other parameters
     660           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     661           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     662             : 
     663             :         // process system options now
     664           2 :         std::stringstream ss;
     665           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     666           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
     667             : #if defined(__SANITIZE_ADDRESS__) || defined(__SANITIZE_THREAD__)
     668             :         // when running coverage or in the Sanitize version
     669             :         //
     670           1 :         std::string const expected(
     671             : #ifdef __SANITIZE_ADDRESS__
     672             :                 "The address sanitizer is compiled in.\n"
     673             : #endif
     674             : #ifdef __SANITIZE_THREAD__
     675             :                 "The thread sanitizer is compiled in.\n"
     676             : #endif
     677           2 :             );
     678           1 :         CATCH_REQUIRE(ss.str() == expected);
     679             : #else
     680             :         // when running in Debug or Release
     681             :         //
     682             :         CATCH_REQUIRE(ss.str() == "The address and thread sanitizers are not compiled in.\n");
     683             : #endif
     684             :     }
     685             :     CATCH_END_SECTION()
     686             : 
     687           4 :     CATCH_START_SECTION("Check with the --has-sanitizer system flag, without a --has-sanitizer on the command line")
     688             :     {
     689           1 :         long const default_value(rand());
     690           2 :         std::string const default_val(std::to_string(default_value));
     691           1 :         advgetopt::option const options[] =
     692             :         {
     693             :             advgetopt::define_option(
     694             :                   advgetopt::Name("size")
     695             :                 , advgetopt::ShortName('s')
     696             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     697             :                 , advgetopt::Help("define the size.")
     698             :                 , advgetopt::DefaultValue(default_val.c_str())
     699           6 :             ),
     700             :             advgetopt::end_options()
     701           7 :         };
     702             : 
     703           1 :         advgetopt::options_environment environment_options;
     704           1 :         environment_options.f_project_name = "unittest";
     705           1 :         environment_options.f_options = options;
     706           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     707           1 :         environment_options.f_help_header = "Usage: test system commands";
     708           1 :         environment_options.f_version = "2.0.24.1";
     709             : 
     710           1 :         char const * cargv[] =
     711             :         {
     712             :             "/usr/bin/arguments",
     713             :             "--size",
     714             :             "1221",
     715             :             nullptr
     716             :         };
     717           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     718           1 :         char ** argv = const_cast<char **>(cargv);
     719             : 
     720           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     721             : 
     722             :         // check that the result is valid
     723             : 
     724             :         // an invalid parameter, MUST NOT EXIST
     725           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     726           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     727           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     728           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     729           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     730             : 
     731             :         // no default
     732           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     733           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     734           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     735           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     736             : 
     737             :         // valid parameter
     738           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     739           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
     740           1 :         CATCH_REQUIRE(opt.is_defined("size"));
     741           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
     742           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
     743           1 :         CATCH_REQUIRE(opt["size"] == "1221");
     744           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
     745           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
     746           1 :         CATCH_REQUIRE(opt.has_default("size"));
     747           1 :         CATCH_REQUIRE(opt.get_default("size") == default_val);
     748           1 :         CATCH_REQUIRE(opt.size("size") == 1);
     749             : 
     750             :         // has-sanitizer parameter
     751           1 :         CATCH_REQUIRE(opt.get_option("has-sanitizer") != nullptr);
     752           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("has-sanitizer"));
     753           1 :         CATCH_REQUIRE_FALSE(opt.has_default("has-sanitizer"));
     754           1 :         CATCH_REQUIRE(opt.get_default("has-sanitizer").empty());
     755           1 :         CATCH_REQUIRE(opt.size("has-sanitizer") == 0);
     756             : 
     757             :         // other parameters
     758           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     759           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     760             : 
     761             :         // process system options now
     762           2 :         std::stringstream ss;
     763           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     764           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
     765           1 :         CATCH_REQUIRE(ss.str().empty());
     766             :     }
     767             :     CATCH_END_SECTION()
     768           2 : }
     769             : 
     770             : 
     771             : 
     772           4 : CATCH_TEST_CASE("system_flags_compiler_version", "[arguments][valid][getopt][system_flags]")
     773             : {
     774           4 :     CATCH_START_SECTION("Check with the --compiler-version system flag")
     775             :     {
     776           1 :         long const default_value(rand());
     777           2 :         std::string const default_val(std::to_string(default_value));
     778           1 :         advgetopt::option const options[] =
     779             :         {
     780             :             advgetopt::define_option(
     781             :                   advgetopt::Name("size")
     782             :                 , advgetopt::ShortName('s')
     783             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     784             :                 , advgetopt::Help("define the size.")
     785             :                 , advgetopt::DefaultValue(default_val.c_str())
     786           6 :             ),
     787             :             advgetopt::end_options()
     788           7 :         };
     789             : 
     790           1 :         advgetopt::options_environment environment_options;
     791           1 :         environment_options.f_project_name = "unittest";
     792           1 :         environment_options.f_options = options;
     793           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     794           1 :         environment_options.f_help_header = "Usage: test system commands";
     795           1 :         environment_options.f_version = "2.0.24.0";
     796             : 
     797           1 :         char const * cargv[] =
     798             :         {
     799             :             "/usr/bin/arguments",
     800             :             "--compiler-version",
     801             :             nullptr
     802             :         };
     803           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     804           1 :         char ** argv = const_cast<char **>(cargv);
     805             : 
     806           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     807             : 
     808             :         // check that the result is valid
     809             : 
     810             :         // an invalid parameter, MUST NOT EXIST
     811           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     812           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     813           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     814           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     815           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     816             : 
     817             :         // no default
     818           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     819           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     820           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     821           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     822             : 
     823             :         // valid parameter
     824           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     825           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
     826           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
     827           1 :         CATCH_REQUIRE(opt.get_string("size") == default_val);
     828           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == default_val);
     829           1 :         CATCH_REQUIRE(opt["size"] == default_val);
     830           1 :         CATCH_REQUIRE(opt.get_long("size") == default_value);
     831           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == default_value);
     832           1 :         CATCH_REQUIRE(opt.has_default("size"));
     833           1 :         CATCH_REQUIRE(opt.get_default("size") == default_val);
     834           1 :         CATCH_REQUIRE(opt.size("size") == 0);
     835             : 
     836             :         // compiler-version parameter
     837           1 :         CATCH_REQUIRE(opt.get_option("compiler-version") != nullptr);
     838           1 :         CATCH_REQUIRE(opt.is_defined("compiler-version"));
     839           1 :         CATCH_REQUIRE(opt.get_string("compiler-version") == "");
     840           1 :         CATCH_REQUIRE(opt.get_string("compiler-version", 0) == "");
     841           1 :         CATCH_REQUIRE(opt["compiler-version"] == "");
     842           1 :         CATCH_REQUIRE_FALSE(opt.has_default("compiler-version"));
     843           1 :         CATCH_REQUIRE(opt.get_default("compiler-version").empty());
     844           1 :         CATCH_REQUIRE(opt.size("compiler-version") == 1);
     845             : 
     846             :         // other parameters
     847           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     848           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     849             : 
     850             :         // process system options now
     851           2 :         std::stringstream ss;
     852           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     853           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
     854           1 :         CATCH_REQUIRE(ss.str() == LIBADVGETOPT_COMPILER_VERSION "\n");
     855             :     }
     856             :     CATCH_END_SECTION()
     857             : 
     858           4 :     CATCH_START_SECTION("Check with the --compiler-version system flag, without a --compiler-version on the command line")
     859             :     {
     860           1 :         long const default_value(rand());
     861           2 :         std::string const default_val(std::to_string(default_value));
     862           1 :         advgetopt::option const options[] =
     863             :         {
     864             :             advgetopt::define_option(
     865             :                   advgetopt::Name("size")
     866             :                 , advgetopt::ShortName('s')
     867             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     868             :                 , advgetopt::Help("define the size.")
     869             :                 , advgetopt::DefaultValue(default_val.c_str())
     870           6 :             ),
     871             :             advgetopt::end_options()
     872           7 :         };
     873             : 
     874           1 :         advgetopt::options_environment environment_options;
     875           1 :         environment_options.f_project_name = "unittest";
     876           1 :         environment_options.f_options = options;
     877           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     878           1 :         environment_options.f_help_header = "Usage: test system commands";
     879           1 :         environment_options.f_version = "2.0.24.1";
     880             : 
     881           1 :         char const * cargv[] =
     882             :         {
     883             :             "/usr/bin/arguments",
     884             :             "--size",
     885             :             "1221",
     886             :             nullptr
     887             :         };
     888           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     889           1 :         char ** argv = const_cast<char **>(cargv);
     890             : 
     891           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     892             : 
     893             :         // check that the result is valid
     894             : 
     895             :         // an invalid parameter, MUST NOT EXIST
     896           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     897           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     898           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     899           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     900           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     901             : 
     902             :         // no default
     903           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
     904           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     905           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
     906           1 :         CATCH_REQUIRE(opt.size("--") == 0);
     907             : 
     908             :         // valid parameter
     909           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
     910           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
     911           1 :         CATCH_REQUIRE(opt.is_defined("size"));
     912           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
     913           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
     914           1 :         CATCH_REQUIRE(opt["size"] == "1221");
     915           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
     916           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
     917           1 :         CATCH_REQUIRE(opt.has_default("size"));
     918           1 :         CATCH_REQUIRE(opt.get_default("size") == default_val);
     919           1 :         CATCH_REQUIRE(opt.size("size") == 1);
     920             : 
     921             :         // compiler-version parameter
     922           1 :         CATCH_REQUIRE(opt.get_option("compiler-version") != nullptr);
     923           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("compiler-version"));
     924           1 :         CATCH_REQUIRE_FALSE(opt.has_default("compiler-version"));
     925           1 :         CATCH_REQUIRE(opt.get_default("compiler-version").empty());
     926           1 :         CATCH_REQUIRE(opt.size("compiler-version") == 0);
     927             : 
     928             :         // other parameters
     929           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
     930           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     931             : 
     932             :         // process system options now
     933           2 :         std::stringstream ss;
     934           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     935           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
     936           1 :         CATCH_REQUIRE(ss.str().empty());
     937             :     }
     938             :     CATCH_END_SECTION()
     939           2 : }
     940             : 
     941             : 
     942             : 
     943           7 : CATCH_TEST_CASE("system_flags_help", "[arguments][valid][getopt][system_flags]")
     944             : {
     945          10 :     CATCH_START_SECTION("Check with the --help system flag")
     946             :     {
     947           1 :         advgetopt::option const options[] =
     948             :         {
     949             :             advgetopt::define_option(
     950             :                   advgetopt::Name("size")
     951             :                 , advgetopt::ShortName('s')
     952             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     953             :                 , advgetopt::Help("define the size.")
     954             :                 , advgetopt::DefaultValue("33")
     955             :             ),
     956             :             advgetopt::define_option(
     957             :                   advgetopt::Name("obscure")
     958             :                 , advgetopt::ShortName('o')
     959             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
     960             :                                                           , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     961             :                 , advgetopt::Help("obscure command, hidden by default.")
     962             :             ),
     963             :             advgetopt::define_option(
     964             :                   advgetopt::Name("secret")
     965             :                 , advgetopt::ShortName('S')
     966             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
     967             :                                                           , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     968             :                 , advgetopt::Help("even more secret command, hidden by default.")
     969             :             ),
     970             :             advgetopt::end_options()
     971             :         };
     972             : 
     973           1 :         advgetopt::options_environment environment_options;
     974           1 :         environment_options.f_project_name = "unittest";
     975           1 :         environment_options.f_options = options;
     976           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     977           1 :         environment_options.f_help_header = "Usage: test system commands";
     978           1 :         environment_options.f_help_footer = "Copyright matters";
     979             : 
     980           1 :         char const * cargv[] =
     981             :         {
     982             :             "/usr/bin/arguments",
     983             :             "--help",
     984             :             nullptr
     985             :         };
     986           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     987           1 :         char ** argv = const_cast<char **>(cargv);
     988             : 
     989           2 :         advgetopt::getopt opt(environment_options, argc, argv);
     990             : 
     991             :         // check that the result is valid
     992             : 
     993             :         // check the list of options
     994             :         //   3 -- the number of user defined option (see above)
     995             :         //  12 -- the number of system options (see advgetopt.cpp)
     996             :         //   1 -- auto-added long-help
     997           1 :         advgetopt::option_info::map_by_name_t const & list_of_options(opt.get_options());
     998           1 :         CATCH_REQUIRE(list_of_options.size() == 3 + 12 + 1);
     999             : 
    1000             :         // user options
    1001           1 :         CATCH_REQUIRE(list_of_options.find("size") != list_of_options.end());
    1002           1 :         CATCH_REQUIRE(list_of_options.find("obscure") != list_of_options.end());
    1003           1 :         CATCH_REQUIRE(list_of_options.find("secret") != list_of_options.end());
    1004             : 
    1005             :         // system options
    1006           1 :         CATCH_REQUIRE(list_of_options.find("help") != list_of_options.end());
    1007           1 :         CATCH_REQUIRE(list_of_options.find("long-help") != list_of_options.end());
    1008           1 :         CATCH_REQUIRE(list_of_options.find("version") != list_of_options.end());
    1009           1 :         CATCH_REQUIRE(list_of_options.find("copyright") != list_of_options.end());
    1010           1 :         CATCH_REQUIRE(list_of_options.find("license") != list_of_options.end());
    1011           1 :         CATCH_REQUIRE(list_of_options.find("build-date") != list_of_options.end());
    1012           1 :         CATCH_REQUIRE(list_of_options.find("environment-variable-name") != list_of_options.end());
    1013           1 :         CATCH_REQUIRE(list_of_options.find("configuration-filenames") != list_of_options.end());
    1014           1 :         CATCH_REQUIRE(list_of_options.find("path-to-option-definitions") != list_of_options.end());
    1015             : 
    1016             :         // an invalid parameter, MUST NOT EXIST
    1017           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1018           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1019           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1020           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1021           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1022             : 
    1023             :         // no default
    1024           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1025           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1026           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1027           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1028             : 
    1029             :         // valid parameter
    1030           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1031           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1032           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    1033           1 :         CATCH_REQUIRE(opt.get_string("size") == "33");
    1034           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "33");
    1035           1 :         CATCH_REQUIRE(opt["size"] == "33");
    1036           1 :         CATCH_REQUIRE(opt.get_long("size") == 33);
    1037           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 33);
    1038           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1039           1 :         CATCH_REQUIRE(opt.get_default("size") == "33");
    1040           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    1041             : 
    1042             :         // help parameter
    1043           1 :         CATCH_REQUIRE(opt.get_option("help") != nullptr);
    1044           1 :         CATCH_REQUIRE(opt.get_option('h') == opt.get_option("help"));
    1045           1 :         CATCH_REQUIRE(opt.is_defined("help"));
    1046           1 :         CATCH_REQUIRE(opt.get_string("help") == "");
    1047           1 :         CATCH_REQUIRE(opt.get_string("help", 0) == "");
    1048           1 :         CATCH_REQUIRE(opt["help"] == "");
    1049           1 :         CATCH_REQUIRE_FALSE(opt.has_default("help"));
    1050           1 :         CATCH_REQUIRE(opt.get_default("help").empty());
    1051           1 :         CATCH_REQUIRE(opt.size("help") == 1);
    1052             : 
    1053             :         // other parameters
    1054           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1055           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1056             : 
    1057             :         // process system options now
    1058           2 :         std::stringstream ss;
    1059           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1060           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
    1061           1 :         CATCH_REQUIRE_LONG_STRING(ss.str(),
    1062             : advgetopt::getopt::breakup_line(
    1063             :               "Usage: test system commands"
    1064             :             , 0
    1065             :             , advgetopt::getopt::get_line_width())
    1066             : + advgetopt::getopt::format_usage_string(
    1067             :               "--build-date"
    1068             :             , "print out the time and date when arguments was built and exit."
    1069             :             , 30
    1070             :             , advgetopt::getopt::get_line_width())
    1071             : + advgetopt::getopt::format_usage_string(
    1072             :               "--compiler-version"
    1073             :             , "print the version of the compiler used to compile the advgetopt library."
    1074             :             , 30
    1075             :             , advgetopt::getopt::get_line_width())
    1076             : + advgetopt::getopt::format_usage_string(
    1077             :               "--configuration-filenames"
    1078             :             , "print out the list of configuration files checked out by this"
    1079             :               " tool."
    1080             :             , 30
    1081             :             , advgetopt::getopt::get_line_width())
    1082             : + advgetopt::getopt::format_usage_string(
    1083             :               "--copyright or -C"
    1084             :             , "print out the copyright of arguments and exit."
    1085             :             , 30
    1086             :             , advgetopt::getopt::get_line_width())
    1087             : + advgetopt::getopt::format_usage_string(
    1088             :               "--environment-variable-name"
    1089             :             , "print out the name of the environment variable supported by"
    1090             :               " arguments (if any.)"
    1091             :             , 30
    1092             :             , advgetopt::getopt::get_line_width())
    1093             : + advgetopt::getopt::format_usage_string(
    1094             :               "--has-sanitizer"
    1095             :             , "print whether the advgetopt was compiled with the sanitizer extension."
    1096             :             , 30
    1097             :             , advgetopt::getopt::get_line_width())
    1098             : + advgetopt::getopt::format_usage_string(
    1099             :               "--help or -h"
    1100             :             , "print out this help screen and exit."
    1101             :             , 30
    1102             :             , advgetopt::getopt::get_line_width())
    1103             : + advgetopt::getopt::format_usage_string(
    1104             :               "--license or -L"
    1105             :             , "print out the license of arguments and exit."
    1106             :             , 30
    1107             :             , advgetopt::getopt::get_line_width())
    1108             : + advgetopt::getopt::format_usage_string(
    1109             :               "--long-help or -?"
    1110             :             , "show all the help from all the available options."
    1111             :             , 30
    1112             :             , advgetopt::getopt::get_line_width())
    1113             : + advgetopt::getopt::format_usage_string(
    1114             :               "--path-to-option-definitions"
    1115             :             , "print out the path to the option definitions."
    1116             :             , 30
    1117             :             , advgetopt::getopt::get_line_width())
    1118             : + advgetopt::getopt::format_usage_string(
    1119             :               "--print-option <arg>"
    1120             :             , "print the value of the named option after loading all the command line options."
    1121             :             , 30
    1122             :             , advgetopt::getopt::get_line_width())
    1123             : + advgetopt::getopt::format_usage_string(
    1124             :               "--show-option-sources"
    1125             :             , "parse all the options and then print out the source of each"
    1126             :               " value and each override."
    1127             :             , 30
    1128             :             , advgetopt::getopt::get_line_width())
    1129             : + advgetopt::getopt::format_usage_string(
    1130             :               "--size or -s <arg> (default is \"33\")"
    1131             :             , "define the size."
    1132             :             , 30
    1133             :             , advgetopt::getopt::get_line_width())
    1134             : + advgetopt::getopt::format_usage_string(
    1135             :               "--version or -V"
    1136             :             , "print out the version of arguments and exit."
    1137             :             , 30
    1138             :             , advgetopt::getopt::get_line_width())
    1139             : + "\n"
    1140             :   "Copyright matters\n"
    1141             :   "\n"
    1142             :                     );
    1143             :     }
    1144             :     CATCH_END_SECTION()
    1145             : 
    1146          10 :     CATCH_START_SECTION("Check with the --long-help system flag")
    1147             :     {
    1148           1 :         advgetopt::option const options[] =
    1149             :         {
    1150             :             advgetopt::define_option(
    1151             :                   advgetopt::Name("size")
    1152             :                 , advgetopt::ShortName('s')
    1153             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    1154             :                 , advgetopt::Help("define the size.")
    1155             :                 , advgetopt::DefaultValue("33")
    1156             :             ),
    1157             :             advgetopt::define_option(
    1158             :                   advgetopt::Name("obscure")
    1159             :                 , advgetopt::ShortName('o')
    1160             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1161             :                                                           , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
    1162             :                 , advgetopt::Help("obscure command, hidden by default.")
    1163             :             ),
    1164             :             advgetopt::define_option(
    1165             :                   advgetopt::Name("secret")
    1166             :                 , advgetopt::ShortName('S')
    1167             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1168             :                                                           , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
    1169             :                 , advgetopt::Help("even more secret command, hidden by default.")
    1170             :             ),
    1171             :             advgetopt::end_options()
    1172             :         };
    1173             : 
    1174           1 :         advgetopt::options_environment environment_options;
    1175           1 :         environment_options.f_project_name = "unittest";
    1176           1 :         environment_options.f_options = options;
    1177           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1178           1 :         environment_options.f_help_header = "Usage: test system commands";
    1179           1 :         environment_options.f_help_footer = "Copyright matters";
    1180             : 
    1181           1 :         char const * cargv[] =
    1182             :         {
    1183             :             "/usr/bin/arguments",
    1184             :             "--long-help",
    1185             :             nullptr
    1186             :         };
    1187           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1188           1 :         char ** argv = const_cast<char **>(cargv);
    1189             : 
    1190           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    1191             : 
    1192           1 :         CATCH_REQUIRE(opt.get_group_name() == std::string());
    1193             : 
    1194             :         // check that the result is valid
    1195             : 
    1196             :         // an invalid parameter, MUST NOT EXIST
    1197           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1198           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1199           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1200           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1201           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1202             : 
    1203             :         // no default
    1204           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1205           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1206           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1207           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1208             : 
    1209             :         // valid parameter
    1210           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1211           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1212           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    1213           1 :         CATCH_REQUIRE(opt.get_string("size") == "33");
    1214           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "33");
    1215           1 :         CATCH_REQUIRE(opt["size"] == "33");
    1216           1 :         CATCH_REQUIRE(opt.get_long("size") == 33);
    1217           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 33);
    1218           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1219           1 :         CATCH_REQUIRE(opt.get_default("size") == "33");
    1220           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    1221             : 
    1222             :         // help parameter
    1223           1 :         CATCH_REQUIRE(opt.get_option("long-help") != nullptr);
    1224           1 :         CATCH_REQUIRE(opt.get_option('?') == opt.get_option("long-help"));
    1225           1 :         CATCH_REQUIRE(opt.is_defined("long-help"));
    1226           1 :         CATCH_REQUIRE(opt.get_string("long-help") == "");
    1227           1 :         CATCH_REQUIRE(opt.get_string("long-help", 0) == "");
    1228           1 :         CATCH_REQUIRE(opt["long-help"] == "");
    1229           1 :         CATCH_REQUIRE_FALSE(opt.has_default("long-help"));
    1230           1 :         CATCH_REQUIRE(opt.get_default("long-help").empty());
    1231           1 :         CATCH_REQUIRE(opt.size("long-help") == 1);
    1232             : 
    1233             :         // other parameters
    1234           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1235           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1236             : 
    1237             :         // process system options now
    1238           2 :         std::stringstream ss;
    1239           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1240           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
    1241           1 :         CATCH_REQUIRE_LONG_STRING(ss.str(),
    1242             : advgetopt::getopt::breakup_line(
    1243             :               "Usage: test system commands"
    1244             :             , 0
    1245             :             , advgetopt::getopt::get_line_width())
    1246             : + advgetopt::getopt::format_usage_string(
    1247             :               "--build-date"
    1248             :             , "print out the time and date when arguments was built and exit."
    1249             :             , 30
    1250             :             , advgetopt::getopt::get_line_width())
    1251             : + advgetopt::getopt::format_usage_string(
    1252             :               "--compiler-version"
    1253             :             , "print the version of the compiler used to compile the advgetopt library."
    1254             :             , 30
    1255             :             , advgetopt::getopt::get_line_width())
    1256             : + advgetopt::getopt::format_usage_string(
    1257             :               "--configuration-filenames"
    1258             :             , "print out the list of configuration files checked out by this"
    1259             :               " tool."
    1260             :             , 30
    1261             :             , advgetopt::getopt::get_line_width())
    1262             : + advgetopt::getopt::format_usage_string(
    1263             :               "--copyright or -C"
    1264             :             , "print out the copyright of arguments and exit."
    1265             :             , 30
    1266             :             , advgetopt::getopt::get_line_width())
    1267             : + advgetopt::getopt::format_usage_string(
    1268             :               "--environment-variable-name"
    1269             :             , "print out the name of the environment variable supported by"
    1270             :               " arguments (if any.)"
    1271             :             , 30
    1272             :             , advgetopt::getopt::get_line_width())
    1273             : + advgetopt::getopt::format_usage_string(
    1274             :               "--has-sanitizer"
    1275             :             , "print whether the advgetopt was compiled with the sanitizer extension."
    1276             :             , 30
    1277             :             , advgetopt::getopt::get_line_width())
    1278             : + advgetopt::getopt::format_usage_string(
    1279             :               "--help or -h"
    1280             :             , "print out this help screen and exit."
    1281             :             , 30
    1282             :             , advgetopt::getopt::get_line_width())
    1283             : + advgetopt::getopt::format_usage_string(
    1284             :               "--license or -L"
    1285             :             , "print out the license of arguments and exit."
    1286             :             , 30
    1287             :             , advgetopt::getopt::get_line_width())
    1288             : + advgetopt::getopt::format_usage_string(
    1289             :               "--long-help or -?"
    1290             :             , "show all the help from all the available options."
    1291             :             , 30
    1292             :             , advgetopt::getopt::get_line_width())
    1293             : + advgetopt::getopt::format_usage_string(
    1294             :               "--obscure or -o <arg>"
    1295             :             , "obscure command, hidden by default."
    1296             :             , 30
    1297             :             , advgetopt::getopt::get_line_width())
    1298             : + advgetopt::getopt::format_usage_string(
    1299             :               "--path-to-option-definitions"
    1300             :             , "print out the path to the option definitions."
    1301             :             , 30
    1302             :             , advgetopt::getopt::get_line_width())
    1303             : + advgetopt::getopt::format_usage_string(
    1304             :               "--print-option <arg>"
    1305             :             , "print the value of the named option after loading all the command line options."
    1306             :             , 30
    1307             :             , advgetopt::getopt::get_line_width())
    1308             : + advgetopt::getopt::format_usage_string(
    1309             :               "--secret or -S <arg>"
    1310             :             , "even more secret command, hidden by default."
    1311             :             , 30
    1312             :             , advgetopt::getopt::get_line_width())
    1313             : + advgetopt::getopt::format_usage_string(
    1314             :               "--show-option-sources"
    1315             :             , "parse all the options and then print out the source of each"
    1316             :               " value and each override."
    1317             :             , 30
    1318             :             , advgetopt::getopt::get_line_width())
    1319             : + advgetopt::getopt::format_usage_string(
    1320             :               "--size or -s <arg> (default is \"33\")"
    1321             :             , "define the size."
    1322             :             , 30
    1323             :             , advgetopt::getopt::get_line_width())
    1324             : + advgetopt::getopt::format_usage_string(
    1325             :               "--version or -V"
    1326             :             , "print out the version of arguments and exit."
    1327             :             , 30
    1328             :             , advgetopt::getopt::get_line_width())
    1329             : + "\n"
    1330             :   "Copyright matters\n"
    1331             :   "\n"
    1332             :                     );
    1333             :     }
    1334             :     CATCH_END_SECTION()
    1335             : 
    1336          10 :     CATCH_START_SECTION("Check with the --help system flag, without a --help on the command line")
    1337           1 :         advgetopt::option const options[] =
    1338             :         {
    1339             :             advgetopt::define_option(
    1340             :                   advgetopt::Name("size")
    1341             :                 , advgetopt::ShortName('s')
    1342             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    1343             :                 , advgetopt::Help("define the size.")
    1344             :                 , advgetopt::DefaultValue("33")
    1345             :             ),
    1346             :             advgetopt::end_options()
    1347             :         };
    1348             : 
    1349           1 :         advgetopt::options_environment environment_options;
    1350           1 :         environment_options.f_project_name = "unittest";
    1351           1 :         environment_options.f_options = options;
    1352           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1353           1 :         environment_options.f_help_header = "Usage: test system commands";
    1354           1 :         environment_options.f_help_footer = "Copyright matters";
    1355             : 
    1356           1 :         char const * cargv[] =
    1357             :         {
    1358             :             "/usr/bin/arguments",
    1359             :             "--size",
    1360             :             "1221",
    1361             :             nullptr
    1362             :         };
    1363           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1364           1 :         char ** argv = const_cast<char **>(cargv);
    1365             : 
    1366           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    1367             : 
    1368             :         // check that the result is valid
    1369             : 
    1370             :         // an invalid parameter, MUST NOT EXIST
    1371           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1372           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1373           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1374           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1375           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1376             : 
    1377             :         // no default
    1378           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1379           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1380           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1381           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1382             : 
    1383             :         // valid parameter
    1384           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1385           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1386           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    1387           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
    1388           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
    1389           1 :         CATCH_REQUIRE(opt["size"] == "1221");
    1390           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
    1391           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
    1392           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1393           1 :         CATCH_REQUIRE(opt.get_default("size") == "33");
    1394           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    1395             : 
    1396             :         // help parameter
    1397           1 :         CATCH_REQUIRE(opt.get_option("help") != nullptr);
    1398           1 :         CATCH_REQUIRE(opt.get_option('h') == opt.get_option("help"));
    1399           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("help"));
    1400           1 :         CATCH_REQUIRE_FALSE(opt.has_default("help"));
    1401           1 :         CATCH_REQUIRE(opt.get_default("help").empty());
    1402           1 :         CATCH_REQUIRE(opt.size("help") == 0);
    1403             : 
    1404             :         // other parameters
    1405           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1406           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1407             : 
    1408             :         // process system options now
    1409           2 :         std::stringstream ss;
    1410           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1411           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
    1412           1 :         CATCH_REQUIRE(ss.str().empty());
    1413             :     CATCH_END_SECTION()
    1414             : 
    1415          10 :     CATCH_START_SECTION("Check with the --commmands-help system flag")
    1416             :     {
    1417           1 :         advgetopt::option const options[] =
    1418             :         {
    1419             :             advgetopt::define_option(
    1420             :                   advgetopt::Name("size")
    1421             :                 , advgetopt::ShortName('s')
    1422             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1423             :                                                           , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
    1424             :                 , advgetopt::Help("define the size.")
    1425             :                 , advgetopt::DefaultValue("33")
    1426             :             ),
    1427             :             advgetopt::define_option(
    1428             :                   advgetopt::Name("obscure")
    1429             :                 , advgetopt::ShortName('o')
    1430             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1431             :                                                           , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
    1432             :                 , advgetopt::Help("obscure command, hidden by default.")
    1433             :             ),
    1434             :             advgetopt::define_option(
    1435             :                   advgetopt::Name("secret")
    1436             :                 , advgetopt::ShortName('S')
    1437             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1438             :                                                           , advgetopt::GETOPT_FLAG_GROUP_OPTIONS>())
    1439             :                 , advgetopt::Help("even more secret command, hidden by default.")
    1440             :             ),
    1441             :             advgetopt::end_options()
    1442             :         };
    1443             : 
    1444           1 :         advgetopt::group_description const groups[] =
    1445             :         {
    1446             :             advgetopt::define_group(
    1447             :                   advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_COMMANDS)
    1448             :                 , advgetopt::GroupName("commands")
    1449             :                 , advgetopt::GroupDescription("Commands:")
    1450             :             ),
    1451             :             advgetopt::define_group(
    1452             :                   advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_OPTIONS)
    1453             :                 , advgetopt::GroupName("option")
    1454             :                 , advgetopt::GroupDescription("Options:")
    1455             :             ),
    1456             :             advgetopt::end_groups()
    1457             :         };
    1458             : 
    1459           1 :         advgetopt::options_environment environment_options;
    1460           1 :         environment_options.f_project_name = "unittest";
    1461           1 :         environment_options.f_options = options;
    1462           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1463           1 :         environment_options.f_help_header = "Usage: test system commands";
    1464           1 :         environment_options.f_help_footer = "Copyright matters";
    1465           1 :         environment_options.f_groups = groups;
    1466             : 
    1467           1 :         char const * cargv[] =
    1468             :         {
    1469             :             "/usr/bin/arguments",
    1470             :             "--commands-help",
    1471             :             nullptr
    1472             :         };
    1473           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1474           1 :         char ** argv = const_cast<char **>(cargv);
    1475             : 
    1476           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    1477             : 
    1478             :         // check that the result is valid
    1479             : 
    1480             :         // an invalid parameter, MUST NOT EXIST
    1481           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1482           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1483           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1484           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1485           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1486             : 
    1487             :         // no default
    1488           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1489           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1490           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1491           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1492             : 
    1493             :         // valid parameter
    1494           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1495           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1496           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    1497           1 :         CATCH_REQUIRE(opt.get_string("size") == "33");
    1498           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "33");
    1499           1 :         CATCH_REQUIRE(opt["size"] == "33");
    1500           1 :         CATCH_REQUIRE(opt.get_long("size") == 33);
    1501           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 33);
    1502           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1503           1 :         CATCH_REQUIRE(opt.get_default("size") == "33");
    1504           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    1505             : 
    1506             :         // help parameter
    1507           1 :         CATCH_REQUIRE(opt.get_option("commands-help") != nullptr);
    1508           1 :         CATCH_REQUIRE(opt.is_defined("commands-help"));
    1509           1 :         CATCH_REQUIRE(opt.get_string("commands-help") == "");
    1510           1 :         CATCH_REQUIRE(opt.get_string("commands-help", 0) == "");
    1511           1 :         CATCH_REQUIRE(opt["commands-help"] == "");
    1512           1 :         CATCH_REQUIRE_FALSE(opt.has_default("commands-help"));
    1513           1 :         CATCH_REQUIRE(opt.get_default("commands-help").empty());
    1514           1 :         CATCH_REQUIRE(opt.size("commands-help") == 1);
    1515             : 
    1516             :         // other parameters
    1517           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1518           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1519             : 
    1520             :         // process system options now
    1521           2 :         std::stringstream ss;
    1522           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1523           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
    1524           1 :         CATCH_REQUIRE_LONG_STRING(ss.str(),
    1525             : advgetopt::getopt::breakup_line(
    1526             :               "Usage: test system commands"
    1527             :             , 0
    1528             :             , advgetopt::getopt::get_line_width())
    1529             : + "\n"
    1530             :   "Commands:\n"
    1531             : + advgetopt::getopt::format_usage_string(
    1532             :               "--build-date"
    1533             :             , "print out the time and date when arguments was built and exit."
    1534             :             , 30
    1535             :             , advgetopt::getopt::get_line_width())
    1536             : + advgetopt::getopt::format_usage_string(
    1537             :               "--commands-help"
    1538             :             , "show help from the \"commands\" group of options."
    1539             :             , 30
    1540             :             , advgetopt::getopt::get_line_width())
    1541             : + advgetopt::getopt::format_usage_string(
    1542             :               "--compiler-version"
    1543             :             , "print the version of the compiler used to compile the advgetopt library."
    1544             :             , 30
    1545             :             , advgetopt::getopt::get_line_width())
    1546             : + advgetopt::getopt::format_usage_string(
    1547             :               "--configuration-filenames"
    1548             :             , "print out the list of configuration files checked out by this"
    1549             :               " tool."
    1550             :             , 30
    1551             :             , advgetopt::getopt::get_line_width())
    1552             : + advgetopt::getopt::format_usage_string(
    1553             :               "--copyright or -C"
    1554             :             , "print out the copyright of arguments and exit."
    1555             :             , 30
    1556             :             , advgetopt::getopt::get_line_width())
    1557             : + advgetopt::getopt::format_usage_string(
    1558             :               "--environment-variable-name"
    1559             :             , "print out the name of the environment variable supported by"
    1560             :               " arguments (if any.)"
    1561             :             , 30
    1562             :             , advgetopt::getopt::get_line_width())
    1563             : + advgetopt::getopt::format_usage_string(
    1564             :               "--has-sanitizer"
    1565             :             , "print whether the advgetopt was compiled with the sanitizer extension."
    1566             :             , 30
    1567             :             , advgetopt::getopt::get_line_width())
    1568             : + advgetopt::getopt::format_usage_string(
    1569             :               "--help or -h"
    1570             :             , "print out this help screen and exit."
    1571             :             , 30
    1572             :             , advgetopt::getopt::get_line_width())
    1573             : + advgetopt::getopt::format_usage_string(
    1574             :               "--license or -L"
    1575             :             , "print out the license of arguments and exit."
    1576             :             , 30
    1577             :             , advgetopt::getopt::get_line_width())
    1578             : + advgetopt::getopt::format_usage_string(
    1579             :               "--obscure or -o <arg>"
    1580             :             , "obscure command, hidden by default."
    1581             :             , 30
    1582             :             , advgetopt::getopt::get_line_width())
    1583             : + advgetopt::getopt::format_usage_string(
    1584             :               "--option-help"
    1585             :             , "show help from the \"option\" group of options."
    1586             :             , 30
    1587             :             , advgetopt::getopt::get_line_width())
    1588             : + advgetopt::getopt::format_usage_string(
    1589             :               "--path-to-option-definitions"
    1590             :             , "print out the path to the option definitions."
    1591             :             , 30
    1592             :             , advgetopt::getopt::get_line_width())
    1593             : + advgetopt::getopt::format_usage_string(
    1594             :               "--print-option <arg>"
    1595             :             , "print the value of the named option after loading all the command line options."
    1596             :             , 30
    1597             :             , advgetopt::getopt::get_line_width())
    1598             : + advgetopt::getopt::format_usage_string(
    1599             :               "--show-option-sources"
    1600             :             , "parse all the options and then print out the source of each"
    1601             :               " value and each override."
    1602             :             , 30
    1603             :             , advgetopt::getopt::get_line_width())
    1604             : + advgetopt::getopt::format_usage_string(
    1605             :               "--size or -s <arg> (default is \"33\")"
    1606             :             , "define the size."
    1607             :             , 30
    1608             :             , advgetopt::getopt::get_line_width())
    1609             : + advgetopt::getopt::format_usage_string(
    1610             :               "--version or -V"
    1611             :             , "print out the version of arguments and exit."
    1612             :             , 30
    1613             :             , advgetopt::getopt::get_line_width())
    1614             : + "\n"
    1615             :   "Copyright matters\n"
    1616             :   "\n"
    1617             :                     );
    1618             :     }
    1619             :     CATCH_END_SECTION()
    1620             : 
    1621          10 :     CATCH_START_SECTION("Check with the --options-help system flag")
    1622             :     {
    1623           1 :         advgetopt::option const options[] =
    1624             :         {
    1625             :             advgetopt::define_option(
    1626             :                   advgetopt::Name("size")
    1627             :                 , advgetopt::ShortName('s')
    1628             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1629             :                                                           , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
    1630             :                 , advgetopt::Help("define the size.")
    1631             :                 , advgetopt::DefaultValue("33")
    1632             :             ),
    1633             :             advgetopt::define_option(
    1634             :                   advgetopt::Name("obscure")
    1635             :                 , advgetopt::ShortName('o')
    1636             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1637             :                                                           , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
    1638             :                 , advgetopt::Help("obscure command, hidden by default.")
    1639             :             ),
    1640             :             advgetopt::define_option(
    1641             :                   advgetopt::Name("secret")
    1642             :                 , advgetopt::ShortName('S')
    1643             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
    1644             :                                                           , advgetopt::GETOPT_FLAG_GROUP_OPTIONS>())
    1645             :                 , advgetopt::Help("even more secret command, hidden by default.")
    1646             :             ),
    1647             :             advgetopt::end_options()
    1648             :         };
    1649             : 
    1650           1 :         advgetopt::group_description const groups[] =
    1651             :         {
    1652             :             advgetopt::define_group(
    1653             :                   advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_COMMANDS)
    1654             :                 , advgetopt::GroupName("commands")
    1655             :                 , advgetopt::GroupDescription("Commands:")
    1656             :             ),
    1657             :             advgetopt::define_group(
    1658             :                   advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_OPTIONS)
    1659             :                 , advgetopt::GroupName("options")
    1660             :                 , advgetopt::GroupDescription("Options:")
    1661             :             ),
    1662             :             advgetopt::end_groups()
    1663             :         };
    1664             : 
    1665           1 :         advgetopt::options_environment environment_options;
    1666           1 :         environment_options.f_project_name = "unittest";
    1667           1 :         environment_options.f_options = options;
    1668           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1669           1 :         environment_options.f_help_header = "Usage: test system commands";
    1670           1 :         environment_options.f_help_footer = "Copyright matters";
    1671           1 :         environment_options.f_groups = groups;
    1672             : 
    1673           1 :         char const * cargv[] =
    1674             :         {
    1675             :             "/usr/bin/arguments",
    1676             :             "--options-help",
    1677             :             nullptr
    1678             :         };
    1679           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1680           1 :         char ** argv = const_cast<char **>(cargv);
    1681             : 
    1682           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    1683             : 
    1684             :         // check that the result is valid
    1685             : 
    1686             :         // an invalid parameter, MUST NOT EXIST
    1687           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1688           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1689           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1690           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1691           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1692             : 
    1693             :         // no default
    1694           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1695           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1696           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1697           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1698             : 
    1699             :         // valid parameter
    1700           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1701           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1702           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    1703           1 :         CATCH_REQUIRE(opt.get_string("size") == "33");
    1704           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "33");
    1705           1 :         CATCH_REQUIRE(opt["size"] == "33");
    1706           1 :         CATCH_REQUIRE(opt.get_long("size") == 33);
    1707           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 33);
    1708           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1709           1 :         CATCH_REQUIRE(opt.get_default("size") == "33");
    1710           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    1711             : 
    1712             :         // help parameter
    1713           1 :         CATCH_REQUIRE(opt.get_option("options-help") != nullptr);
    1714           1 :         CATCH_REQUIRE(opt.is_defined("options-help"));
    1715           1 :         CATCH_REQUIRE(opt.get_string("options-help") == "");
    1716           1 :         CATCH_REQUIRE(opt.get_string("options-help", 0) == "");
    1717           1 :         CATCH_REQUIRE(opt["options-help"] == "");
    1718           1 :         CATCH_REQUIRE_FALSE(opt.has_default("options-help"));
    1719           1 :         CATCH_REQUIRE(opt.get_default("options-help").empty());
    1720           1 :         CATCH_REQUIRE(opt.size("options-help") == 1);
    1721             : 
    1722             :         // other parameters
    1723           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1724           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1725             : 
    1726             :         // process system options now
    1727           2 :         std::stringstream ss;
    1728           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1729           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
    1730           1 :         CATCH_REQUIRE_LONG_STRING(ss.str(),
    1731             : "Usage: test system commands\n"
    1732             : "\n"
    1733             : "Options:\n"
    1734             : "   --secret or -S <arg>       even more secret command, hidden by default.\n"
    1735             : "\n"
    1736             : "Copyright matters\n"
    1737             : "\n"
    1738             :                     );
    1739             :     }
    1740             :     CATCH_END_SECTION()
    1741           5 : }
    1742             : 
    1743             : 
    1744             : 
    1745           4 : CATCH_TEST_CASE("system_flags_copyright", "[arguments][valid][getopt][system_flags]")
    1746             : {
    1747           4 :     CATCH_START_SECTION("Check with the --copyright system flag")
    1748             :     {
    1749           1 :         advgetopt::option const options[] =
    1750             :         {
    1751             :             advgetopt::define_option(
    1752             :                   advgetopt::Name("size")
    1753             :                 , advgetopt::ShortName('s')
    1754             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    1755             :                 , advgetopt::Help("define the size.")
    1756             :                 , advgetopt::DefaultValue("23")
    1757             :             ),
    1758             :             advgetopt::end_options()
    1759             :         };
    1760             : 
    1761           1 :         advgetopt::options_environment environment_options;
    1762           1 :         environment_options.f_project_name = "unittest";
    1763           1 :         environment_options.f_options = options;
    1764           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1765           1 :         environment_options.f_copyright = "Copyright (c) " BOOST_PP_STRINGIZE(UTC_BUILD_YEAR) "  Made to Order Software Corporation";
    1766             : 
    1767           1 :         char const * cargv[] =
    1768             :         {
    1769             :             "/usr/bin/arguments",
    1770             :             "--copyright",
    1771             :             nullptr
    1772             :         };
    1773           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1774           1 :         char ** argv = const_cast<char **>(cargv);
    1775             : 
    1776           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    1777             : 
    1778             :         // check that the result is valid
    1779             : 
    1780             :         // an invalid parameter, MUST NOT EXIST
    1781           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1782           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1783           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1784           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1785           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1786             : 
    1787             :         // no default
    1788           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1789           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1790           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1791           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1792             : 
    1793             :         // valid parameter
    1794           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1795           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1796           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    1797           1 :         CATCH_REQUIRE(opt.get_string("size") == "23");
    1798           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "23");
    1799           1 :         CATCH_REQUIRE(opt["size"] == "23");
    1800           1 :         CATCH_REQUIRE(opt.get_long("size") == 23);
    1801           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 23);
    1802           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1803           1 :         CATCH_REQUIRE(opt.get_default("size") == "23");
    1804           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    1805             : 
    1806             :         // copyright parameter
    1807           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    1808           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    1809           1 :         CATCH_REQUIRE(opt.is_defined("copyright"));
    1810           1 :         CATCH_REQUIRE(opt.get_string("copyright") == "");
    1811           1 :         CATCH_REQUIRE(opt.get_string("copyright", 0) == "");
    1812           1 :         CATCH_REQUIRE(opt["copyright"] == "");
    1813           1 :         CATCH_REQUIRE_FALSE(opt.has_default("copyright"));
    1814           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    1815           1 :         CATCH_REQUIRE(opt.size("copyright") == 1);
    1816             : 
    1817             :         // other parameters
    1818           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1819           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1820             : 
    1821             :         // process system options now
    1822           2 :         std::stringstream ss;
    1823           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1824           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_COPYRIGHT);
    1825           1 :         CATCH_REQUIRE(ss.str() == "Copyright (c) " BOOST_PP_STRINGIZE(UTC_BUILD_YEAR) "  Made to Order Software Corporation\n");
    1826             :     }
    1827             :     CATCH_END_SECTION()
    1828             : 
    1829           4 :     CATCH_START_SECTION("Check with the --copyright system flag, without a --copyright on the command line")
    1830           1 :         advgetopt::option const options[] =
    1831             :         {
    1832             :             advgetopt::define_option(
    1833             :                   advgetopt::Name("size")
    1834             :                 , advgetopt::ShortName('s')
    1835             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    1836             :                 , advgetopt::Help("define the size.")
    1837             :                 , advgetopt::DefaultValue("53")
    1838             :             ),
    1839             :             advgetopt::end_options()
    1840             :         };
    1841             : 
    1842           1 :         advgetopt::options_environment environment_options;
    1843           1 :         environment_options.f_project_name = "unittest";
    1844           1 :         environment_options.f_options = options;
    1845           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1846           1 :         environment_options.f_help_header = "Usage: test system commands";
    1847           1 :         environment_options.f_help_footer = "Copyright matters";
    1848             : 
    1849           1 :         char const * cargv[] =
    1850             :         {
    1851             :             "/usr/bin/arguments",
    1852             :             "--size",
    1853             :             "1221",
    1854             :             nullptr
    1855             :         };
    1856           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1857           1 :         char ** argv = const_cast<char **>(cargv);
    1858             : 
    1859           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    1860             : 
    1861             :         // check that the result is valid
    1862             : 
    1863             :         // an invalid parameter, MUST NOT EXIST
    1864           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1865           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1866           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1867           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1868           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1869             : 
    1870             :         // no default
    1871           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1872           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1873           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1874           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1875             : 
    1876             :         // valid parameter
    1877           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1878           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1879           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    1880           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
    1881           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
    1882           1 :         CATCH_REQUIRE(opt["size"] == "1221");
    1883           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
    1884           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
    1885           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1886           1 :         CATCH_REQUIRE(opt.get_default("size") == "53");
    1887           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    1888             : 
    1889             :         // copyright parameter
    1890           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    1891           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    1892           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
    1893           1 :         CATCH_REQUIRE_FALSE(opt.has_default("copyright"));
    1894           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    1895           1 :         CATCH_REQUIRE(opt.size("copyright") == 0);
    1896             : 
    1897             :         // other parameters
    1898           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1899           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1900             : 
    1901             :         // process system options now
    1902           2 :         std::stringstream ss;
    1903           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1904           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
    1905           1 :         CATCH_REQUIRE(ss.str().empty());
    1906             :     CATCH_END_SECTION()
    1907           2 : }
    1908             : 
    1909             : 
    1910             : 
    1911           4 : CATCH_TEST_CASE("system_flags_license", "[arguments][valid][getopt][system_flags]")
    1912             : {
    1913           4 :     CATCH_START_SECTION("Check with the --license system flag")
    1914             :     {
    1915           1 :         advgetopt::option const options[] =
    1916             :         {
    1917             :             advgetopt::define_option(
    1918             :                   advgetopt::Name("size")
    1919             :                 , advgetopt::ShortName('s')
    1920             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    1921             :                 , advgetopt::Help("define the size.")
    1922             :                 , advgetopt::DefaultValue("73")
    1923             :             ),
    1924             :             advgetopt::end_options()
    1925             :         };
    1926             : 
    1927           1 :         advgetopt::options_environment environment_options;
    1928           1 :         environment_options.f_project_name = "unittest";
    1929           1 :         environment_options.f_options = options;
    1930           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1931           1 :         environment_options.f_license = "GPL v2";
    1932             : 
    1933           1 :         char const * cargv[] =
    1934             :         {
    1935             :             "/usr/bin/arguments",
    1936             :             "--license",
    1937             :             nullptr
    1938             :         };
    1939           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1940           1 :         char ** argv = const_cast<char **>(cargv);
    1941             : 
    1942           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    1943             : 
    1944             :         // check that the result is valid
    1945             : 
    1946             :         // an invalid parameter, MUST NOT EXIST
    1947           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1948           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1949           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1950           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1951           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1952             : 
    1953             :         // no default
    1954           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    1955           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    1956           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    1957           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    1958             : 
    1959             :         // valid parameter
    1960           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    1961           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    1962           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    1963           1 :         CATCH_REQUIRE(opt.get_string("size") == "73");
    1964           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "73");
    1965           1 :         CATCH_REQUIRE(opt["size"] == "73");
    1966           1 :         CATCH_REQUIRE(opt.get_long("size") == 73);
    1967           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 73);
    1968           1 :         CATCH_REQUIRE(opt.has_default("size"));
    1969           1 :         CATCH_REQUIRE(opt.get_default("size") == "73");
    1970           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    1971             : 
    1972             :         // license parameter
    1973           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    1974           1 :         CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
    1975           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    1976           1 :         CATCH_REQUIRE(opt.get_string("license") == "");
    1977           1 :         CATCH_REQUIRE(opt.get_string("license", 0) == "");
    1978           1 :         CATCH_REQUIRE(opt["license"] == "");
    1979           1 :         CATCH_REQUIRE_FALSE(opt.has_default("license"));
    1980           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    1981           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    1982             : 
    1983             :         // other parameters
    1984           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1985           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1986             : 
    1987             :         // process system options now
    1988           2 :         std::stringstream ss;
    1989           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    1990           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_LICENSE);
    1991           1 :         CATCH_REQUIRE(ss.str() == "GPL v2\n");
    1992             :     }
    1993             :     CATCH_END_SECTION()
    1994             : 
    1995           4 :     CATCH_START_SECTION("Check with the --license system flag, without a --license on the command line")
    1996           1 :         advgetopt::option const options[] =
    1997             :         {
    1998             :             advgetopt::define_option(
    1999             :                   advgetopt::Name("size")
    2000             :                 , advgetopt::ShortName('s')
    2001             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2002             :                 , advgetopt::Help("define the size.")
    2003             :                 , advgetopt::DefaultValue("103")
    2004             :             ),
    2005             :             advgetopt::end_options()
    2006             :         };
    2007             : 
    2008           1 :         advgetopt::options_environment environment_options;
    2009           1 :         environment_options.f_project_name = "unittest";
    2010           1 :         environment_options.f_options = options;
    2011           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2012           1 :         environment_options.f_help_header = "Usage: test system commands";
    2013           1 :         environment_options.f_help_footer = "Copyright matters";
    2014             : 
    2015           1 :         char const * cargv[] =
    2016             :         {
    2017             :             "/usr/bin/arguments",
    2018             :             "--size",
    2019             :             "1221",
    2020             :             nullptr
    2021             :         };
    2022           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2023           1 :         char ** argv = const_cast<char **>(cargv);
    2024             : 
    2025           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2026             : 
    2027             :         // check that the result is valid
    2028             : 
    2029             :         // an invalid parameter, MUST NOT EXIST
    2030           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2031           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2032           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2033           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2034           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2035             : 
    2036             :         // no default
    2037           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2038           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2039           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2040           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2041             : 
    2042             :         // valid parameter
    2043           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2044           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2045           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    2046           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
    2047           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
    2048           1 :         CATCH_REQUIRE(opt["size"] == "1221");
    2049           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
    2050           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
    2051           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2052           1 :         CATCH_REQUIRE(opt.get_default("size") == "103");
    2053           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    2054             : 
    2055             :         // license parameter
    2056           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    2057           1 :         CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
    2058           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("license"));
    2059           1 :         CATCH_REQUIRE_FALSE(opt.has_default("license"));
    2060           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    2061           1 :         CATCH_REQUIRE(opt.size("license") == 0);
    2062             : 
    2063             :         // other parameters
    2064           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2065           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2066             : 
    2067             :         // process system options now
    2068           2 :         std::stringstream ss;
    2069           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2070           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
    2071           1 :         CATCH_REQUIRE(ss.str().empty());
    2072             :     CATCH_END_SECTION()
    2073           2 : }
    2074             : 
    2075             : 
    2076             : 
    2077           4 : CATCH_TEST_CASE("system_flags_build_date", "[arguments][valid][getopt][system_flags]")
    2078             : {
    2079           4 :     CATCH_START_SECTION("Check with the --build-date system flag")
    2080             :     {
    2081           1 :         advgetopt::option const options[] =
    2082             :         {
    2083             :             advgetopt::define_option(
    2084             :                   advgetopt::Name("size")
    2085             :                 , advgetopt::ShortName('s')
    2086             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2087             :                 , advgetopt::Help("define the size.")
    2088             :                 , advgetopt::DefaultValue("7301")
    2089             :             ),
    2090             :             advgetopt::end_options()
    2091             :         };
    2092             : 
    2093           1 :         advgetopt::options_environment environment_options;
    2094           1 :         environment_options.f_project_name = "unittest";
    2095           1 :         environment_options.f_options = options;
    2096           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2097             : 
    2098           1 :         char const * cargv[] =
    2099             :         {
    2100             :             "/usr/bin/arguments",
    2101             :             "--build-date",
    2102             :             nullptr
    2103             :         };
    2104           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2105           1 :         char ** argv = const_cast<char **>(cargv);
    2106             : 
    2107           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2108             : 
    2109             :         // check that the result is valid
    2110             : 
    2111             :         // an invalid parameter, MUST NOT EXIST
    2112           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2113           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2114           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2115           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2116           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2117             : 
    2118             :         // no default
    2119           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2120           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2121           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2122           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2123             : 
    2124             :         // valid parameter
    2125           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2126           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2127           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    2128           1 :         CATCH_REQUIRE(opt.get_string("size") == "7301");
    2129           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
    2130           1 :         CATCH_REQUIRE(opt["size"] == "7301");
    2131           1 :         CATCH_REQUIRE(opt.get_long("size") == 7301);
    2132           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
    2133           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2134           1 :         CATCH_REQUIRE(opt.get_default("size") == "7301");
    2135           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    2136             : 
    2137             :         // build-date parameter
    2138           1 :         CATCH_REQUIRE(opt.get_option("build-date") != nullptr);
    2139           1 :         CATCH_REQUIRE(opt.is_defined("build-date"));
    2140           1 :         CATCH_REQUIRE(opt.get_string("build-date") == "");
    2141           1 :         CATCH_REQUIRE(opt.get_string("build-date", 0) == "");
    2142           1 :         CATCH_REQUIRE(opt["build-date"] == "");
    2143           1 :         CATCH_REQUIRE_FALSE(opt.has_default("build-date"));
    2144           1 :         CATCH_REQUIRE(opt.get_default("build-date").empty());
    2145           1 :         CATCH_REQUIRE(opt.size("build-date") == 1);
    2146             : 
    2147             :         // other parameters
    2148           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2149           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2150             : 
    2151             :         // process system options now
    2152           2 :         std::stringstream ss;
    2153           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2154           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_BUILD_DATE);
    2155           1 :         CATCH_REQUIRE(ss.str() == "Built on "
    2156             :                                 + std::string(environment_options.f_build_date)
    2157             :                                 + " at "
    2158             :                                 + environment_options.f_build_time
    2159             :                                 + "\n");
    2160             :     }
    2161             :     CATCH_END_SECTION()
    2162             : 
    2163           4 :     CATCH_START_SECTION("Check with the --build-date system flag, without a --build-date on the command line")
    2164           1 :         advgetopt::option const options[] =
    2165             :         {
    2166             :             advgetopt::define_option(
    2167             :                   advgetopt::Name("size")
    2168             :                 , advgetopt::ShortName('s')
    2169             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2170             :                 , advgetopt::Help("define the size.")
    2171             :                 , advgetopt::DefaultValue("103")
    2172             :             ),
    2173             :             advgetopt::end_options()
    2174             :         };
    2175             : 
    2176           1 :         advgetopt::options_environment environment_options;
    2177           1 :         environment_options.f_project_name = "unittest";
    2178           1 :         environment_options.f_options = options;
    2179           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2180           1 :         environment_options.f_help_header = "Usage: test system commands";
    2181           1 :         environment_options.f_help_footer = "Copyright matters";
    2182             : 
    2183           1 :         char const * cargv[] =
    2184             :         {
    2185             :             "/usr/bin/arguments",
    2186             :             "--size",
    2187             :             "1221",
    2188             :             nullptr
    2189             :         };
    2190           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2191           1 :         char ** argv = const_cast<char **>(cargv);
    2192             : 
    2193           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2194             : 
    2195             :         // check that the result is valid
    2196             : 
    2197             :         // an invalid parameter, MUST NOT EXIST
    2198           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2199           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2200           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2201           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2202           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2203             : 
    2204             :         // no default
    2205           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2206           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2207           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2208           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2209             : 
    2210             :         // valid parameter
    2211           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2212           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2213           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    2214           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
    2215           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
    2216           1 :         CATCH_REQUIRE(opt["size"] == "1221");
    2217           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
    2218           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
    2219           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2220           1 :         CATCH_REQUIRE(opt.get_default("size") == "103");
    2221           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    2222             : 
    2223             :         // build-date parameter
    2224           1 :         CATCH_REQUIRE(opt.get_option("build-date") != nullptr);
    2225           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("build-date"));
    2226           1 :         CATCH_REQUIRE_FALSE(opt.has_default("build-date"));
    2227           1 :         CATCH_REQUIRE(opt.get_default("build-date").empty());
    2228           1 :         CATCH_REQUIRE(opt.size("build-date") == 0);
    2229             : 
    2230             :         // other parameters
    2231           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2232           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2233             : 
    2234             :         // process system options now
    2235           2 :         std::stringstream ss;
    2236           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2237           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
    2238           1 :         CATCH_REQUIRE(ss.str().empty());
    2239             :     CATCH_END_SECTION()
    2240           2 : }
    2241             : 
    2242             : 
    2243             : 
    2244           6 : CATCH_TEST_CASE("system_flags_environment_variable_name", "[arguments][valid][getopt][system_flags]")
    2245             : {
    2246           8 :     CATCH_START_SECTION("Check with the --environment-variable-name system flag")
    2247             :     {
    2248           1 :         advgetopt::option const options[] =
    2249             :         {
    2250             :             advgetopt::define_option(
    2251             :                   advgetopt::Name("size")
    2252             :                 , advgetopt::ShortName('s')
    2253             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2254             :                 , advgetopt::Help("define the size.")
    2255             :                 , advgetopt::DefaultValue("7301")
    2256             :             ),
    2257             :             advgetopt::end_options()
    2258             :         };
    2259             : 
    2260           1 :         advgetopt::options_environment environment_options;
    2261           1 :         environment_options.f_project_name = "unittest";
    2262           1 :         environment_options.f_options = options;
    2263           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2264           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_OPTIONS";
    2265             : 
    2266           1 :         char const * cargv[] =
    2267             :         {
    2268             :             "/usr/bin/arguments",
    2269             :             "--environment-variable-name",
    2270             :             nullptr
    2271             :         };
    2272           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2273           1 :         char ** argv = const_cast<char **>(cargv);
    2274             : 
    2275           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2276             : 
    2277             :         // check that the result is valid
    2278             : 
    2279             :         // an invalid parameter, MUST NOT EXIST
    2280           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2281           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2282           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2283           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2284           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2285             : 
    2286             :         // no default
    2287           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2288           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2289           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2290           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2291             : 
    2292             :         // valid parameter
    2293           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2294           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2295           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    2296           1 :         CATCH_REQUIRE(opt.get_string("size") == "7301");
    2297           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
    2298           1 :         CATCH_REQUIRE(opt["size"] == "7301");
    2299           1 :         CATCH_REQUIRE(opt.get_long("size") == 7301);
    2300           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
    2301           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2302           1 :         CATCH_REQUIRE(opt.get_default("size") == "7301");
    2303           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    2304             : 
    2305             :         // environment-variable-name parameter
    2306           1 :         CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
    2307           1 :         CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
    2308           1 :         CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
    2309           1 :         CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
    2310           1 :         CATCH_REQUIRE(opt["environment-variable-name"] == "");
    2311           1 :         CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
    2312           1 :         CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
    2313           1 :         CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
    2314             : 
    2315             :         // other parameters
    2316           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2317           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2318             : 
    2319             :         // process system options now
    2320           2 :         std::stringstream ss;
    2321           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2322           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
    2323           1 :         CATCH_REQUIRE(ss.str() == "ADVGETOPT_OPTIONS\n");
    2324             :     }
    2325             :     CATCH_END_SECTION()
    2326             : 
    2327           8 :     CATCH_START_SECTION("Check with the --environment-variable-name system flag with nullptr")
    2328             :     {
    2329           1 :         advgetopt::option const options[] =
    2330             :         {
    2331             :             advgetopt::define_option(
    2332             :                   advgetopt::Name("size")
    2333             :                 , advgetopt::ShortName('s')
    2334             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2335             :                 , advgetopt::Help("define the size.")
    2336             :                 , advgetopt::DefaultValue("7301")
    2337             :             ),
    2338             :             advgetopt::end_options()
    2339             :         };
    2340             : 
    2341           1 :         advgetopt::options_environment environment_options;
    2342           1 :         environment_options.f_project_name = "unittest";
    2343           1 :         environment_options.f_options = options;
    2344           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2345           1 :         environment_options.f_environment_variable_name = nullptr;
    2346             : 
    2347           1 :         char const * cargv[] =
    2348             :         {
    2349             :             "/usr/bin/arguments",
    2350             :             "--environment-variable-name",
    2351             :             nullptr
    2352             :         };
    2353           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2354           1 :         char ** argv = const_cast<char **>(cargv);
    2355             : 
    2356           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2357             : 
    2358             :         // check that the result is valid
    2359             : 
    2360             :         // an invalid parameter, MUST NOT EXIST
    2361           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2362           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2363           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2364           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2365           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2366             : 
    2367             :         // no default
    2368           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2369           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2370           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2371           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2372             : 
    2373             :         // valid parameter
    2374           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2375           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2376           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    2377           1 :         CATCH_REQUIRE(opt.get_string("size") == "7301");
    2378           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
    2379           1 :         CATCH_REQUIRE(opt["size"] == "7301");
    2380           1 :         CATCH_REQUIRE(opt.get_long("size") == 7301);
    2381           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
    2382           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2383           1 :         CATCH_REQUIRE(opt.get_default("size") == "7301");
    2384           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    2385             : 
    2386             :         // environment-variable-name parameter
    2387           1 :         CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
    2388           1 :         CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
    2389           1 :         CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
    2390           1 :         CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
    2391           1 :         CATCH_REQUIRE(opt["environment-variable-name"] == "");
    2392           1 :         CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
    2393           1 :         CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
    2394           1 :         CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
    2395             : 
    2396             :         // other parameters
    2397           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2398           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2399             : 
    2400             :         // process system options now
    2401           2 :         std::stringstream ss;
    2402           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2403           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
    2404           1 :         CATCH_REQUIRE(ss.str() == "unittest does not support an environment variable.\n");
    2405             :     }
    2406             :     CATCH_END_SECTION()
    2407             : 
    2408           8 :     CATCH_START_SECTION("Check with the --environment-variable-name system flag with \"\"")
    2409             :     {
    2410           1 :         advgetopt::option const options[] =
    2411             :         {
    2412             :             advgetopt::define_option(
    2413             :                   advgetopt::Name("size")
    2414             :                 , advgetopt::ShortName('s')
    2415             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2416             :                 , advgetopt::Help("define the size.")
    2417             :                 , advgetopt::DefaultValue("7301")
    2418             :             ),
    2419             :             advgetopt::end_options()
    2420             :         };
    2421             : 
    2422           1 :         advgetopt::options_environment environment_options;
    2423           1 :         environment_options.f_project_name = "unittest";
    2424           1 :         environment_options.f_options = options;
    2425           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2426           1 :         environment_options.f_environment_variable_name = "";
    2427             : 
    2428           1 :         char const * cargv[] =
    2429             :         {
    2430             :             "/usr/bin/arguments",
    2431             :             "--environment-variable-name",
    2432             :             nullptr
    2433             :         };
    2434           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2435           1 :         char ** argv = const_cast<char **>(cargv);
    2436             : 
    2437           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2438             : 
    2439             :         // check that the result is valid
    2440             : 
    2441             :         // an invalid parameter, MUST NOT EXIST
    2442           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2443           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2444           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2445           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2446           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2447             : 
    2448             :         // no default
    2449           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2450           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2451           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2452           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2453             : 
    2454             :         // valid parameter
    2455           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2456           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2457           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    2458           1 :         CATCH_REQUIRE(opt.get_string("size") == "7301");
    2459           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
    2460           1 :         CATCH_REQUIRE(opt["size"] == "7301");
    2461           1 :         CATCH_REQUIRE(opt.get_long("size") == 7301);
    2462           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
    2463           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2464           1 :         CATCH_REQUIRE(opt.get_default("size") == "7301");
    2465           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    2466             : 
    2467             :         // environment-variable-name parameter
    2468           1 :         CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
    2469           1 :         CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
    2470           1 :         CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
    2471           1 :         CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
    2472           1 :         CATCH_REQUIRE(opt["environment-variable-name"] == "");
    2473           1 :         CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
    2474           1 :         CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
    2475           1 :         CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
    2476             : 
    2477             :         // other parameters
    2478           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2479           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2480             : 
    2481             :         // process system options now
    2482           2 :         std::stringstream ss;
    2483           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2484           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
    2485           1 :         CATCH_REQUIRE(ss.str() == "unittest does not support an environment variable.\n");
    2486             :     }
    2487             :     CATCH_END_SECTION()
    2488             : 
    2489           8 :     CATCH_START_SECTION("Check with the --environment-variable-name system flag, without a --environment-variable-name on the command line")
    2490           1 :         advgetopt::option const options[] =
    2491             :         {
    2492             :             advgetopt::define_option(
    2493             :                   advgetopt::Name("size")
    2494             :                 , advgetopt::ShortName('s')
    2495             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2496             :                 , advgetopt::Help("define the size.")
    2497             :                 , advgetopt::DefaultValue("103")
    2498             :             ),
    2499             :             advgetopt::end_options()
    2500             :         };
    2501             : 
    2502           1 :         advgetopt::options_environment environment_options;
    2503           1 :         environment_options.f_project_name = "unittest";
    2504           1 :         environment_options.f_options = options;
    2505           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2506           1 :         environment_options.f_help_header = "Usage: test system commands";
    2507           1 :         environment_options.f_help_footer = "Copyright matters";
    2508             : 
    2509           1 :         char const * cargv[] =
    2510             :         {
    2511             :             "/usr/bin/arguments",
    2512             :             "--size",
    2513             :             "1221",
    2514             :             nullptr
    2515             :         };
    2516           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2517           1 :         char ** argv = const_cast<char **>(cargv);
    2518             : 
    2519           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2520             : 
    2521             :         // check that the result is valid
    2522             : 
    2523             :         // an invalid parameter, MUST NOT EXIST
    2524           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2525           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2526           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2527           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2528           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2529             : 
    2530             :         // no default
    2531           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2532           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2533           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2534           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2535             : 
    2536             :         // valid parameter
    2537           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2538           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2539           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    2540           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
    2541           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
    2542           1 :         CATCH_REQUIRE(opt["size"] == "1221");
    2543           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
    2544           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
    2545           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2546           1 :         CATCH_REQUIRE(opt.get_default("size") == "103");
    2547           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    2548             : 
    2549             :         // environment-variable-name parameter
    2550           1 :         CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
    2551           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("environment-variable-name"));
    2552           1 :         CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
    2553           1 :         CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
    2554           1 :         CATCH_REQUIRE(opt.size("environment-variable-name") == 0);
    2555             : 
    2556             :         // other parameters
    2557           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2558           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2559             : 
    2560             :         // process system options now
    2561           2 :         std::stringstream ss;
    2562           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2563           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
    2564           1 :         CATCH_REQUIRE(ss.str().empty());
    2565             :     CATCH_END_SECTION()
    2566           4 : }
    2567             : 
    2568             : 
    2569             : 
    2570           6 : CATCH_TEST_CASE("system_flags_configuration_filenames", "[arguments][valid][getopt][system_flags]")
    2571             : {
    2572           8 :     CATCH_START_SECTION("Check with the --configuration-filenames system flag")
    2573             :     {
    2574           2 :         snapdev::safe_setenv env("HOME", "/home/advgetopt");
    2575             : 
    2576           1 :         advgetopt::option const options[] =
    2577             :         {
    2578             :             advgetopt::define_option(
    2579             :                   advgetopt::Name("size")
    2580             :                 , advgetopt::ShortName('s')
    2581             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2582             :                 , advgetopt::Help("define the size.")
    2583             :                 , advgetopt::DefaultValue("3101")
    2584             :             ),
    2585             :             advgetopt::end_options()
    2586             :         };
    2587             : 
    2588           1 :         char const * confs[] =
    2589             :         {
    2590             :             ".config/file.mdi",
    2591             :             "/etc/snapwebsites/server.conf",
    2592             :             "~/.config/advgetopt/snap.conf",
    2593             :             nullptr
    2594             :         };
    2595           1 :         char const * dirs[] =
    2596             :         {
    2597             :             ".config",
    2598             :             "/etc/secret",
    2599             :             "~/.config/snapwebsites",
    2600             :             nullptr
    2601             :         };
    2602             : 
    2603           1 :         advgetopt::options_environment environment_options;
    2604           1 :         environment_options.f_project_name = "unittest";
    2605           1 :         environment_options.f_options = options;
    2606           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2607           1 :         environment_options.f_configuration_files = confs;
    2608           1 :         environment_options.f_configuration_filename = "snapdb.conf";
    2609           1 :         environment_options.f_configuration_directories = dirs;
    2610             : 
    2611           1 :         char const * cargv[] =
    2612             :         {
    2613             :             "/usr/bin/arguments",
    2614             :             "--configuration-filenames",
    2615             :             nullptr
    2616             :         };
    2617           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2618           1 :         char ** argv = const_cast<char **>(cargv);
    2619             : 
    2620           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2621             : 
    2622             :         // check that the result is valid
    2623             : 
    2624             :         // an invalid parameter, MUST NOT EXIST
    2625           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2626           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2627           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2628           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2629           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2630             : 
    2631             :         // no default
    2632           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2633           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2634           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2635           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2636             : 
    2637             :         // valid parameter
    2638           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2639           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2640           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    2641           1 :         CATCH_REQUIRE(opt.get_string("size") == "3101");
    2642           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
    2643           1 :         CATCH_REQUIRE(opt["size"] == "3101");
    2644           1 :         CATCH_REQUIRE(opt.get_long("size") == 3101);
    2645           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
    2646           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2647           1 :         CATCH_REQUIRE(opt.get_default("size") == "3101");
    2648           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    2649             : 
    2650             :         // configuration-filenames parameter
    2651           1 :         CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
    2652           1 :         CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
    2653           1 :         CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
    2654           1 :         CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
    2655           1 :         CATCH_REQUIRE(opt["configuration-filenames"] == "");
    2656           1 :         CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
    2657           1 :         CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
    2658           1 :         CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
    2659             : 
    2660             :         // other parameters
    2661           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2662           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2663             : 
    2664             :         // process system options now
    2665           2 :         std::stringstream ss;
    2666           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2667           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES);
    2668           1 :         CATCH_REQUIRE(getenv("HOME") != nullptr);
    2669           2 :         std::string const home(getenv("HOME"));
    2670           1 :         CATCH_REQUIRE(ss.str() ==
    2671             : "Configuration filenames:\n"
    2672             : " . .config/file.mdi\n"
    2673             : " . .config/unittest.d/50-file.mdi\n"
    2674             : " . /etc/snapwebsites/server.conf\n"
    2675             : " . /etc/snapwebsites/unittest.d/50-server.conf\n"
    2676             : " . " + home + "/.config/advgetopt/snap.conf\n"
    2677             : " . .config/snapdb.conf\n"
    2678             : " . .config/unittest.d/50-snapdb.conf\n"
    2679             : " . /etc/secret/snapdb.conf\n"
    2680             : " . /etc/secret/unittest.d/50-snapdb.conf\n"
    2681             : " . " + home + "/.config/snapwebsites/snapdb.conf\n"
    2682             : );
    2683             :     }
    2684             :     CATCH_END_SECTION()
    2685             : 
    2686           8 :     CATCH_START_SECTION("Check with the --configuration-filenames system flag with --config-dir too")
    2687             :     {
    2688           2 :         snapdev::safe_setenv env("HOME", "/home/advgetopt");
    2689             : 
    2690           1 :         advgetopt::option const options[] =
    2691             :         {
    2692             :             advgetopt::define_option(
    2693             :                   advgetopt::Name("size")
    2694             :                 , advgetopt::ShortName('s')
    2695             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2696             :                 , advgetopt::Help("define the size.")
    2697             :                 , advgetopt::DefaultValue("3101")
    2698             :             ),
    2699             :             advgetopt::end_options()
    2700             :         };
    2701             : 
    2702           1 :         char const * confs[] =
    2703             :         {
    2704             :             ".config/file.mdi",
    2705             :             "/etc/snapwebsites/server.conf",
    2706             :             "~/.config/advgetopt/snap.conf",
    2707             :             nullptr
    2708             :         };
    2709           1 :         char const * dirs[] =
    2710             :         {
    2711             :             ".config",
    2712             :             "/etc/secret",
    2713             :             "~/.config/snapwebsites",
    2714             :             nullptr
    2715             :         };
    2716             : 
    2717           1 :         advgetopt::options_environment environment_options;
    2718           1 :         environment_options.f_project_name = "unittest";
    2719           1 :         environment_options.f_options = options;
    2720           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2721           1 :         environment_options.f_configuration_files = confs;
    2722           1 :         environment_options.f_configuration_filename = "snapdb.conf";
    2723           1 :         environment_options.f_configuration_directories = dirs;
    2724             : 
    2725           1 :         char const * cargv[] =
    2726             :         {
    2727             :             "/usr/bin/arguments",
    2728             :             "--config-dir",
    2729             :             "/var/lib/advgetopt",
    2730             :             "--configuration-filenames",
    2731             :             "--config-dir",
    2732             :             "/opt/config",
    2733             :             nullptr
    2734             :         };
    2735           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2736           1 :         char ** argv = const_cast<char **>(cargv);
    2737             : 
    2738           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2739             : 
    2740             :         // check that the result is valid
    2741             : 
    2742             :         // an invalid parameter, MUST NOT EXIST
    2743           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2744           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2745           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2746           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2747           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2748             : 
    2749             :         // no default
    2750           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2751           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2752           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2753           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2754             : 
    2755             :         // valid parameter
    2756           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2757           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2758           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    2759           1 :         CATCH_REQUIRE(opt.get_string("size") == "3101");
    2760           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
    2761           1 :         CATCH_REQUIRE(opt["size"] == "3101");
    2762           1 :         CATCH_REQUIRE(opt.get_long("size") == 3101);
    2763           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
    2764           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2765           1 :         CATCH_REQUIRE(opt.get_default("size") == "3101");
    2766           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    2767             : 
    2768             :         // configuration-filenames parameter
    2769           1 :         CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
    2770           1 :         CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
    2771           1 :         CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
    2772           1 :         CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
    2773           1 :         CATCH_REQUIRE(opt["configuration-filenames"] == "");
    2774           1 :         CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
    2775           1 :         CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
    2776           1 :         CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
    2777             : 
    2778             :         // other parameters
    2779           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2780           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2781             : 
    2782             :         // process system options now
    2783           2 :         std::stringstream ss;
    2784           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2785           1 :         CATCH_REQUIRE(result == (advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES
    2786             :                                | advgetopt::SYSTEM_OPTION_CONFIG_DIR));
    2787           1 :         CATCH_REQUIRE(getenv("HOME") != nullptr);
    2788           2 :         std::string const home(getenv("HOME"));
    2789           1 :         CATCH_REQUIRE(ss.str() ==
    2790             : "Configuration filenames:\n"
    2791             : " . .config/file.mdi\n"
    2792             : " . .config/unittest.d/50-file.mdi\n"
    2793             : " . /etc/snapwebsites/server.conf\n"
    2794             : " . /etc/snapwebsites/unittest.d/50-server.conf\n"
    2795             : " . " + home + "/.config/advgetopt/snap.conf\n"
    2796             : " . /var/lib/advgetopt/snapdb.conf\n"
    2797             : " . /var/lib/advgetopt/unittest.d/50-snapdb.conf\n"
    2798             : " . /opt/config/snapdb.conf\n"
    2799             : " . /opt/config/unittest.d/50-snapdb.conf\n"
    2800             : " . .config/snapdb.conf\n"
    2801             : " . .config/unittest.d/50-snapdb.conf\n"
    2802             : " . /etc/secret/snapdb.conf\n"
    2803             : " . /etc/secret/unittest.d/50-snapdb.conf\n"
    2804             : " . " + home + "/.config/snapwebsites/snapdb.conf\n"
    2805             : );
    2806             :     }
    2807             :     CATCH_END_SECTION()
    2808             : 
    2809           8 :     CATCH_START_SECTION("Check with the --configuration-filenames system flag without any configuration files")
    2810             :     {
    2811           1 :         advgetopt::option const options[] =
    2812             :         {
    2813             :             advgetopt::define_option(
    2814             :                   advgetopt::Name("size")
    2815             :                 , advgetopt::ShortName('s')
    2816             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2817             :                 , advgetopt::Help("define the size.")
    2818             :                 , advgetopt::DefaultValue("3101")
    2819             :             ),
    2820             :             advgetopt::end_options()
    2821             :         };
    2822             : 
    2823           1 :         advgetopt::options_environment environment_options;
    2824           1 :         environment_options.f_project_name = "unittest";
    2825           1 :         environment_options.f_options = options;
    2826           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2827             : 
    2828           1 :         char const * cargv[] =
    2829             :         {
    2830             :             "/usr/bin/arguments",
    2831             :             "--configuration-filenames",
    2832             :             nullptr
    2833             :         };
    2834           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2835           1 :         char ** argv = const_cast<char **>(cargv);
    2836             : 
    2837           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2838             : 
    2839             :         // check that the result is valid
    2840             : 
    2841             :         // an invalid parameter, MUST NOT EXIST
    2842           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2843           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2844           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2845           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2846           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2847             : 
    2848             :         // no default
    2849           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2850           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2851           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2852           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2853             : 
    2854             :         // valid parameter
    2855           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2856           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2857           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    2858           1 :         CATCH_REQUIRE(opt.get_string("size") == "3101");
    2859           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
    2860           1 :         CATCH_REQUIRE(opt["size"] == "3101");
    2861           1 :         CATCH_REQUIRE(opt.get_long("size") == 3101);
    2862           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
    2863           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2864           1 :         CATCH_REQUIRE(opt.get_default("size") == "3101");
    2865           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    2866             : 
    2867             :         // configuration-filenames parameter
    2868           1 :         CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
    2869           1 :         CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
    2870           1 :         CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
    2871           1 :         CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
    2872           1 :         CATCH_REQUIRE(opt["configuration-filenames"] == "");
    2873           1 :         CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
    2874           1 :         CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
    2875           1 :         CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
    2876             : 
    2877             :         // other parameters
    2878           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2879           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2880             : 
    2881             :         // process system options now
    2882           2 :         std::stringstream ss;
    2883           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2884           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES);
    2885           1 :         CATCH_REQUIRE(ss.str() == "unittest does not support configuration files.\n");
    2886             :     }
    2887             :     CATCH_END_SECTION()
    2888             : 
    2889           8 :     CATCH_START_SECTION("Check with the --configuration-filenames system flag, without a --configuration-filenames on the command line")
    2890           1 :         advgetopt::option const options[] =
    2891             :         {
    2892             :             advgetopt::define_option(
    2893             :                   advgetopt::Name("size")
    2894             :                 , advgetopt::ShortName('s')
    2895             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2896             :                 , advgetopt::Help("define the size.")
    2897             :                 , advgetopt::DefaultValue("193")
    2898             :             ),
    2899             :             advgetopt::end_options()
    2900             :         };
    2901             : 
    2902           1 :         char const * confs[] =
    2903             :         {
    2904             :             ".config/file.mdi",
    2905             :             "/etc/snapwebsites/server.conf",
    2906             :             "~/.config/advgetopt/snap.conf",
    2907             :             nullptr
    2908             :         };
    2909           1 :         char const * dirs[] =
    2910             :         {
    2911             :             ".config",
    2912             :             "/etc/secret",
    2913             :             "~/.config/snapwebsites",
    2914             :             nullptr
    2915             :         };
    2916             : 
    2917           1 :         advgetopt::options_environment environment_options;
    2918           1 :         environment_options.f_project_name = "unittest";
    2919           1 :         environment_options.f_options = options;
    2920           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2921           1 :         environment_options.f_help_header = "Usage: test system commands";
    2922           1 :         environment_options.f_help_footer = "Copyright matters";
    2923           1 :         environment_options.f_configuration_files = confs;
    2924           1 :         environment_options.f_configuration_filename = "snapdb.conf";
    2925           1 :         environment_options.f_configuration_directories = dirs;
    2926             : 
    2927           1 :         char const * cargv[] =
    2928             :         {
    2929             :             "/usr/bin/arguments",
    2930             :             "--size",
    2931             :             "1221",
    2932             :             nullptr
    2933             :         };
    2934           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2935           1 :         char ** argv = const_cast<char **>(cargv);
    2936             : 
    2937           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2938             : 
    2939             :         // check that the result is valid
    2940             : 
    2941             :         // an invalid parameter, MUST NOT EXIST
    2942           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2943           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2944           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2945           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2946           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2947             : 
    2948             :         // no default
    2949           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    2950           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2951           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    2952           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    2953             : 
    2954             :         // valid parameter
    2955           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    2956           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    2957           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    2958           1 :         CATCH_REQUIRE(opt.get_string("size") == "1221");
    2959           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
    2960           1 :         CATCH_REQUIRE(opt["size"] == "1221");
    2961           1 :         CATCH_REQUIRE(opt.get_long("size") == 1221);
    2962           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
    2963           1 :         CATCH_REQUIRE(opt.has_default("size"));
    2964           1 :         CATCH_REQUIRE(opt.get_default("size") == "193");
    2965           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    2966             : 
    2967             :         // configuration-filenames parameter
    2968           1 :         CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
    2969           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("configuration-filenames"));
    2970           1 :         CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
    2971           1 :         CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
    2972           1 :         CATCH_REQUIRE(opt.size("configuration-filenames") == 0);
    2973             : 
    2974             :         // other parameters
    2975           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2976           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2977             : 
    2978             :         // process system options now
    2979           2 :         std::stringstream ss;
    2980           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    2981           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
    2982           1 :         CATCH_REQUIRE(ss.str().empty());
    2983             :     CATCH_END_SECTION()
    2984           4 : }
    2985             : 
    2986             : 
    2987             : 
    2988           5 : CATCH_TEST_CASE("system_flags_path_to_option_definitions", "[arguments][valid][getopt][system_flags]")
    2989             : {
    2990           6 :     CATCH_START_SECTION("Check with the --path-to-option-definitions system flag (Default)")
    2991             :     {
    2992           1 :         advgetopt::option const options[] =
    2993             :         {
    2994             :             advgetopt::define_option(
    2995             :                   advgetopt::Name("size")
    2996             :                 , advgetopt::ShortName('s')
    2997             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2998             :                 , advgetopt::Help("define the size.")
    2999             :                 , advgetopt::DefaultValue("7301")
    3000             :             ),
    3001             :             advgetopt::end_options()
    3002             :         };
    3003             : 
    3004           1 :         advgetopt::options_environment environment_options;
    3005           1 :         environment_options.f_project_name = "unittest";
    3006           1 :         environment_options.f_options = options;
    3007           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    3008             : 
    3009           1 :         char const * cargv[] =
    3010             :         {
    3011             :             "/usr/bin/arguments",
    3012             :             "--path-to-option-definitions",
    3013             :             nullptr
    3014             :         };
    3015           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3016           1 :         char ** argv = const_cast<char **>(cargv);
    3017             : 
    3018           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3019             : 
    3020             :         // check that the result is valid
    3021             : 
    3022             :         // an invalid parameter, MUST NOT EXIST
    3023           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3024           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3025           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3026           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3027           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3028             : 
    3029             :         // no default
    3030           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3031           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3032           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3033           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3034             : 
    3035             :         // valid parameter
    3036           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3037           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    3038           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    3039           1 :         CATCH_REQUIRE(opt.get_string("size") == "7301");
    3040           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
    3041           1 :         CATCH_REQUIRE(opt["size"] == "7301");
    3042           1 :         CATCH_REQUIRE(opt.get_long("size") == 7301);
    3043           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
    3044           1 :         CATCH_REQUIRE(opt.has_default("size"));
    3045           1 :         CATCH_REQUIRE(opt.get_default("size") == "7301");
    3046           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3047             : 
    3048             :         // path-to-option-definitions parameter
    3049           1 :         CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
    3050           1 :         CATCH_REQUIRE(opt.is_defined("path-to-option-definitions"));
    3051           1 :         CATCH_REQUIRE(opt.get_string("path-to-option-definitions") == "");
    3052           1 :         CATCH_REQUIRE(opt.get_string("path-to-option-definitions", 0) == "");
    3053           1 :         CATCH_REQUIRE(opt["path-to-option-definitions"] == "");
    3054           1 :         CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
    3055           1 :         CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
    3056           1 :         CATCH_REQUIRE(opt.size("path-to-option-definitions") == 1);
    3057             : 
    3058             :         // other parameters
    3059           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3060           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3061             : 
    3062             :         // process system options now
    3063           2 :         std::stringstream ss;
    3064           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    3065           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_PATH_TO_OPTION_DEFINITIONS);
    3066           1 :         CATCH_REQUIRE(ss.str() == "/usr/share/advgetopt/options/\n");
    3067             :     }
    3068             :     CATCH_END_SECTION()
    3069             : 
    3070           6 :     CATCH_START_SECTION("Check with the --path-to-option-definitions system flag (Specified)")
    3071             :     {
    3072           1 :         advgetopt::option const options[] =
    3073             :         {
    3074             :             advgetopt::define_option(
    3075             :                   advgetopt::Name("size")
    3076             :                 , advgetopt::ShortName('s')
    3077             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    3078             :                 , advgetopt::Help("define the size.")
    3079             :                 , advgetopt::DefaultValue("7301")
    3080             :             ),
    3081             :             advgetopt::end_options()
    3082             :         };
    3083             : 
    3084           1 :         advgetopt::options_environment environment_options;
    3085           1 :         environment_options.f_project_name = "unittest";
    3086           1 :         environment_options.f_options = options;
    3087           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    3088           1 :         environment_options.f_options_files_directory = "/opt/advgetopt/configs";
    3089             : 
    3090           1 :         char const * cargv[] =
    3091             :         {
    3092             :             "/usr/bin/arguments",
    3093             :             "--path-to-option-definitions",
    3094             :             nullptr
    3095             :         };
    3096           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3097           1 :         char ** argv = const_cast<char **>(cargv);
    3098             : 
    3099           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3100             : 
    3101             :         // check that the result is valid
    3102             : 
    3103             :         // an invalid parameter, MUST NOT EXIST
    3104           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3105           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3106           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3107           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3108           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3109             : 
    3110             :         // no default
    3111           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3112           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3113           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3114           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3115             : 
    3116             :         // valid parameter
    3117           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3118           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    3119           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    3120           1 :         CATCH_REQUIRE(opt.get_string("size") == "7301");
    3121           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
    3122           1 :         CATCH_REQUIRE(opt["size"] == "7301");
    3123           1 :         CATCH_REQUIRE(opt.get_long("size") == 7301);
    3124           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
    3125           1 :         CATCH_REQUIRE(opt.has_default("size"));
    3126           1 :         CATCH_REQUIRE(opt.get_default("size") == "7301");
    3127           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3128             : 
    3129             :         // path-to-option-definitions parameter
    3130           1 :         CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
    3131           1 :         CATCH_REQUIRE(opt.is_defined("path-to-option-definitions"));
    3132           1 :         CATCH_REQUIRE(opt.get_string("path-to-option-definitions") == "");
    3133           1 :         CATCH_REQUIRE(opt.get_string("path-to-option-definitions", 0) == "");
    3134           1 :         CATCH_REQUIRE(opt["path-to-option-definitions"] == "");
    3135           1 :         CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
    3136           1 :         CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
    3137           1 :         CATCH_REQUIRE(opt.size("path-to-option-definitions") == 1);
    3138             : 
    3139             :         // other parameters
    3140           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3141           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3142             : 
    3143             :         // process system options now
    3144           2 :         std::stringstream ss;
    3145           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    3146           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_PATH_TO_OPTION_DEFINITIONS);
    3147           1 :         CATCH_REQUIRE(ss.str() == "/opt/advgetopt/configs/\n");
    3148             :     }
    3149             :     CATCH_END_SECTION()
    3150             : 
    3151           6 :     CATCH_START_SECTION("Check with the --path-to-option-definitions system flag, without a --path-to-option-definitions on the command line")
    3152           1 :         advgetopt::option const options[] =
    3153             :         {
    3154             :             advgetopt::define_option(
    3155             :                   advgetopt::Name("size")
    3156             :                 , advgetopt::ShortName('s')
    3157             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    3158             :                 , advgetopt::Help("define the size.")
    3159             :                 , advgetopt::DefaultValue("303")
    3160             :             ),
    3161             :             advgetopt::end_options()
    3162             :         };
    3163             : 
    3164           1 :         advgetopt::options_environment environment_options;
    3165           1 :         environment_options.f_project_name = "unittest";
    3166           1 :         environment_options.f_options = options;
    3167           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    3168           1 :         environment_options.f_help_header = "Usage: test system commands";
    3169           1 :         environment_options.f_help_footer = "Copyright matters";
    3170             : 
    3171           1 :         char const * cargv[] =
    3172             :         {
    3173             :             "/usr/bin/arguments",
    3174             :             "--size",
    3175             :             "1919",
    3176             :             nullptr
    3177             :         };
    3178           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3179           1 :         char ** argv = const_cast<char **>(cargv);
    3180             : 
    3181           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3182             : 
    3183             :         // check that the result is valid
    3184             : 
    3185             :         // an invalid parameter, MUST NOT EXIST
    3186           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3187           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3188           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3189           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3190           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3191             : 
    3192             :         // no default
    3193           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3194           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3195           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3196           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3197             : 
    3198             :         // valid parameter
    3199           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3200           1 :         CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
    3201           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    3202           1 :         CATCH_REQUIRE(opt.get_string("size") == "1919");
    3203           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "1919");
    3204           1 :         CATCH_REQUIRE(opt["size"] == "1919");
    3205           1 :         CATCH_REQUIRE(opt.get_long("size") == 1919);
    3206           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 1919);
    3207           1 :         CATCH_REQUIRE(opt.has_default("size"));
    3208           1 :         CATCH_REQUIRE(opt.get_default("size") == "303");
    3209           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    3210             : 
    3211             :         // environment-variable-name parameter
    3212           1 :         CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
    3213           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("path-to-option-definitions"));
    3214           1 :         CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
    3215           1 :         CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
    3216           1 :         CATCH_REQUIRE(opt.size("path-to-option-definitions") == 0);
    3217             : 
    3218             :         // other parameters
    3219           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3220           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3221             : 
    3222             :         // process system options now
    3223           2 :         std::stringstream ss;
    3224           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
    3225           1 :         CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
    3226           1 :         CATCH_REQUIRE(ss.str().empty());
    3227             :     CATCH_END_SECTION()
    3228           3 : }
    3229             : 
    3230             : 
    3231             : 
    3232             : 
    3233             : 
    3234             : 
    3235             : 
    3236             : 
    3237           6 : CATCH_TEST_CASE("invalid_option_name", "[arguments][invalid][getopt]")
    3238             : {
    3239           8 :     CATCH_START_SECTION("Verify that asking for the string of a non-existant option fails")
    3240           1 :         advgetopt::options_environment environment_options;
    3241           1 :         environment_options.f_project_name = "unittest";
    3242           1 :         environment_options.f_options = nullptr;
    3243           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    3244           1 :         environment_options.f_help_header = "Usage: test get_string() functions";
    3245             : 
    3246           2 :         advgetopt::getopt opt(environment_options);
    3247             : 
    3248           1 :         char const * cargv[] =
    3249             :         {
    3250             :             "tests/options-parser",
    3251             :             "--license",
    3252             :             nullptr
    3253             :         };
    3254           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3255           1 :         char ** argv = const_cast<char **>(cargv);
    3256             : 
    3257           1 :         opt.finish_parsing(argc, argv);
    3258             : 
    3259           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3260             :                   opt.get_string("non-existant")
    3261             :                 , advgetopt::getopt_logic_error
    3262             :                 , Catch::Matchers::ExceptionMessage(
    3263             :                               "getopt_logic_error: there is no --non-existant option defined."));
    3264             : 
    3265           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3266             :                   opt.get_string("non-existant", 0)
    3267             :                 , advgetopt::getopt_logic_error
    3268             :                 , Catch::Matchers::ExceptionMessage(
    3269             :                               "getopt_logic_error: there is no --non-existant option defined."));
    3270             : 
    3271           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3272             :                   opt.get_string("non-existant", 1)
    3273             :                 , advgetopt::getopt_logic_error
    3274             :                 , Catch::Matchers::ExceptionMessage(
    3275             :                               "getopt_logic_error: there is no --non-existant option defined."));
    3276             :     CATCH_END_SECTION()
    3277             : 
    3278           8 :     CATCH_START_SECTION("Verify that asking for the long of a non-existant option fails")
    3279           1 :         advgetopt::options_environment environment_options;
    3280           1 :         environment_options.f_project_name = "unittest";
    3281           1 :         environment_options.f_options = nullptr;
    3282           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    3283           1 :         environment_options.f_help_header = "Usage: test get_string() functions";
    3284             : 
    3285           2 :         advgetopt::getopt opt(environment_options);
    3286             : 
    3287           1 :         char const * cargv[] =
    3288             :         {
    3289             :             "tests/options-parser",
    3290             :             "--license",
    3291             :             nullptr
    3292             :         };
    3293           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3294           1 :         char ** argv = const_cast<char **>(cargv);
    3295             : 
    3296           1 :         opt.finish_parsing(argc, argv);
    3297             : 
    3298           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3299             :                   opt.get_long("non-existant")
    3300             :                 , advgetopt::getopt_logic_error
    3301             :                 , Catch::Matchers::ExceptionMessage(
    3302             :                               "getopt_logic_error: there is no --non-existant option defined."));
    3303             : 
    3304           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3305             :                   opt.get_long("non-existant", 0)
    3306             :                 , advgetopt::getopt_logic_error
    3307             :                 , Catch::Matchers::ExceptionMessage(
    3308             :                               "getopt_logic_error: there is no --non-existant option defined."));
    3309             : 
    3310           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3311             :                   opt.get_long("non-existant", 1)
    3312             :                 , advgetopt::getopt_logic_error
    3313             :                 , Catch::Matchers::ExceptionMessage(
    3314             :                               "getopt_logic_error: there is no --non-existant option defined."));
    3315             :     CATCH_END_SECTION()
    3316             : 
    3317           8 :     CATCH_START_SECTION("Verify that asking for a default with an empty string fails")
    3318           1 :         advgetopt::options_environment environment_options;
    3319           1 :         environment_options.f_project_name = "unittest";
    3320           1 :         environment_options.f_options = nullptr;
    3321           1 :         environment_options.f_help_header = "Usage: test get_default() functions";
    3322             : 
    3323           2 :         advgetopt::getopt opt(environment_options);
    3324             : 
    3325           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3326             :                   opt.has_default("")
    3327             :                 , advgetopt::getopt_invalid_parameter
    3328             :                 , Catch::Matchers::ExceptionMessage(
    3329             :                               "getopt_exception: get_option() `name` argument cannot be empty."));
    3330             : 
    3331           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3332             :                   opt.has_default(std::string())
    3333             :                 , advgetopt::getopt_invalid_parameter
    3334             :                 , Catch::Matchers::ExceptionMessage(
    3335             :                               "getopt_exception: get_option() `name` argument cannot be empty."));
    3336             : 
    3337           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3338             :                   opt.get_default("")
    3339             :                 , advgetopt::getopt_invalid_parameter
    3340             :                 , Catch::Matchers::ExceptionMessage(
    3341             :                               "getopt_exception: get_option() `name` argument cannot be empty."));
    3342             : 
    3343           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3344             :                   opt.get_default(std::string())
    3345             :                 , advgetopt::getopt_invalid_parameter
    3346             :                 , Catch::Matchers::ExceptionMessage(
    3347             :                               "getopt_exception: get_option() `name` argument cannot be empty."));
    3348             :     CATCH_END_SECTION()
    3349             : 
    3350           8 :     CATCH_START_SECTION("[] operators want a valid name")
    3351           1 :         advgetopt::options_environment environment_options;
    3352           1 :         environment_options.f_project_name = "unittest";
    3353           1 :         environment_options.f_options = nullptr;
    3354           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    3355           1 :         environment_options.f_help_header = "Usage: test get_default() functions";
    3356             : 
    3357           2 :         advgetopt::getopt opt(environment_options);
    3358             : 
    3359           1 :         char const * cargv[] =
    3360             :         {
    3361             :             "tests/options-parser",
    3362             :             "--license",
    3363             :             nullptr
    3364             :         };
    3365           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3366           1 :         char ** argv = const_cast<char **>(cargv);
    3367             : 
    3368           1 :         opt.finish_parsing(argc, argv);
    3369             : 
    3370           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3371             :                   opt[""]
    3372             :                 , advgetopt::getopt_logic_error
    3373             :                 , Catch::Matchers::ExceptionMessage(
    3374             :                               "getopt_logic_error: argument name cannot be empty."));
    3375             : 
    3376           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3377             :                   opt[std::string()]
    3378             :                 , advgetopt::getopt_logic_error
    3379             :                 , Catch::Matchers::ExceptionMessage(
    3380             :                               "getopt_logic_error: argument name cannot be empty."));
    3381             : 
    3382           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3383             :                   opt["g"]
    3384             :                 , advgetopt::getopt_logic_error
    3385             :                 , Catch::Matchers::ExceptionMessage(
    3386             :                               "getopt_logic_error: argument name cannot be one letter if it does not exist in operator []."));
    3387             : 
    3388           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3389             :                   opt[std::string("g")]
    3390             :                 , advgetopt::getopt_logic_error
    3391             :                 , Catch::Matchers::ExceptionMessage(
    3392             :                               "getopt_logic_error: argument name cannot be one letter if it does not exist in operator []."));
    3393             : 
    3394           1 :         advgetopt::getopt const & const_opt(opt);
    3395             : 
    3396           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3397             :                   const_opt[""]
    3398             :                 , advgetopt::getopt_logic_error
    3399             :                 , Catch::Matchers::ExceptionMessage(
    3400             :                               "getopt_logic_error: argument name cannot be empty."));
    3401             : 
    3402           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3403             :                   const_opt[std::string()]
    3404             :                 , advgetopt::getopt_logic_error
    3405             :                 , Catch::Matchers::ExceptionMessage(
    3406             :                               "getopt_logic_error: argument name cannot be empty."));
    3407             :     CATCH_END_SECTION()
    3408           4 : }
    3409             : 
    3410             : 
    3411             : 
    3412           5 : CATCH_TEST_CASE("missing_default_value", "[arguments][invalid][getopt]")
    3413             : {
    3414           6 :     CATCH_START_SECTION("Verify a string value without arguments and no default")
    3415             :     {
    3416           1 :         advgetopt::option const options[] =
    3417             :         {
    3418             :             advgetopt::define_option(
    3419             :                   advgetopt::Name("size")
    3420             :                 , advgetopt::ShortName('s')
    3421             :                 , advgetopt::Flags(advgetopt::command_flags<
    3422             :                               advgetopt::GETOPT_FLAG_REQUIRED
    3423             :                             , advgetopt::GETOPT_FLAG_DYNAMIC_CONFIGURATION>())
    3424             :                 , advgetopt::Help("define the size.")
    3425             :             ),
    3426             :             advgetopt::end_options()
    3427             :         };
    3428             : 
    3429           1 :         advgetopt::options_environment environment_options;
    3430           1 :         environment_options.f_project_name = "unittest";
    3431           1 :         environment_options.f_options = options;
    3432           1 :         environment_options.f_help_header = "Usage: test get_string() functions";
    3433             : 
    3434           1 :         char const * cargv[] =
    3435             :         {
    3436             :             "/usr/bin/arguments",
    3437             :             nullptr
    3438             :         };
    3439           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3440           1 :         char ** argv = const_cast<char **>(cargv);
    3441             : 
    3442           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3443             : 
    3444             :         // check that the result is valid
    3445             : 
    3446             :         // an invalid parameter, MUST NOT EXIST
    3447           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3448           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3449           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3450           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3451           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3452             : 
    3453             :         // no default
    3454           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3455           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3456           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3457           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3458             : 
    3459             :         // the valid parameter
    3460           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3461           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    3462           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    3463           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3464           1 :         CATCH_REQUIRE(static_cast<advgetopt::getopt const &>(opt)["size"].empty());
    3465             : 
    3466           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3467             :                   opt.get_string("size")
    3468             :                 , advgetopt::getopt_logic_error
    3469             :                 , Catch::Matchers::ExceptionMessage(
    3470             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
    3471             : 
    3472           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3473             :                   opt.get_string("size", 0)
    3474             :                 , advgetopt::getopt_logic_error
    3475             :                 , Catch::Matchers::ExceptionMessage(
    3476             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
    3477             : 
    3478           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3479             :                   opt.get_string("size", 1)
    3480             :                 , advgetopt::getopt_logic_error
    3481             :                 , Catch::Matchers::ExceptionMessage(
    3482             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
    3483             : 
    3484             :         // these do not create an entry (even though it looks like it,
    3485             :         // i.e. it would for an std::map)
    3486             :         //
    3487           1 :         CATCH_REQUIRE(opt["size"].empty());
    3488           1 :         CATCH_REQUIRE(opt["size"].length() == 0);
    3489           1 :         CATCH_REQUIRE(opt["size"].size() == 0);
    3490             : 
    3491           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3492             : 
    3493           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3494             :                   opt.get_string("size", 0)
    3495             :                 , advgetopt::getopt_logic_error
    3496             :                 , Catch::Matchers::ExceptionMessage(
    3497             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
    3498             : 
    3499           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3500             :                   opt.get_string("size", 1)
    3501             :                 , advgetopt::getopt_logic_error
    3502             :                 , Catch::Matchers::ExceptionMessage(
    3503             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
    3504             : 
    3505             :         // now this one does create a value
    3506             :         //
    3507           1 :         opt["size"] = "45.3";
    3508             : 
    3509           1 :         CATCH_REQUIRE(opt.get_string("size") == "45.3");
    3510           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "45.3");
    3511             : 
    3512           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3513             :                   opt.get_string("size", 1)
    3514             :                 , advgetopt::getopt_undefined
    3515             :                 , Catch::Matchers::ExceptionMessage(
    3516             :                               "getopt_exception: option_info::get_value(): no value at index 1 (idx >= 1) for --size so you can't get this value."));
    3517             : 
    3518             :         // other parameters
    3519           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3520           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3521             :     }
    3522             :     CATCH_END_SECTION()
    3523             : 
    3524           6 :     CATCH_START_SECTION("Verify an integer (long) value without arguments and no default")
    3525             :     {
    3526           1 :         advgetopt::option const options[] =
    3527             :         {
    3528             :             advgetopt::define_option(
    3529             :                   advgetopt::Name("size")
    3530             :                 , advgetopt::ShortName('s')
    3531             :                 , advgetopt::Flags(advgetopt::command_flags<
    3532             :                               advgetopt::GETOPT_FLAG_REQUIRED
    3533             :                             , advgetopt::GETOPT_FLAG_DYNAMIC_CONFIGURATION>())
    3534             :                 , advgetopt::Help("define the size.")
    3535             :             ),
    3536             :             advgetopt::end_options()
    3537             :         };
    3538             : 
    3539           1 :         advgetopt::options_environment environment_options;
    3540           1 :         environment_options.f_project_name = "unittest";
    3541           1 :         environment_options.f_options = options;
    3542           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
    3543             : 
    3544           1 :         char const * cargv[] =
    3545             :         {
    3546             :             "/usr/bin/arguments",
    3547             :             nullptr
    3548             :         };
    3549           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3550           1 :         char ** argv = const_cast<char **>(cargv);
    3551             : 
    3552           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3553             : 
    3554             :         // check that the result is valid
    3555             : 
    3556             :         // an invalid parameter, MUST NOT EXIST
    3557           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3558           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3559           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3560           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3561           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3562             : 
    3563             :         // no default
    3564           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3565           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3566           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3567           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3568             : 
    3569             :         // the valid parameter
    3570           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3571           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    3572           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    3573           1 :         CATCH_REQUIRE_FALSE(opt.has_default("size"));
    3574           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3575             : 
    3576           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3577             :                   opt.get_long("size")
    3578             :                 , advgetopt::getopt_logic_error
    3579             :                 , Catch::Matchers::ExceptionMessage(
    3580             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
    3581             : 
    3582           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3583             :                   opt.get_long("size", 0)
    3584             :                 , advgetopt::getopt_logic_error
    3585             :                 , Catch::Matchers::ExceptionMessage(
    3586             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
    3587             : 
    3588           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3589             :                   opt.get_long("size", 1)
    3590             :                 , advgetopt::getopt_logic_error
    3591             :                 , Catch::Matchers::ExceptionMessage(
    3592             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
    3593             : 
    3594             :         // other parameters
    3595           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3596           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3597             :     }
    3598             :     CATCH_END_SECTION()
    3599             : 
    3600           6 :     CATCH_START_SECTION("Verify an integer (long) value without arguments and an empty string as default")
    3601             :     {
    3602           1 :         advgetopt::option const options[] =
    3603             :         {
    3604             :             advgetopt::define_option(
    3605             :                   advgetopt::Name("size")
    3606             :                 , advgetopt::ShortName('s')
    3607             :                 , advgetopt::Flags(advgetopt::command_flags<
    3608             :                               advgetopt::GETOPT_FLAG_REQUIRED
    3609             :                             , advgetopt::GETOPT_FLAG_DYNAMIC_CONFIGURATION>())
    3610             :                 , advgetopt::Help("define the size.")
    3611             :                 , advgetopt::DefaultValue("")
    3612             :             ),
    3613             :             advgetopt::end_options()
    3614             :         };
    3615             : 
    3616           1 :         advgetopt::options_environment environment_options;
    3617           1 :         environment_options.f_project_name = "unittest";
    3618           1 :         environment_options.f_options = options;
    3619           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
    3620             : 
    3621           1 :         char const * cargv[] =
    3622             :         {
    3623             :             "/usr/bin/arguments",
    3624             :             nullptr
    3625             :         };
    3626           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3627           1 :         char ** argv = const_cast<char **>(cargv);
    3628             : 
    3629           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3630             : 
    3631             :         // check that the result is valid
    3632             : 
    3633             :         // an invalid parameter, MUST NOT EXIST
    3634           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3635           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3636           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3637           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3638           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3639             : 
    3640             :         // no default
    3641           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3642           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3643           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3644           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3645             : 
    3646             :         // the valid parameter
    3647           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3648           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    3649           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    3650           1 :         CATCH_REQUIRE(opt.has_default("size"));
    3651           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3652             : 
    3653           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3654             :                   opt.get_long("size")
    3655             :                 , advgetopt::getopt_logic_error
    3656             :                 , Catch::Matchers::ExceptionMessage(
    3657             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
    3658             : 
    3659           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3660             :                   opt.get_long("size", 0)
    3661             :                 , advgetopt::getopt_logic_error
    3662             :                 , Catch::Matchers::ExceptionMessage(
    3663             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
    3664             : 
    3665           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3666             :                   opt.get_long("size", 1)
    3667             :                 , advgetopt::getopt_logic_error
    3668             :                 , Catch::Matchers::ExceptionMessage(
    3669             :                               "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
    3670             : 
    3671             :         // other parameters
    3672           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3673           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3674             :     }
    3675             :     CATCH_END_SECTION()
    3676           3 : }
    3677             : 
    3678             : 
    3679             : 
    3680           3 : CATCH_TEST_CASE("incompatible_default_value", "[arguments][invalid][getopt]")
    3681             : {
    3682           2 :     CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
    3683           1 :         advgetopt::option const options[] =
    3684             :         {
    3685             :             advgetopt::define_option(
    3686             :                   advgetopt::Name("size")
    3687             :                 , advgetopt::ShortName('s')
    3688             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    3689             :                 , advgetopt::Help("define the size.")
    3690             :                 , advgetopt::DefaultValue("undefined")
    3691             :             ),
    3692             :             advgetopt::end_options()
    3693             :         };
    3694             : 
    3695           1 :         advgetopt::options_environment environment_options;
    3696           1 :         environment_options.f_project_name = "unittest";
    3697           1 :         environment_options.f_options = options;
    3698           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
    3699             : 
    3700           1 :         char const * cargv[] =
    3701             :         {
    3702             :             "/usr/bin/arguments",
    3703             :             nullptr
    3704             :         };
    3705           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3706           1 :         char ** argv = const_cast<char **>(cargv);
    3707             : 
    3708           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3709             : 
    3710             :         // check that the result is valid
    3711             : 
    3712             :         // an invalid parameter, MUST NOT EXIST
    3713           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3714           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3715           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3716           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3717           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3718             : 
    3719             :         // no default
    3720           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3721           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3722           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3723           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3724             : 
    3725             :         // the valid parameter
    3726           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3727           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    3728           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    3729           1 :         CATCH_REQUIRE(opt.has_default("size"));
    3730           1 :         CATCH_REQUIRE(opt.get_default("size") == "undefined"); // this works, it fails with get_long() though
    3731           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3732             : 
    3733           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3734             :                   opt.get_long("size")
    3735             :                 , advgetopt::getopt_logic_error
    3736             :                 , Catch::Matchers::ExceptionMessage(
    3737             :                               "getopt_logic_error: invalid default number \"undefined\" for option --size"));
    3738             : 
    3739           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3740             :                   opt.get_long("size", 0)
    3741             :                 , advgetopt::getopt_logic_error
    3742             :                 , Catch::Matchers::ExceptionMessage(
    3743             :                               "getopt_logic_error: invalid default number \"undefined\" for option --size"));
    3744             : 
    3745           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    3746             :                   opt.get_long("size", 1)
    3747             :                 , advgetopt::getopt_logic_error
    3748             :                 , Catch::Matchers::ExceptionMessage(
    3749             :                               "getopt_logic_error: invalid default number \"undefined\" for option --size"));
    3750             : 
    3751             :         // other parameters
    3752           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3753           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3754             :     CATCH_END_SECTION()
    3755           1 : }
    3756             : 
    3757             : 
    3758             : 
    3759           4 : CATCH_TEST_CASE("out_of_range_value", "[arguments][invalid][getopt]")
    3760             : {
    3761           4 :     CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
    3762           1 :         advgetopt::option const options[] =
    3763             :         {
    3764             :             advgetopt::define_option(
    3765             :                   advgetopt::Name("size")
    3766             :                 , advgetopt::ShortName('s')
    3767             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    3768             :                 , advgetopt::Help("define the size.")
    3769             :                 , advgetopt::DefaultValue("-300")
    3770             :             ),
    3771             :             advgetopt::end_options()
    3772             :         };
    3773             : 
    3774           1 :         advgetopt::options_environment environment_options;
    3775           1 :         environment_options.f_project_name = "unittest";
    3776           1 :         environment_options.f_options = options;
    3777           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
    3778             : 
    3779           1 :         char const * cargv[] =
    3780             :         {
    3781             :             "/usr/bin/arguments",
    3782             :             "--size",
    3783             :             "312",
    3784             :             nullptr
    3785             :         };
    3786           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3787           1 :         char ** argv = const_cast<char **>(cargv);
    3788             : 
    3789           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3790             : 
    3791             :         // check that the result is valid
    3792             : 
    3793             :         // an invalid parameter, MUST NOT EXIST
    3794           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3795           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3796           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3797           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3798           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3799             : 
    3800             :         // no default
    3801           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3802           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3803           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3804           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3805             : 
    3806             :         // the valid parameter
    3807           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3808           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    3809           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    3810           1 :         CATCH_REQUIRE(opt.get_string("size") == "312");
    3811           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "312");
    3812           1 :         CATCH_REQUIRE(opt["size"] == "312");
    3813           1 :         CATCH_REQUIRE(opt.get_long("size") == 312);
    3814           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 312);
    3815           1 :         CATCH_REQUIRE(opt.get_default("size") == "-300");
    3816           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    3817             : 
    3818           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: 312 is out of bounds (-100..100 inclusive) in parameter --size.");
    3819           1 :         CATCH_REQUIRE(opt.get_long("size", 0, -100, 100) == -1);
    3820           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    3821             : 
    3822             :         // other parameters
    3823           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3824           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3825             :     CATCH_END_SECTION()
    3826             : 
    3827           4 :     CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
    3828           1 :         advgetopt::option const options[] =
    3829             :         {
    3830             :             advgetopt::define_option(
    3831             :                   advgetopt::Name("size")
    3832             :                 , advgetopt::ShortName('s')
    3833             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    3834             :                 , advgetopt::Help("define the size.")
    3835             :                 , advgetopt::DefaultValue("-300")
    3836             :             ),
    3837             :             advgetopt::end_options()
    3838             :         };
    3839             : 
    3840           1 :         advgetopt::options_environment environment_options;
    3841           1 :         environment_options.f_project_name = "unittest";
    3842           1 :         environment_options.f_options = options;
    3843           1 :         environment_options.f_help_header = "Usage: test get_long() functions";
    3844             : 
    3845           1 :         char const * cargv[] =
    3846             :         {
    3847             :             "/usr/bin/arguments",
    3848             :             nullptr
    3849             :         };
    3850           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3851           1 :         char ** argv = const_cast<char **>(cargv);
    3852             : 
    3853           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    3854             : 
    3855             :         // check that the result is valid
    3856             : 
    3857             :         // an invalid parameter, MUST NOT EXIST
    3858           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3859           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3860           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3861           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3862           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3863             : 
    3864             :         // no default
    3865           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3866           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3867           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    3868           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    3869             : 
    3870             :         // the valid parameter
    3871           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    3872           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    3873           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    3874           1 :         CATCH_REQUIRE(opt.get_default("size") == "-300");
    3875           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    3876             : 
    3877           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: -300 is out of bounds (-100..100 inclusive) in parameter --size.");
    3878           1 :         CATCH_REQUIRE(opt.get_long("size", 0, -100, 100) == -1);
    3879           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    3880             : 
    3881             :         // other parameters
    3882           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3883           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3884             :     CATCH_END_SECTION()
    3885           2 : }
    3886             : 
    3887             : 
    3888           3 : CATCH_TEST_CASE("check_sanitizer", "[arguments][valid][getopt]")
    3889             : {
    3890           2 :     CATCH_START_SECTION("Check that the sanitizer is detected")
    3891             :     {
    3892             :         // when compiling the tests with coverage we turn on the sanitizer
    3893             :         // so here we should get output that show the sanitizer as being
    3894             :         // turned on; unfortunately, we can't test all cases in our current
    3895             :         // situation
    3896             :         //
    3897             : #if defined(__SANITIZE_ADDRESS__) || defined(__SANITIZE_THREAD__)
    3898             :         // when running coverage or in the Sanitize version
    3899             :         //
    3900           1 :         std::string const expected(
    3901             : #ifdef __SANITIZE_ADDRESS__
    3902             :                     "The address sanitizer is compiled in.\n"
    3903             : #endif
    3904             : #ifdef __SANITIZE_THREAD__
    3905             :                     "The thread sanitizer is compiled in.\n"
    3906             : #endif
    3907           2 :             );
    3908           1 :         CATCH_REQUIRE(advgetopt::getopt::sanitizer_details() == expected);
    3909             : #else
    3910             :         // when running in Debug or Release
    3911             :         //
    3912             :         CATCH_REQUIRE(advgetopt::getopt::sanitizer_details() == "The address and thread sanitizers are not compiled in.\n");
    3913             : #endif
    3914             :     }
    3915             :     CATCH_END_SECTION()
    3916           7 : }
    3917             : 
    3918             : 
    3919             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.13