LCOV - code coverage report
Current view: top level - tests - data.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1556 1556 100.0 %
Date: 2019-07-15 03:11:49 Functions: 16 16 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.12