LCOV - code coverage report
Current view: top level - tests - data.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1570 1570 100.0 %
Date: 2019-09-16 03:06:47 Functions: 16 16 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.12