LCOV - code coverage report
Current view: top level - tests - catch_arguments.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 3313 3354 98.8 %
Date: 2022-07-15 09:02:52 Functions: 18 18 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2006-2022  Made to Order Software Corp.  All Rights Reserved
       2             : //
       3             : // https://snapwebsites.org/project/advgetopt
       4             : // contact@m2osw.com
       5             : //
       6             : // This program is free software; you can redistribute it and/or modify
       7             : // it under the terms of the GNU General Public License as published by
       8             : // the Free Software Foundation; either version 2 of the License, or
       9             : // (at your option) any later version.
      10             : //
      11             : // This program is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU General Public License for more details.
      15             : //
      16             : // You should have received a copy of the GNU General Public License along
      17             : // with this program; if not, write to the Free Software Foundation, Inc.,
      18             : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      19             : 
      20             : // advgetopt
      21             : //
      22             : #include    <advgetopt/exception.h>
      23             : 
      24             : 
      25             : // self
      26             : //
      27             : #include    "catch_main.h"
      28             : 
      29             : 
      30             : // snapdev
      31             : //
      32             : #include    <snapdev/ostream_to_buf.h>
      33             : #include    <snapdev/safe_setenv.h>
      34             : 
      35             : 
      36             : // C++
      37             : //
      38             : #include    <fstream>
      39             : #include    <sstream>
      40             : 
      41             : 
      42             : // last include
      43             : //
      44             : #include    <snapdev/poison.h>
      45             : 
      46             : 
      47             : 
      48             : 
      49             : 
      50             : 
      51             : 
      52             : 
      53             : 
      54             : 
      55             : 
      56             : 
      57          10 : CATCH_TEST_CASE("flag_argument", "[arguments][valid][getopt]")
      58             : {
      59          16 :     CATCH_START_SECTION("Verify a simple --verbose argument")
      60             :     {
      61           2 :         advgetopt::option const options[] =
      62             :         {
      63             :             advgetopt::define_option(
      64             :                   advgetopt::Name("verbose")
      65             :                 , advgetopt::ShortName('v')
      66             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
      67             :                 , advgetopt::Help("print info as we work.")
      68             :             ),
      69             :             advgetopt::end_options()
      70             :         };
      71             : 
      72           2 :         advgetopt::options_environment environment_options;
      73           2 :         environment_options.f_project_name = "unittest";
      74           2 :         environment_options.f_options = options;
      75           2 :         environment_options.f_environment_flags = 0;
      76           2 :         environment_options.f_help_header = "Usage: test simple --verbose option";
      77           2 :         environment_options.f_environment_variable_name = "ADVGETOPT_UNDEFINED_VARIABLE_TO_TEST_THE_NULL";
      78             : 
      79           4 :         CATCH_WHEN("using long form")
      80             :         {
      81           1 :             char const * cargv[] =
      82             :             {
      83             :                 "/usr/bin/arguments",
      84             :                 "--verbose",
      85             :                 nullptr
      86             :             };
      87           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
      88           1 :             char ** argv = const_cast<char **>(cargv);
      89             : 
      90           2 :             advgetopt::getopt opt(environment_options, argc, argv);
      91             : 
      92             :             // check that the result is valid
      93             : 
      94             :             // an invalid parameter, MUST NOT EXIST
      95           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
      96           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
      97           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
      98           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
      99           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     100             : 
     101             :             // no default
     102           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     103           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     104           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     105           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     106             : 
     107             :             // the valid parameter
     108           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     109           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
     110           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     111           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     112           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     113             : 
     114             :             // other parameters
     115           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     116           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     117             :         }
     118             : 
     119           4 :         CATCH_WHEN("using short form")
     120             :         {
     121           1 :             char const * cargv[] =
     122             :             {
     123             :                 "/usr/bin/arguments",
     124             :                 "-v",
     125             :                 nullptr
     126             :             };
     127           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     128           1 :             char ** argv = const_cast<char **>(cargv);
     129             : 
     130           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     131             : 
     132             :             // check that the result is valid
     133             : 
     134             :             // an invalid parameter, MUST NOT EXIST
     135           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     136           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     137           1 :             CATCH_REQUIRE(opt.get_option('Z', true) == nullptr);
     138           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     139           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     140           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     141             : 
     142             :             // no default
     143           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     144           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     145           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     146           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     147             : 
     148             :             // the valid parameter
     149           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     150           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
     151           1 :             CATCH_REQUIRE(opt.get_option('v', true) == opt.get_option('v'));
     152           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     153           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     154           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     155             : 
     156             :             // other parameters
     157           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     158           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     159             :         }
     160             :     }
     161             :     CATCH_END_SECTION()
     162             : 
     163          16 :     CATCH_START_SECTION("Verify a simple --verbose argument in a variable")
     164             :     {
     165           2 :         advgetopt::option const options[] =
     166             :         {
     167             :             advgetopt::define_option(
     168             :                   advgetopt::Name("verbose")
     169             :                 , advgetopt::ShortName('v')
     170             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_FLAG>())
     171             :                 , advgetopt::Help("print info as we work.")
     172             :             ),
     173             :             advgetopt::end_options()
     174             :         };
     175             : 
     176           2 :         advgetopt::options_environment environment_options;
     177           2 :         environment_options.f_project_name = "unittest";
     178           2 :         environment_options.f_options = options;
     179           2 :         environment_options.f_environment_flags = 0;
     180           2 :         environment_options.f_help_header = "Usage: test simple --verbose option";
     181           2 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
     182             : 
     183           4 :         CATCH_WHEN("using long form")
     184             :         {
     185           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose");
     186             : 
     187           1 :             char const * cargv[] =
     188             :             {
     189             :                 "/usr/bin/arguments",
     190             :                 nullptr
     191             :             };
     192           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     193           1 :             char ** argv = const_cast<char **>(cargv);
     194             : 
     195           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     196             : 
     197             :             // check that the result is valid
     198             : 
     199             :             // an invalid parameter, MUST NOT EXIST
     200           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     201           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     202           1 :             CATCH_REQUIRE(opt.get_option('Z', true) == nullptr);
     203           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     204           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     205           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     206             : 
     207             :             // no default
     208           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     209           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     210           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     211           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     212             : 
     213             :             // the valid parameter
     214           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     215           1 :             CATCH_REQUIRE(opt.get_option('v') == opt.get_option("verbose"));
     216           1 :             CATCH_REQUIRE(opt.get_option('v', true) == opt.get_option('v'));
     217           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     218           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     219           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     220             : 
     221             :             // other parameters
     222           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     223           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     224             :         }
     225             : 
     226           4 :         CATCH_WHEN("using short form")
     227             :         {
     228           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-v");
     229             : 
     230           1 :             char const * cargv[] =
     231             :             {
     232             :                 "/usr/bin/arguments",
     233             :                 nullptr
     234             :             };
     235           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     236           1 :             char ** argv = const_cast<char **>(cargv);
     237             : 
     238           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     239             : 
     240             :             // check that the result is valid
     241             : 
     242             :             // an invalid parameter, MUST NOT EXIST
     243           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     244           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     245           1 :             CATCH_REQUIRE(opt.get_option('Z', true) == nullptr);
     246           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     247           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     248           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     249             : 
     250             :             // no default
     251           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     252           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     253           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     254           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     255             : 
     256             :             // the valid parameter
     257           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     258           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
     259           1 :             CATCH_REQUIRE(opt.get_option('v', true) == opt.get_option("verbose"));
     260           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     261           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     262           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     263             : 
     264             :             // other parameters
     265           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     266           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     267             :         }
     268             :     }
     269             :     CATCH_END_SECTION()
     270             : 
     271          16 :     CATCH_START_SECTION("Verify a simple alias argument")
     272             :     {
     273           2 :         advgetopt::option const options[] =
     274             :         {
     275             :             advgetopt::define_option(
     276             :                   advgetopt::Name("verbosity")
     277             :                 , advgetopt::ShortName('n')
     278             :                 , advgetopt::Flags(advgetopt::standalone_command_flags<advgetopt::GETOPT_FLAG_FLAG>())
     279             :                 , advgetopt::Alias("verbose")
     280             :             ),
     281             :             advgetopt::define_option(
     282             :                   advgetopt::Name("verbose")
     283             :                 , advgetopt::ShortName('v')
     284             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
     285             :                 , advgetopt::Help("print info as we work.")
     286             :             ),
     287             :             advgetopt::end_options()
     288             :         };
     289             : 
     290           2 :         advgetopt::options_environment environment_options;
     291           2 :         environment_options.f_project_name = "unittest";
     292           2 :         environment_options.f_options = options;
     293           2 :         environment_options.f_environment_flags = 0;
     294           2 :         environment_options.f_help_header = "Usage: test simple --verbosity option";
     295             : 
     296           4 :         CATCH_WHEN("using long form")
     297             :         {
     298           1 :             char const * cargv[] =
     299             :             {
     300             :                 "/usr/bin/arguments",
     301             :                 "--verbosity",
     302             :                 nullptr
     303             :             };
     304           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     305           1 :             char ** argv = const_cast<char **>(cargv);
     306             : 
     307           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     308             : 
     309             :             // check that the result is valid
     310             : 
     311             :             // an invalid parameter, MUST NOT EXIST
     312           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     313           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     314           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     315           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     316           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     317             : 
     318             :             // no default
     319           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     320           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     321           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     322           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     323             : 
     324             :             // the valid parameter
     325           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     326           1 :             CATCH_REQUIRE(opt.get_option('v') == opt.get_option("verbose"));
     327           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     328           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     329           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     330             : 
     331             :             // the alias parameter
     332           1 :             CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
     333           1 :             CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
     334           1 :             CATCH_REQUIRE(opt.is_defined("verbosity"));
     335           1 :             CATCH_REQUIRE(opt.get_default("verbosity").empty());
     336           1 :             CATCH_REQUIRE(opt.size("verbosity") == 1);
     337             : 
     338             :             // other parameters
     339           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     340           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     341             :         }
     342             : 
     343           4 :         CATCH_WHEN("using short form")
     344             :         {
     345           1 :             char const * cargv[] =
     346             :             {
     347             :                 "/usr/bin/arguments",
     348             :                 "-n",
     349             :                 nullptr
     350             :             };
     351           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     352           1 :             char ** argv = const_cast<char **>(cargv);
     353             : 
     354           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     355             : 
     356             :             // check that the result is valid
     357             : 
     358             :             // an invalid parameter, MUST NOT EXIST
     359           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     360           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     361           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     362           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     363           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     364             : 
     365             :             // no default
     366           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     367           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     368           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     369           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     370             : 
     371             :             // the valid parameter
     372           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     373           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
     374           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     375           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     376           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     377             : 
     378             :             // the alias parameter
     379           1 :             CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
     380           1 :             CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
     381           1 :             CATCH_REQUIRE(opt.is_defined("verbosity"));
     382           1 :             CATCH_REQUIRE(opt.get_option('n') == opt.get_option("verbose"));
     383           1 :             CATCH_REQUIRE(opt.get_option('n', true) == opt.get_option("verbosity", true));
     384           1 :             CATCH_REQUIRE(opt.get_option('n', true) != opt.get_option("verbose"));
     385           1 :             CATCH_REQUIRE(opt.get_default("verbosity").empty());
     386           1 :             CATCH_REQUIRE(opt.size("verbosity") == 1);
     387             : 
     388             :             // other parameters
     389           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     390           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     391             :         }
     392             :     }
     393             :     CATCH_END_SECTION()
     394             : 
     395          16 :     CATCH_START_SECTION("Verify a simple alias argument in a variable")
     396             :     {
     397           2 :         advgetopt::option const options[] =
     398             :         {
     399             :             advgetopt::define_option(
     400             :                   advgetopt::Name("verbose")
     401             :                 , advgetopt::ShortName('v')
     402             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_FLAG>())
     403             :                 , advgetopt::Help("print info as we work.")
     404             :             ),
     405             :             advgetopt::define_option(
     406             :                   advgetopt::Name("verbosity")
     407             :                 , advgetopt::ShortName('n')
     408             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_FLAG>())
     409             :                 , advgetopt::Alias("verbose")
     410             :             ),
     411             :             advgetopt::end_options()
     412             :         };
     413             : 
     414           2 :         advgetopt::options_environment environment_options;
     415           2 :         environment_options.f_project_name = "unittest";
     416           2 :         environment_options.f_options = options;
     417           2 :         environment_options.f_environment_flags = 0;
     418           2 :         environment_options.f_help_header = "Usage: test simple --verbosity option";
     419           2 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
     420             : 
     421           4 :         CATCH_WHEN("using long form")
     422             :         {
     423           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbosity");
     424             : 
     425           1 :             char const * cargv[] =
     426             :             {
     427             :                 "/usr/bin/arguments",
     428             :                 nullptr
     429             :             };
     430           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     431           1 :             char ** argv = const_cast<char **>(cargv);
     432             : 
     433           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     434             : 
     435             :             // check that the result is valid
     436             : 
     437             :             // an invalid parameter, MUST NOT EXIST
     438           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     439           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     440           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     441           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     442           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     443             : 
     444             :             // no default
     445           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     446           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     447           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     448           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     449             : 
     450             :             // the valid parameter
     451           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     452           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
     453           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     454           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     455           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     456             : 
     457             :             // the alias parameter
     458           1 :             CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
     459           1 :             CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
     460           1 :             CATCH_REQUIRE(opt.is_defined("verbosity"));
     461           1 :             CATCH_REQUIRE(opt.get_default("verbosity").empty());
     462           1 :             CATCH_REQUIRE(opt.size("verbosity") == 1);
     463             : 
     464             :             // other parameters
     465           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     466           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     467             :         }
     468             : 
     469           4 :         CATCH_WHEN("using short form")
     470             :         {
     471           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-n");
     472             : 
     473           1 :             char const * cargv[] =
     474             :             {
     475             :                 "/usr/bin/arguments",
     476             :                 nullptr
     477             :             };
     478           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     479           1 :             char ** argv = const_cast<char **>(cargv);
     480             : 
     481           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     482             : 
     483             :             // check that the result is valid
     484             : 
     485             :             // an invalid parameter, MUST NOT EXIST
     486           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     487           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     488           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     489           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     490           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     491             : 
     492             :             // no default
     493           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
     494           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
     495           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
     496           1 :             CATCH_REQUIRE(opt.size("--") == 0);
     497             : 
     498             :             // the valid parameter
     499           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
     500           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
     501           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
     502           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
     503           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
     504             : 
     505             :             // the alias parameter
     506           1 :             CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
     507           1 :             CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
     508           1 :             CATCH_REQUIRE(opt.is_defined("verbosity"));
     509           1 :             CATCH_REQUIRE(opt.get_default("verbosity").empty());
     510           1 :             CATCH_REQUIRE(opt.size("verbosity") == 1);
     511             : 
     512             :             // other parameters
     513           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     514           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     515             :         }
     516             :     }
     517             :     CATCH_END_SECTION()
     518           8 : }
     519             : 
     520             : 
     521          13 : CATCH_TEST_CASE("require_argument", "[arguments][valid][required][getopt]")
     522             : {
     523          22 :     CATCH_START_SECTION("Verify a simple --out <filename> argument")
     524             :     {
     525           3 :         advgetopt::option const options[] =
     526             :         {
     527             :             advgetopt::define_option(
     528             :                   advgetopt::Name("out")
     529             :                 , advgetopt::ShortName('o')
     530             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     531             :                 , advgetopt::Help("output filename.")
     532             :             ),
     533             :             advgetopt::end_options()
     534             :         };
     535             : 
     536           3 :         advgetopt::options_environment environment_options;
     537           3 :         environment_options.f_project_name = "unittest";
     538           3 :         environment_options.f_options = options;
     539           3 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     540           3 :         environment_options.f_help_header = "Usage: test simple --out <filename> option";
     541             : 
     542           6 :         CATCH_WHEN("using long form")
     543             :         {
     544           1 :             char const * cargv[] =
     545             :             {
     546             :                 "/usr/bin/arguments",
     547             :                 "--out",
     548             :                 "my-filename.out",
     549             :                 "--license",
     550             :                 nullptr
     551             :             };
     552           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     553           1 :             char ** argv = const_cast<char **>(cargv);
     554             : 
     555           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     556             : 
     557             :             // check that the result is valid
     558             : 
     559             :             // an invalid parameter, MUST NOT EXIST
     560           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     561           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     562           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     563           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     564           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     565             : 
     566             :             // the valid parameter
     567           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
     568           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     569           1 :             CATCH_REQUIRE(opt.is_defined("out"));
     570           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
     571           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
     572           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
     573           1 :             CATCH_REQUIRE(opt.size("out") == 1);
     574             : 
     575             :             // the license system parameter
     576           1 :             CATCH_REQUIRE(opt.get_option("license") != nullptr);
     577           1 :             CATCH_REQUIRE(opt.get_option('L') != nullptr);
     578           1 :             CATCH_REQUIRE(opt.is_defined("license"));
     579           1 :             CATCH_REQUIRE(opt.get_default("license").empty());
     580           1 :             CATCH_REQUIRE(opt.size("license") == 1);
     581             : 
     582             :             // the copyright system parameter
     583           1 :             CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
     584           1 :             CATCH_REQUIRE(opt.get_option('C') != nullptr);
     585           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
     586           1 :             CATCH_REQUIRE(opt.get_default("copyright").empty());
     587           1 :             CATCH_REQUIRE(opt.size("copyright") == 0);
     588             : 
     589             :             // other parameters
     590           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     591           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     592             :         }
     593             : 
     594           6 :         CATCH_WHEN("using long form with an equal sign")
     595             :         {
     596           1 :             char const * cargv[] =
     597             :             {
     598             :                 "/usr/bin/arguments",
     599             :                 "--out=my-filename.out",
     600             :                 nullptr
     601             :             };
     602           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     603           1 :             char ** argv = const_cast<char **>(cargv);
     604             : 
     605           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     606             : 
     607             :             // check that the result is valid
     608             : 
     609             :             // an invalid parameter, MUST NOT EXIST
     610           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     611           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     612           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     613           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     614           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     615             : 
     616             :             // the valid parameter
     617           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
     618           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     619           1 :             CATCH_REQUIRE(opt.is_defined("out"));
     620           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
     621           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
     622           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
     623           1 :             CATCH_REQUIRE(opt.size("out") == 1);
     624             : 
     625             :             // other parameters
     626           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     627           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     628             :         }
     629             : 
     630           6 :         CATCH_WHEN("using short form")
     631             :         {
     632           1 :             char const * cargv[] =
     633             :             {
     634             :                 "/usr/bin/arguments",
     635             :                 "-o",
     636             :                 "my-filename.out",
     637             :                 nullptr
     638             :             };
     639           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     640           1 :             char ** argv = const_cast<char **>(cargv);
     641             : 
     642           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     643             : 
     644             :             // check that the result is valid
     645             : 
     646             :             // an invalid parameter, MUST NOT EXIST
     647           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     648           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     649           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     650           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     651           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     652             : 
     653             :             // the valid parameter
     654           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
     655           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     656           1 :             CATCH_REQUIRE(opt.is_defined("out"));
     657           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
     658           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
     659           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
     660           1 :             CATCH_REQUIRE(opt.size("out") == 1);
     661             : 
     662             :             // other parameters
     663           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     664           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     665             :         }
     666             :     }
     667             :     CATCH_END_SECTION()
     668             : 
     669          22 :     CATCH_START_SECTION("Verify a simple alias of --out <filename> argument")
     670             :     {
     671           3 :         advgetopt::option const options[] =
     672             :         {
     673             :             advgetopt::define_option(
     674             :                   advgetopt::Name("out")
     675             :                 , advgetopt::ShortName('o')
     676             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     677             :                 , advgetopt::Help("output filename.")
     678             :             ),
     679             :             advgetopt::define_option(
     680             :                   advgetopt::Name("results")
     681             :                 , advgetopt::ShortName('r')
     682             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     683             :                 , advgetopt::Alias("out")
     684             :             ),
     685             :             advgetopt::end_options()
     686             :         };
     687             : 
     688           3 :         advgetopt::options_environment environment_options;
     689           3 :         environment_options.f_project_name = "unittest";
     690           3 :         environment_options.f_options = options;
     691           3 :         environment_options.f_environment_flags = 0;
     692           3 :         environment_options.f_help_header = "Usage: test simple --results <filename> option";
     693             : 
     694           6 :         CATCH_WHEN("using long form")
     695             :         {
     696           1 :             char const * cargv[] =
     697             :             {
     698             :                 "/usr/bin/arguments",
     699             :                 "--results",
     700             :                 "my-filename.out",
     701             :                 nullptr
     702             :             };
     703           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     704           1 :             char ** argv = const_cast<char **>(cargv);
     705             : 
     706           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     707             : 
     708             :             // check that the result is valid
     709             : 
     710             :             // an invalid parameter, MUST NOT EXIST
     711           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     712           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     713           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     714           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     715           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     716             : 
     717             :             // the valid parameter
     718           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
     719           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     720           1 :             CATCH_REQUIRE(opt.is_defined("out"));
     721           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
     722           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
     723           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
     724           1 :             CATCH_REQUIRE(opt.size("out") == 1);
     725             : 
     726             :             // the alias parameter
     727           1 :             CATCH_REQUIRE(opt.get_option("results") != nullptr);
     728           1 :             CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
     729           1 :             CATCH_REQUIRE(opt.is_defined("results"));
     730           1 :             CATCH_REQUIRE(opt.is_defined("results"));
     731           1 :             CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
     732           1 :             CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
     733           1 :             CATCH_REQUIRE(opt.get_default("results").empty());
     734           1 :             CATCH_REQUIRE(opt.size("results") == 1);
     735             : 
     736             :             // other parameters
     737           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     738           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     739             :         }
     740             : 
     741           6 :         CATCH_WHEN("using long form with an equal sign")
     742             :         {
     743           1 :             char const * cargv[] =
     744             :             {
     745             :                 "/usr/bin/arguments",
     746             :                 "--results=my-filename.out",
     747             :                 nullptr
     748             :             };
     749           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     750           1 :             char ** argv = const_cast<char **>(cargv);
     751             : 
     752           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     753             : 
     754             :             // check that the result is valid
     755             : 
     756             :             // an invalid parameter, MUST NOT EXIST
     757           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     758           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     759           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     760           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     761           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     762             : 
     763             :             // the valid parameter
     764           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
     765           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     766           1 :             CATCH_REQUIRE(opt.is_defined("out"));
     767           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
     768           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
     769           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
     770           1 :             CATCH_REQUIRE(opt.size("out") == 1);
     771             : 
     772             :             // the alias parameter
     773           1 :             CATCH_REQUIRE(opt.get_option("results") != nullptr);
     774           1 :             CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
     775           1 :             CATCH_REQUIRE(opt.is_defined("results"));
     776           1 :             CATCH_REQUIRE(opt.is_defined("results"));
     777           1 :             CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
     778           1 :             CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
     779           1 :             CATCH_REQUIRE(opt.get_default("results").empty());
     780           1 :             CATCH_REQUIRE(opt.size("results") == 1);
     781             : 
     782             :             // other parameters
     783           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     784           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     785             :         }
     786             : 
     787           6 :         CATCH_WHEN("using short form")
     788             :         {
     789           1 :             char const * cargv[] =
     790             :             {
     791             :                 "/usr/bin/arguments",
     792             :                 "-r",
     793             :                 "my-filename.out",
     794             :                 nullptr
     795             :             };
     796           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     797           1 :             char ** argv = const_cast<char **>(cargv);
     798             : 
     799           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     800             : 
     801             :             // check that the result is valid
     802             : 
     803             :             // an invalid parameter, MUST NOT EXIST
     804           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     805           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     806           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     807           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     808           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     809             : 
     810             :             // the valid parameter
     811           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
     812           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     813           1 :             CATCH_REQUIRE(opt.is_defined("out"));
     814           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
     815           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
     816           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
     817           1 :             CATCH_REQUIRE(opt.size("out") == 1);
     818             : 
     819             :             // the alias parameter
     820           1 :             CATCH_REQUIRE(opt.get_option("results") != nullptr);
     821           1 :             CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
     822           1 :             CATCH_REQUIRE(opt.is_defined("results"));
     823           1 :             CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
     824           1 :             CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
     825           1 :             CATCH_REQUIRE(opt.get_default("results").empty());
     826           1 :             CATCH_REQUIRE(opt.size("results") == 1);
     827             : 
     828             :             // other parameters
     829           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     830           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     831             :         }
     832             :     }
     833             :     CATCH_END_SECTION()
     834             : 
     835          22 :     CATCH_START_SECTION("Verify a simple --out <filename> argument in a variable")
     836             :     {
     837           3 :         advgetopt::option const options[] =
     838             :         {
     839             :             advgetopt::define_option(
     840             :                   advgetopt::Name("out_dir")
     841             :                 , advgetopt::ShortName('o')
     842             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     843             :                 , advgetopt::Help("output filename.")
     844             :             ),
     845             :             advgetopt::end_options()
     846             :         };
     847             : 
     848           3 :         advgetopt::options_environment environment_options;
     849           3 :         environment_options.f_project_name = "unittest";
     850           3 :         environment_options.f_options = options;
     851           3 :         environment_options.f_environment_flags = 0;
     852           3 :         environment_options.f_help_header = "Usage: test simple --out_dir <filename> option";
     853           3 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
     854             : 
     855           6 :         CATCH_WHEN("using long form")
     856             :         {
     857           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out_dir my-filename.out");
     858             : 
     859           1 :             char const * cargv[] =
     860             :             {
     861             :                 "/usr/bin/arguments",
     862             :                 nullptr
     863             :             };
     864           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     865           1 :             char ** argv = const_cast<char **>(cargv);
     866             : 
     867           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     868             : 
     869             :             // check that the result is valid
     870             : 
     871             :             // an invalid parameter, MUST NOT EXIST
     872           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     873           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     874           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     875           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     876           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     877             : 
     878             :             // the valid parameter
     879           1 :             CATCH_REQUIRE(opt.get_option("out-dir") != nullptr);
     880           1 :             CATCH_REQUIRE(opt.get_option("out_dir") != nullptr);
     881           1 :             CATCH_REQUIRE(opt.get_option("out_dir") == opt.get_option("out-dir"));
     882           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     883           1 :             CATCH_REQUIRE(opt.is_defined("out-dir"));
     884           1 :             CATCH_REQUIRE(opt.get_string("out-dir") == "my-filename.out");
     885           1 :             CATCH_REQUIRE(opt.get_string("out-dir", 0) == "my-filename.out");
     886           1 :             CATCH_REQUIRE(opt.get_default("out-dir").empty());
     887           1 :             CATCH_REQUIRE(opt.size("out-dir") == 1);
     888             : 
     889             :             // other parameters
     890           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     891           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     892             :         }
     893             : 
     894           6 :         CATCH_WHEN("using long form with an equal sign")
     895             :         {
     896           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out_dir=my-filename.out");
     897             : 
     898           1 :             char const * cargv[] =
     899             :             {
     900             :                 "/usr/bin/arguments",
     901             :                 nullptr
     902             :             };
     903           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     904           1 :             char ** argv = const_cast<char **>(cargv);
     905             : 
     906           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     907             : 
     908             :             // check that the result is valid
     909             : 
     910             :             // an invalid parameter, MUST NOT EXIST
     911           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     912           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     913           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     914           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     915           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     916             : 
     917             :             // the valid parameter
     918           1 :             CATCH_REQUIRE(opt.get_option("out_dir") != nullptr);
     919           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     920           1 :             CATCH_REQUIRE(opt.is_defined("out_dir"));
     921           1 :             CATCH_REQUIRE(opt.get_string("out_dir") == "my-filename.out");
     922           1 :             CATCH_REQUIRE(opt.get_string("out_dir", 0) == "my-filename.out");
     923           1 :             CATCH_REQUIRE(opt.get_default("out_dir").empty());
     924           1 :             CATCH_REQUIRE(opt.size("out_dir") == 1);
     925             : 
     926             :             // other parameters
     927           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     928           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     929             :         }
     930             : 
     931           6 :         CATCH_WHEN("using short form")
     932             :         {
     933           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o my-filename.out");
     934             : 
     935           1 :             char const * cargv[] =
     936             :             {
     937             :                 "/usr/bin/arguments",
     938             :                 nullptr
     939             :             };
     940           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     941           1 :             char ** argv = const_cast<char **>(cargv);
     942             : 
     943           2 :             advgetopt::getopt opt(environment_options, argc, argv);
     944             : 
     945             :             // check that the result is valid
     946             : 
     947             :             // an invalid parameter, MUST NOT EXIST
     948           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
     949           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
     950           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
     951           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
     952           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
     953             : 
     954             :             // the valid parameter
     955           1 :             CATCH_REQUIRE(opt.get_option("out_dir") != nullptr);
     956           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
     957           1 :             CATCH_REQUIRE(opt.is_defined("out-dir"));
     958           1 :             CATCH_REQUIRE(opt.get_string("out_dir") == "my-filename.out");
     959           1 :             CATCH_REQUIRE(opt.get_string("out-dir", 0) == "my-filename.out");
     960           1 :             CATCH_REQUIRE(opt.get_default("out_dir").empty());
     961           1 :             CATCH_REQUIRE(opt.size("out-dir") == 1);
     962             : 
     963             :             // other parameters
     964           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
     965           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
     966             :         }
     967             :     }
     968             :     CATCH_END_SECTION()
     969             : 
     970          22 :     CATCH_START_SECTION("Verify a simple alias of --out <filename> argument in a variable")
     971             :     {
     972           2 :         advgetopt::option const options[] =
     973             :         {
     974             :             advgetopt::define_option(
     975             :                   advgetopt::Name("out")
     976             :                 , advgetopt::ShortName('o')
     977             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     978             :                 , advgetopt::Help("output filename.")
     979             :             ),
     980             :             advgetopt::define_option(
     981             :                   advgetopt::Name("results")
     982             :                 , advgetopt::ShortName('r')
     983             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     984             :                 , advgetopt::Alias("o")
     985             :             ),
     986             :             advgetopt::end_options()
     987             :         };
     988             : 
     989           2 :         advgetopt::options_environment environment_options;
     990           2 :         environment_options.f_project_name = "unittest";
     991           2 :         environment_options.f_options = options;
     992           2 :         environment_options.f_environment_flags = 0;
     993           2 :         environment_options.f_help_header = "Usage: test simple alias of --out <filename> option";
     994           2 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
     995             : 
     996           4 :         CATCH_WHEN("using long form")
     997             :         {
     998           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--results my-filename.out");
     999             : 
    1000           1 :             char const * cargv[] =
    1001             :             {
    1002             :                 "/usr/bin/arguments",
    1003             :                 nullptr
    1004             :             };
    1005           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1006           1 :             char ** argv = const_cast<char **>(cargv);
    1007             : 
    1008           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1009             : 
    1010             :             // check that the result is valid
    1011             : 
    1012             :             // an invalid parameter, MUST NOT EXIST
    1013           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1014           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1015           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1016           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1017           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1018             : 
    1019             :             // the valid parameter
    1020           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1021           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1022           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1023           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1024           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1025           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1026           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1027             : 
    1028             :             // the alias parameter
    1029           1 :             CATCH_REQUIRE(opt.get_option("results") != nullptr);
    1030           1 :             CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
    1031           1 :             CATCH_REQUIRE(opt.is_defined("results"));
    1032           1 :             CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
    1033           1 :             CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
    1034           1 :             CATCH_REQUIRE(opt.get_default("results").empty());
    1035           1 :             CATCH_REQUIRE(opt.size("results") == 1);
    1036             : 
    1037             :             // other parameters
    1038           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1039           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1040             :         }
    1041             : 
    1042           4 :         CATCH_WHEN("using short form")
    1043             :         {
    1044           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-r my-filename.out");
    1045             : 
    1046           1 :             char const * cargv[] =
    1047             :             {
    1048             :                 "/usr/bin/arguments",
    1049             :                 nullptr
    1050             :             };
    1051           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1052           1 :             char ** argv = const_cast<char **>(cargv);
    1053             : 
    1054           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1055             : 
    1056             :             // check that the result is valid
    1057             : 
    1058             :             // an invalid parameter, MUST NOT EXIST
    1059           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1060           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1061           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1062           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1063           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1064             : 
    1065             :             // the valid parameter
    1066           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1067           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1068           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1069           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1070           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1071           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1072           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1073             : 
    1074             :             // the alias parameter
    1075           1 :             CATCH_REQUIRE(opt.get_option("results") != nullptr);
    1076           1 :             CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
    1077           1 :             CATCH_REQUIRE(opt.is_defined("results"));
    1078           1 :             CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
    1079           1 :             CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
    1080           1 :             CATCH_REQUIRE(opt.get_default("results").empty());
    1081           1 :             CATCH_REQUIRE(opt.size("results") == 1);
    1082             : 
    1083             :             // other parameters
    1084           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1085           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1086             :         }
    1087             :     }
    1088             :     CATCH_END_SECTION()
    1089          11 : }
    1090             : 
    1091             : 
    1092           8 : CATCH_TEST_CASE("require_arguments", "[arguments][valid][required][multiple][getopt]")
    1093             : {
    1094          12 :     CATCH_START_SECTION("Verify a simple --out <filename> ... argument")
    1095             :     {
    1096           2 :         advgetopt::option const options[] =
    1097             :         {
    1098             :             advgetopt::define_option(
    1099             :                   advgetopt::Name("out")
    1100             :                 , advgetopt::ShortName('o')
    1101             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
    1102             :                 , advgetopt::Help("output filename.")
    1103             :             ),
    1104             :             advgetopt::end_options()
    1105             :         };
    1106             : 
    1107           2 :         advgetopt::options_environment environment_options;
    1108           2 :         environment_options.f_project_name = "unittest";
    1109           2 :         environment_options.f_options = options;
    1110           2 :         environment_options.f_environment_flags = 0;
    1111           2 :         environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
    1112             : 
    1113           4 :         CATCH_WHEN("using long form")
    1114             :         {
    1115           1 :             char const * cargv[] =
    1116             :             {
    1117             :                 "/usr/bin/arguments",
    1118             :                 "--out",
    1119             :                 "my-filename.out",
    1120             :                 "another.out",
    1121             :                 "last.out",
    1122             :                 nullptr
    1123             :             };
    1124           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1125           1 :             char ** argv = const_cast<char **>(cargv);
    1126             : 
    1127           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1128             : 
    1129             :             // check that the result is valid
    1130             : 
    1131             :             // an invalid parameter, MUST NOT EXIST
    1132           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1133           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1134           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1135           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1136           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1137             : 
    1138             :             // the valid parameter
    1139           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1140           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1141           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1142           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1143           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1144           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1145           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1146           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1147           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1148             : 
    1149             :             // other parameters
    1150           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1151           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1152             :         }
    1153             : 
    1154           4 :         CATCH_WHEN("using short form")
    1155             :         {
    1156           1 :             char const * cargv[] =
    1157             :             {
    1158             :                 "/usr/bin/arguments",
    1159             :                 "-o",
    1160             :                 "my-filename.out",
    1161             :                 "another.out",
    1162             :                 "last.out",
    1163             :                 nullptr
    1164             :             };
    1165           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1166           1 :             char ** argv = const_cast<char **>(cargv);
    1167             : 
    1168           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1169             : 
    1170             :             // check that the result is valid
    1171             : 
    1172             :             // an invalid parameter, MUST NOT EXIST
    1173           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1174           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1175           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1176           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1177           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1178             : 
    1179             :             // the valid parameter
    1180           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1181           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1182           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1183           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1184           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1185           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1186           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1187           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1188           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1189             : 
    1190             :             // other parameters
    1191           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1192           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1193             :         }
    1194             :     }
    1195             :     CATCH_END_SECTION()
    1196             : 
    1197          12 :     CATCH_START_SECTION("Verify a simple alias of --out <filename> ... argument")
    1198             :     {
    1199           2 :         advgetopt::option const options[] =
    1200             :         {
    1201             :             advgetopt::define_option(
    1202             :                   advgetopt::Name("out")
    1203             :                 , advgetopt::ShortName('o')
    1204             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
    1205             :                 , advgetopt::Help("output filename.")
    1206             :             ),
    1207             :             advgetopt::define_option(
    1208             :                   advgetopt::Name("results")
    1209             :                 , advgetopt::ShortName('r')
    1210             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
    1211             :                 , advgetopt::Alias("out")
    1212             :             ),
    1213             :             advgetopt::end_options()
    1214             :         };
    1215             : 
    1216           2 :         advgetopt::options_environment environment_options;
    1217           2 :         environment_options.f_project_name = "unittest";
    1218           2 :         environment_options.f_options = options;
    1219           2 :         environment_options.f_environment_flags = 0;
    1220           2 :         environment_options.f_help_header = "Usage: test simple alias of --out <filename> ... option";
    1221             : 
    1222           4 :         CATCH_WHEN("using long form")
    1223             :         {
    1224           1 :             char const * cargv[] =
    1225             :             {
    1226             :                 "/usr/bin/arguments",
    1227             :                 "--results",
    1228             :                 "my-filename.out",
    1229             :                 "another.out",
    1230             :                 "last.out",
    1231             :                 nullptr
    1232             :             };
    1233           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1234           1 :             char ** argv = const_cast<char **>(cargv);
    1235             : 
    1236           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1237             : 
    1238             :             // check that the result is valid
    1239             : 
    1240             :             // an invalid parameter, MUST NOT EXIST
    1241           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1242           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1243           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1244           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1245           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1246             : 
    1247             :             // the valid parameter
    1248           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1249           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1250           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1251           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1252           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1253           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1254           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1255           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1256           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1257             : 
    1258             :             // the alias parameter
    1259           1 :             CATCH_REQUIRE(opt.get_option("results") != nullptr);
    1260           1 :             CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
    1261           1 :             CATCH_REQUIRE(opt.is_defined("results"));
    1262           1 :             CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
    1263           1 :             CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
    1264           1 :             CATCH_REQUIRE(opt.get_string("results", 1) == "another.out");
    1265           1 :             CATCH_REQUIRE(opt.get_string("results", 2) == "last.out");
    1266           1 :             CATCH_REQUIRE(opt.get_default("results").empty());
    1267           1 :             CATCH_REQUIRE(opt.size("results") == 3);
    1268             : 
    1269             :             // other parameters
    1270           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1271           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1272             :         }
    1273             : 
    1274           4 :         CATCH_WHEN("using short form")
    1275             :         {
    1276           1 :             char const * cargv[] =
    1277             :             {
    1278             :                 "/usr/bin/arguments",
    1279             :                 "-r",
    1280             :                 "my-filename.out",
    1281             :                 "another.out",
    1282             :                 "last.out",
    1283             :                 nullptr
    1284             :             };
    1285           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1286           1 :             char ** argv = const_cast<char **>(cargv);
    1287             : 
    1288           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1289             : 
    1290             :             // check that the result is valid
    1291             : 
    1292             :             // an invalid parameter, MUST NOT EXIST
    1293           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1294           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1295           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1296           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1297           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1298             : 
    1299             :             // the valid parameter
    1300           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1301           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1302           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1303           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1304           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1305           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1306           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1307           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1308           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1309             : 
    1310             :             // the alias parameter
    1311           1 :             CATCH_REQUIRE(opt.get_option("results") != nullptr);
    1312           1 :             CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
    1313           1 :             CATCH_REQUIRE(opt.is_defined("results"));
    1314           1 :             CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
    1315           1 :             CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
    1316           1 :             CATCH_REQUIRE(opt.get_string("results", 1) == "another.out");
    1317           1 :             CATCH_REQUIRE(opt.get_string("results", 2) == "last.out");
    1318           1 :             CATCH_REQUIRE(opt.get_default("results").empty());
    1319           1 :             CATCH_REQUIRE(opt.size("results") == 3);
    1320             : 
    1321             :             // other parameters
    1322           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1323           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1324             :         }
    1325             :     }
    1326             :     CATCH_END_SECTION()
    1327             : 
    1328          12 :     CATCH_START_SECTION("Verify a simple --out <filename> ... argument in a variable")
    1329             :     {
    1330           2 :         advgetopt::option const options[] =
    1331             :         {
    1332             :             advgetopt::define_option(
    1333             :                   advgetopt::Name("out")
    1334             :                 , advgetopt::ShortName('o')
    1335             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
    1336             :                 , advgetopt::Help("output filename.")
    1337             :             ),
    1338             :             advgetopt::end_options()
    1339             :         };
    1340             : 
    1341           2 :         advgetopt::options_environment environment_options;
    1342           2 :         environment_options.f_project_name = "unittest";
    1343           2 :         environment_options.f_options = options;
    1344           2 :         environment_options.f_environment_flags = 0;
    1345           2 :         environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
    1346           2 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    1347             : 
    1348           4 :         CATCH_WHEN("using long form")
    1349             :         {
    1350           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out \"my filename.out\" another.out last.out");
    1351             : 
    1352           1 :             char const * cargv[] =
    1353             :             {
    1354             :                 "/usr/bin/arguments",
    1355             :                 nullptr
    1356             :             };
    1357           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1358           1 :             char ** argv = const_cast<char **>(cargv);
    1359             : 
    1360           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1361             : 
    1362             :             // check that the result is valid
    1363             : 
    1364             :             // an invalid parameter, MUST NOT EXIST
    1365           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1366           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1367           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1368           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1369           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1370             : 
    1371             :             // the valid parameter
    1372           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1373           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1374           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1375           1 :             CATCH_REQUIRE(opt.get_string("out") == "my filename.out");
    1376           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my filename.out");
    1377           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1378           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1379           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1380           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1381             : 
    1382             :             // other parameters
    1383           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1384           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1385             :         }
    1386             : 
    1387           4 :         CATCH_WHEN("using short form")
    1388             :         {
    1389           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o 'my filename.out' another.out last.out");
    1390             : 
    1391           1 :             char const * cargv[] =
    1392             :             {
    1393             :                 "/usr/bin/arguments",
    1394             :                 nullptr
    1395             :             };
    1396           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1397           1 :             char ** argv = const_cast<char **>(cargv);
    1398             : 
    1399           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1400             : 
    1401             :             // check that the result is valid
    1402             : 
    1403             :             // an invalid parameter, MUST NOT EXIST
    1404           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1405           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1406           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1407           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1408           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1409             : 
    1410             :             // the valid parameter
    1411           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1412           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1413           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1414           1 :             CATCH_REQUIRE(opt.get_string("out") == "my filename.out");
    1415           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my filename.out");
    1416           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1417           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1418           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1419           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1420             : 
    1421             :             // other parameters
    1422           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1423           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1424             :         }
    1425             :     }
    1426             :     CATCH_END_SECTION()
    1427           6 : }
    1428             : 
    1429             : 
    1430          17 : CATCH_TEST_CASE("optional_arguments", "[arguments][valid][multiple][getopt]")
    1431             : {
    1432          30 :     CATCH_START_SECTION("Verify a simple --out [<filename> ...] argument")
    1433             :     {
    1434           9 :         char const * const separators[] =
    1435             :         {
    1436             :             ",",
    1437             :             nullptr
    1438             :         };
    1439             : 
    1440           9 :         advgetopt::option const options[] =
    1441             :         {
    1442             :             advgetopt::define_option(
    1443             :                   advgetopt::Name("out")
    1444             :                 , advgetopt::ShortName('o')
    1445             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
    1446             :                 , advgetopt::Help("output filename.")
    1447             :                 , advgetopt::Separators(separators)
    1448          54 :             ),
    1449             :             advgetopt::end_options()
    1450          63 :         };
    1451             : 
    1452           9 :         advgetopt::options_environment environment_options;
    1453           9 :         environment_options.f_project_name = "unittest";
    1454           9 :         environment_options.f_options = options;
    1455           9 :         environment_options.f_environment_flags = 0;
    1456           9 :         environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
    1457             : 
    1458          18 :         CATCH_WHEN("using long form and no arguments")
    1459             :         {
    1460           1 :             char const * cargv[] =
    1461             :             {
    1462             :                 "/usr/bin/arguments",
    1463             :                 "--out",
    1464             :                 nullptr
    1465             :             };
    1466           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1467           1 :             char ** argv = const_cast<char **>(cargv);
    1468             : 
    1469           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1470             : 
    1471             :             // check that the result is valid
    1472             : 
    1473             :             // an invalid parameter, MUST NOT EXIST
    1474           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1475           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1476           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1477           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1478           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1479             : 
    1480             :             // the valid parameter
    1481           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1482           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1483           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1484           1 :             CATCH_REQUIRE(opt.get_string("out").empty());
    1485           1 :             CATCH_REQUIRE(opt.get_string("out", 0).empty());
    1486           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1487           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1488             : 
    1489             :             // other parameters
    1490           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1491           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1492             :         }
    1493             : 
    1494          18 :         CATCH_WHEN("using long form and one empty argument and an equal sign")
    1495             :         {
    1496           1 :             char const * cargv[] =
    1497             :             {
    1498             :                 "/usr/bin/arguments",
    1499             :                 "--out=",
    1500             :                 nullptr
    1501             :             };
    1502           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1503           1 :             char ** argv = const_cast<char **>(cargv);
    1504             : 
    1505           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1506             : 
    1507             :             // check that the result is valid
    1508             : 
    1509             :             // an invalid parameter, MUST NOT EXIST
    1510           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1511           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1512           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1513           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1514           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1515             : 
    1516             :             // the valid parameter
    1517           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1518           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1519           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1520           1 :             CATCH_REQUIRE(opt.get_string("out").empty());
    1521           1 :             CATCH_REQUIRE(opt.get_string("out", 0).empty());
    1522           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1523           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1524             : 
    1525             :             // other parameters
    1526           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1527           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1528             :         }
    1529             : 
    1530          18 :         CATCH_WHEN("using long form and one argument")
    1531             :         {
    1532           1 :             char const * cargv[] =
    1533             :             {
    1534             :                 "/usr/bin/arguments",
    1535             :                 "--out",
    1536             :                 "my-filename.out",
    1537             :                 nullptr
    1538             :             };
    1539           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1540           1 :             char ** argv = const_cast<char **>(cargv);
    1541             : 
    1542           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1543             : 
    1544             :             // check that the result is valid
    1545             : 
    1546             :             // an invalid parameter, MUST NOT EXIST
    1547           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1548           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1549           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1550           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1551           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1552             : 
    1553             :             // the valid parameter
    1554           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1555           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1556           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1557           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1558           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1559           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1560           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1561             : 
    1562             :             // other parameters
    1563           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1564           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1565             :         }
    1566             : 
    1567          18 :         CATCH_WHEN("using long form and one argument and an equal sign")
    1568             :         {
    1569           1 :             char const * cargv[] =
    1570             :             {
    1571             :                 "/usr/bin/arguments",
    1572             :                 "--out=my-filename.out",
    1573             :                 nullptr
    1574             :             };
    1575           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1576           1 :             char ** argv = const_cast<char **>(cargv);
    1577             : 
    1578           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1579             : 
    1580             :             // check that the result is valid
    1581             : 
    1582             :             // an invalid parameter, MUST NOT EXIST
    1583           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1584           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1585           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1586           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1587           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1588             : 
    1589             :             // the valid parameter
    1590           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1591           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1592           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1593           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1594           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1595           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1596           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1597             : 
    1598             :             // other parameters
    1599           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1600           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1601             :         }
    1602             : 
    1603          18 :         CATCH_WHEN("using long form and three arguments")
    1604             :         {
    1605           1 :             char const * cargv[] =
    1606             :             {
    1607             :                 "/usr/bin/arguments",
    1608             :                 "--out",
    1609             :                 "my-filename.out",
    1610             :                 "another.out",
    1611             :                 "last.out",
    1612             :                 nullptr
    1613             :             };
    1614           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1615           1 :             char ** argv = const_cast<char **>(cargv);
    1616             : 
    1617           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1618             : 
    1619             :             // check that the result is valid
    1620             : 
    1621             :             // an invalid parameter, MUST NOT EXIST
    1622           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1623           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1624           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1625           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1626           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1627             : 
    1628             :             // the valid parameter
    1629           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1630           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1631           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1632           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1633           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1634           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1635           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1636           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1637           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1638             : 
    1639             :             // other parameters
    1640           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1641           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1642             :         }
    1643             : 
    1644          18 :         CATCH_WHEN("using long form and three arguments and an equal sign")
    1645             :         {
    1646           1 :             char const * cargv[] =
    1647             :             {
    1648             :                 "/usr/bin/arguments",
    1649             :                 "--out=my-filename.out,another.out,last.out",
    1650             :                 nullptr
    1651             :             };
    1652           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1653           1 :             char ** argv = const_cast<char **>(cargv);
    1654             : 
    1655           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1656             : 
    1657             :             // check that the result is valid
    1658             : 
    1659             :             // an invalid parameter, MUST NOT EXIST
    1660           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1661           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1662           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1663           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1664           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1665             : 
    1666             :             // the valid parameter
    1667           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1668           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1669           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1670           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1671           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1672           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1673           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1674           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1675           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1676             : 
    1677             :             // other parameters
    1678           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1679           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1680             :         }
    1681             : 
    1682          18 :         CATCH_WHEN("using short form and no arguments")
    1683             :         {
    1684           1 :             char const * cargv[] =
    1685             :             {
    1686             :                 "/usr/bin/arguments",
    1687             :                 "-o",
    1688             :                 nullptr
    1689             :             };
    1690           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1691           1 :             char ** argv = const_cast<char **>(cargv);
    1692             : 
    1693           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1694             : 
    1695             :             // check that the result is valid
    1696             : 
    1697             :             // an invalid parameter, MUST NOT EXIST
    1698           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1699           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1700           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1701           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1702           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1703             : 
    1704             :             // the valid parameter
    1705           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1706           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1707           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1708           1 :             CATCH_REQUIRE(opt.get_string("out").empty());
    1709           1 :             CATCH_REQUIRE(opt.get_string("out", 0).empty());
    1710           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1711           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1712             : 
    1713             :             // other parameters
    1714           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1715           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1716             :         }
    1717             : 
    1718          18 :         CATCH_WHEN("using short form and one argument")
    1719             :         {
    1720           1 :             char const * cargv[] =
    1721             :             {
    1722             :                 "/usr/bin/arguments",
    1723             :                 "-o",
    1724             :                 "my-filename.out",
    1725             :                 nullptr
    1726             :             };
    1727           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1728           1 :             char ** argv = const_cast<char **>(cargv);
    1729             : 
    1730           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1731             : 
    1732             :             // check that the result is valid
    1733             : 
    1734             :             // an invalid parameter, MUST NOT EXIST
    1735           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1736           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1737           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1738           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1739           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1740             : 
    1741             :             // the valid parameter
    1742           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1743           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1744           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1745           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1746           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1747           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1748           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1749             : 
    1750             :             // other parameters
    1751           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1752           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1753             :         }
    1754             : 
    1755          18 :         CATCH_WHEN("using short form and three arguments")
    1756             :         {
    1757           1 :             char const * cargv[] =
    1758             :             {
    1759             :                 "/usr/bin/arguments",
    1760             :                 "-o",
    1761             :                 "my-filename.out",
    1762             :                 "another.out",
    1763             :                 "last.out",
    1764             :                 nullptr
    1765             :             };
    1766           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1767           1 :             char ** argv = const_cast<char **>(cargv);
    1768             : 
    1769           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1770             : 
    1771             :             // check that the result is valid
    1772             : 
    1773             :             // an invalid parameter, MUST NOT EXIST
    1774           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1775           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1776           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1777           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1778           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1779             : 
    1780             :             // the valid parameter
    1781           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1782           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1783           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1784           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1785           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1786           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1787           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1788           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1789           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1790             : 
    1791             :             // other parameters
    1792           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1793           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1794             :         }
    1795             :     }
    1796             :     CATCH_END_SECTION()
    1797             : 
    1798          30 :     CATCH_START_SECTION("Verify a simple --out [<filename> ...] argument in a variable")
    1799             :     {
    1800           6 :         advgetopt::option const options[] =
    1801             :         {
    1802             :             advgetopt::define_option(
    1803             :                   advgetopt::Name("out")
    1804             :                 , advgetopt::ShortName('o')
    1805             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
    1806             :                 , advgetopt::Help("output filename.")
    1807             :             ),
    1808             :             advgetopt::end_options()
    1809             :         };
    1810             : 
    1811           6 :         advgetopt::options_environment environment_options;
    1812           6 :         environment_options.f_project_name = "unittest";
    1813           6 :         environment_options.f_options = options;
    1814           6 :         environment_options.f_environment_flags = 0;
    1815           6 :         environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
    1816           6 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    1817             : 
    1818          12 :         CATCH_WHEN("using long form and no arguments")
    1819             :         {
    1820           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out");
    1821             : 
    1822           1 :             char const * cargv[] =
    1823             :             {
    1824             :                 "/usr/bin/arguments",
    1825             :                 nullptr
    1826             :             };
    1827           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1828           1 :             char ** argv = const_cast<char **>(cargv);
    1829             : 
    1830           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1831             : 
    1832             :             // check that the result is valid
    1833             : 
    1834             :             // an invalid parameter, MUST NOT EXIST
    1835           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1836           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1837           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1838           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1839           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1840             : 
    1841             :             // the valid parameter
    1842           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1843           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1844           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1845           1 :             CATCH_REQUIRE(opt.get_string("out").empty());
    1846           1 :             CATCH_REQUIRE(opt.get_string("out", 0).empty());
    1847           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1848           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1849             : 
    1850             :             // other parameters
    1851           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1852           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1853             :         }
    1854             : 
    1855          12 :         CATCH_WHEN("using long form and one argument")
    1856             :         {
    1857           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out my-filename.out");
    1858             : 
    1859           1 :             char const * cargv[] =
    1860             :             {
    1861             :                 "/usr/bin/arguments",
    1862             :                 nullptr
    1863             :             };
    1864           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1865           1 :             char ** argv = const_cast<char **>(cargv);
    1866             : 
    1867           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1868             : 
    1869             :             // check that the result is valid
    1870             : 
    1871             :             // an invalid parameter, MUST NOT EXIST
    1872           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1873           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1874           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1875           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1876           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1877             : 
    1878             :             // the valid parameter
    1879           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1880           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1881           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1882           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1883           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1884           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1885           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1886             : 
    1887             :             // other parameters
    1888           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1889           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1890             :         }
    1891             : 
    1892          12 :         CATCH_WHEN("using long form and three arguments")
    1893             :         {
    1894           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out my-filename.out another.out last.out");
    1895             : 
    1896           1 :             char const * cargv[] =
    1897             :             {
    1898             :                 "/usr/bin/arguments",
    1899             :                 nullptr
    1900             :             };
    1901           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1902           1 :             char ** argv = const_cast<char **>(cargv);
    1903             : 
    1904           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1905             : 
    1906             :             // check that the result is valid
    1907             : 
    1908             :             // an invalid parameter, MUST NOT EXIST
    1909           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1910           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1911           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1912           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1913           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1914             : 
    1915             :             // the valid parameter
    1916           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1917           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1918           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1919           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1920           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1921           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    1922           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    1923           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1924           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    1925             : 
    1926             :             // other parameters
    1927           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1928           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1929             :         }
    1930             : 
    1931          12 :         CATCH_WHEN("using short form and no arguments")
    1932             :         {
    1933           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o");
    1934             : 
    1935           1 :             char const * cargv[] =
    1936             :             {
    1937             :                 "/usr/bin/arguments",
    1938             :                 nullptr
    1939             :             };
    1940           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1941           1 :             char ** argv = const_cast<char **>(cargv);
    1942             : 
    1943           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1944             : 
    1945             :             // check that the result is valid
    1946             : 
    1947             :             // an invalid parameter, MUST NOT EXIST
    1948           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1949           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1950           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1951           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1952           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1953             : 
    1954             :             // the valid parameter
    1955           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1956           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1957           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1958           1 :             CATCH_REQUIRE(opt.get_string("out").empty());
    1959           1 :             CATCH_REQUIRE(opt.get_string("out", 0).empty());
    1960           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1961           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1962             : 
    1963             :             // other parameters
    1964           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1965           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1966             :         }
    1967             : 
    1968          12 :         CATCH_WHEN("using short form and one argument")
    1969             :         {
    1970           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o my-filename.out");
    1971             : 
    1972           1 :             char const * cargv[] =
    1973             :             {
    1974             :                 "/usr/bin/arguments",
    1975             :                 nullptr
    1976             :             };
    1977           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1978           1 :             char ** argv = const_cast<char **>(cargv);
    1979             : 
    1980           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    1981             : 
    1982             :             // check that the result is valid
    1983             : 
    1984             :             // an invalid parameter, MUST NOT EXIST
    1985           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1986           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1987           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1988           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1989           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1990             : 
    1991             :             // the valid parameter
    1992           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    1993           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    1994           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    1995           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    1996           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    1997           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    1998           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    1999             : 
    2000             :             // other parameters
    2001           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2002           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2003             :         }
    2004             : 
    2005          12 :         CATCH_WHEN("using short form and three arguments")
    2006             :         {
    2007           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o my-filename.out another.out last.out");
    2008             : 
    2009           1 :             char const * cargv[] =
    2010             :             {
    2011             :                 "/usr/bin/arguments",
    2012             :                 nullptr
    2013             :             };
    2014           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2015           1 :             char ** argv = const_cast<char **>(cargv);
    2016             : 
    2017           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2018             : 
    2019             :             // check that the result is valid
    2020             : 
    2021             :             // an invalid parameter, MUST NOT EXIST
    2022           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2023           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2024           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2025           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2026           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2027             : 
    2028             :             // the valid parameter
    2029           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2030           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2031           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    2032           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2033           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2034           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    2035           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    2036           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2037           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    2038             : 
    2039             :             // other parameters
    2040           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2041           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2042             :         }
    2043             :     }
    2044             :     CATCH_END_SECTION()
    2045          15 : }
    2046             : 
    2047             : 
    2048           8 : CATCH_TEST_CASE("config_dir_argument", "[arguments][valid][getopt][config]")
    2049             : {
    2050          12 :     CATCH_START_SECTION("Verify that we do get the --config-dir option when we have a standalone configuration filename")
    2051             :     {
    2052           1 :         advgetopt::option const options[] =
    2053             :         {
    2054             :             advgetopt::define_option(
    2055             :                   advgetopt::Name("out")
    2056             :                 , advgetopt::ShortName('o')
    2057             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2058             :                 , advgetopt::Help("output filename.")
    2059             :             ),
    2060             :             advgetopt::end_options()
    2061             :         };
    2062             : 
    2063           1 :         advgetopt::options_environment environment_options;
    2064           1 :         environment_options.f_project_name = "unittest";
    2065           1 :         environment_options.f_options = options;
    2066           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2067           1 :         environment_options.f_configuration_filename = "snapwatchdog.conf";
    2068           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    2069             : 
    2070           1 :         char const * cargv[] =
    2071             :         {
    2072             :             "/usr/bin/arguments",
    2073             :             "--out",
    2074             :             "my-filename.out",
    2075             :             "--license",
    2076             :             "--config-dir",
    2077             :             "/opt/m2osw/config",
    2078             :             nullptr
    2079             :         };
    2080           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2081           1 :         char ** argv = const_cast<char **>(cargv);
    2082             : 
    2083           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2084             : 
    2085             :         // check that the result is valid
    2086             : 
    2087             :         // an invalid parameter, MUST NOT EXIST
    2088           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2089           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2090           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2091           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2092           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2093             : 
    2094             :         // the valid parameter
    2095           1 :         CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2096           1 :         CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
    2097           1 :         CATCH_REQUIRE(opt.is_defined("out"));
    2098           1 :         CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2099           1 :         CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2100           1 :         CATCH_REQUIRE(opt.get_default("out").empty());
    2101           1 :         CATCH_REQUIRE(opt.size("out") == 1);
    2102             : 
    2103             :         // the license system parameter
    2104           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    2105           1 :         CATCH_REQUIRE(opt.get_option('L') != nullptr);
    2106           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    2107           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    2108           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    2109             : 
    2110             :         // the copyright system parameter
    2111           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    2112           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    2113           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
    2114           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    2115           1 :         CATCH_REQUIRE(opt.size("copyright") == 0);
    2116             : 
    2117             :         // the config-dir system parameter
    2118           1 :         CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
    2119           1 :         CATCH_REQUIRE(opt.is_defined("config-dir"));
    2120           1 :         CATCH_REQUIRE(opt.get_default("config-dir").empty());
    2121           1 :         CATCH_REQUIRE(opt.size("config-dir") == 1);
    2122           1 :         CATCH_REQUIRE(opt.get_string("config-dir") == "/opt/m2osw/config");
    2123             : 
    2124             :         // other parameters
    2125           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2126           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2127             :     }
    2128             :     CATCH_END_SECTION()
    2129             : 
    2130          12 :     CATCH_START_SECTION("Verify that we do not get the --config-dir option when the standalone configuration filename is nullptr")
    2131             :     {
    2132           1 :         advgetopt::option const options[] =
    2133             :         {
    2134             :             advgetopt::define_option(
    2135             :                   advgetopt::Name("out")
    2136             :                 , advgetopt::ShortName('o')
    2137             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2138             :                 , advgetopt::Help("output filename.")
    2139             :             ),
    2140             :             advgetopt::end_options()
    2141             :         };
    2142             : 
    2143           1 :         advgetopt::options_environment environment_options;
    2144           1 :         environment_options.f_project_name = "unittest";
    2145           1 :         environment_options.f_options = options;
    2146           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2147           1 :         environment_options.f_configuration_filename = nullptr;
    2148           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    2149             : 
    2150           1 :         char const * cargv[] =
    2151             :         {
    2152             :             "/usr/bin/arguments",
    2153             :             "--out",
    2154             :             "my-filename.out",
    2155             :             "--license",
    2156             :             nullptr
    2157             :         };
    2158           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2159           1 :         char ** argv = const_cast<char **>(cargv);
    2160             : 
    2161           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2162             : 
    2163             :         // check that the result is valid
    2164             : 
    2165             :         // an invalid parameter, MUST NOT EXIST
    2166           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2167           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2168           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2169           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2170           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2171             : 
    2172             :         // the valid parameter
    2173           1 :         CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2174           1 :         CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
    2175           1 :         CATCH_REQUIRE(opt.is_defined("out"));
    2176           1 :         CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2177           1 :         CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2178           1 :         CATCH_REQUIRE(opt.get_default("out").empty());
    2179           1 :         CATCH_REQUIRE(opt.size("out") == 1);
    2180             : 
    2181             :         // the license system parameter
    2182           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    2183           1 :         CATCH_REQUIRE(opt.get_option('L') != nullptr);
    2184           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    2185           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    2186           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    2187             : 
    2188             :         // the copyright system parameter
    2189           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    2190           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    2191           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
    2192           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    2193           1 :         CATCH_REQUIRE(opt.size("copyright") == 0);
    2194             : 
    2195             :         // no config-dir system parameter when the configuration filename is missing
    2196           1 :         CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
    2197           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
    2198           1 :         CATCH_REQUIRE(opt.get_default("config-dir").empty());
    2199           1 :         CATCH_REQUIRE(opt.size("config-dir") == 0);
    2200             : 
    2201             :         // other parameters
    2202           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2203           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2204             :     }
    2205             :     CATCH_END_SECTION()
    2206             : 
    2207          12 :     CATCH_START_SECTION("Verify that we do not get the --config-dir option when the standalone configuration filename is \"\"")
    2208             :     {
    2209           1 :         advgetopt::option const options[] =
    2210             :         {
    2211             :             advgetopt::define_option(
    2212             :                   advgetopt::Name("out")
    2213             :                 , advgetopt::ShortName('o')
    2214             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2215             :                 , advgetopt::Help("output filename.")
    2216             :             ),
    2217             :             advgetopt::end_options()
    2218             :         };
    2219             : 
    2220           1 :         advgetopt::options_environment environment_options;
    2221           1 :         environment_options.f_project_name = "unittest";
    2222           1 :         environment_options.f_options = options;
    2223           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2224           1 :         environment_options.f_configuration_filename = "";
    2225           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    2226             : 
    2227           1 :         char const * cargv[] =
    2228             :         {
    2229             :             "/usr/bin/arguments",
    2230             :             "--out",
    2231             :             "my-filename.out",
    2232             :             "--license",
    2233             :             nullptr
    2234             :         };
    2235           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2236           1 :         char ** argv = const_cast<char **>(cargv);
    2237             : 
    2238           2 :         advgetopt::getopt opt(environment_options, argc, argv);
    2239             : 
    2240             :         // check that the result is valid
    2241             : 
    2242             :         // an invalid parameter, MUST NOT EXIST
    2243           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2244           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2245           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2246           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2247           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2248             : 
    2249             :         // the valid parameter
    2250           1 :         CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2251           1 :         CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
    2252           1 :         CATCH_REQUIRE(opt.is_defined("out"));
    2253           1 :         CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2254           1 :         CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2255           1 :         CATCH_REQUIRE(opt.get_default("out").empty());
    2256           1 :         CATCH_REQUIRE(opt.size("out") == 1);
    2257             : 
    2258             :         // the license system parameter
    2259           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    2260           1 :         CATCH_REQUIRE(opt.get_option('L') != nullptr);
    2261           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    2262           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    2263           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    2264             : 
    2265             :         // the copyright system parameter
    2266           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    2267           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    2268           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
    2269           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    2270           1 :         CATCH_REQUIRE(opt.size("copyright") == 0);
    2271             : 
    2272             :         // no config-dir system parameter when the configuration filename is missing
    2273           1 :         CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
    2274           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
    2275           1 :         CATCH_REQUIRE(opt.get_default("config-dir").empty());
    2276           1 :         CATCH_REQUIRE(opt.size("config-dir") == 0);
    2277             : 
    2278             :         // other parameters
    2279           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2280           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2281             :     }
    2282             :     CATCH_END_SECTION()
    2283             : 
    2284          12 :     CATCH_START_SECTION("Test adding '-c' to '--config-dir'")
    2285             :     {
    2286           1 :         advgetopt::option const options[] =
    2287             :         {
    2288             :             advgetopt::define_option(
    2289             :                   advgetopt::Name("out")
    2290             :                 , advgetopt::ShortName('o')
    2291             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2292             :                 , advgetopt::Help("output filename.")
    2293             :             ),
    2294             :             advgetopt::end_options()
    2295             :         };
    2296             : 
    2297           1 :         advgetopt::options_environment environment_options;
    2298           1 :         environment_options.f_project_name = "unittest";
    2299           1 :         environment_options.f_options = options;
    2300           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2301           1 :         environment_options.f_configuration_filename = "snapwatchdog.conf";
    2302           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    2303             : 
    2304           1 :         char const * cargv[] =
    2305             :         {
    2306             :             "/usr/bin/arguments",
    2307             :             "--out",
    2308             :             "my-filename.out",
    2309             :             "--license",
    2310             :             "-c",
    2311             :             "/opt/m2osw/config",
    2312             :             nullptr
    2313             :         };
    2314           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2315           1 :         char ** argv = const_cast<char **>(cargv);
    2316             : 
    2317           2 :         advgetopt::getopt opt(environment_options);
    2318           1 :         opt.parse_program_name(argv);
    2319           1 :         opt.link_aliases();
    2320             : 
    2321           2 :         advgetopt::option_info::pointer_t config_dir(opt.get_option("config-dir"));
    2322           1 :         CATCH_REQUIRE(config_dir != nullptr);
    2323           1 :         opt.set_short_name("config-dir", U'c');
    2324             : 
    2325           1 :         opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
    2326             : 
    2327             :         // check that the result is valid
    2328             : 
    2329             :         // an invalid parameter, MUST NOT EXIST
    2330           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2331           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2332           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2333           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2334           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2335             : 
    2336             :         // the valid parameter
    2337           1 :         CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2338           1 :         CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
    2339           1 :         CATCH_REQUIRE(opt.is_defined("out"));
    2340           1 :         CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2341           1 :         CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2342           1 :         CATCH_REQUIRE(opt.get_default("out").empty());
    2343           1 :         CATCH_REQUIRE(opt.size("out") == 1);
    2344             : 
    2345             :         // the license system parameter
    2346           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    2347           1 :         CATCH_REQUIRE(opt.get_option('L') != nullptr);
    2348           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    2349           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    2350           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    2351             : 
    2352             :         // the copyright system parameter
    2353           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    2354           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    2355           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
    2356           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    2357           1 :         CATCH_REQUIRE(opt.size("copyright") == 0);
    2358             : 
    2359             :         // the config-dir system parameter
    2360           1 :         CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
    2361           1 :         CATCH_REQUIRE(opt.is_defined("config-dir"));
    2362           1 :         CATCH_REQUIRE(opt.get_default("config-dir").empty());
    2363           1 :         CATCH_REQUIRE(opt.size("config-dir") == 1);
    2364           1 :         CATCH_REQUIRE(opt.get_string("config-dir") == "/opt/m2osw/config");
    2365             : 
    2366             :         // other parameters
    2367           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2368           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2369             :     }
    2370             :     CATCH_END_SECTION()
    2371             : 
    2372          12 :     CATCH_START_SECTION("Test our own parsing with '--config-dir' and f_configuration_filename set to nullptr")
    2373             :     {
    2374           1 :         advgetopt::option const options[] =
    2375             :         {
    2376             :             advgetopt::define_option(
    2377             :                   advgetopt::Name("out")
    2378             :                 , advgetopt::ShortName('o')
    2379             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2380             :                 , advgetopt::Help("output filename.")
    2381             :             ),
    2382             :             advgetopt::end_options()
    2383             :         };
    2384             : 
    2385           1 :         advgetopt::options_environment environment_options;
    2386           1 :         environment_options.f_project_name = "unittest";
    2387           1 :         environment_options.f_options = options;
    2388           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2389           1 :         environment_options.f_configuration_filename = nullptr;
    2390           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    2391             : 
    2392           1 :         char const * cargv[] =
    2393             :         {
    2394             :             "/usr/bin/arguments",
    2395             :             "--out",
    2396             :             "my-filename.out",
    2397             :             "--license",
    2398             :             nullptr
    2399             :         };
    2400           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2401           1 :         char ** argv = const_cast<char **>(cargv);
    2402             : 
    2403           2 :         advgetopt::getopt opt(environment_options);
    2404           1 :         opt.parse_program_name(argv);
    2405           1 :         opt.link_aliases();
    2406             : 
    2407           1 :         CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
    2408             : 
    2409           1 :         opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
    2410             : 
    2411             :         // check that the result is valid
    2412             : 
    2413             :         // an invalid parameter, MUST NOT EXIST
    2414           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2415           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2416           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2417           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2418           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2419             : 
    2420             :         // the valid parameter
    2421           1 :         CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2422           1 :         CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
    2423           1 :         CATCH_REQUIRE(opt.is_defined("out"));
    2424           1 :         CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2425           1 :         CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2426           1 :         CATCH_REQUIRE(opt.get_default("out").empty());
    2427           1 :         CATCH_REQUIRE(opt.size("out") == 1);
    2428             : 
    2429             :         // the license system parameter
    2430           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    2431           1 :         CATCH_REQUIRE(opt.get_option('L') != nullptr);
    2432           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    2433           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    2434           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    2435             : 
    2436             :         // the copyright system parameter
    2437           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    2438           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    2439           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
    2440           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    2441           1 :         CATCH_REQUIRE(opt.size("copyright") == 0);
    2442             : 
    2443             :         // the config-dir system parameter
    2444           1 :         CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
    2445           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
    2446           1 :         CATCH_REQUIRE(opt.get_default("config-dir").empty());
    2447           1 :         CATCH_REQUIRE(opt.size("config-dir") == 0);
    2448             : 
    2449             :         // other parameters
    2450           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2451           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2452             :     }
    2453             :     CATCH_END_SECTION()
    2454             : 
    2455          12 :     CATCH_START_SECTION("Test our own parsing with '--config-dir' and f_configuration_filename set to \"\"")
    2456             :     {
    2457           1 :         advgetopt::option const options[] =
    2458             :         {
    2459             :             advgetopt::define_option(
    2460             :                   advgetopt::Name("out")
    2461             :                 , advgetopt::ShortName('o')
    2462             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    2463             :                 , advgetopt::Help("output filename.")
    2464             :             ),
    2465             :             advgetopt::end_options()
    2466             :         };
    2467             : 
    2468           1 :         advgetopt::options_environment environment_options;
    2469           1 :         environment_options.f_project_name = "unittest";
    2470           1 :         environment_options.f_options = options;
    2471           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    2472           1 :         environment_options.f_configuration_filename = "";
    2473           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    2474             : 
    2475           1 :         char const * cargv[] =
    2476             :         {
    2477             :             "/usr/bin/arguments",
    2478             :             "--out",
    2479             :             "my-filename.out",
    2480             :             "--license",
    2481             :             nullptr
    2482             :         };
    2483           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2484           1 :         char ** argv = const_cast<char **>(cargv);
    2485             : 
    2486           2 :         advgetopt::getopt opt(environment_options);
    2487           1 :         opt.parse_program_name(argv);
    2488           1 :         opt.link_aliases();
    2489             : 
    2490           1 :         CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
    2491             : 
    2492           1 :         opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
    2493             : 
    2494             :         // check that the result is valid
    2495             : 
    2496             :         // an invalid parameter, MUST NOT EXIST
    2497           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2498           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2499           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2500           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2501           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2502             : 
    2503             :         // the valid parameter
    2504           1 :         CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2505           1 :         CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
    2506           1 :         CATCH_REQUIRE(opt.is_defined("out"));
    2507           1 :         CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2508           1 :         CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2509           1 :         CATCH_REQUIRE(opt.get_default("out").empty());
    2510           1 :         CATCH_REQUIRE(opt.size("out") == 1);
    2511             : 
    2512             :         // the license system parameter
    2513           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    2514           1 :         CATCH_REQUIRE(opt.get_option('L') != nullptr);
    2515           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    2516           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    2517           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    2518             : 
    2519             :         // the copyright system parameter
    2520           1 :         CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
    2521           1 :         CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
    2522           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
    2523           1 :         CATCH_REQUIRE(opt.get_default("copyright").empty());
    2524           1 :         CATCH_REQUIRE(opt.size("copyright") == 0);
    2525             : 
    2526             :         // the config-dir system parameter
    2527           1 :         CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
    2528           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
    2529           1 :         CATCH_REQUIRE(opt.get_default("config-dir").empty());
    2530           1 :         CATCH_REQUIRE(opt.size("config-dir") == 0);
    2531             : 
    2532             :         // other parameters
    2533           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2534           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2535             :     }
    2536             :     CATCH_END_SECTION()
    2537           6 : }
    2538             : 
    2539             : 
    2540          18 : CATCH_TEST_CASE("default_argument", "[arguments][valid][getopt]")
    2541             : {
    2542          32 :     CATCH_START_SECTION("Verify a simple [<filename>] argument")
    2543             :     {
    2544           6 :         advgetopt::option const options[] =
    2545             :         {
    2546             :             advgetopt::define_option(
    2547             :                   advgetopt::Name("out")
    2548             :                 , advgetopt::ShortName('o')
    2549             :                 , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_COMMAND_LINE
    2550             :                                                       , advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    2551             :                 , advgetopt::Help("output filename.")
    2552             :             ),
    2553             :             advgetopt::end_options()
    2554             :         };
    2555             : 
    2556           6 :         advgetopt::options_environment environment_options;
    2557           6 :         environment_options.f_project_name = "unittest";
    2558           6 :         environment_options.f_options = options;
    2559           6 :         environment_options.f_environment_flags = 0;
    2560           6 :         environment_options.f_help_header = "Usage: test simple [<filename>] option";
    2561             : 
    2562          12 :         CATCH_WHEN("no arguments")
    2563             :         {
    2564           1 :             char const * cargv[] =
    2565             :             {
    2566             :                 "/usr/bin/arguments",
    2567             :                 nullptr
    2568             :             };
    2569           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2570           1 :             char ** argv = const_cast<char **>(cargv);
    2571             : 
    2572           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2573             : 
    2574             :             // check that the result is valid
    2575             : 
    2576             :             // an invalid parameter, MUST NOT EXIST
    2577           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2578           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2579           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2580           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2581           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2582             : 
    2583             :             // the valid parameter
    2584           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2585           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2586           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("out"));
    2587           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2588           1 :             CATCH_REQUIRE(opt.size("out") == 0);
    2589             : 
    2590             :             // the valid parameter is the default
    2591           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2592           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2593           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2594           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2595           1 :             CATCH_REQUIRE(opt.size("--") == 0);
    2596             : 
    2597             :             // other parameters
    2598           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2599           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2600             :         }
    2601             : 
    2602          12 :         CATCH_WHEN("one argument")
    2603             :         {
    2604           1 :             char const * cargv[] =
    2605             :             {
    2606             :                 "/usr/bin/arguments",
    2607             :                 "my-filename.out",
    2608             :                 nullptr
    2609             :             };
    2610           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2611           1 :             char ** argv = const_cast<char **>(cargv);
    2612             : 
    2613           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2614             : 
    2615             :             // check that the result is valid
    2616             : 
    2617             :             // an invalid parameter, MUST NOT EXIST
    2618           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2619           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2620           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2621           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2622           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2623             : 
    2624             :             // the valid parameter
    2625           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2626           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2627           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    2628           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2629           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2630           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2631           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    2632             : 
    2633             :             // the valid parameter is the default
    2634           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2635           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2636           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    2637           1 :             CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
    2638           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
    2639           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2640           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    2641             : 
    2642             :             // other parameters
    2643           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2644           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2645             :         }
    2646             : 
    2647          12 :         CATCH_WHEN("three arguments")
    2648             :         {
    2649           1 :             char const * cargv[] =
    2650             :             {
    2651             :                 "/usr/bin/arguments",
    2652             :                 "my-filename.out",
    2653             :                 "another.out",
    2654             :                 "last.out",
    2655             :                 nullptr
    2656             :             };
    2657           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2658           1 :             char ** argv = const_cast<char **>(cargv);
    2659             : 
    2660           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2661             : 
    2662             :             // check that the result is valid
    2663             : 
    2664             :             // an invalid parameter, MUST NOT EXIST
    2665           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2666           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2667           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2668           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2669           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2670             : 
    2671             :             // the valid parameter
    2672           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2673           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2674           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    2675           1 :             CATCH_REQUIRE(opt.get_string("out") == "last.out");
    2676           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "last.out");
    2677           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2678           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    2679             : 
    2680             :             // the valid parameter is the default
    2681           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2682           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2683           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    2684           1 :             CATCH_REQUIRE(opt.get_string("--") == "last.out");
    2685           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "last.out");
    2686           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2687           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    2688             : 
    2689             :             // other parameters
    2690           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2691           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2692             :         }
    2693             : 
    2694          12 :         CATCH_WHEN("using the '--' separator and no arguments")
    2695             :         {
    2696           1 :             char const * cargv[] =
    2697             :             {
    2698             :                 "/usr/bin/arguments",
    2699             :                 "--",
    2700             :                 nullptr
    2701             :             };
    2702           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2703           1 :             char ** argv = const_cast<char **>(cargv);
    2704             : 
    2705           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2706             : 
    2707             :             // check that the result is valid
    2708             : 
    2709             :             // an invalid parameter, MUST NOT EXIST
    2710           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2711           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2712           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2713           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2714           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2715             : 
    2716             :             // the valid parameter
    2717           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2718           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2719           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("out"));
    2720           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2721           1 :             CATCH_REQUIRE(opt.size("out") == 0);
    2722             : 
    2723             :             // the valid parameter is the default
    2724           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2725           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2726           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2727           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2728           1 :             CATCH_REQUIRE(opt.size("--") == 0);
    2729             : 
    2730             :             // other parameters
    2731           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2732           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2733             :         }
    2734             : 
    2735          12 :         CATCH_WHEN("using the '--' separator and one argument")
    2736             :         {
    2737           1 :             char const * cargv[] =
    2738             :             {
    2739             :                 "/usr/bin/arguments",
    2740             :                 "--",
    2741             :                 "--my-filename.out",
    2742             :                 nullptr
    2743             :             };
    2744           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2745           1 :             char ** argv = const_cast<char **>(cargv);
    2746             : 
    2747           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2748             : 
    2749             :             // check that the result is valid
    2750             : 
    2751             :             // an invalid parameter, MUST NOT EXIST
    2752           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2753           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2754           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2755           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2756           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2757             : 
    2758             :             // the valid parameter
    2759           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2760           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2761           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    2762           1 :             CATCH_REQUIRE(opt.get_string("out") == "--my-filename.out");
    2763           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "--my-filename.out");
    2764           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2765           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    2766             : 
    2767             :             // the valid parameter is the default
    2768           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2769           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2770           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    2771           1 :             CATCH_REQUIRE(opt.get_string("--") == "--my-filename.out");
    2772           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "--my-filename.out");
    2773           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2774           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    2775             : 
    2776             :             // other parameters
    2777           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2778           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2779             :         }
    2780             : 
    2781          12 :         CATCH_WHEN("using the '--' separator and three arguments")
    2782             :         {
    2783           1 :             char const * cargv[] =
    2784             :             {
    2785             :                 "/usr/bin/arguments",
    2786             :                 "--",
    2787             :                 "my-filename.out",
    2788             :                 "-another.out",
    2789             :                 "--last.out",
    2790             :                 nullptr
    2791             :             };
    2792           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2793           1 :             char ** argv = const_cast<char **>(cargv);
    2794             : 
    2795           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2796             : 
    2797             :             // check that the result is valid
    2798             : 
    2799             :             // an invalid parameter, MUST NOT EXIST
    2800           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2801           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2802           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2803           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2804           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2805             : 
    2806             :             // the valid parameter
    2807           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2808           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2809           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    2810           1 :             CATCH_REQUIRE(opt.get_string("out") == "--last.out");
    2811           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "--last.out");
    2812           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2813           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    2814             : 
    2815             :             // the valid parameter is the default
    2816           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2817           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2818           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    2819           1 :             CATCH_REQUIRE(opt.get_string("--") == "--last.out");
    2820           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "--last.out");
    2821           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2822           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    2823             : 
    2824             :             // other parameters
    2825           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2826           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2827             :         }
    2828             :     }
    2829             :     CATCH_END_SECTION()
    2830             : 
    2831          32 :     CATCH_START_SECTION("Verify a simple [<filename>] argument in a variable")
    2832             :     {
    2833           8 :         advgetopt::option const options[] =
    2834             :         {
    2835             :             advgetopt::define_option(
    2836             :                   advgetopt::Name("out")
    2837             :                 , advgetopt::ShortName('o')
    2838             :                 , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_ENVIRONMENT_VARIABLE
    2839             :                                                       , advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    2840             :                 , advgetopt::Help("output filename.")
    2841             :             ),
    2842             :             advgetopt::end_options()
    2843             :         };
    2844             : 
    2845           8 :         advgetopt::options_environment environment_options;
    2846           8 :         environment_options.f_project_name = "unittest";
    2847           8 :         environment_options.f_options = options;
    2848           8 :         environment_options.f_environment_flags = 0;
    2849           8 :         environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
    2850           8 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    2851             : 
    2852          16 :         CATCH_WHEN("no arguments")
    2853             :         {
    2854           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "");
    2855             : 
    2856           1 :             char const * cargv[] =
    2857             :             {
    2858             :                 "/usr/bin/arguments",
    2859             :                 nullptr
    2860             :             };
    2861           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2862           1 :             char ** argv = const_cast<char **>(cargv);
    2863             : 
    2864           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2865             : 
    2866             :             // check that the result is valid
    2867             : 
    2868             :             // an invalid parameter, MUST NOT EXIST
    2869           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2870           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2871           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2872           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2873           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2874             : 
    2875             :             // the valid parameter
    2876           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2877           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2878           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("out"));
    2879           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2880           1 :             CATCH_REQUIRE(opt.size("out") == 0);
    2881             : 
    2882             :             // the valid parameter is the default
    2883           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2884           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2885           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    2886           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2887           1 :             CATCH_REQUIRE(opt.size("--") == 0);
    2888             : 
    2889             :             // other parameters
    2890           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2891           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2892             :         }
    2893             : 
    2894          16 :         CATCH_WHEN("one argument")
    2895             :         {
    2896           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out");
    2897             : 
    2898           1 :             char const * cargv[] =
    2899             :             {
    2900             :                 "/usr/bin/arguments",
    2901             :                 nullptr
    2902             :             };
    2903           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2904           1 :             char ** argv = const_cast<char **>(cargv);
    2905             : 
    2906           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2907             : 
    2908             :             // check that the result is valid
    2909             : 
    2910             :             // an invalid parameter, MUST NOT EXIST
    2911           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2912           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2913           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2914           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2915           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2916             : 
    2917             :             // the valid parameter
    2918           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2919           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2920           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    2921           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    2922           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    2923           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2924           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    2925             : 
    2926             :             // the valid parameter is the default
    2927           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2928           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2929           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    2930           1 :             CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
    2931           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
    2932           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2933           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    2934             : 
    2935             :             // other parameters
    2936           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2937           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2938             :         }
    2939             : 
    2940          16 :         CATCH_WHEN("three arguments")
    2941             :         {
    2942           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out last.out");
    2943             : 
    2944           1 :             char const * cargv[] =
    2945             :             {
    2946             :                 "/usr/bin/arguments",
    2947             :                 nullptr
    2948             :             };
    2949           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2950           1 :             char ** argv = const_cast<char **>(cargv);
    2951             : 
    2952           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2953             : 
    2954             :             // check that the result is valid
    2955             : 
    2956             :             // an invalid parameter, MUST NOT EXIST
    2957           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    2958           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    2959           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    2960           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    2961           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    2962             : 
    2963             :             // the valid parameter
    2964           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    2965           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    2966           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    2967           1 :             CATCH_REQUIRE(opt.get_string("out") == "last.out");
    2968           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "last.out");
    2969           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    2970           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    2971             : 
    2972             :             // the valid parameter is the default
    2973           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    2974           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    2975           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    2976           1 :             CATCH_REQUIRE(opt.get_string("--") == "last.out");
    2977           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "last.out");
    2978           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    2979           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    2980             : 
    2981             :             // other parameters
    2982           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    2983           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    2984             :         }
    2985             : 
    2986          16 :         CATCH_WHEN("four arguments with a '-'")
    2987             :         {
    2988           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out - last.out");
    2989             : 
    2990           1 :             char const * cargv[] =
    2991             :             {
    2992             :                 "/usr/bin/arguments",
    2993             :                 nullptr
    2994             :             };
    2995           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    2996           1 :             char ** argv = const_cast<char **>(cargv);
    2997             : 
    2998           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    2999             : 
    3000             :             // check that the result is valid
    3001             : 
    3002             :             // an invalid parameter, MUST NOT EXIST
    3003           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3004           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3005           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3006           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3007           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3008             : 
    3009             :             // the valid parameter
    3010           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3011           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3012           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3013           1 :             CATCH_REQUIRE(opt.get_string("out") == "last.out");
    3014           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "last.out");
    3015           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3016           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3017             : 
    3018             :             // the valid parameter is the default
    3019           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3020           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    3021           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    3022           1 :             CATCH_REQUIRE(opt.get_string("--") == "last.out");
    3023           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "last.out");
    3024           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3025           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    3026             : 
    3027             :             // other parameters
    3028           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3029           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3030             :         }
    3031             : 
    3032          16 :         CATCH_WHEN("using the '--' separator and no arguments")
    3033             :         {
    3034           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--");
    3035             : 
    3036           1 :             char const * cargv[] =
    3037             :             {
    3038             :                 "/usr/bin/arguments",
    3039             :                 nullptr
    3040             :             };
    3041           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3042           1 :             char ** argv = const_cast<char **>(cargv);
    3043             : 
    3044           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3045             : 
    3046             :             // check that the result is valid
    3047             : 
    3048             :             // an invalid parameter, MUST NOT EXIST
    3049           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3050           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3051           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3052           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3053           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3054             : 
    3055             :             // the valid parameter
    3056           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3057           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3058           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("out"));
    3059           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3060           1 :             CATCH_REQUIRE(opt.size("out") == 0);
    3061             : 
    3062             :             // the valid parameter is the default
    3063           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3064           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    3065           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3066           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3067           1 :             CATCH_REQUIRE(opt.size("--") == 0);
    3068             : 
    3069             :             // other parameters
    3070           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3071           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3072             :         }
    3073             : 
    3074          16 :         CATCH_WHEN("using the '--' separator and one argument")
    3075             :         {
    3076           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- my-filename.out");
    3077             : 
    3078           1 :             char const * cargv[] =
    3079             :             {
    3080             :                 "/usr/bin/arguments",
    3081             :                 nullptr
    3082             :             };
    3083           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3084           1 :             char ** argv = const_cast<char **>(cargv);
    3085             : 
    3086           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3087             : 
    3088             :             // check that the result is valid
    3089             : 
    3090             :             // an invalid parameter, MUST NOT EXIST
    3091           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3092           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3093           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3094           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3095           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3096             : 
    3097             :             // the valid parameter
    3098           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3099           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3100           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3101           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    3102           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    3103           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3104           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3105             : 
    3106             :             // the valid parameter is the default
    3107           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3108           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    3109           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    3110           1 :             CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
    3111           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
    3112           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3113           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    3114             : 
    3115             :             // other parameters
    3116           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3117           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3118             :         }
    3119             : 
    3120          16 :         CATCH_WHEN("using the '--' separator and three arguments")
    3121             :         {
    3122           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- my-filename.out -another.out --last.out");
    3123             : 
    3124           1 :             char const * cargv[] =
    3125             :             {
    3126             :                 "/usr/bin/arguments",
    3127             :                 nullptr
    3128             :             };
    3129           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3130           1 :             char ** argv = const_cast<char **>(cargv);
    3131             : 
    3132           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3133             : 
    3134             :             // check that the result is valid
    3135             : 
    3136             :             // an invalid parameter, MUST NOT EXIST
    3137           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3138           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3139           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3140           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3141           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3142             : 
    3143             :             // the valid parameter
    3144           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3145           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3146           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3147           1 :             CATCH_REQUIRE(opt.get_string("out") == "--last.out");
    3148           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "--last.out");
    3149           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3150           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3151             : 
    3152             :             // the valid parameter is the default
    3153           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3154           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    3155           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    3156           1 :             CATCH_REQUIRE(opt.get_string("--") == "--last.out");
    3157           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "--last.out");
    3158           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3159           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    3160             : 
    3161             :             // other parameters
    3162           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3163           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3164             :         }
    3165             : 
    3166          16 :         CATCH_WHEN("using the '--' separator and four arguments with a '-'")
    3167             :         {
    3168           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- my-filename.out -another.out - --last.out");
    3169             : 
    3170           1 :             char const * cargv[] =
    3171             :             {
    3172             :                 "/usr/bin/arguments",
    3173             :                 nullptr
    3174             :             };
    3175           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3176           1 :             char ** argv = const_cast<char **>(cargv);
    3177             : 
    3178           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3179             : 
    3180             :             // check that the result is valid
    3181             : 
    3182             :             // an invalid parameter, MUST NOT EXIST
    3183           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3184           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3185           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3186           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3187           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3188             : 
    3189             :             // the valid parameter
    3190           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3191           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3192           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3193           1 :             CATCH_REQUIRE(opt.get_string("out") == "--last.out");
    3194           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "--last.out");
    3195           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3196           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3197             : 
    3198             :             // the valid parameter is the default
    3199           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3200           1 :             CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
    3201           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    3202           1 :             CATCH_REQUIRE(opt.get_string("--") == "--last.out");
    3203           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "--last.out");
    3204           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3205           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    3206             : 
    3207             :             // other parameters
    3208           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3209           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3210             :         }
    3211             :     }
    3212             :     CATCH_END_SECTION()
    3213             : 
    3214          32 :     CATCH_START_SECTION("Verify that we can have a non-require argument with an invalid default")
    3215             :     {
    3216           2 :         advgetopt::option const options[] =
    3217             :         {
    3218             :             advgetopt::define_option(
    3219             :                   advgetopt::Name("before")
    3220             :                 , advgetopt::ShortName('b')
    3221             :                 , advgetopt::Flags(advgetopt::command_flags<>())
    3222             :                 , advgetopt::Help("appears before.")
    3223             :                 , advgetopt::DefaultValue("early")
    3224             :             ),
    3225             :             advgetopt::define_option(
    3226             :                   advgetopt::Name("out")
    3227             :                 , advgetopt::ShortName('o')
    3228             :                 , advgetopt::Flags(advgetopt::command_flags<>())
    3229             :                 , advgetopt::Help("output filename.")
    3230             :                 , advgetopt::DefaultValue("default-name")
    3231             :                 , advgetopt::Validator("/[a-z]+/")
    3232             :             ),
    3233             :             advgetopt::define_option(
    3234             :                   advgetopt::Name("after")
    3235             :                 , advgetopt::ShortName('a')
    3236             :                 , advgetopt::Flags(advgetopt::command_flags<>())
    3237             :                 , advgetopt::Help("appears after.")
    3238             :                 , advgetopt::DefaultValue("late")
    3239             :             ),
    3240             :             advgetopt::end_options()
    3241             :         };
    3242             : 
    3243           2 :         advgetopt::options_environment environment_options;
    3244           2 :         environment_options.f_project_name = "unittest";
    3245           2 :         environment_options.f_options = options;
    3246           2 :         environment_options.f_environment_flags = 0;
    3247           2 :         environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
    3248           2 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    3249             : 
    3250           4 :         CATCH_WHEN("no parameters to arguments")
    3251             :         {
    3252           1 :             char const * cargv[] =
    3253             :             {
    3254             :                 "/usr/bin/arguments",
    3255             :                 "--before",
    3256             :                 "--out",
    3257             :                 "--after",
    3258             :                 nullptr
    3259             :             };
    3260           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3261           1 :             char ** argv = const_cast<char **>(cargv);
    3262             : 
    3263           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3264             : 
    3265             :             // check that the result is valid
    3266             : 
    3267             :             // an invalid parameter, MUST NOT EXIST
    3268           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3269           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3270           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3271           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3272           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3273             : 
    3274             :             // the valid parameter
    3275           1 :             CATCH_REQUIRE(opt.get_option("before") != nullptr);
    3276           1 :             CATCH_REQUIRE(opt.get_option('b') != nullptr);
    3277           1 :             CATCH_REQUIRE(opt.is_defined("before"));
    3278           1 :             CATCH_REQUIRE(opt.get_string("before") == "early");
    3279           1 :             CATCH_REQUIRE(opt.get_string("before", 0) == "early");
    3280           1 :             CATCH_REQUIRE(opt.get_default("before") == "early");
    3281           1 :             CATCH_REQUIRE(opt.size("before") == 1);
    3282             : 
    3283             :             // the valid parameter
    3284           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3285           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3286           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3287           1 :             CATCH_REQUIRE(opt.get_string("out") == "default-name");
    3288           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "default-name");
    3289           1 :             CATCH_REQUIRE(opt.get_default("out") == "default-name");
    3290           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3291             : 
    3292             :             // the valid parameter
    3293           1 :             CATCH_REQUIRE(opt.get_option("after") != nullptr);
    3294           1 :             CATCH_REQUIRE(opt.get_option('a') != nullptr);
    3295           1 :             CATCH_REQUIRE(opt.is_defined("after"));
    3296           1 :             CATCH_REQUIRE(opt.get_string("after") == "late");
    3297           1 :             CATCH_REQUIRE(opt.get_string("after", 0) == "late");
    3298           1 :             CATCH_REQUIRE(opt.get_default("after") == "late");
    3299           1 :             CATCH_REQUIRE(opt.size("after") == 1);
    3300             : 
    3301             :             // other parameters
    3302           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3303           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3304             :         }
    3305             : 
    3306           4 :         CATCH_WHEN("parameters to some arguments")
    3307             :         {
    3308           1 :             char const * cargv[] =
    3309             :             {
    3310             :                 "/usr/bin/arguments",
    3311             :                 "--before",
    3312             :                 "avant",
    3313             :                 "--out",
    3314             :                 "--after",
    3315             :                 "apr\xC3\xA8s", // UTF-8 of "`e"
    3316             :                 nullptr
    3317             :             };
    3318           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3319           1 :             char ** argv = const_cast<char **>(cargv);
    3320             : 
    3321           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3322             : 
    3323             :             // check that the result is valid
    3324             : 
    3325             :             // an invalid parameter, MUST NOT EXIST
    3326           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3327           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3328           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3329           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3330           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3331             : 
    3332             :             // the valid parameter
    3333           1 :             CATCH_REQUIRE(opt.get_option("before") != nullptr);
    3334           1 :             CATCH_REQUIRE(opt.get_option('b') != nullptr);
    3335           1 :             CATCH_REQUIRE(opt.is_defined("before"));
    3336           1 :             CATCH_REQUIRE(opt.get_string("before") == "avant");
    3337           1 :             CATCH_REQUIRE(opt.get_string("before", 0) == "avant");
    3338           1 :             CATCH_REQUIRE(opt.get_default("before") == "early");
    3339           1 :             CATCH_REQUIRE(opt.size("before") == 1);
    3340             : 
    3341             :             // the valid parameter
    3342           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3343           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3344           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3345           1 :             CATCH_REQUIRE(opt.get_string("out") == "default-name");
    3346           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "default-name");
    3347           1 :             CATCH_REQUIRE(opt.get_default("out") == "default-name");
    3348           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3349             : 
    3350             :             // the valid parameter
    3351           1 :             CATCH_REQUIRE(opt.get_option("after") != nullptr);
    3352           1 :             CATCH_REQUIRE(opt.get_option('a') != nullptr);
    3353           1 :             CATCH_REQUIRE(opt.is_defined("after"));
    3354           1 :             CATCH_REQUIRE(opt.get_string("after") == "apr\xC3\xA8s");
    3355           1 :             CATCH_REQUIRE(opt.get_string("after", 0) == "apr\xC3\xA8s");
    3356           1 :             CATCH_REQUIRE(opt.get_default("after") == "late");
    3357           1 :             CATCH_REQUIRE(opt.size("after") == 1);
    3358             : 
    3359             :             // other parameters
    3360           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3361           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3362             :         }
    3363             :     }
    3364             :     CATCH_END_SECTION()
    3365          16 : }
    3366             : 
    3367             : 
    3368          14 : CATCH_TEST_CASE("default_arguments", "[arguments][valid][multiple][getopt]")
    3369             : {
    3370          24 :     CATCH_START_SECTION("Verify a simple [<filename> ...] argument")
    3371             :     {
    3372           4 :         advgetopt::option const options[] =
    3373             :         {
    3374             :             advgetopt::define_option(
    3375             :                   advgetopt::Name("out")
    3376             :                 , advgetopt::ShortName('o')
    3377             :                 , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_COMMAND_LINE
    3378             :                                                       , advgetopt::GETOPT_FLAG_DEFAULT_OPTION
    3379             :                                                       , advgetopt::GETOPT_FLAG_MULTIPLE>())
    3380             :                 , advgetopt::Help("output filename.")
    3381             :             ),
    3382             :             advgetopt::end_options()
    3383             :         };
    3384             : 
    3385           4 :         advgetopt::options_environment environment_options;
    3386           4 :         environment_options.f_project_name = "unittest";
    3387           4 :         environment_options.f_options = options;
    3388           4 :         environment_options.f_environment_flags = 0;
    3389           4 :         environment_options.f_help_header = "Usage: test simple [<filename>] option";
    3390             : 
    3391           8 :         CATCH_WHEN("no arguments")
    3392             :         {
    3393           1 :             char const * cargv[] =
    3394             :             {
    3395             :                 "/usr/bin/arguments",
    3396             :                 nullptr
    3397             :             };
    3398           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3399           1 :             char ** argv = const_cast<char **>(cargv);
    3400             : 
    3401           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3402             : 
    3403             :             // check that the result is valid
    3404             : 
    3405             :             // an invalid parameter, MUST NOT EXIST
    3406           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3407           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3408           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3409           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3410           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3411             : 
    3412             :             // the valid parameter
    3413           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3414           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3415           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("out"));
    3416           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3417           1 :             CATCH_REQUIRE(opt.size("out") == 0);
    3418             : 
    3419             :             // other parameters
    3420           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3421           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3422             :         }
    3423             : 
    3424           8 :         CATCH_WHEN("one argument")
    3425             :         {
    3426           1 :             char const * cargv[] =
    3427             :             {
    3428             :                 "/usr/bin/arguments",
    3429             :                 "my-filename.out",
    3430             :                 nullptr
    3431             :             };
    3432           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3433           1 :             char ** argv = const_cast<char **>(cargv);
    3434             : 
    3435           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3436             : 
    3437             :             // check that the result is valid
    3438             : 
    3439             :             // an invalid parameter, MUST NOT EXIST
    3440           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3441           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3442           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3443           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3444           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3445             : 
    3446             :             // the valid parameter
    3447           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3448           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3449           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3450           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    3451           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    3452           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3453           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3454             : 
    3455             :             // other parameters
    3456           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3457           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3458             :         }
    3459             : 
    3460           8 :         CATCH_WHEN("three arguments")
    3461             :         {
    3462           1 :             char const * cargv[] =
    3463             :             {
    3464             :                 "/usr/bin/arguments",
    3465             :                 "my-filename.out",
    3466             :                 "another.out",
    3467             :                 "last.out",
    3468             :                 nullptr
    3469             :             };
    3470           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3471           1 :             char ** argv = const_cast<char **>(cargv);
    3472             : 
    3473           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3474             : 
    3475             :             // check that the result is valid
    3476             : 
    3477             :             // an invalid parameter, MUST NOT EXIST
    3478           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3479           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3480           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3481           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3482           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3483             : 
    3484             :             // the valid parameter
    3485           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3486           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3487           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3488           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    3489           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    3490           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    3491           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    3492           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3493           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    3494             : 
    3495             :             // other parameters
    3496           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3497           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3498             :         }
    3499             : 
    3500           8 :         CATCH_WHEN("four arguments with a '-'")
    3501             :         {
    3502           1 :             char const * cargv[] =
    3503             :             {
    3504             :                 "/usr/bin/arguments",
    3505             :                 "my-filename.out",
    3506             :                 "another.out",
    3507             :                 "-",
    3508             :                 "last.out",
    3509             :                 nullptr
    3510             :             };
    3511           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3512           1 :             char ** argv = const_cast<char **>(cargv);
    3513             : 
    3514           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3515             : 
    3516             :             // check that the result is valid
    3517             : 
    3518             :             // an invalid parameter, MUST NOT EXIST
    3519           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3520           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3521           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3522           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3523           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3524             : 
    3525             :             // the valid parameter
    3526           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3527           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3528           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3529           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    3530           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    3531           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    3532           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "-");
    3533           1 :             CATCH_REQUIRE(opt.get_string("out", 3) == "last.out");
    3534           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3535           1 :             CATCH_REQUIRE(opt.size("out") == 4);
    3536             : 
    3537             :             // other parameters
    3538           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3539           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3540             :         }
    3541             :     }
    3542             :     CATCH_END_SECTION()
    3543             : 
    3544          24 :     CATCH_START_SECTION("Verify a simple [<filename> ...] argument with the default name (a.k.a. \"--\")")
    3545             :     {
    3546           4 :         advgetopt::option const options[] =
    3547             :         {
    3548             :             advgetopt::define_option(
    3549             :                   advgetopt::Name("--")
    3550             :                 , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_COMMAND_LINE
    3551             :                                                       , advgetopt::GETOPT_FLAG_DEFAULT_OPTION
    3552             :                                                       , advgetopt::GETOPT_FLAG_MULTIPLE>())
    3553             :                 , advgetopt::Help("output filename.")
    3554             :             ),
    3555             :             advgetopt::end_options()
    3556             :         };
    3557             : 
    3558           4 :         advgetopt::options_environment environment_options;
    3559           4 :         environment_options.f_project_name = "unittest";
    3560           4 :         environment_options.f_options = options;
    3561           4 :         environment_options.f_environment_flags = 0;
    3562           4 :         environment_options.f_help_header = "Usage: test simple [<filename>] option";
    3563             : 
    3564           8 :         CATCH_WHEN("no arguments")
    3565             :         {
    3566           1 :             char const * cargv[] =
    3567             :             {
    3568             :                 "/usr/bin/arguments",
    3569             :                 nullptr
    3570             :             };
    3571           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3572           1 :             char ** argv = const_cast<char **>(cargv);
    3573             : 
    3574           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3575             : 
    3576             :             // check that the result is valid
    3577             : 
    3578             :             // an invalid parameter, MUST NOT EXIST
    3579           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3580           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3581           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3582           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3583           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3584             : 
    3585             :             // the valid parameter
    3586           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3587           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    3588           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3589           1 :             CATCH_REQUIRE(opt.size("--") == 0);
    3590             : 
    3591             :             // other parameters
    3592           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3593           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3594             :         }
    3595             : 
    3596           8 :         CATCH_WHEN("one argument")
    3597             :         {
    3598           1 :             char const * cargv[] =
    3599             :             {
    3600             :                 "/usr/bin/arguments",
    3601             :                 "my-filename.out",
    3602             :                 nullptr
    3603             :             };
    3604           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3605           1 :             char ** argv = const_cast<char **>(cargv);
    3606             : 
    3607           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3608             : 
    3609             :             // check that the result is valid
    3610             : 
    3611             :             // an invalid parameter, MUST NOT EXIST
    3612           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3613           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3614           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3615           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3616           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3617             : 
    3618             :             // the valid parameter
    3619           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3620           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    3621           1 :             CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
    3622           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
    3623           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3624           1 :             CATCH_REQUIRE(opt.size("--") == 1);
    3625             : 
    3626             :             // other parameters
    3627           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3628           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3629             :         }
    3630             : 
    3631           8 :         CATCH_WHEN("three arguments")
    3632             :         {
    3633           1 :             char const * cargv[] =
    3634             :             {
    3635             :                 "/usr/bin/arguments",
    3636             :                 "my-filename.out",
    3637             :                 "another.out",
    3638             :                 "last.out",
    3639             :                 nullptr
    3640             :             };
    3641           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3642           1 :             char ** argv = const_cast<char **>(cargv);
    3643             : 
    3644           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3645             : 
    3646             :             // check that the result is valid
    3647             : 
    3648             :             // an invalid parameter, MUST NOT EXIST
    3649           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3650           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3651           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3652           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3653           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3654             : 
    3655             :             // the valid parameter
    3656           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3657           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    3658           1 :             CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
    3659           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
    3660           1 :             CATCH_REQUIRE(opt.get_string("--", 1) == "another.out");
    3661           1 :             CATCH_REQUIRE(opt.get_string("--", 2) == "last.out");
    3662           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3663           1 :             CATCH_REQUIRE(opt.size("--") == 3);
    3664             : 
    3665             :             // other parameters
    3666           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3667           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3668             :         }
    3669             : 
    3670           8 :         CATCH_WHEN("four arguments with a '-'")
    3671             :         {
    3672           1 :             char const * cargv[] =
    3673             :             {
    3674             :                 "/usr/bin/arguments",
    3675             :                 "my-filename.out",
    3676             :                 "another.out",
    3677             :                 "-",
    3678             :                 "last.out",
    3679             :                 nullptr
    3680             :             };
    3681           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3682           1 :             char ** argv = const_cast<char **>(cargv);
    3683             : 
    3684           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3685             : 
    3686             :             // check that the result is valid
    3687             : 
    3688             :             // an invalid parameter, MUST NOT EXIST
    3689           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3690           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3691           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3692           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3693           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3694             : 
    3695             :             // the valid parameter
    3696           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    3697           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    3698           1 :             CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
    3699           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
    3700           1 :             CATCH_REQUIRE(opt.get_string("--", 1) == "another.out");
    3701           1 :             CATCH_REQUIRE(opt.get_string("--", 2) == "-");
    3702           1 :             CATCH_REQUIRE(opt.get_string("--", 3) == "last.out");
    3703           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3704           1 :             CATCH_REQUIRE(opt.size("--") == 4);
    3705             : 
    3706             :             // other parameters
    3707           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3708           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3709             :         }
    3710             :     }
    3711             :     CATCH_END_SECTION()
    3712             : 
    3713          24 :     CATCH_START_SECTION("Verify a simple [<filename> ...] argument in a variable")
    3714             :     {
    3715           4 :         advgetopt::option const options[] =
    3716             :         {
    3717             :             advgetopt::define_option(
    3718             :                   advgetopt::Name("out")
    3719             :                 , advgetopt::ShortName('o')
    3720             :                 , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_ENVIRONMENT_VARIABLE
    3721             :                                                       , advgetopt::GETOPT_FLAG_DEFAULT_OPTION
    3722             :                                                       , advgetopt::GETOPT_FLAG_MULTIPLE>())
    3723             :                 , advgetopt::Help("output filename.")
    3724             :             ),
    3725             :             advgetopt::end_options()
    3726             :         };
    3727             : 
    3728           4 :         advgetopt::options_environment environment_options;
    3729           4 :         environment_options.f_project_name = "unittest";
    3730           4 :         environment_options.f_options = options;
    3731           4 :         environment_options.f_environment_flags = 0;
    3732           4 :         environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
    3733           4 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    3734             : 
    3735           8 :         CATCH_WHEN("no arguments")
    3736             :         {
    3737           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "");
    3738             : 
    3739           1 :             char const * cargv[] =
    3740             :             {
    3741             :                 "/usr/bin/arguments",
    3742             :                 nullptr
    3743             :             };
    3744           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3745           1 :             char ** argv = const_cast<char **>(cargv);
    3746             : 
    3747           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3748             : 
    3749             :             // check that the result is valid
    3750             : 
    3751             :             // an invalid parameter, MUST NOT EXIST
    3752           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3753           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3754           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3755           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3756           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3757             : 
    3758             :             // the valid parameter
    3759           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3760           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3761           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("out"));
    3762           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3763           1 :             CATCH_REQUIRE(opt.size("out") == 0);
    3764             : 
    3765             :             // other parameters
    3766           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3767           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3768             :         }
    3769             : 
    3770           8 :         CATCH_WHEN("one argument")
    3771             :         {
    3772           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out");
    3773             : 
    3774           1 :             char const * cargv[] =
    3775             :             {
    3776             :                 "/usr/bin/arguments",
    3777             :                 nullptr
    3778             :             };
    3779           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3780           1 :             char ** argv = const_cast<char **>(cargv);
    3781             : 
    3782           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3783             : 
    3784             :             // check that the result is valid
    3785             : 
    3786             :             // an invalid parameter, MUST NOT EXIST
    3787           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3788           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3789           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3790           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3791           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3792             : 
    3793             :             // the valid parameter
    3794           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3795           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3796           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3797           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    3798           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    3799           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3800           1 :             CATCH_REQUIRE(opt.size("out") == 1);
    3801             : 
    3802             :             // other parameters
    3803           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3804           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3805             :         }
    3806             : 
    3807           8 :         CATCH_WHEN("three arguments")
    3808             :         {
    3809           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out last.out");
    3810             : 
    3811           1 :             char const * cargv[] =
    3812             :             {
    3813             :                 "/usr/bin/arguments",
    3814             :                 nullptr
    3815             :             };
    3816           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3817           1 :             char ** argv = const_cast<char **>(cargv);
    3818             : 
    3819           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3820             : 
    3821             :             // check that the result is valid
    3822             : 
    3823             :             // an invalid parameter, MUST NOT EXIST
    3824           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3825           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3826           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3827           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3828           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3829             : 
    3830             :             // the valid parameter
    3831           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3832           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3833           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3834           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    3835           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    3836           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    3837           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
    3838           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3839           1 :             CATCH_REQUIRE(opt.size("out") == 3);
    3840             : 
    3841             :             // other parameters
    3842           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3843           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3844             :         }
    3845             : 
    3846           8 :         CATCH_WHEN("four arguments with a '-'")
    3847             :         {
    3848           2 :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out - last.out");
    3849             : 
    3850           1 :             char const * cargv[] =
    3851             :             {
    3852             :                 "/usr/bin/arguments",
    3853             :                 nullptr
    3854             :             };
    3855           1 :             int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3856           1 :             char ** argv = const_cast<char **>(cargv);
    3857             : 
    3858           2 :             advgetopt::getopt opt(environment_options, argc, argv);
    3859             : 
    3860             :             // check that the result is valid
    3861             : 
    3862             :             // an invalid parameter, MUST NOT EXIST
    3863           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3864           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3865           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    3866           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3867           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    3868             : 
    3869             :             // the valid parameter
    3870           1 :             CATCH_REQUIRE(opt.get_option("out") != nullptr);
    3871           1 :             CATCH_REQUIRE(opt.get_option('o') != nullptr);
    3872           1 :             CATCH_REQUIRE(opt.is_defined("out"));
    3873           1 :             CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
    3874           1 :             CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
    3875           1 :             CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
    3876           1 :             CATCH_REQUIRE(opt.get_string("out", 2) == "-");
    3877           1 :             CATCH_REQUIRE(opt.get_string("out", 3) == "last.out");
    3878           1 :             CATCH_REQUIRE(opt.get_default("out").empty());
    3879           1 :             CATCH_REQUIRE(opt.size("out") == 4);
    3880             : 
    3881             :             // other parameters
    3882           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3883           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3884             :         }
    3885             :     }
    3886             :     CATCH_END_SECTION()
    3887          12 : }
    3888             : 
    3889             : 
    3890           5 : CATCH_TEST_CASE("manual_arguments", "[arguments][valid][getopt]")
    3891             : {
    3892           6 :     CATCH_START_SECTION("Verify a few arguments added manually")
    3893             :     {
    3894             :         // create a getopt object
    3895             :         //
    3896           1 :         advgetopt::options_environment environment_options;
    3897           1 :         environment_options.f_project_name = "unittest";
    3898           1 :         environment_options.f_help_header = "Usage: test simple --verbose option";
    3899           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    3900             : 
    3901           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "file.exe file.so file.dll file.lib file.a");
    3902           2 :         advgetopt::getopt opt(environment_options);
    3903             : 
    3904             :             // an invalid parameter, MUST NEVER EXIST
    3905             :             //
    3906           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3907           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3908           1 :             CATCH_REQUIRE_THROWS_MATCHES(
    3909             :                       opt.is_defined("invalid-parameter")
    3910             :                     , advgetopt::getopt_initialization
    3911             :                     , Catch::Matchers::ExceptionMessage(
    3912             :                                   "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
    3913           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3914           1 :             CATCH_REQUIRE_THROWS_MATCHES(
    3915             :                       opt.size("invalid-parameter")
    3916             :                     , advgetopt::getopt_initialization
    3917             :                     , Catch::Matchers::ExceptionMessage(
    3918             :                                   "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
    3919             : 
    3920             :             // verbose
    3921             :             //
    3922           1 :             CATCH_REQUIRE(opt.get_option("verbose") == nullptr);
    3923           1 :             CATCH_REQUIRE(opt.get_option('v') == nullptr);
    3924           1 :             CATCH_REQUIRE_THROWS_MATCHES(
    3925             :                       opt.is_defined("verbose")
    3926             :                     , advgetopt::getopt_initialization
    3927             :                     , Catch::Matchers::ExceptionMessage(
    3928             :                                   "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
    3929           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    3930           1 :             CATCH_REQUIRE_THROWS_MATCHES(
    3931             :                       opt.size("verbose")
    3932             :                     , advgetopt::getopt_initialization
    3933             :                     , Catch::Matchers::ExceptionMessage(
    3934             :                                   "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
    3935             : 
    3936             :             // help
    3937             :             //
    3938           1 :             CATCH_REQUIRE(opt.get_option("help") == nullptr);
    3939           1 :             CATCH_REQUIRE(opt.get_option('h') == nullptr);
    3940           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    3941             : 
    3942             :             // default
    3943             :             //
    3944           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3945           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3946             : 
    3947             :             // other parameters
    3948             :             //
    3949           1 :             CATCH_REQUIRE(opt.get_program_name().empty());
    3950           1 :             CATCH_REQUIRE(opt.get_program_fullname().empty());
    3951             : 
    3952             :         // setup the program name early
    3953             :         //
    3954           1 :         char const * cargv[] =
    3955             :         {
    3956             :             "/usr/bin/arguments",
    3957             :             "--verbose",
    3958             :             "--help",
    3959             :             nullptr
    3960             :         };
    3961           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    3962           1 :         char ** argv = const_cast<char **>(cargv);
    3963             : 
    3964           1 :         opt.parse_program_name(argv);
    3965             : 
    3966             :             // an invalid parameter, MUST NEVER EXIST
    3967             :             //
    3968           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    3969           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    3970           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    3971             : 
    3972             :             // verbose
    3973             :             //
    3974           1 :             CATCH_REQUIRE(opt.get_option("verbose") == nullptr);
    3975           1 :             CATCH_REQUIRE(opt.get_option('v') == nullptr);
    3976           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    3977             : 
    3978             :             // help
    3979             :             //
    3980           1 :             CATCH_REQUIRE(opt.get_option("help") == nullptr);
    3981           1 :             CATCH_REQUIRE(opt.get_option('h') == nullptr);
    3982           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    3983             : 
    3984             :             // default
    3985             :             //
    3986           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
    3987           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    3988             : 
    3989             :             // other parameters
    3990             :             //
    3991           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    3992           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    3993             : 
    3994             :         // verify nullptr has no effect
    3995             :         //
    3996           1 :         opt.parse_options_info(nullptr);
    3997             : 
    3998             :             // an invalid parameter, MUST NEVER EXIST
    3999             :             //
    4000           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4001           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4002           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4003             : 
    4004             :             // verbose
    4005             :             //
    4006           1 :             CATCH_REQUIRE(opt.get_option("verbose") == nullptr);
    4007           1 :             CATCH_REQUIRE(opt.get_option('v') == nullptr);
    4008           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4009             : 
    4010             :             // help
    4011             :             //
    4012           1 :             CATCH_REQUIRE(opt.get_option("help") == nullptr);
    4013           1 :             CATCH_REQUIRE(opt.get_option('h') == nullptr);
    4014           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4015             : 
    4016             :             // default
    4017             :             //
    4018           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
    4019           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4020             : 
    4021             :             // other parameters
    4022             :             //
    4023           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4024           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4025             : 
    4026             :         // add --verbose
    4027             :         //
    4028           1 :         advgetopt::option const verbose_option[] =
    4029             :         {
    4030             :             advgetopt::define_option(
    4031             :                   advgetopt::Name("verbose")
    4032             :                 , advgetopt::ShortName('v')
    4033             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    4034             :                 , advgetopt::Help("print info as we work.")
    4035             :             ),
    4036             :             advgetopt::end_options()
    4037             :         };
    4038           1 :         opt.parse_options_info(verbose_option);
    4039             : 
    4040             :             // an invalid parameter, MUST NEVER EXIST
    4041             :             //
    4042           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4043           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4044           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4045             : 
    4046             :             // verbose
    4047             :             //
    4048           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4049           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4050           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4051             : 
    4052             :             // help
    4053             :             //
    4054           1 :             CATCH_REQUIRE(opt.get_option("help") == nullptr);
    4055           1 :             CATCH_REQUIRE(opt.get_option('h') == nullptr);
    4056           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4057             : 
    4058             :             // default
    4059             :             //
    4060           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
    4061           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4062             : 
    4063             :             // other parameters
    4064             :             //
    4065           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4066           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4067             : 
    4068             :         // add --help
    4069             :         //
    4070           1 :         advgetopt::option const help_option[] =
    4071             :         {
    4072             :             advgetopt::define_option(
    4073             :                   advgetopt::Name("help")
    4074             :                 , advgetopt::ShortName('h')
    4075             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    4076             :                 , advgetopt::Help("print this help screen.")
    4077             :             ),
    4078             :             advgetopt::end_options()
    4079             :         };
    4080           1 :         opt.parse_options_info(help_option);
    4081             : 
    4082             :             // an invalid parameter, MUST NEVER EXIST
    4083             :             //
    4084           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4085           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4086           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4087             : 
    4088             :             // verbose
    4089             :             //
    4090           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4091           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4092           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4093             : 
    4094             :             // help
    4095             :             //
    4096           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4097           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4098           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4099             : 
    4100             :             // default
    4101             :             //
    4102           1 :             CATCH_REQUIRE(opt.get_option("--") == nullptr);
    4103           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4104             : 
    4105             :             // other parameters
    4106             :             //
    4107           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4108           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4109             : 
    4110             :         // add -- (default option)
    4111             :         //
    4112           1 :         advgetopt::option const default_option[] =
    4113             :         {
    4114             :             advgetopt::define_option(
    4115             :                   advgetopt::Name("--")
    4116             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
    4117             :                 , advgetopt::Help("filenames to handle by this command.")
    4118             :             ),
    4119             :             advgetopt::end_options()
    4120             :         };
    4121           1 :         opt.parse_options_info(default_option);
    4122             : 
    4123             :             // an invalid parameter, MUST NEVER EXIST
    4124             :             //
    4125           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4126           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4127           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4128             : 
    4129             :             // verbose
    4130             :             //
    4131           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4132           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4133           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4134             : 
    4135             :             // help
    4136             :             //
    4137           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4138           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4139           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4140             : 
    4141             :             // default
    4142             :             //
    4143           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4144           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4145             : 
    4146             :             // other parameters
    4147             :             //
    4148           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4149           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4150             : 
    4151             :         // first parse the environment variable
    4152             :         //
    4153           1 :         opt.parse_environment_variable();
    4154             : 
    4155             :             // an invalid parameter, MUST NEVER EXIST
    4156             :             //
    4157           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4158           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4159           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    4160           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4161           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    4162             : 
    4163             :             // verbose
    4164             :             //
    4165           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4166           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4167           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("verbose"));
    4168           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4169           1 :             CATCH_REQUIRE(opt.size("verbose") == 0);
    4170             : 
    4171             :             // help
    4172             :             //
    4173           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4174           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4175           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("help"));
    4176           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4177           1 :             CATCH_REQUIRE(opt.size("help") == 0);
    4178             : 
    4179             :             // default
    4180             :             //
    4181           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4182           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    4183           1 :             CATCH_REQUIRE(opt.get_string("--") == "file.exe");
    4184           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
    4185           1 :             CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
    4186           1 :             CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
    4187           1 :             CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
    4188           1 :             CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
    4189           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4190           1 :             CATCH_REQUIRE(opt.size("--") == 5);
    4191             : 
    4192             :             // other parameters
    4193             :             //
    4194           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4195           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4196             : 
    4197             :         // now parse our command line arguments
    4198             :         //
    4199           1 :         opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
    4200             : 
    4201             :             // an invalid parameter, MUST NEVER EXIST
    4202             :             //
    4203           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4204           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4205           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    4206           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4207           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    4208             : 
    4209             :             // verbose
    4210             :             //
    4211           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4212           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4213           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
    4214           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4215           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
    4216             : 
    4217             :             // help
    4218             :             //
    4219           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4220           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4221           1 :             CATCH_REQUIRE(opt.is_defined("help"));
    4222           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4223           1 :             CATCH_REQUIRE(opt.size("help") == 1);
    4224             : 
    4225             :             // default
    4226             :             //
    4227           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4228           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    4229           1 :             CATCH_REQUIRE(opt.get_string("--") == "file.exe");
    4230           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
    4231           1 :             CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
    4232           1 :             CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
    4233           1 :             CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
    4234           1 :             CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
    4235           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4236           1 :             CATCH_REQUIRE(opt.size("--") == 5);
    4237             : 
    4238             :             // other parameters
    4239             :             //
    4240           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4241           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4242             :     }
    4243             :     CATCH_END_SECTION()
    4244             : 
    4245           6 :     CATCH_START_SECTION("Verify a few arguments added manually and system options")
    4246             :     {
    4247             :         // create a getopt object with options
    4248             :         //
    4249           1 :         advgetopt::option const options[] =
    4250             :         {
    4251             :             advgetopt::define_option(
    4252             :                   advgetopt::Name("verbose")
    4253             :                 , advgetopt::ShortName('v')
    4254             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    4255             :                 , advgetopt::Help("print info as we work.")
    4256             :             ),
    4257             :             advgetopt::define_option(
    4258             :                   advgetopt::Name("size")
    4259             :                 , advgetopt::ShortName('s')
    4260             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    4261             :                 , advgetopt::DefaultValue("123")
    4262             :                 , advgetopt::Help("define a size.")
    4263             :             ),
    4264             :             advgetopt::define_option(
    4265             :                   advgetopt::Name("--")
    4266             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
    4267             :                 , advgetopt::Help("filenames to handle by this command.")
    4268             :             ),
    4269             :             advgetopt::end_options()
    4270             :         };
    4271             : 
    4272           1 :         advgetopt::options_environment environment_options;
    4273           1 :         environment_options.f_project_name = "unittest";
    4274           1 :         environment_options.f_options = options;
    4275           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    4276           1 :         environment_options.f_help_header = "Usage: test simple --verbose option";
    4277           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    4278             : 
    4279           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "file.exe file.so file.dll file.lib file.a");
    4280           2 :         advgetopt::getopt opt(environment_options);
    4281             : 
    4282             :             // an invalid parameter, MUST NEVER EXIST
    4283             :             //
    4284           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4285           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4286           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4287             : 
    4288             :             // verbose
    4289             :             //
    4290           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4291           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4292           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4293             : 
    4294             :             // help
    4295             :             //
    4296           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4297           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4298           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4299             : 
    4300             :             // default
    4301             :             //
    4302           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4303           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4304             : 
    4305             :             // size
    4306             :             //
    4307           1 :             CATCH_REQUIRE(opt.get_option("size") != nullptr);
    4308           1 :             CATCH_REQUIRE(opt.get_option('s') != nullptr);
    4309           1 :             CATCH_REQUIRE(opt.get_default("size") == "123");
    4310             : 
    4311             :             // pos
    4312             :             //
    4313           1 :             CATCH_REQUIRE(opt.get_option("pos") == nullptr);
    4314           1 :             CATCH_REQUIRE(opt.get_option('p') == nullptr);
    4315           1 :             CATCH_REQUIRE(opt.get_default("pos").empty());
    4316             : 
    4317             :             // other parameters
    4318             :             //
    4319           1 :             CATCH_REQUIRE(opt.get_program_name().empty());
    4320           1 :             CATCH_REQUIRE(opt.get_program_fullname().empty());
    4321             : 
    4322             :         // setup the program name early
    4323             :         //
    4324           1 :         char const * cargv[] =
    4325             :         {
    4326             :             "/usr/bin/arguments",
    4327             :             "--size",
    4328             :             "40132",
    4329             :             "--pos",
    4330             :             "43,91",
    4331             :             nullptr
    4332             :         };
    4333           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    4334           1 :         char ** argv = const_cast<char **>(cargv);
    4335             : 
    4336           1 :         opt.parse_program_name(argv);
    4337             : 
    4338             :             // an invalid parameter, MUST NEVER EXIST
    4339             :             //
    4340           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4341           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4342           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4343             : 
    4344             :             // verbose
    4345             :             //
    4346           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4347           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4348           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4349             : 
    4350             :             // help
    4351             :             //
    4352           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4353           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4354           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4355             : 
    4356             :             // size
    4357             :             //
    4358           1 :             CATCH_REQUIRE(opt.get_option("size") != nullptr);
    4359           1 :             CATCH_REQUIRE(opt.get_option('s') != nullptr);
    4360           1 :             CATCH_REQUIRE(opt.get_default("size") == "123");
    4361             : 
    4362             :             // pos
    4363             :             //
    4364           1 :             CATCH_REQUIRE(opt.get_option("pos") == nullptr);
    4365           1 :             CATCH_REQUIRE(opt.get_option('p') == nullptr);
    4366           1 :             CATCH_REQUIRE(opt.get_default("pos").empty());
    4367             : 
    4368             :             // default
    4369             :             //
    4370           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4371           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4372             : 
    4373             :             // other parameters
    4374             :             //
    4375           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4376           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4377             : 
    4378             :         // add --pos
    4379             :         //
    4380           1 :         advgetopt::option const help_option[] =
    4381             :         {
    4382             :             advgetopt::define_option(
    4383             :                   advgetopt::Name("pos")
    4384             :                 , advgetopt::ShortName('p')
    4385             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    4386             :                 , advgetopt::Help("specify position.")
    4387             :                 , advgetopt::DefaultValue("0,0")
    4388             :             ),
    4389             :             advgetopt::end_options()
    4390             :         };
    4391           1 :         opt.parse_options_info(help_option);
    4392             : 
    4393             :             // an invalid parameter, MUST NEVER EXIST
    4394             :             //
    4395           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4396           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4397           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4398             : 
    4399             :             // verbose
    4400             :             //
    4401           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4402           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4403           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4404             : 
    4405             :             // help
    4406             :             //
    4407           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4408           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4409           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4410             : 
    4411             :             // size
    4412             :             //
    4413           1 :             CATCH_REQUIRE(opt.get_option("size") != nullptr);
    4414           1 :             CATCH_REQUIRE(opt.get_option('s') != nullptr);
    4415           1 :             CATCH_REQUIRE(opt.get_default("size") == "123");
    4416             : 
    4417             :             // pos
    4418             :             //
    4419           1 :             CATCH_REQUIRE(opt.get_option("pos") != nullptr);
    4420           1 :             CATCH_REQUIRE(opt.get_option('p') != nullptr);
    4421           1 :             CATCH_REQUIRE(opt.get_default("pos") == "0,0");
    4422             : 
    4423             :             // default
    4424             :             //
    4425           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4426           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4427             : 
    4428             :             // other parameters
    4429             :             //
    4430           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4431           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4432             : 
    4433             :         // first parse the environment variable
    4434             :         //
    4435           1 :         opt.parse_environment_variable();
    4436             : 
    4437             :             // an invalid parameter, MUST NEVER EXIST
    4438             :             //
    4439           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4440           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4441           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    4442           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4443           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    4444             : 
    4445             :             // verbose
    4446             :             //
    4447           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4448           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4449           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("verbose"));
    4450           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4451           1 :             CATCH_REQUIRE(opt.size("verbose") == 0);
    4452             : 
    4453             :             // help
    4454             :             //
    4455           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4456           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4457           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("help"));
    4458           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4459           1 :             CATCH_REQUIRE(opt.size("help") == 0);
    4460             : 
    4461             :             // size
    4462             :             //
    4463           1 :             CATCH_REQUIRE(opt.get_option("size") != nullptr);
    4464           1 :             CATCH_REQUIRE(opt.get_option('s') != nullptr);
    4465           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    4466           1 :             CATCH_REQUIRE(opt.get_default("size") == "123");
    4467           1 :             CATCH_REQUIRE(opt.size("size") == 0);
    4468             : 
    4469             :             // pos
    4470             :             //
    4471           1 :             CATCH_REQUIRE(opt.get_option("pos") != nullptr);
    4472           1 :             CATCH_REQUIRE(opt.get_option('p') != nullptr);
    4473           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("pos"));
    4474           1 :             CATCH_REQUIRE(opt.get_default("pos") == "0,0");
    4475           1 :             CATCH_REQUIRE(opt.size("pos") == 0);
    4476             : 
    4477             :             // default
    4478             :             //
    4479           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4480           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    4481           1 :             CATCH_REQUIRE(opt.get_string("--") == "file.exe");
    4482           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
    4483           1 :             CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
    4484           1 :             CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
    4485           1 :             CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
    4486           1 :             CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
    4487           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4488           1 :             CATCH_REQUIRE(opt.size("--") == 5);
    4489             : 
    4490             :             // other parameters
    4491             :             //
    4492           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4493           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4494             : 
    4495             :         // now parse our command line arguments
    4496             :         //
    4497           1 :         opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
    4498             : 
    4499             :             // an invalid parameter, MUST NEVER EXIST
    4500             :             //
    4501           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4502           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4503           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    4504           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4505           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    4506             : 
    4507             :             // verbose
    4508             :             //
    4509           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4510           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4511           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("verbose"));
    4512           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4513           1 :             CATCH_REQUIRE(opt.size("verbose") == 0);
    4514             : 
    4515             :             // help
    4516             :             //
    4517           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4518           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4519           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("help"));
    4520           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4521           1 :             CATCH_REQUIRE(opt.size("help") == 0);
    4522             : 
    4523             :             // size
    4524             :             //
    4525           1 :             CATCH_REQUIRE(opt.get_option("size") != nullptr);
    4526           1 :             CATCH_REQUIRE(opt.get_option('s') != nullptr);
    4527           1 :             CATCH_REQUIRE(opt.is_defined("size"));
    4528           1 :             CATCH_REQUIRE(opt.get_string("size") == "40132");
    4529           1 :             CATCH_REQUIRE(opt.get_string("size", 0) == "40132");
    4530           1 :             CATCH_REQUIRE(opt.get_long("size") == 40132);
    4531           1 :             CATCH_REQUIRE(opt.get_long("size", 0) == 40132);
    4532             : #pragma GCC diagnostic push
    4533             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    4534             :             {
    4535           1 :                 bool const a1(opt.get_double("size") == 40132.0);
    4536           1 :                 CATCH_REQUIRE(a1);
    4537           1 :                 bool const a2(opt.get_double("size", 0) == 40132.0);
    4538           1 :                 CATCH_REQUIRE(a2);
    4539             :             }
    4540             : #pragma GCC diagnostic pop
    4541           1 :             CATCH_REQUIRE(opt.get_default("size") == "123");
    4542           1 :             CATCH_REQUIRE(opt.size("size") == 1);
    4543             : 
    4544             :             // pos
    4545             :             //
    4546           1 :             CATCH_REQUIRE(opt.get_option("pos") != nullptr);
    4547           1 :             CATCH_REQUIRE(opt.get_option('p') != nullptr);
    4548           1 :             CATCH_REQUIRE(opt.is_defined("pos"));
    4549           1 :             CATCH_REQUIRE(opt.get_string("pos") == "43,91");
    4550           1 :             CATCH_REQUIRE(opt.get_string("pos", 0) == "43,91");
    4551           1 :             CATCH_REQUIRE(opt.get_default("pos") == "0,0");
    4552           1 :             CATCH_REQUIRE(opt.size("pos") == 1);
    4553             : 
    4554             :             // default
    4555             :             //
    4556           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4557           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    4558           1 :             CATCH_REQUIRE(opt.get_string("--") == "file.exe");
    4559           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
    4560           1 :             CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
    4561           1 :             CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
    4562           1 :             CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
    4563           1 :             CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
    4564           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4565           1 :             CATCH_REQUIRE(opt.size("--") == 5);
    4566             : 
    4567             :             // other parameters
    4568             :             //
    4569           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4570           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4571             : 
    4572             :         // second set of arguments
    4573             :         //
    4574           1 :         char const * cargv2[] =
    4575             :         {
    4576             :             "/usr/bin/arguments",
    4577             :             "--help",
    4578             :             "--verbose",
    4579             :             nullptr
    4580             :         };
    4581           1 :         int const argc2(sizeof(cargv2) / sizeof(cargv2[0]) - 1);
    4582           1 :         char ** argv2 = const_cast<char **>(cargv2);
    4583             : 
    4584           1 :         opt.parse_arguments(argc2, argv2, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
    4585             : 
    4586             :             // an invalid parameter, MUST NEVER EXIST
    4587             :             //
    4588           1 :             CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    4589           1 :             CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    4590           1 :             CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    4591           1 :             CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    4592           1 :             CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    4593             : 
    4594             :             // verbose
    4595             :             //
    4596           1 :             CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    4597           1 :             CATCH_REQUIRE(opt.get_option('v') != nullptr);
    4598           1 :             CATCH_REQUIRE(opt.is_defined("verbose"));
    4599           1 :             CATCH_REQUIRE(opt.get_string("verbose").empty());
    4600           1 :             CATCH_REQUIRE(opt.get_string("verbose", 0).empty());
    4601           1 :             CATCH_REQUIRE(opt.get_default("verbose").empty());
    4602           1 :             CATCH_REQUIRE(opt.size("verbose") == 1);
    4603             : 
    4604             :             // help
    4605             :             //
    4606           1 :             CATCH_REQUIRE(opt.get_option("help") != nullptr);
    4607           1 :             CATCH_REQUIRE(opt.get_option('h') != nullptr);
    4608           1 :             CATCH_REQUIRE(opt.is_defined("help"));
    4609           1 :             CATCH_REQUIRE(opt.get_string("help").empty());
    4610           1 :             CATCH_REQUIRE(opt.get_string("help", 0).empty());
    4611           1 :             CATCH_REQUIRE(opt.get_default("help").empty());
    4612           1 :             CATCH_REQUIRE(opt.size("help") == 1);
    4613             : 
    4614             :             // size
    4615             :             //
    4616           1 :             CATCH_REQUIRE(opt.get_option("size") != nullptr);
    4617           1 :             CATCH_REQUIRE(opt.get_option('s') != nullptr);
    4618           1 :             CATCH_REQUIRE(opt.is_defined("size"));
    4619           1 :             CATCH_REQUIRE(opt.get_string("size") == "40132");
    4620           1 :             CATCH_REQUIRE(opt.get_string("size", 0) == "40132");
    4621           1 :             CATCH_REQUIRE(opt.get_long("size") == 40132);
    4622           1 :             CATCH_REQUIRE(opt.get_long("size", 0) == 40132);
    4623             : #pragma GCC diagnostic push
    4624             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    4625             :             {
    4626           1 :                 bool const a1(opt.get_double("size") == 40132.0);
    4627           1 :                 CATCH_REQUIRE(a1);
    4628           1 :                 bool const a2(opt.get_double("size", 0) == 40132.0);
    4629           1 :                 CATCH_REQUIRE(a2);
    4630             :             }
    4631             : #pragma GCC diagnostic pop
    4632           1 :             CATCH_REQUIRE(opt.get_default("size") == "123");
    4633           1 :             CATCH_REQUIRE(opt.size("size") == 1);
    4634             : 
    4635             :             // pos
    4636             :             //
    4637           1 :             CATCH_REQUIRE(opt.get_option("pos") != nullptr);
    4638           1 :             CATCH_REQUIRE(opt.get_option('p') != nullptr);
    4639           1 :             CATCH_REQUIRE(opt.is_defined("pos"));
    4640           1 :             CATCH_REQUIRE(opt.get_string("pos") == "43,91");
    4641           1 :             CATCH_REQUIRE(opt.get_string("pos", 0) == "43,91");
    4642           1 :             CATCH_REQUIRE(opt.get_default("pos") == "0,0");
    4643           1 :             CATCH_REQUIRE(opt.size("pos") == 1);
    4644             : 
    4645             :             // default
    4646             :             //
    4647           1 :             CATCH_REQUIRE(opt.get_option("--") != nullptr);
    4648           1 :             CATCH_REQUIRE(opt.is_defined("--"));
    4649           1 :             CATCH_REQUIRE(opt.get_string("--") == "file.exe");
    4650           1 :             CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
    4651           1 :             CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
    4652           1 :             CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
    4653           1 :             CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
    4654           1 :             CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
    4655           1 :             CATCH_REQUIRE(opt.get_default("--").empty());
    4656           1 :             CATCH_REQUIRE(opt.size("--") == 5);
    4657             : 
    4658             :             // other parameters
    4659             :             //
    4660           1 :             CATCH_REQUIRE(opt.get_program_name() == "arguments");
    4661           1 :             CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    4662             :     }
    4663             :     CATCH_END_SECTION()
    4664             : 
    4665           6 :     CATCH_START_SECTION("Verify that not calling link_aliases() causes problems")
    4666             :     {
    4667             :         // create a getopt object, we will part the options "manually" later
    4668             :         //
    4669           1 :         advgetopt::options_environment environment_options;
    4670           1 :         environment_options.f_project_name = "unittest";
    4671           1 :         environment_options.f_help_header = "Usage: test --licence as equivalent to --license";
    4672           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    4673           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    4674             : 
    4675           2 :         advgetopt::getopt opt(environment_options);
    4676             : 
    4677           1 :         const advgetopt::option options[] =
    4678             :         {
    4679             :             advgetopt::define_option(
    4680             :                   advgetopt::Name("verbose")
    4681             :                 , advgetopt::ShortName('v')
    4682             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    4683             :                 , advgetopt::Help("print info as we work.")
    4684             :             ),
    4685             :             advgetopt::define_option(
    4686             :                   advgetopt::Name("licence")    // French spelling
    4687             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    4688             :                 , advgetopt::Alias("license")   // forgot system flags?
    4689             :             ),
    4690             :             advgetopt::end_options()
    4691             :         };
    4692             : 
    4693           1 :         opt.parse_options_info(options);
    4694             : 
    4695             :         // "forgot" to call the opt.link_aliases() here
    4696             : 
    4697           1 :         char const * cargv[] =
    4698             :         {
    4699             :             "/usr/bin/arguments",
    4700             :             "--verbose",
    4701             :             "--licence",
    4702             :             nullptr
    4703             :         };
    4704           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    4705           1 :         char ** argv = const_cast<char **>(cargv);
    4706             : 
    4707           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    4708             :                   opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE)
    4709             :                 , advgetopt::getopt_undefined
    4710             :                 , Catch::Matchers::ExceptionMessage(
    4711             :                               "getopt_exception: getopt::get_alias_destination(): alias is missing. Did you call link_aliases()?"));
    4712             :     }
    4713             :     CATCH_END_SECTION()
    4714           3 : }
    4715             : 
    4716             : 
    4717           7 : CATCH_TEST_CASE("individual_argument_variable", "[arguments][valid][variable][getopt]")
    4718             : {
    4719          10 :     CATCH_START_SECTION("Test that we get the values of individual environment variables without an INTRO_...")
    4720             :     {
    4721             :         // create a getopt object with options
    4722             :         //
    4723           5 :         advgetopt::option const options[] =
    4724             :         {
    4725             :             advgetopt::define_option(
    4726             :                   advgetopt::Name("verbose")
    4727             :                 , advgetopt::ShortName('v')
    4728             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    4729             :                 , advgetopt::EnvironmentVariableName("VERBOSE")
    4730             :                 , advgetopt::Help("print info as we work.")
    4731             :             ),
    4732             :             advgetopt::define_option(
    4733             :                   advgetopt::Name("size")
    4734             :                 , advgetopt::ShortName('s')
    4735             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    4736             :                 , advgetopt::DefaultValue("123")
    4737             :                 , advgetopt::EnvironmentVariableName("SIZE")
    4738             :                 , advgetopt::Help("define a size.")
    4739             :             ),
    4740             :             advgetopt::define_option(
    4741             :                   advgetopt::Name("--")
    4742             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
    4743             :                 , advgetopt::EnvironmentVariableName("FILENAMES")
    4744             :                 , advgetopt::Help("filenames to handle by this command.")
    4745             :             ),
    4746             :             advgetopt::end_options()
    4747             :         };
    4748             : 
    4749           5 :         advgetopt::options_environment environment_options;
    4750           5 :         environment_options.f_project_name = "unittest";
    4751           5 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
    4752           5 :         environment_options.f_help_header = "Usage: testing system arguments.";
    4753           5 :         environment_options.f_options = options;
    4754           5 :         environment_options.f_version = "2.0.1";
    4755           5 :         environment_options.f_license = "MIT";
    4756           5 :         environment_options.f_copyright = "Copyright (c) 2019  Made to Order Software Corp. -- All Rights Reserved";
    4757           5 :         environment_options.f_build_date = "Jun  4 2019";
    4758           5 :         environment_options.f_build_time = "23:02:36";
    4759             : 
    4760          10 :         CATCH_WHEN("Testing all parameters defined on command line")
    4761             :         {
    4762           2 :             snapdev::safe_setenv env_verbose("VERBOSE", "");
    4763           2 :             snapdev::safe_setenv env_size("SIZE", "22159");
    4764           2 :             snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
    4765             : 
    4766           1 :             char const * cargv[] =
    4767             :             {
    4768             :                 "tests/system-arguments",
    4769             :                 "--verbose",
    4770             :                 "--size",
    4771             :                 "5003",
    4772             :                 "special/file",
    4773             :                 "organic/test",
    4774             :                 nullptr
    4775             :             };
    4776           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    4777           1 :             char ** argv = const_cast<char **>(cargv);
    4778             : 
    4779             :             // the command line has priority, but the MULTIPLE creates a
    4780             :             // problem here...
    4781             :             //
    4782           2 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    4783           1 :             CATCH_REQUIRE(opt != nullptr);
    4784             : 
    4785           1 :             CATCH_REQUIRE(opt->is_defined("verbose"));
    4786             : 
    4787           1 :             CATCH_REQUIRE(opt->is_defined("size"));
    4788           1 :             CATCH_REQUIRE(opt->get_string("size") == "5003");
    4789             : 
    4790           1 :             CATCH_REQUIRE(opt->is_defined("--"));
    4791           1 :             CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
    4792           1 :             CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
    4793           1 :             CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
    4794             :         }
    4795             : 
    4796          10 :         CATCH_WHEN("Testing with verbose not on the list")
    4797             :         {
    4798           2 :             snapdev::safe_setenv env_verbose("VERBOSE", "");
    4799           2 :             snapdev::safe_setenv env_size("SIZE", "22159");
    4800           2 :             snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
    4801             : 
    4802           1 :             char const * cargv[] =
    4803             :             {
    4804             :                 "tests/system-arguments",
    4805             :                 "--size",
    4806             :                 "5003",
    4807             :                 "special/file",
    4808             :                 "organic/test",
    4809             :                 nullptr
    4810             :             };
    4811           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    4812           1 :             char ** argv = const_cast<char **>(cargv);
    4813             : 
    4814             :             // the command line has priority, but the MULTIPLE creates a
    4815             :             // problem here...
    4816             :             //
    4817           2 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    4818           1 :             CATCH_REQUIRE(opt != nullptr);
    4819             : 
    4820           1 :             CATCH_REQUIRE(opt->is_defined("verbose"));
    4821             : 
    4822           1 :             CATCH_REQUIRE(opt->is_defined("size"));
    4823           1 :             CATCH_REQUIRE(opt->get_string("size") == "5003");
    4824             : 
    4825           1 :             CATCH_REQUIRE(opt->is_defined("--"));
    4826           1 :             CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
    4827           1 :             CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
    4828           1 :             CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
    4829             :         }
    4830             : 
    4831          10 :         CATCH_WHEN("Testing with verbose set to false")
    4832             :         {
    4833           2 :             snapdev::safe_setenv env_verbose("VERBOSE", "false");
    4834           2 :             snapdev::safe_setenv env_size("SIZE", "22159");
    4835           2 :             snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
    4836             : 
    4837           1 :             char const * cargv[] =
    4838             :             {
    4839             :                 "tests/system-arguments",
    4840             :                 "--size",
    4841             :                 "5003",
    4842             :                 "special/file",
    4843             :                 "organic/test",
    4844             :                 nullptr
    4845             :             };
    4846           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    4847           1 :             char ** argv = const_cast<char **>(cargv);
    4848             : 
    4849             :             // the command line has priority, but the MULTIPLE creates a
    4850             :             // problem here...
    4851             :             //
    4852           2 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    4853           1 :             CATCH_REQUIRE(opt != nullptr);
    4854             : 
    4855           1 :             CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
    4856             : 
    4857           1 :             CATCH_REQUIRE(opt->is_defined("size"));
    4858           1 :             CATCH_REQUIRE(opt->get_string("size") == "5003");
    4859             : 
    4860           1 :             CATCH_REQUIRE(opt->is_defined("--"));
    4861           1 :             CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
    4862           1 :             CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
    4863           1 :             CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
    4864             :         }
    4865             : 
    4866          10 :         CATCH_WHEN("Testing with no verbose, but size in environment")
    4867             :         {
    4868           2 :             snapdev::safe_setenv env_size("SIZE", "22159");
    4869           2 :             snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
    4870             : 
    4871           1 :             char const * cargv[] =
    4872             :             {
    4873             :                 "tests/system-arguments",
    4874             :                 "special/file",
    4875             :                 "organic/test",
    4876             :                 nullptr
    4877             :             };
    4878           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    4879           1 :             char ** argv = const_cast<char **>(cargv);
    4880             : 
    4881             :             // the command line has priority, but the MULTIPLE creates a
    4882             :             // problem here...
    4883             :             //
    4884           2 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    4885           1 :             CATCH_REQUIRE(opt != nullptr);
    4886             : 
    4887           1 :             CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
    4888             : 
    4889           1 :             CATCH_REQUIRE(opt->is_defined("size"));
    4890           1 :             CATCH_REQUIRE(opt->get_string("size") == "22159");
    4891             : 
    4892           1 :             CATCH_REQUIRE(opt->is_defined("--"));
    4893           1 :             CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
    4894           1 :             CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
    4895           1 :             CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
    4896             :         }
    4897             : 
    4898          10 :         CATCH_WHEN("Testing with no command line parameters, but filenames in environment only")
    4899             :         {
    4900           2 :             snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
    4901             : 
    4902           1 :             char const * cargv[] =
    4903             :             {
    4904             :                 "tests/system-arguments",
    4905             :                 nullptr
    4906             :             };
    4907           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    4908           1 :             char ** argv = const_cast<char **>(cargv);
    4909             : 
    4910             :             // the command line has priority, but the MULTIPLE creates a
    4911             :             // problem here...
    4912             :             //
    4913           2 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    4914           1 :             CATCH_REQUIRE(opt != nullptr);
    4915             : 
    4916           1 :             CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
    4917             : 
    4918           1 :             CATCH_REQUIRE_FALSE(opt->is_defined("size"));
    4919             : 
    4920           1 :             CATCH_REQUIRE(opt->is_defined("--"));
    4921           1 :             CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
    4922             :         }
    4923             :     }
    4924             :     CATCH_END_SECTION()
    4925           5 : }
    4926             : 
    4927             : 
    4928           6 : CATCH_TEST_CASE("auto_process_system_arguments", "[arguments][valid][getopt]")
    4929             : {
    4930           8 :     CATCH_START_SECTION("Test auto-processing of system arguments (with many CATCH_WHEN)")
    4931             :     {
    4932           4 :         advgetopt::options_environment options;
    4933           4 :         options.f_project_name = "unittest";
    4934           4 :         options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
    4935           4 :         options.f_help_header = "Usage: testing system arguments.";
    4936           4 :         options.f_version = "2.0.1";
    4937           4 :         options.f_license = "MIT";
    4938           4 :         options.f_copyright = "Copyright (c) 2019  Made to Order Software Corp. -- All Rights Reserved";
    4939           4 :         options.f_build_date = "Jun  4 2019";
    4940           4 :         options.f_build_time = "23:02:36";
    4941             : 
    4942           8 :         CATCH_WHEN("Testing --version")
    4943             :         {
    4944           1 :             char const * cargv[] =
    4945             :             {
    4946             :                 "tests/system-arguments",
    4947             :                 "--version",
    4948             :                 nullptr
    4949             :             };
    4950           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    4951           1 :             char ** argv = const_cast<char **>(cargv);
    4952             : 
    4953             :             // do our own try/catch because we want to test the message
    4954             :             // and exit code of the exception and it's easier to do it
    4955             :             // this way
    4956             :             //
    4957           2 :             snapdev::ostream_to_buf<char> out(std::cout);
    4958             :             try
    4959             :             {
    4960           1 :                 advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
    4961             : 
    4962             :                 // if it returns opt cannot be nullptr
    4963             :                 //
    4964           0 :                 CATCH_REQUIRE(opt == nullptr);
    4965             :             }
    4966           2 :             catch(advgetopt::getopt_exit const & e)
    4967             :             {
    4968             :                 // this is the expected route
    4969             :                 //
    4970           1 :                 CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
    4971           1 :                 CATCH_REQUIRE(e.code() == 0);
    4972           1 :                 CATCH_REQUIRE(out.str() == "2.0.1\n");
    4973             :             }
    4974           0 :             catch(std::exception const & e)
    4975             :             {
    4976             :                 // no other exception is considered valid here
    4977             :                 //
    4978           0 :                 CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
    4979             :             }
    4980             :         }
    4981             : 
    4982           8 :         CATCH_WHEN("Testing --copyright")
    4983             :         {
    4984           1 :             char const * cargv[] =
    4985             :             {
    4986             :                 "tests/system-arguments",
    4987             :                 "--copyright",
    4988             :                 nullptr
    4989             :             };
    4990           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    4991           1 :             char ** argv = const_cast<char **>(cargv);
    4992             : 
    4993             :             // do our own try/catch because we want to test the message
    4994             :             // and exit code of the exception and it's easier to do it
    4995             :             // this way
    4996             :             //
    4997           2 :             snapdev::ostream_to_buf<char> out(std::cout);
    4998             :             try
    4999             :             {
    5000           1 :                 advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
    5001             : 
    5002             :                 // if it returns opt cannot be nullptr
    5003             :                 //
    5004           0 :                 CATCH_REQUIRE(opt == nullptr);
    5005             :             }
    5006           2 :             catch(advgetopt::getopt_exit const & e)
    5007             :             {
    5008             :                 // this is the expected route
    5009             :                 //
    5010           1 :                 CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
    5011           1 :                 CATCH_REQUIRE(e.code() == 0);
    5012           1 :                 CATCH_REQUIRE(out.str() == "Copyright (c) 2019  Made to Order Software Corp. -- All Rights Reserved\n");
    5013             :             }
    5014           0 :             catch(std::exception const & e)
    5015             :             {
    5016             :                 // no other exception is considered valid here
    5017             :                 //
    5018           0 :                 CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
    5019             :             }
    5020             :         }
    5021             : 
    5022           8 :         CATCH_WHEN("Testing --build-date")
    5023             :         {
    5024           1 :             char const * cargv[] =
    5025             :             {
    5026             :                 "tests/system-arguments",
    5027             :                 "--build-date",
    5028             :                 nullptr
    5029             :             };
    5030           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    5031           1 :             char ** argv = const_cast<char **>(cargv);
    5032             : 
    5033             :             // do our own try/catch because we want to test the message
    5034             :             // and exit code of the exception and it's easier to do it
    5035             :             // this way
    5036             :             //
    5037           2 :             snapdev::ostream_to_buf<char> out(std::cout);
    5038             :             try
    5039             :             {
    5040           1 :                 advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
    5041             : 
    5042             :                 // if it returns opt cannot be nullptr
    5043             :                 //
    5044           0 :                 CATCH_REQUIRE(opt == nullptr);
    5045             :             }
    5046           2 :             catch(advgetopt::getopt_exit const & e)
    5047             :             {
    5048             :                 // this is the expected route
    5049             :                 //
    5050           1 :                 CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
    5051           1 :                 CATCH_REQUIRE(e.code() == 0);
    5052           1 :                 CATCH_REQUIRE(out.str() == "Built on Jun  4 2019 at 23:02:36\n");
    5053             :             }
    5054           0 :             catch(std::exception const & e)
    5055             :             {
    5056             :                 // no other exception is considered valid here
    5057             :                 //
    5058           0 :                 CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
    5059             :             }
    5060             :         }
    5061             : 
    5062           8 :         CATCH_WHEN("Testing -L (For --license)")
    5063             :         {
    5064           1 :             char const * cargv[] =
    5065             :             {
    5066             :                 "tests/system-arguments",
    5067             :                 "-L",
    5068             :                 nullptr
    5069             :             };
    5070           1 :             int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    5071           1 :             char ** argv = const_cast<char **>(cargv);
    5072             : 
    5073             :             // do our own try/catch because we want to test the message
    5074             :             // and exit code of the exception and it's easier to do it
    5075             :             // this way
    5076             :             //
    5077           2 :             snapdev::ostream_to_buf<char> out(std::cout);
    5078             :             try
    5079             :             {
    5080           1 :                 advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
    5081             : 
    5082             :                 // if it returns opt cannot be nullptr
    5083             :                 //
    5084           0 :                 CATCH_REQUIRE(opt == nullptr);
    5085             :             }
    5086           2 :             catch(advgetopt::getopt_exit const & e)
    5087             :             {
    5088             :                 // this is the expected route
    5089             :                 //
    5090           1 :                 CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
    5091           1 :                 CATCH_REQUIRE(e.code() == 0);
    5092           1 :                 CATCH_REQUIRE(out.str() == "MIT\n");
    5093             :             }
    5094           0 :             catch(std::exception const & e)
    5095             :             {
    5096             :                 // no other exception is considered valid here
    5097             :                 //
    5098           0 :                 CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
    5099             :             }
    5100             :         }
    5101             :     }
    5102             :     CATCH_END_SECTION()
    5103           4 : }
    5104             : 
    5105             : 
    5106           5 : CATCH_TEST_CASE("check_print_option", "[arguments][valid][getopt]")
    5107             : {
    5108           6 :     CATCH_START_SECTION("Testing --print-option with a defined parameter")
    5109             :     {
    5110           1 :         advgetopt::option const options[] =
    5111             :         {
    5112             :             advgetopt::define_option(
    5113             :                   advgetopt::Name("color")
    5114             :                 , advgetopt::ShortName('c')
    5115             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    5116             :                 , advgetopt::Help("set color.")
    5117             :             ),
    5118             :             advgetopt::end_options()
    5119             :         };
    5120             : 
    5121           1 :         advgetopt::options_environment environment_options;
    5122           1 :         environment_options.f_project_name = "unittest";
    5123           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
    5124           1 :         environment_options.f_help_header = "Usage: testing system arguments.";
    5125           1 :         environment_options.f_options = options;
    5126           1 :         environment_options.f_version = "2.0.1";
    5127           1 :         environment_options.f_license = "MIT";
    5128           1 :         environment_options.f_copyright = "Copyright (c) 2019  Made to Order Software Corp. -- All Rights Reserved";
    5129           1 :         environment_options.f_build_date = "Jun  4 2019";
    5130           1 :         environment_options.f_build_time = "23:02:36";
    5131             : 
    5132           1 :         char const * cargv[] =
    5133             :         {
    5134             :             "tests/system-arguments",
    5135             :             "--color",
    5136             :             "fushia",
    5137             :             "--print-option",
    5138             :             "color",
    5139             :             nullptr
    5140             :         };
    5141           1 :         int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    5142           1 :         char ** argv = const_cast<char **>(cargv);
    5143             : 
    5144             :         // do our own try/catch because we want to test the message
    5145             :         // and exit code of the exception and it's easier to do it
    5146             :         // this way
    5147             :         //
    5148           2 :         snapdev::ostream_to_buf<char> out(std::cout);
    5149             :         try
    5150             :         {
    5151           1 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    5152             : 
    5153             :             // if it returns opt cannot be nullptr
    5154             :             //
    5155           0 :             CATCH_REQUIRE(opt == nullptr);
    5156             :         }
    5157           2 :         catch(advgetopt::getopt_exit const & e)
    5158             :         {
    5159             :             // this is the expected route
    5160             :             //
    5161           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
    5162           1 :             CATCH_REQUIRE(e.code() == 0);
    5163           1 :             CATCH_REQUIRE(out.str() == "fushia\n");
    5164             :         }
    5165           0 :         catch(std::exception const & e)
    5166             :         {
    5167             :             // no other exception is considered valid here
    5168             :             //
    5169           0 :             CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
    5170             :         }
    5171             :     }
    5172             :     CATCH_END_SECTION()
    5173             : 
    5174           6 :     CATCH_START_SECTION("Testing --print-option with an undefined parameter but a default")
    5175             :     {
    5176           1 :         advgetopt::option const options[] =
    5177             :         {
    5178             :             advgetopt::define_option(
    5179             :                   advgetopt::Name("color")
    5180             :                 , advgetopt::ShortName('c')
    5181             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    5182             :                 , advgetopt::DefaultValue("maroon")
    5183             :                 , advgetopt::Help("set color.")
    5184             :             ),
    5185             :             advgetopt::end_options()
    5186             :         };
    5187             : 
    5188           1 :         advgetopt::options_environment environment_options;
    5189           1 :         environment_options.f_project_name = "unittest";
    5190           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
    5191           1 :         environment_options.f_help_header = "Usage: testing system arguments.";
    5192           1 :         environment_options.f_options = options;
    5193           1 :         environment_options.f_version = "2.0.1";
    5194           1 :         environment_options.f_license = "MIT";
    5195           1 :         environment_options.f_copyright = "Copyright (c) 2019  Made to Order Software Corp. -- All Rights Reserved";
    5196           1 :         environment_options.f_build_date = "Jun  4 2019";
    5197           1 :         environment_options.f_build_time = "23:02:36";
    5198             : 
    5199           1 :         char const * cargv[] =
    5200             :         {
    5201             :             "tests/system-arguments",
    5202             :             "--print-option",
    5203             :             "color",
    5204             :             nullptr
    5205             :         };
    5206           1 :         int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    5207           1 :         char ** argv = const_cast<char **>(cargv);
    5208             : 
    5209             :         // do our own try/catch because we want to test the message
    5210             :         // and exit code of the exception and it's easier to do it
    5211             :         // this way
    5212             :         //
    5213           2 :         snapdev::ostream_to_buf<char> out(std::cout);
    5214             :         try
    5215             :         {
    5216           1 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    5217             : 
    5218             :             // if it returns opt cannot be nullptr
    5219             :             //
    5220           0 :             CATCH_REQUIRE(opt == nullptr);
    5221             :         }
    5222           2 :         catch(advgetopt::getopt_exit const & e)
    5223             :         {
    5224             :             // this is the expected route
    5225             :             //
    5226           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
    5227           1 :             CATCH_REQUIRE(e.code() == 0);
    5228           1 :             CATCH_REQUIRE(out.str() == "maroon\n");
    5229             :         }
    5230           0 :         catch(std::exception const & e)
    5231             :         {
    5232             :             // no other exception is considered valid here
    5233             :             //
    5234           0 :             CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
    5235             :         }
    5236             :     }
    5237             :     CATCH_END_SECTION()
    5238             : 
    5239           6 :     CATCH_START_SECTION("Testing --print-option with an undefined parameter and no default")
    5240             :     {
    5241           1 :         advgetopt::option const options[] =
    5242             :         {
    5243             :             advgetopt::define_option(
    5244             :                   advgetopt::Name("color")
    5245             :                 , advgetopt::ShortName('c')
    5246             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    5247             :                 , advgetopt::Help("set color.")
    5248             :             ),
    5249             :             advgetopt::end_options()
    5250             :         };
    5251             : 
    5252           1 :         advgetopt::options_environment environment_options;
    5253           1 :         environment_options.f_project_name = "unittest";
    5254           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
    5255           1 :         environment_options.f_help_header = "Usage: testing system arguments.";
    5256           1 :         environment_options.f_options = options;
    5257           1 :         environment_options.f_version = "2.0.1";
    5258           1 :         environment_options.f_license = "MIT";
    5259           1 :         environment_options.f_copyright = "Copyright (c) 2019  Made to Order Software Corp. -- All Rights Reserved";
    5260           1 :         environment_options.f_build_date = "Jun  4 2019";
    5261           1 :         environment_options.f_build_time = "23:02:36";
    5262             : 
    5263           1 :         char const * cargv[] =
    5264             :         {
    5265             :             "tests/system-arguments",
    5266             :             "--print-option",
    5267             :             "color",
    5268             :             nullptr
    5269             :         };
    5270           1 :         int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    5271           1 :         char ** argv = const_cast<char **>(cargv);
    5272             : 
    5273             :         // do our own try/catch because we want to test the message
    5274             :         // and exit code of the exception and it's easier to do it
    5275             :         // this way
    5276             :         //
    5277           2 :         snapdev::ostream_to_buf<char> out(std::cout);
    5278             :         try
    5279             :         {
    5280           1 :             advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
    5281             : 
    5282             :             // if it returns opt cannot be nullptr
    5283             :             //
    5284           0 :             CATCH_REQUIRE(opt == nullptr);
    5285             :         }
    5286           2 :         catch(advgetopt::getopt_exit const & e)
    5287             :         {
    5288             :             // this is the expected route
    5289             :             //
    5290           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
    5291           1 :             CATCH_REQUIRE(e.code() == 0);
    5292           1 :             CATCH_REQUIRE(out.str() == "");
    5293             :         }
    5294           0 :         catch(std::exception const & e)
    5295             :         {
    5296             :             // no other exception is considered valid here
    5297             :             //
    5298           0 :             CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
    5299             :         }
    5300             :     }
    5301             :     CATCH_END_SECTION()
    5302           3 : }
    5303             : 
    5304             : 
    5305           3 : CATCH_TEST_CASE("invalid_getopt_pointers", "[invalid][getopt][arguments]")
    5306             : {
    5307           2 :     CATCH_START_SECTION("Create getopt with argv set to nullptr.")
    5308             :     {
    5309           1 :         advgetopt::options_environment const environment_opt;
    5310             : 
    5311           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    5312             :                   std::make_shared<advgetopt::getopt>(environment_opt, 3, nullptr)
    5313             :                 , advgetopt::getopt_logic_error
    5314             :                 , Catch::Matchers::ExceptionMessage(
    5315             :                     "getopt_logic_error: argv pointer cannot be nullptr"));
    5316             :     }
    5317             :     CATCH_END_SECTION()
    5318           1 : }
    5319             : 
    5320             : 
    5321           4 : CATCH_TEST_CASE("invalid_getopt_missing_options", "[invalid][getopt][arguments]")
    5322             : {
    5323           4 :     CATCH_START_SECTION("Create getopt with no options.")
    5324             :     {
    5325           1 :         advgetopt::options_environment options_empty;
    5326           1 :         options_empty.f_project_name = "unittest";
    5327           1 :         options_empty.f_options = nullptr;
    5328           1 :         options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
    5329             : 
    5330           1 :         char const * cargv[] =
    5331             :         {
    5332             :             "/usr/bin/arguments",
    5333             :             "--no-options",
    5334             :             nullptr
    5335             :         };
    5336           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5337           1 :         char ** argv = const_cast<char **>(cargv);
    5338             : 
    5339           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    5340             :                   std::make_shared<advgetopt::getopt>(options_empty, argc, argv)
    5341             :                 , advgetopt::getopt_logic_error
    5342             :                 , Catch::Matchers::ExceptionMessage(
    5343             :                     "getopt_logic_error: an empty list of options is not legal, you must"
    5344             :                     " defined at least one (i.e. --version, --help...)"));
    5345             :     }
    5346             :     CATCH_END_SECTION()
    5347             : 
    5348           4 :     CATCH_START_SECTION("Create getopt with an empty list of options.")
    5349             :     {
    5350           1 :         const advgetopt::option options_empty_list[] =
    5351             :         {
    5352             :             {
    5353             :                 '\0',
    5354             :                 advgetopt::GETOPT_FLAG_END,
    5355             :                 nullptr,
    5356             :                 nullptr,
    5357             :                 nullptr,
    5358             :                 nullptr
    5359             :             }
    5360             :         };
    5361             : 
    5362           1 :         advgetopt::options_environment options_empty;
    5363           1 :         options_empty.f_project_name = "unittest";
    5364           1 :         options_empty.f_options = options_empty_list;
    5365           1 :         options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
    5366             : 
    5367           1 :         char const * cargv[] =
    5368             :         {
    5369             :             "/usr/bin/arguments",
    5370             :             "--no-options",
    5371             :             nullptr
    5372             :         };
    5373           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5374           1 :         char ** argv = const_cast<char **>(cargv);
    5375             : 
    5376           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    5377             :                   std::make_shared<advgetopt::getopt>(options_empty, argc, argv)
    5378             :                 , advgetopt::getopt_logic_error
    5379             :                 , Catch::Matchers::ExceptionMessage(
    5380             :                     "getopt_logic_error: an empty list of options is not legal, you must"
    5381             :                     " defined at least one (i.e. --version, --help...)"));
    5382             :     }
    5383             :     CATCH_END_SECTION()
    5384           2 : }
    5385             : 
    5386             : 
    5387           6 : CATCH_TEST_CASE("invalid_getopt_missing_required_option", "[invalid][getopt][arguments][alias]")
    5388             : {
    5389           8 :     CATCH_START_SECTION("Specify the option without a corresponding parameter.")
    5390             :     {
    5391           1 :         const advgetopt::option options[] =
    5392             :         {
    5393             :             advgetopt::define_option(
    5394             :                   advgetopt::Name("verbose")
    5395             :                 , advgetopt::ShortName('v')
    5396             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5397             :                 , advgetopt::Help("print info as we work.")
    5398             :             ),
    5399             :             advgetopt::define_option(
    5400             :                   advgetopt::Name("size")
    5401             :                 , advgetopt::Help("The size of the line.")
    5402             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    5403             :                 , advgetopt::DefaultValue("100")
    5404             :             ),
    5405             :             advgetopt::end_options()
    5406             :         };
    5407             : 
    5408           1 :         advgetopt::options_environment environment_options;
    5409           1 :         environment_options.f_project_name = "unittest";
    5410           1 :         environment_options.f_options = options;
    5411           1 :         environment_options.f_help_header = "Usage: use --size without a value.";
    5412             : 
    5413           1 :         char const * cargv[] =
    5414             :         {
    5415             :             "/usr/bin/arguments",
    5416             :             "--verbose",
    5417             :             "--size",
    5418             :             nullptr
    5419             :         };
    5420           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5421           1 :         char ** argv = const_cast<char **>(cargv);
    5422             : 
    5423           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
    5424           2 :         advgetopt::getopt opt(environment_options);
    5425             :         try
    5426             :         {
    5427           1 :             opt.finish_parsing(argc, argv);
    5428           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5429             :         }
    5430           2 :         catch(advgetopt::getopt_exit const & e)
    5431             :         {
    5432           1 :             CATCH_REQUIRE(e.code() == 1);
    5433           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5434             :         }
    5435           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5436             : 
    5437             :         // check that the result is valid
    5438             : 
    5439             :         // an "invalid-parameter", MUST NOT EXIST
    5440           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5441           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5442           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    5443           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    5444           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    5445             : 
    5446             :         // no default
    5447           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    5448           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    5449           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    5450           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    5451             : 
    5452             :         // the valid parameter
    5453           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    5454           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    5455           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    5456           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    5457           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    5458             : 
    5459             :         // the invalid parameter
    5460           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    5461           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    5462           1 :         CATCH_REQUIRE(opt.get_default("size") == "100");
    5463           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    5464             : 
    5465             :         // other parameters
    5466           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    5467           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    5468             :     }
    5469             :     CATCH_END_SECTION()
    5470             : 
    5471           8 :     CATCH_START_SECTION("Specify the option with an equal sign but without a corresponding parameter.")
    5472             :     {
    5473           1 :         const advgetopt::option options[] =
    5474             :         {
    5475             :             advgetopt::define_option(
    5476             :                   advgetopt::Name("verbose")
    5477             :                 , advgetopt::ShortName('v')
    5478             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5479             :                 , advgetopt::Help("print info as we work.")
    5480             :             ),
    5481             :             advgetopt::define_option(
    5482             :                   advgetopt::Name("size")
    5483             :                 , advgetopt::Help("The size of the line.")
    5484             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    5485             :                 , advgetopt::DefaultValue("100")
    5486             :             ),
    5487             :             advgetopt::end_options()
    5488             :         };
    5489             : 
    5490           1 :         advgetopt::options_environment environment_options;
    5491           1 :         environment_options.f_project_name = "unittest";
    5492           1 :         environment_options.f_options = options;
    5493           1 :         environment_options.f_help_header = "Usage: use --size without a value.";
    5494             : 
    5495           1 :         char const * cargv[] =
    5496             :         {
    5497             :             "/usr/bin/arguments",
    5498             :             "--verbose",
    5499             :             "--size=",
    5500             :             nullptr
    5501             :         };
    5502           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5503           1 :         char ** argv = const_cast<char **>(cargv);
    5504             : 
    5505           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size must be given a value.");
    5506           2 :         advgetopt::getopt opt(environment_options);
    5507             :         try
    5508             :         {
    5509           1 :             opt.finish_parsing(argc, argv);
    5510           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5511             :         }
    5512           2 :         catch(advgetopt::getopt_exit const & e)
    5513             :         {
    5514           1 :             CATCH_REQUIRE(e.code() == 1);
    5515           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5516             :         }
    5517           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5518             : 
    5519             :         // check that the result is valid
    5520             : 
    5521             :         // an invalid parameter, MUST NOT EXIST
    5522           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5523           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5524           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    5525           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    5526           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    5527             : 
    5528             :         // no default
    5529           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    5530           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    5531           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    5532           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    5533             : 
    5534             :         // the valid parameter
    5535           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    5536           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    5537           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    5538           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    5539           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    5540             : 
    5541             :         // the invalid parameter
    5542           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    5543           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    5544           1 :         CATCH_REQUIRE(opt.get_default("size") == "100");
    5545           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    5546             : 
    5547             :         // other parameters
    5548           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    5549           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    5550             :     }
    5551             :     CATCH_END_SECTION()
    5552             : 
    5553           8 :     CATCH_START_SECTION("Specify the option without a corresponding parameter followed by a long argument.")
    5554             :     {
    5555           1 :         const advgetopt::option options[] =
    5556             :         {
    5557             :             advgetopt::define_option(
    5558             :                   advgetopt::Name("verbose")
    5559             :                 , advgetopt::ShortName('v')
    5560             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5561             :                 , advgetopt::Help("print info as we work.")
    5562             :             ),
    5563             :             advgetopt::define_option(
    5564             :                   advgetopt::Name("size")
    5565             :                 , advgetopt::Help("The size of the line.")
    5566             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    5567             :                 , advgetopt::DefaultValue("100")
    5568             :             ),
    5569             :             advgetopt::end_options()
    5570             :         };
    5571             : 
    5572           1 :         advgetopt::options_environment environment_options;
    5573           1 :         environment_options.f_project_name = "unittest";
    5574           1 :         environment_options.f_options = options;
    5575           1 :         environment_options.f_help_header = "Usage: use --size without a value.";
    5576             : 
    5577           1 :         char const * cargv[] =
    5578             :         {
    5579             :             "/usr/bin/arguments",
    5580             :             "--size",
    5581             :             "--verbose",
    5582             :             nullptr
    5583             :         };
    5584           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5585           1 :         char ** argv = const_cast<char **>(cargv);
    5586             : 
    5587           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
    5588           2 :         advgetopt::getopt opt(environment_options);
    5589             :         try
    5590             :         {
    5591           1 :             opt.finish_parsing(argc, argv);
    5592           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5593             :         }
    5594           2 :         catch(advgetopt::getopt_exit const & e)
    5595             :         {
    5596           1 :             CATCH_REQUIRE(e.code() == 1);
    5597           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5598             :         }
    5599           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5600             : 
    5601             :         // check that the result is valid
    5602             : 
    5603             :         // an invalid parameter, MUST NOT EXIST
    5604           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5605           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5606           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    5607           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    5608           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    5609             : 
    5610             :         // no default
    5611           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    5612           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    5613           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    5614           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    5615             : 
    5616             :         // the valid parameter
    5617           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    5618           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    5619           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    5620           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    5621           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    5622             : 
    5623             :         // the invalid parameter
    5624           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    5625           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    5626           1 :         CATCH_REQUIRE(opt.get_default("size") == "100");
    5627           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    5628             : 
    5629             :         // other parameters
    5630           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    5631           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    5632             :     }
    5633             :     CATCH_END_SECTION()
    5634             : 
    5635           8 :     CATCH_START_SECTION("Specify the option without a corresponding parameter followed by a short argument.")
    5636             :     {
    5637           1 :         const advgetopt::option options[] =
    5638             :         {
    5639             :             advgetopt::define_option(
    5640             :                   advgetopt::Name("verbose")
    5641             :                 , advgetopt::ShortName('v')
    5642             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5643             :                 , advgetopt::Help("print info as we work.")
    5644             :             ),
    5645             :             advgetopt::define_option(
    5646             :                   advgetopt::Name("size")
    5647             :                 , advgetopt::Help("The size of the line.")
    5648             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    5649             :                 , advgetopt::DefaultValue("100")
    5650             :             ),
    5651             :             advgetopt::end_options()
    5652             :         };
    5653             : 
    5654           1 :         advgetopt::options_environment environment_options;
    5655           1 :         environment_options.f_project_name = "unittest";
    5656           1 :         environment_options.f_options = options;
    5657           1 :         environment_options.f_help_header = "Usage: use --size without a value.";
    5658             : 
    5659           1 :         char const * cargv[] =
    5660             :         {
    5661             :             "/usr/bin/arguments",
    5662             :             "--size",
    5663             :             "-v",
    5664             :             nullptr
    5665             :         };
    5666           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5667           1 :         char ** argv = const_cast<char **>(cargv);
    5668             : 
    5669           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
    5670           2 :         advgetopt::getopt opt(environment_options);
    5671             :         try
    5672             :         {
    5673           1 :             opt.finish_parsing(argc, argv);
    5674           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5675             :         }
    5676           2 :         catch(advgetopt::getopt_exit const & e)
    5677             :         {
    5678           1 :             CATCH_REQUIRE(e.code() == 1);
    5679           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5680             :         }
    5681           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5682             : 
    5683             :         // check that the result is valid
    5684             : 
    5685             :         // an invalid parameter, MUST NOT EXIST
    5686           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5687           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5688           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    5689           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    5690           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    5691             : 
    5692             :         // no default
    5693           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    5694           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    5695           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    5696           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    5697             : 
    5698             :         // the valid parameter
    5699           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    5700           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    5701           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    5702           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    5703           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    5704             : 
    5705             :         // the invalid parameter
    5706           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    5707           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    5708           1 :         CATCH_REQUIRE(opt.get_default("size") == "100");
    5709           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    5710             : 
    5711             :         // other parameters
    5712           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    5713           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    5714             :     }
    5715             :     CATCH_END_SECTION()
    5716           4 : }
    5717             : 
    5718             : 
    5719          11 : CATCH_TEST_CASE("invalid_default_options", "[invalid][getopt][arguments]")
    5720             : {
    5721          18 :     CATCH_START_SECTION("Using a standalone 'file.txt' when no default option is allowed.")
    5722             :     {
    5723           1 :         const advgetopt::option options[] =
    5724             :         {
    5725             :             advgetopt::define_option(
    5726             :                   advgetopt::Name("verbose")
    5727             :                 , advgetopt::ShortName('v')
    5728             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5729             :                 , advgetopt::Help("print info as we work.")
    5730             :             ),
    5731             :             advgetopt::end_options()
    5732             :         };
    5733             : 
    5734           1 :         advgetopt::options_environment environment_options;
    5735           1 :         environment_options.f_project_name = "unittest";
    5736           1 :         environment_options.f_options = options;
    5737           1 :         environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
    5738             : 
    5739           1 :         char const * cargv[] =
    5740             :         {
    5741             :             "/usr/bin/arguments",
    5742             :             "--verbose",
    5743             :             "file.txt",
    5744             :             nullptr
    5745             :         };
    5746           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5747           1 :         char ** argv = const_cast<char **>(cargv);
    5748             : 
    5749           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"file.txt\"; standalone parameters are not accepted by this program.");
    5750           2 :         advgetopt::getopt opt(environment_options);
    5751             :         try
    5752             :         {
    5753           1 :             opt.finish_parsing(argc, argv);
    5754           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5755             :         }
    5756           2 :         catch(advgetopt::getopt_exit const & e)
    5757             :         {
    5758           1 :             CATCH_REQUIRE(e.code() == 1);
    5759           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5760             :         }
    5761           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5762             : 
    5763             :         // check that the result is valid
    5764             : 
    5765             :         // an invalid parameter, MUST NOT EXIST
    5766           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5767           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5768           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    5769           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    5770           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    5771             : 
    5772             :         // no default
    5773           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    5774           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    5775           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    5776           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    5777             : 
    5778             :         // the valid parameter
    5779           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    5780           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    5781           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    5782           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    5783           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    5784             : 
    5785             :         // other parameters
    5786           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    5787           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    5788             :     }
    5789             :     CATCH_END_SECTION()
    5790             : 
    5791          18 :     CATCH_START_SECTION("Using a standalone 'file.txt' on the command line when only allowed in a variable.")
    5792             :     {
    5793           1 :         const advgetopt::option options[] =
    5794             :         {
    5795             :             advgetopt::define_option(
    5796             :                   advgetopt::Name("verbose")
    5797             :                 , advgetopt::ShortName('v')
    5798             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5799             :                 , advgetopt::Help("print info as we work.")
    5800             :             ),
    5801             :             advgetopt::define_option(
    5802             :                   advgetopt::Name("--")
    5803             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    5804             :                 , advgetopt::Help("default option.")
    5805             :             ),
    5806             :             advgetopt::end_options()
    5807             :         };
    5808             : 
    5809           1 :         advgetopt::options_environment environment_options;
    5810           1 :         environment_options.f_project_name = "unittest";
    5811           1 :         environment_options.f_options = options;
    5812           1 :         environment_options.f_help_header = "Usage: use '--' on the command line when only allowed in the variable.";
    5813           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    5814             : 
    5815           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "allowed.jpg");
    5816             : 
    5817           1 :         char const * cargv[] =
    5818             :         {
    5819             :             "/usr/bin/arguments",
    5820             :             "--verbose",
    5821             :             "file.txt",
    5822             :             nullptr
    5823             :         };
    5824           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5825           1 :         char ** argv = const_cast<char **>(cargv);
    5826             : 
    5827           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported on the command line.");
    5828           2 :         advgetopt::getopt opt(environment_options);
    5829             :         try
    5830             :         {
    5831           1 :             opt.finish_parsing(argc, argv);
    5832           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5833             :         }
    5834           2 :         catch(advgetopt::getopt_exit const & e)
    5835             :         {
    5836           1 :             CATCH_REQUIRE(e.code() == 1);
    5837           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5838             :         }
    5839           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5840             : 
    5841             :         // check that the result is valid
    5842             : 
    5843             :         // an invalid parameter, MUST NOT EXIST
    5844           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5845           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5846           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    5847           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    5848           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    5849             : 
    5850             :         // default on command line passed through
    5851           1 :         CATCH_REQUIRE(opt.get_option("--") != nullptr);
    5852           1 :         CATCH_REQUIRE(opt.is_defined("--"));
    5853           1 :         CATCH_REQUIRE(opt.get_string("--") == "allowed.jpg");
    5854           1 :         CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.jpg");
    5855           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    5856           1 :         CATCH_REQUIRE(opt.size("--") == 1);
    5857             : 
    5858             :         // the valid parameter
    5859           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    5860           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    5861           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    5862           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    5863           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    5864             : 
    5865             :         // other parameters
    5866           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    5867           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    5868             :     }
    5869             :     CATCH_END_SECTION()
    5870             : 
    5871          18 :     CATCH_START_SECTION("Using a standalone 'file.txt' in a variable when only allowed on the command line.")
    5872             :     {
    5873           1 :         const advgetopt::option options[] =
    5874             :         {
    5875             :             advgetopt::define_option(
    5876             :                   advgetopt::Name("verbose")
    5877             :                 , advgetopt::ShortName('v')
    5878             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5879             :                 , advgetopt::Help("print info as we work.")
    5880             :             ),
    5881             :             advgetopt::define_option(
    5882             :                   advgetopt::Name("--")
    5883             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    5884             :                 , advgetopt::Help("default option.")
    5885             :             ),
    5886             :             advgetopt::end_options()
    5887             :         };
    5888             : 
    5889           1 :         advgetopt::options_environment environment_options;
    5890           1 :         environment_options.f_project_name = "unittest";
    5891           1 :         environment_options.f_options = options;
    5892           1 :         environment_options.f_help_header = "Usage: use '--' on the command line when only allowed in the variable.";
    5893           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    5894             : 
    5895           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "file.txt");
    5896             : 
    5897           1 :         char const * cargv[] =
    5898             :         {
    5899             :             "/usr/bin/arguments",
    5900             :             "--verbose",
    5901             :             "allowed.jpg",
    5902             :             nullptr
    5903             :         };
    5904           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5905           1 :         char ** argv = const_cast<char **>(cargv);
    5906             : 
    5907           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported in the environment variable.");
    5908           2 :         advgetopt::getopt opt(environment_options);
    5909             :         try
    5910             :         {
    5911           1 :             opt.finish_parsing(argc, argv);
    5912           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5913             :         }
    5914           2 :         catch(advgetopt::getopt_exit const & e)
    5915             :         {
    5916           1 :             CATCH_REQUIRE(e.code() == 1);
    5917           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5918             :         }
    5919           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5920             : 
    5921             :         // check that the result is valid
    5922             : 
    5923             :         // an invalid parameter, MUST NOT EXIST
    5924           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5925           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5926           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    5927           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    5928           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    5929             : 
    5930             :         // default on command line passed through
    5931           1 :         CATCH_REQUIRE(opt.get_option("--") != nullptr);
    5932           1 :         CATCH_REQUIRE(opt.is_defined("--"));
    5933           1 :         CATCH_REQUIRE(opt.get_string("--") == "allowed.jpg");
    5934           1 :         CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.jpg");
    5935           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    5936           1 :         CATCH_REQUIRE(opt.size("--") == 1);
    5937             : 
    5938             :         // the valid parameter
    5939           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    5940           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    5941           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    5942           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    5943           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    5944             : 
    5945             :         // other parameters
    5946           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    5947           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    5948             :     }
    5949             :     CATCH_END_SECTION()
    5950             : 
    5951          18 :     CATCH_START_SECTION("Using a '--' when no default option is allowed.")
    5952             :     {
    5953           1 :         const advgetopt::option options[] =
    5954             :         {
    5955             :             advgetopt::define_option(
    5956             :                   advgetopt::Name("verbose")
    5957             :                 , advgetopt::ShortName('v')
    5958             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    5959             :                 , advgetopt::Help("print info as we work.")
    5960             :             ),
    5961             :             advgetopt::end_options()
    5962             :         };
    5963             : 
    5964           1 :         advgetopt::options_environment environment_options;
    5965           1 :         environment_options.f_project_name = "unittest";
    5966           1 :         environment_options.f_options = options;
    5967           1 :         environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
    5968             : 
    5969           1 :         char const * cargv[] =
    5970             :         {
    5971             :             "/usr/bin/arguments",
    5972             :             "--verbose",
    5973             :             "--",
    5974             :             "file.txt",
    5975             :             nullptr
    5976             :         };
    5977           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    5978           1 :         char ** argv = const_cast<char **>(cargv);
    5979             : 
    5980           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus \"--\" is not accepted by this program.");
    5981           2 :         advgetopt::getopt opt(environment_options);
    5982             :         try
    5983             :         {
    5984           1 :             opt.finish_parsing(argc, argv);
    5985           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    5986             :         }
    5987           2 :         catch(advgetopt::getopt_exit const & e)
    5988             :         {
    5989           1 :             CATCH_REQUIRE(e.code() == 1);
    5990           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    5991             :         }
    5992           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    5993             : 
    5994             :         // check that the result is valid
    5995             : 
    5996             :         // an invalid parameter, MUST NOT EXIST
    5997           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    5998           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    5999           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6000           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6001           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6002             : 
    6003             :         // no default
    6004           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    6005           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    6006           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    6007           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    6008             : 
    6009             :         // the valid parameter
    6010           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6011           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6012           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6013           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6014           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6015             : 
    6016             :         // other parameters
    6017           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6018           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6019             :     }
    6020             :     CATCH_END_SECTION()
    6021             : 
    6022          18 :     CATCH_START_SECTION("Using a '--' when on the command line when only accepted in variables.")
    6023             :     {
    6024           1 :         const advgetopt::option options[] =
    6025             :         {
    6026             :             advgetopt::define_option(
    6027             :                   advgetopt::Name("verbose")
    6028             :                 , advgetopt::ShortName('v')
    6029             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    6030             :                 , advgetopt::Help("print info as we work.")
    6031             :             ),
    6032             :             advgetopt::define_option(
    6033             :                   advgetopt::Name("--")
    6034             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    6035             :                 , advgetopt::Help("default option.")
    6036             :             ),
    6037             :             advgetopt::end_options()
    6038             :         };
    6039             : 
    6040           1 :         advgetopt::options_environment environment_options;
    6041           1 :         environment_options.f_project_name = "unittest";
    6042           1 :         environment_options.f_options = options;
    6043           1 :         environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
    6044           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6045             : 
    6046           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- allowed.txt");
    6047             : 
    6048           1 :         char const * cargv[] =
    6049             :         {
    6050             :             "/usr/bin/arguments",
    6051             :             "--verbose",
    6052             :             "--",
    6053             :             "file.txt",
    6054             :             nullptr
    6055             :         };
    6056           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6057           1 :         char ** argv = const_cast<char **>(cargv);
    6058             : 
    6059           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--\" is not supported on the command line.");
    6060           2 :         advgetopt::getopt opt(environment_options);
    6061             :         try
    6062             :         {
    6063           1 :             opt.finish_parsing(argc, argv);
    6064           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6065             :         }
    6066           2 :         catch(advgetopt::getopt_exit const & e)
    6067             :         {
    6068           1 :             CATCH_REQUIRE(e.code() == 1);
    6069           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6070             :         }
    6071           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6072             : 
    6073             :         // check that the result is valid
    6074             : 
    6075             :         // an invalid parameter, MUST NOT EXIST
    6076           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6077           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6078           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6079           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6080           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6081             : 
    6082             :         // no default
    6083           1 :         CATCH_REQUIRE(opt.get_option("--") != nullptr);
    6084           1 :         CATCH_REQUIRE(opt.is_defined("--"));
    6085           1 :         CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
    6086           1 :         CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
    6087           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    6088           1 :         CATCH_REQUIRE(opt.size("--") == 1);
    6089             : 
    6090             :         // the valid parameter
    6091           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6092           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6093           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6094           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6095           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6096             : 
    6097             :         // other parameters
    6098           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6099           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6100             :     }
    6101             :     CATCH_END_SECTION()
    6102             : 
    6103          18 :     CATCH_START_SECTION("Using a '--' in the environment variable when only accepted on the command line.")
    6104             :     {
    6105           1 :         const advgetopt::option options[] =
    6106             :         {
    6107             :             advgetopt::define_option(
    6108             :                   advgetopt::Name("verbose")
    6109             :                 , advgetopt::ShortName('v')
    6110             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    6111             :                 , advgetopt::Help("print info as we work.")
    6112             :             ),
    6113             :             advgetopt::define_option(
    6114             :                   advgetopt::Name("--")
    6115             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    6116             :                 , advgetopt::Help("default option.")
    6117             :             ),
    6118             :             advgetopt::end_options()
    6119             :         };
    6120             : 
    6121           1 :         advgetopt::options_environment environment_options;
    6122           1 :         environment_options.f_project_name = "unittest";
    6123           1 :         environment_options.f_options = options;
    6124           1 :         environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
    6125           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6126             : 
    6127           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", " -- file.txt ");
    6128             : 
    6129           1 :         char const * cargv[] =
    6130             :         {
    6131             :             "/usr/bin/arguments",
    6132             :             "--verbose",
    6133             :             "--",
    6134             :             "allowed.txt",
    6135             :             nullptr
    6136             :         };
    6137           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6138           1 :         char ** argv = const_cast<char **>(cargv);
    6139             : 
    6140           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--\" is not supported in the environment variable.");
    6141           2 :         advgetopt::getopt opt(environment_options);
    6142             :         try
    6143             :         {
    6144           1 :             opt.finish_parsing(argc, argv);
    6145           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6146             :         }
    6147           2 :         catch(advgetopt::getopt_exit const & e)
    6148             :         {
    6149           1 :             CATCH_REQUIRE(e.code() == 1);
    6150           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6151             :         }
    6152           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6153             : 
    6154             :         // check that the result is valid
    6155             : 
    6156             :         // an invalid parameter, MUST NOT EXIST
    6157           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6158           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6159           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6160           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6161           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6162             : 
    6163             :         // no default
    6164           1 :         CATCH_REQUIRE(opt.get_option("--") != nullptr);
    6165           1 :         CATCH_REQUIRE(opt.is_defined("--"));
    6166           1 :         CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
    6167           1 :         CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
    6168           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    6169           1 :         CATCH_REQUIRE(opt.size("--") == 1);
    6170             : 
    6171             :         // the valid parameter
    6172           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6173           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6174           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6175           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6176           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6177             : 
    6178             :         // other parameters
    6179           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6180           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6181             :     }
    6182             :     CATCH_END_SECTION()
    6183             : 
    6184          18 :     CATCH_START_SECTION("Using a '-' when no default option is allowed.")
    6185             :     {
    6186           1 :         const advgetopt::option options[] =
    6187             :         {
    6188             :             advgetopt::define_option(
    6189             :                   advgetopt::Name("verbose")
    6190             :                 , advgetopt::ShortName('v')
    6191             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    6192             :                 , advgetopt::Help("print info as we work.")
    6193             :             ),
    6194             :             advgetopt::end_options()
    6195             :         };
    6196             : 
    6197           1 :         advgetopt::options_environment environment_options;
    6198           1 :         environment_options.f_project_name = "unittest";
    6199           1 :         environment_options.f_options = options;
    6200           1 :         environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
    6201             : 
    6202           1 :         char const * cargv[] =
    6203             :         {
    6204             :             "/usr/bin/arguments",
    6205             :             "--verbose",
    6206             :             "-",
    6207             :             "file.txt",
    6208             :             nullptr
    6209             :         };
    6210           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6211           1 :         char ** argv = const_cast<char **>(cargv);
    6212             : 
    6213           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus \"-\" is not accepted by this program.");
    6214           2 :         advgetopt::getopt opt(environment_options);
    6215             :         try
    6216             :         {
    6217           1 :             opt.finish_parsing(argc, argv);
    6218           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6219             :         }
    6220           2 :         catch(advgetopt::getopt_exit const & e)
    6221             :         {
    6222           1 :             CATCH_REQUIRE(e.code() == 1);
    6223           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6224             :         }
    6225           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6226             : 
    6227             :         // check that the result is valid
    6228             : 
    6229             :         // an invalid parameter, MUST NOT EXIST
    6230           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6231           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6232           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6233           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6234           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6235             : 
    6236             :         // no default
    6237           1 :         CATCH_REQUIRE(opt.get_option("--") == nullptr);
    6238           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("--"));
    6239           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    6240           1 :         CATCH_REQUIRE(opt.size("--") == 0);
    6241             : 
    6242             :         // the valid parameter
    6243           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6244           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6245           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6246           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6247           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6248             : 
    6249             :         // other parameters
    6250           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6251           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6252             :     }
    6253             :     CATCH_END_SECTION()
    6254             : 
    6255          18 :     CATCH_START_SECTION("Using a '-' when on the command line when only accepted in variables.")
    6256             :     {
    6257           1 :         const advgetopt::option options[] =
    6258             :         {
    6259             :             advgetopt::define_option(
    6260             :                   advgetopt::Name("verbose")
    6261             :                 , advgetopt::ShortName('v')
    6262             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    6263             :                 , advgetopt::Help("print info as we work.")
    6264             :             ),
    6265             :             advgetopt::define_option(
    6266             :                   advgetopt::Name("--")
    6267             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    6268             :                 , advgetopt::Help("default option.")
    6269             :             ),
    6270             :             advgetopt::end_options()
    6271             :         };
    6272             : 
    6273           1 :         advgetopt::options_environment environment_options;
    6274           1 :         environment_options.f_project_name = "unittest";
    6275           1 :         environment_options.f_options = options;
    6276           1 :         environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
    6277           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6278             : 
    6279           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "- allowed.txt");
    6280             : 
    6281           1 :         char const * cargv[] =
    6282             :         {
    6283             :             "/usr/bin/arguments",
    6284             :             "--verbose",
    6285             :             "-",
    6286             :             "file.txt",
    6287             :             nullptr
    6288             :         };
    6289           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6290           1 :         char ** argv = const_cast<char **>(cargv);
    6291             : 
    6292           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-\" is not supported on the command line.");
    6293           2 :         advgetopt::getopt opt(environment_options);
    6294             :         try
    6295             :         {
    6296           1 :             opt.finish_parsing(argc, argv);
    6297           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6298             :         }
    6299           2 :         catch(advgetopt::getopt_exit const & e)
    6300             :         {
    6301           1 :             CATCH_REQUIRE(e.code() == 1);
    6302           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6303             :         }
    6304           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6305             : 
    6306             :         // check that the result is valid
    6307             : 
    6308             :         // an invalid parameter, MUST NOT EXIST
    6309           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6310           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6311           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6312           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6313           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6314             : 
    6315             :         // no default
    6316           1 :         CATCH_REQUIRE(opt.get_option("--") != nullptr);
    6317           1 :         CATCH_REQUIRE(opt.is_defined("--"));
    6318           1 :         CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
    6319           1 :         CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
    6320           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    6321           1 :         CATCH_REQUIRE(opt.size("--") == 1);
    6322             : 
    6323             :         // the valid parameter
    6324           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6325           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6326           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6327           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6328           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6329             : 
    6330             :         // other parameters
    6331           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6332           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6333             :     }
    6334             :     CATCH_END_SECTION()
    6335             : 
    6336          18 :     CATCH_START_SECTION("Using a '-' in the environment variable when only accepted on the command line.")
    6337             :     {
    6338           1 :         const advgetopt::option options[] =
    6339             :         {
    6340             :             advgetopt::define_option(
    6341             :                   advgetopt::Name("verbose")
    6342             :                 , advgetopt::ShortName('v')
    6343             :                 , advgetopt::Flags(advgetopt::standalone_command_flags())
    6344             :                 , advgetopt::Help("print info as we work.")
    6345             :             ),
    6346             :             advgetopt::define_option(
    6347             :                   advgetopt::Name("--")
    6348             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
    6349             :                 , advgetopt::Help("default option.")
    6350             :             ),
    6351             :             advgetopt::end_options()
    6352             :         };
    6353             : 
    6354           1 :         advgetopt::options_environment environment_options;
    6355           1 :         environment_options.f_project_name = "unittest";
    6356           1 :         environment_options.f_options = options;
    6357           1 :         environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
    6358           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6359             : 
    6360           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", " -  file.txt ");
    6361             : 
    6362           1 :         char const * cargv[] =
    6363             :         {
    6364             :             "/usr/bin/arguments",
    6365             :             "--verbose",
    6366             :             "-",
    6367             :             "allowed.txt",
    6368             :             nullptr
    6369             :         };
    6370           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6371           1 :         char ** argv = const_cast<char **>(cargv);
    6372             : 
    6373           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-\" is not supported in the environment variable.");
    6374           2 :         advgetopt::getopt opt(environment_options);
    6375             :         try
    6376             :         {
    6377           1 :             opt.finish_parsing(argc, argv);
    6378           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6379             :         }
    6380           2 :         catch(advgetopt::getopt_exit const & e)
    6381             :         {
    6382           1 :             CATCH_REQUIRE(e.code() == 1);
    6383           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6384             :         }
    6385           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6386             : 
    6387             :         // check that the result is valid
    6388             : 
    6389             :         // an invalid parameter, MUST NOT EXIST
    6390           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6391           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6392           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6393           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6394           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6395             : 
    6396             :         // no default
    6397           1 :         CATCH_REQUIRE(opt.get_option("--") != nullptr);
    6398           1 :         CATCH_REQUIRE(opt.is_defined("--"));
    6399           1 :         CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
    6400           1 :         CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
    6401           1 :         CATCH_REQUIRE(opt.get_default("--").empty());
    6402           1 :         CATCH_REQUIRE(opt.size("--") == 1);
    6403             : 
    6404             :         // the valid parameter
    6405           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6406           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6407           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6408           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6409           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6410             : 
    6411             :         // other parameters
    6412           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6413           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6414             :     }
    6415             :     CATCH_END_SECTION()
    6416           9 : }
    6417             : 
    6418             : 
    6419           9 : CATCH_TEST_CASE("invalid_options", "[invalid][getopt][arguments]")
    6420             : {
    6421          14 :     CATCH_START_SECTION("Long option with an equal sign but not name.")
    6422             :     {
    6423           1 :         const advgetopt::option options[] =
    6424             :         {
    6425             :             advgetopt::define_option(
    6426             :                   advgetopt::Name("size")
    6427             :                 , advgetopt::ShortName('s')
    6428             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    6429             :                 , advgetopt::Help("define the size.")
    6430             :             ),
    6431             :             advgetopt::end_options()
    6432             :         };
    6433             : 
    6434           1 :         advgetopt::options_environment environment_options;
    6435           1 :         environment_options.f_project_name = "unittest";
    6436           1 :         environment_options.f_options = options;
    6437           1 :         environment_options.f_help_header = "Usage: use a long name option without the long name.";
    6438             : 
    6439           1 :         char const * cargv[] =
    6440             :         {
    6441             :             "/usr/bin/arguments",
    6442             :             "--=591",
    6443             :             nullptr
    6444             :         };
    6445           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6446           1 :         char ** argv = const_cast<char **>(cargv);
    6447             : 
    6448           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: name missing in \"--=591\".");
    6449           2 :         advgetopt::getopt opt(environment_options);
    6450             :         try
    6451             :         {
    6452           1 :             opt.finish_parsing(argc, argv);
    6453           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6454             :         }
    6455           2 :         catch(advgetopt::getopt_exit const & e)
    6456             :         {
    6457           1 :             CATCH_REQUIRE(e.code() == 1);
    6458           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6459             :         }
    6460           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6461             : 
    6462             :         // check that the result is valid
    6463             : 
    6464             :         // an invalid parameter, MUST NOT EXIST
    6465           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6466           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6467           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6468           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6469           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6470             : 
    6471             :         // the valid parameter
    6472           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    6473           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    6474           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    6475           1 :         CATCH_REQUIRE(opt.get_default("size").empty());
    6476           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    6477             : 
    6478             :         // other parameters
    6479           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6480           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6481             :     }
    6482             :     CATCH_END_SECTION()
    6483             : 
    6484          14 :     CATCH_START_SECTION("Unknown long option.")
    6485             :     {
    6486           1 :         const advgetopt::option options[] =
    6487             :         {
    6488             :             advgetopt::define_option(
    6489             :                   advgetopt::Name("size")
    6490             :                 , advgetopt::ShortName('s')
    6491             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    6492             :                 , advgetopt::Help("define the size.")
    6493             :             ),
    6494             :             advgetopt::end_options()
    6495             :         };
    6496             : 
    6497           1 :         advgetopt::options_environment environment_options;
    6498           1 :         environment_options.f_project_name = "unittest";
    6499           1 :         environment_options.f_options = options;
    6500           1 :         environment_options.f_help_header = "Usage: use an unknown long option.";
    6501             : 
    6502           1 :         char const * cargv[] =
    6503             :         {
    6504             :             "/usr/bin/arguments",
    6505             :             "--unknown=568",
    6506             :             nullptr
    6507             :         };
    6508           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6509           1 :         char ** argv = const_cast<char **>(cargv);
    6510             : 
    6511           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--unknown\" is not supported.");
    6512           2 :         advgetopt::getopt opt(environment_options);
    6513             :         try
    6514             :         {
    6515           1 :             opt.finish_parsing(argc, argv);
    6516           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6517             :         }
    6518           2 :         catch(advgetopt::getopt_exit const & e)
    6519             :         {
    6520           1 :             CATCH_REQUIRE(e.code() == 1);
    6521           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6522             :         }
    6523           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6524             : 
    6525             :         // check that the result is valid
    6526             : 
    6527             :         // an invalid parameter, MUST NOT EXIST
    6528           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6529           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6530           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6531           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6532           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6533             : 
    6534             :         // the valid parameter
    6535           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    6536           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    6537           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    6538           1 :         CATCH_REQUIRE(opt.get_default("size").empty());
    6539           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    6540             : 
    6541             :         // other parameters
    6542           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6543           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6544             :     }
    6545             :     CATCH_END_SECTION()
    6546             : 
    6547          14 :     CATCH_START_SECTION("Long option not available in environment variable.")
    6548             :     {
    6549           1 :         const advgetopt::option options[] =
    6550             :         {
    6551             :             advgetopt::define_option(
    6552             :                   advgetopt::Name("size")
    6553             :                 , advgetopt::ShortName('s')
    6554             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    6555             :                 , advgetopt::Help("define the size.")
    6556             :             ),
    6557             :             advgetopt::end_options()
    6558             :         };
    6559             : 
    6560           1 :         advgetopt::options_environment environment_options;
    6561           1 :         environment_options.f_project_name = "unittest";
    6562           1 :         environment_options.f_options = options;
    6563           1 :         environment_options.f_help_header = "Usage: use an unknown long option.";
    6564           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6565             : 
    6566           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--size 4551");
    6567             : 
    6568           1 :         char const * cargv[] =
    6569             :         {
    6570             :             "/usr/bin/arguments",
    6571             :             "--size=568",
    6572             :             nullptr
    6573             :         };
    6574           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6575           1 :         char ** argv = const_cast<char **>(cargv);
    6576             : 
    6577           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--size\" is not supported in the environment variable.");
    6578           2 :         advgetopt::getopt opt(environment_options);
    6579             :         try
    6580             :         {
    6581           1 :             opt.finish_parsing(argc, argv);
    6582           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6583             :         }
    6584           2 :         catch(advgetopt::getopt_exit const & e)
    6585             :         {
    6586           1 :             CATCH_REQUIRE(e.code() == 1);
    6587           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6588             :         }
    6589           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6590             : 
    6591             :         // check that the result is valid
    6592             : 
    6593             :         // an invalid parameter, MUST NOT EXIST
    6594           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6595           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6596           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6597           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6598           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6599             : 
    6600             :         // the valid parameter
    6601           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    6602           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    6603           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    6604           1 :         CATCH_REQUIRE(opt.get_string("size") == "568");
    6605           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "568");
    6606           1 :         CATCH_REQUIRE(opt.get_long("size") == 568);
    6607           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 568);
    6608             : #pragma GCC diagnostic push
    6609             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    6610             :         {
    6611           1 :             bool const a1(opt.get_double("size") == 568.0);
    6612           1 :             CATCH_REQUIRE(a1);
    6613           1 :             bool const a2(opt.get_double("size", 0) == 568.0);
    6614           1 :             CATCH_REQUIRE(a2);
    6615             :         }
    6616             : #pragma GCC diagnostic pop
    6617           1 :         CATCH_REQUIRE(opt.get_default("size").empty());
    6618           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    6619             : 
    6620             :         // other parameters
    6621           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6622           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6623             :     }
    6624             :     CATCH_END_SECTION()
    6625             : 
    6626          14 :     CATCH_START_SECTION("Long option not available on command line.")
    6627             :     {
    6628           1 :         const advgetopt::option options[] =
    6629             :         {
    6630             :             advgetopt::define_option(
    6631             :                   advgetopt::Name("size")
    6632             :                 , advgetopt::ShortName('s')
    6633             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    6634             :                 , advgetopt::Help("define the size.")
    6635             :                 , advgetopt::DefaultValue("331")
    6636             :             ),
    6637             :             advgetopt::end_options()
    6638             :         };
    6639             : 
    6640           1 :         advgetopt::options_environment environment_options;
    6641           1 :         environment_options.f_project_name = "unittest";
    6642           1 :         environment_options.f_options = options;
    6643           1 :         environment_options.f_help_header = "Usage: use an unknown long option.";
    6644           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6645             : 
    6646           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--size 4551");
    6647             : 
    6648           1 :         char const * cargv[] =
    6649             :         {
    6650             :             "/usr/bin/arguments",
    6651             :             "--size=568",
    6652             :             nullptr
    6653             :         };
    6654           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6655           1 :         char ** argv = const_cast<char **>(cargv);
    6656             : 
    6657           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--size\" is not supported on the command line.");
    6658           2 :         advgetopt::getopt opt(environment_options);
    6659             :         try
    6660             :         {
    6661           1 :             opt.finish_parsing(argc, argv);
    6662           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6663             :         }
    6664           2 :         catch(advgetopt::getopt_exit const & e)
    6665             :         {
    6666           1 :             CATCH_REQUIRE(e.code() == 1);
    6667           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6668             :         }
    6669           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6670             : 
    6671             :         // check that the result is valid
    6672             : 
    6673             :         // an invalid parameter, MUST NOT EXIST
    6674           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6675           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6676           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6677           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6678           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6679             : 
    6680             :         // the valid parameter
    6681           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    6682           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    6683           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    6684           1 :         CATCH_REQUIRE(opt.get_string("size") == "4551");
    6685           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "4551");
    6686           1 :         CATCH_REQUIRE(opt.get_long("size") == 4551);
    6687           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 4551);
    6688             : #pragma GCC diagnostic push
    6689             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    6690             :         {
    6691           1 :             bool const a1(opt.get_double("size") == 4551.0);
    6692           1 :             CATCH_REQUIRE(a1);
    6693           1 :             bool const a2(opt.get_double("size", 0) == 4551.0);
    6694           1 :             CATCH_REQUIRE(a2);
    6695             :         }
    6696             : #pragma GCC diagnostic pop
    6697           1 :         CATCH_REQUIRE(opt.get_default("size") == "331");
    6698           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    6699             : 
    6700             :         // other parameters
    6701           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6702           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6703             :     }
    6704             :     CATCH_END_SECTION()
    6705             : 
    6706          14 :     CATCH_START_SECTION("Unknown short option.")
    6707             :     {
    6708           1 :         const advgetopt::option options[] =
    6709             :         {
    6710             :             advgetopt::define_option(
    6711             :                   advgetopt::Name("verbose")
    6712             :                 , advgetopt::ShortName('v')
    6713             :                 , advgetopt::Flags(advgetopt::standalone_command_flags<>())
    6714             :                 , advgetopt::Help("tell you about our work here.")
    6715             :             ),
    6716             :             advgetopt::define_option(
    6717             :                   advgetopt::Name("size")
    6718             :                 , advgetopt::ShortName('s')
    6719             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    6720             :                 , advgetopt::Help("define the size.")
    6721             :             ),
    6722             :             advgetopt::end_options()
    6723             :         };
    6724             : 
    6725           1 :         advgetopt::options_environment environment_options;
    6726           1 :         environment_options.f_project_name = "unittest";
    6727           1 :         environment_options.f_options = options;
    6728           1 :         environment_options.f_help_header = "Usage: use an unknown long option.";
    6729             : 
    6730           1 :         char const * cargv[] =
    6731             :         {
    6732             :             "/usr/bin/arguments",
    6733             :             "-vq 568",
    6734             :             nullptr
    6735             :         };
    6736           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6737           1 :         char ** argv = const_cast<char **>(cargv);
    6738             : 
    6739           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-q\" is not supported.");
    6740           2 :         advgetopt::getopt opt(environment_options);
    6741             :         try
    6742             :         {
    6743           1 :             opt.finish_parsing(argc, argv);
    6744           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6745             :         }
    6746           2 :         catch(advgetopt::getopt_exit const & e)
    6747             :         {
    6748           1 :             CATCH_REQUIRE(e.code() == 1);
    6749           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6750             :         }
    6751           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6752             : 
    6753             :         // check that the result is valid
    6754             : 
    6755             :         // an invalid parameter, MUST NOT EXIST
    6756           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6757           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6758           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6759           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6760           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6761             : 
    6762             :         // verbose
    6763           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6764           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6765           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6766           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6767           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6768           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6769             : 
    6770             :         // the valid parameter
    6771           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    6772           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    6773           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("size"));
    6774           1 :         CATCH_REQUIRE(opt.get_default("size").empty());
    6775           1 :         CATCH_REQUIRE(opt.size("size") == 0);
    6776             : 
    6777             :         // other parameters
    6778           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6779           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6780             :     }
    6781             :     CATCH_END_SECTION()
    6782             : 
    6783          14 :     CATCH_START_SECTION("Short option not available in environment variable.")
    6784             :     {
    6785           1 :         const advgetopt::option options[] =
    6786             :         {
    6787             :             advgetopt::define_option(
    6788             :                   advgetopt::Name("size")
    6789             :                 , advgetopt::ShortName('s')
    6790             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    6791             :                 , advgetopt::Help("define the size.")
    6792             :             ),
    6793             :             advgetopt::define_option(
    6794             :                   advgetopt::Name("verbose")
    6795             :                 , advgetopt::ShortName('v')
    6796             :                 , advgetopt::Flags(advgetopt::standalone_command_flags<>())
    6797             :                 , advgetopt::Help("tell you about our work here.")
    6798             :             ),
    6799             :             advgetopt::end_options()
    6800             :         };
    6801             : 
    6802           1 :         advgetopt::options_environment environment_options;
    6803           1 :         environment_options.f_project_name = "unittest";
    6804           1 :         environment_options.f_options = options;
    6805           1 :         environment_options.f_help_header = "Usage: use an unknown long option.";
    6806           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6807             : 
    6808           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-s 4551");
    6809             : 
    6810           1 :         char const * cargv[] =
    6811             :         {
    6812             :             "/usr/bin/arguments",
    6813             :             "-sv",
    6814             :             "568",
    6815             :             nullptr
    6816             :         };
    6817           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6818           1 :         char ** argv = const_cast<char **>(cargv);
    6819             : 
    6820           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-s\" is not supported in the environment variable.");
    6821           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"4551\"; standalone parameters are not accepted by this program.");
    6822           2 :         advgetopt::getopt opt(environment_options);
    6823             :         try
    6824             :         {
    6825           1 :             opt.finish_parsing(argc, argv);
    6826           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6827             :         }
    6828           2 :         catch(advgetopt::getopt_exit const & e)
    6829             :         {
    6830           1 :             CATCH_REQUIRE(e.code() == 1);
    6831           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6832             :         }
    6833           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6834             : 
    6835             :         // check that the result is valid
    6836             : 
    6837             :         // an invalid parameter, MUST NOT EXIST
    6838           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6839           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6840           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6841           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6842           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6843             : 
    6844             :         // the valid parameter
    6845           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    6846           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    6847           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    6848           1 :         CATCH_REQUIRE(opt.get_string("size") == "568");
    6849           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "568");
    6850           1 :         CATCH_REQUIRE(opt.get_long("size") == 568);
    6851           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 568);
    6852             : #pragma GCC diagnostic push
    6853             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    6854             :         {
    6855           1 :             bool const a1(opt.get_double("size") == 568.0);
    6856           1 :             CATCH_REQUIRE(a1);
    6857           1 :             bool const a2(opt.get_double("size", 0) == 568.0);
    6858           1 :             CATCH_REQUIRE(a2);
    6859             :         }
    6860             : #pragma GCC diagnostic pop
    6861           1 :         CATCH_REQUIRE(opt.get_default("size").empty());
    6862           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    6863             : 
    6864             :         // verbose
    6865           1 :         CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
    6866           1 :         CATCH_REQUIRE(opt.get_option('v') != nullptr);
    6867           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6868           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
    6869           1 :         CATCH_REQUIRE(opt.get_default("verbose").empty());
    6870           1 :         CATCH_REQUIRE(opt.size("verbose") == 1);
    6871             : 
    6872             :         // other parameters
    6873           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6874           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6875             :     }
    6876             :     CATCH_END_SECTION()
    6877             : 
    6878          14 :     CATCH_START_SECTION("Long option not available on command line.")
    6879             :     {
    6880           1 :         const advgetopt::option options[] =
    6881             :         {
    6882             :             advgetopt::define_option(
    6883             :                   advgetopt::Name("size")
    6884             :                 , advgetopt::ShortName('s')
    6885             :                 , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    6886             :                 , advgetopt::Help("define the size.")
    6887             :                 , advgetopt::DefaultValue("331")
    6888             :             ),
    6889             :             advgetopt::define_option(
    6890             :                   advgetopt::Name("verbose")
    6891             :                 , advgetopt::ShortName('v')
    6892             :                 , advgetopt::Flags(advgetopt::standalone_command_flags<>())
    6893             :                 , advgetopt::Help("tell you about our work here.")
    6894             :             ),
    6895             :             advgetopt::end_options()
    6896             :         };
    6897             : 
    6898           1 :         advgetopt::options_environment environment_options;
    6899           1 :         environment_options.f_project_name = "unittest";
    6900           1 :         environment_options.f_options = options;
    6901           1 :         environment_options.f_help_header = "Usage: use an unknown long option.";
    6902           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    6903             : 
    6904           2 :         snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-s 4551");
    6905             : 
    6906           1 :         char const * cargv[] =
    6907             :         {
    6908             :             "/usr/bin/arguments",
    6909             :             "-sv 568",
    6910             :             nullptr
    6911             :         };
    6912           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    6913           1 :         char ** argv = const_cast<char **>(cargv);
    6914             : 
    6915           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-s\" is not supported on the command line.");
    6916             :         //SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"4551\"; standalone parameters are not accepted by this program.");
    6917           2 :         advgetopt::getopt opt(environment_options);
    6918             :         try
    6919             :         {
    6920           1 :             opt.finish_parsing(argc, argv);
    6921           0 :             CATCH_REQUIRE(false);   // the library is expected to throw here
    6922             :         }
    6923           2 :         catch(advgetopt::getopt_exit const & e)
    6924             :         {
    6925           1 :             CATCH_REQUIRE(e.code() == 1);
    6926           1 :             CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
    6927             :         }
    6928           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    6929             : 
    6930             :         // check that the result is valid
    6931             : 
    6932             :         // an invalid parameter, MUST NOT EXIST
    6933           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    6934           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    6935           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    6936           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    6937           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    6938             : 
    6939             :         // the valid parameter
    6940           1 :         CATCH_REQUIRE(opt.get_option("size") != nullptr);
    6941           1 :         CATCH_REQUIRE(opt.get_option('s') != nullptr);
    6942           1 :         CATCH_REQUIRE(opt.is_defined("size"));
    6943           1 :         CATCH_REQUIRE(opt.get_string("size") == "4551");
    6944           1 :         CATCH_REQUIRE(opt.get_string("size", 0) == "4551");
    6945           1 :         CATCH_REQUIRE(opt.get_long("size") == 4551);
    6946           1 :         CATCH_REQUIRE(opt.get_long("size", 0) == 4551);
    6947             : #pragma GCC diagnostic push
    6948             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    6949             :         {
    6950           1 :             bool const a1(opt.get_double("size") == 4551.0);
    6951           1 :             CATCH_REQUIRE(a1);
    6952           1 :             bool const a2(opt.get_double("size", 0) == 4551.0);
    6953           1 :             CATCH_REQUIRE(a2);
    6954             :         }
    6955             : #pragma GCC diagnostic pop
    6956           1 :         CATCH_REQUIRE(opt.get_default("size") == "331");
    6957           1 :         CATCH_REQUIRE(opt.size("size") == 1);
    6958             : 
    6959             :         // other parameters
    6960           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    6961           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    6962             :     }
    6963             :     CATCH_END_SECTION()
    6964          13 : }
    6965             : 
    6966             : 
    6967             : #if 0
    6968             : // TODO: break this out in sections and even multiple tests
    6969             : //       the old version would check a command set of options which is
    6970             : //       not required (doable/useful) with version 2.x
    6971             : //
    6972             : //       also this test used to work but now that I heavily changed
    6973             : //       the configuration file loading process (specifically, added
    6974             : //       the cache), it fails since this test assumed that you can
    6975             : //       load a new copy of the same file over and over again
    6976             : 
    6977             : CATCH_TEST_CASE("invalid_parameters", "[invalid][getopt][arguments]")
    6978             : {
    6979             : 
    6980             :     CATCH_START_SECTION("Check all possible invalid argument")
    6981             :     {
    6982             :         // default arguments
    6983             :         //
    6984             :         char const * cargv[] =
    6985             :         {
    6986             :             "tests/unittests/invalid_parameters",
    6987             :             "--ignore-parameters",
    6988             :             nullptr
    6989             :         };
    6990             :         const int argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
    6991             :         char **argv = const_cast<char **>(cargv);
    6992             : 
    6993             :         // no options available
    6994             :         //
    6995             :         const advgetopt::option options_empty_list[] =
    6996             :         {
    6997             :             {
    6998             :                 '\0',
    6999             :                 advgetopt::GETOPT_FLAG_END,
    7000             :                 nullptr,
    7001             :                 nullptr,
    7002             :                 nullptr,
    7003             :                 nullptr
    7004             :             }
    7005             :         };
    7006             : 
    7007             :         advgetopt::options_environment options_empty;
    7008             :         options_empty.f_project_name = "unittest";
    7009             :         options_empty.f_options = options_empty_list;
    7010             :         options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
    7011             : 
    7012             :         {
    7013             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_empty, argc, argv), advgetopt::getopt_logic_error);
    7014             :         }
    7015             : 
    7016             :         // option without a name and "wrong" type
    7017             :         //
    7018             :         const advgetopt::option options_no_name_list[] =
    7019             :         {
    7020             :             {
    7021             :                 '\0',
    7022             :                 advgetopt::GETOPT_FLAG_REQUIRED,
    7023             :                 nullptr,
    7024             :                 "we can have a default though",
    7025             :                 nullptr,
    7026             :                 nullptr
    7027             :             },
    7028             :             {
    7029             :                 '\0',
    7030             :                 advgetopt::GETOPT_FLAG_END,
    7031             :                 nullptr,
    7032             :                 nullptr,
    7033             :                 nullptr,
    7034             :                 nullptr
    7035             :             }
    7036             :         };
    7037             : 
    7038             :         advgetopt::options_environment options_no_name;
    7039             :         options_no_name.f_project_name = "unittest";
    7040             :         options_no_name.f_options = options_no_name_list;
    7041             :         options_no_name.f_help_header = "Usage: try this one and we get a throw (no name)";
    7042             : 
    7043             :         {
    7044             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_no_name, argc, argv), advgetopt::getopt_logic_error);
    7045             :         }
    7046             : 
    7047             :         // long options must be 2+ characters
    7048             :         //
    7049             :         const advgetopt::option options_2chars_minimum_list[] =
    7050             :         {
    7051             :             {
    7052             :                 '\0',
    7053             :                 advgetopt::GETOPT_FLAG_MULTIPLE,
    7054             :                 "", // cannot be empty string (use nullptr instead)
    7055             :                 nullptr,
    7056             :                 "long option must be 2 characters long at least",
    7057             :                 nullptr
    7058             :             },
    7059             :             {
    7060             :                 '\0',
    7061             :                 advgetopt::GETOPT_FLAG_END,
    7062             :                 nullptr,
    7063             :                 nullptr,
    7064             :                 nullptr,
    7065             :                 nullptr
    7066             :             }
    7067             :         };
    7068             : 
    7069             :         advgetopt::options_environment options_2chars_minimum;
    7070             :         options_2chars_minimum.f_project_name = "unittest";
    7071             :         options_2chars_minimum.f_options = options_2chars_minimum_list;
    7072             :         options_2chars_minimum.f_help_header = "Usage: try this one and we get a throw (2 chars minimum)";
    7073             : 
    7074             :         {
    7075             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_2chars_minimum, argc, argv), advgetopt::getopt_logic_error);
    7076             :         }
    7077             : 
    7078             :         // long options must be 2+ characters
    7079             :         //
    7080             :         const advgetopt::option options_2chars_minimum2_list[] =
    7081             :         {
    7082             :             {
    7083             :                 '\0',
    7084             :                 advgetopt::GETOPT_FLAG_MULTIPLE,
    7085             :                 "f", // cannot be 1 character
    7086             :                 nullptr,
    7087             :                 "long option must be 2 characters long at least",
    7088             :                 nullptr
    7089             :             },
    7090             :             {
    7091             :                 '\0',
    7092             :                 advgetopt::GETOPT_FLAG_END,
    7093             :                 nullptr,
    7094             :                 nullptr,
    7095             :                 nullptr,
    7096             :                 nullptr
    7097             :             }
    7098             :         };
    7099             : 
    7100             :         advgetopt::options_environment options_2chars_minimum2;
    7101             :         options_2chars_minimum2.f_project_name = "unittest";
    7102             :         options_2chars_minimum2.f_options = options_2chars_minimum2_list;
    7103             :         options_2chars_minimum2.f_help_header = "Usage: try this one and we get a throw (2 chars minimum 2nd)";
    7104             : 
    7105             :         {
    7106             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_2chars_minimum2, argc, argv), advgetopt::getopt_logic_error);
    7107             :         }
    7108             : 
    7109             :         // same long option defined twice
    7110             :         //
    7111             :         const advgetopt::option options_defined_twice_list[] =
    7112             :         {
    7113             :             {
    7114             :                 '\0',
    7115             :                 advgetopt::GETOPT_FLAG_REQUIRED,
    7116             :                 "filename",
    7117             :                 nullptr,
    7118             :                 "options must be unique",
    7119             :                 nullptr
    7120             :             },
    7121             :             {
    7122             :                 '\0',
    7123             :                 advgetopt::GETOPT_FLAG_REQUIRED,
    7124             :                 "filename", // copy/paste problem maybe?
    7125             :                 nullptr,
    7126             :                 "options must be unique",
    7127             :                 nullptr
    7128             :             },
    7129             :             {
    7130             :                 '\0',
    7131             :                 advgetopt::GETOPT_FLAG_END,
    7132             :                 nullptr,
    7133             :                 nullptr,
    7134             :                 nullptr,
    7135             :                 nullptr
    7136             :             }
    7137             :         };
    7138             : 
    7139             :         advgetopt::options_environment options_defined_twice;
    7140             :         options_defined_twice.f_project_name = "unittest";
    7141             :         options_defined_twice.f_options = options_defined_twice_list;
    7142             :         options_defined_twice.f_help_header = "Usage: try this one and we get a throw (long defined twice)";
    7143             : 
    7144             :         {
    7145             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_defined_twice, argc, argv), advgetopt::getopt_logic_error);
    7146             :         }
    7147             : 
    7148             :         // same short option defined twice
    7149             :         //
    7150             :         const advgetopt::option options_short_defined_twice_list[] =
    7151             :         {
    7152             :             {
    7153             :                 'f',
    7154             :                 advgetopt::GETOPT_FLAG_REQUIRED,
    7155             :                 "from",
    7156             :                 nullptr,
    7157             :                 "options must be unique",
    7158             :                 nullptr
    7159             :             },
    7160             :             {
    7161             :                 'f',
    7162             :                 advgetopt::GETOPT_FLAG_REQUIRED,
    7163             :                 "to",
    7164             :                 nullptr,
    7165             :                 "options must be unique",
    7166             :                 nullptr
    7167             :             },
    7168             :             {
    7169             :                 '\0',
    7170             :                 advgetopt::GETOPT_FLAG_END,
    7171             :                 nullptr,
    7172             :                 nullptr,
    7173             :                 nullptr,
    7174             :                 nullptr
    7175             :             }
    7176             :         };
    7177             : 
    7178             :         advgetopt::options_environment options_short_defined_twice;
    7179             :         options_short_defined_twice.f_project_name = "unittest";
    7180             :         options_short_defined_twice.f_options = options_short_defined_twice_list;
    7181             :         options_short_defined_twice.f_help_header = "Usage: try this one and we get a throw (short defined twice)";
    7182             :         options_short_defined_twice.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    7183             : 
    7184             :         {
    7185             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_short_defined_twice, argc, argv), advgetopt::getopt_logic_error);
    7186             :         }
    7187             : 
    7188             :         // 2 default_multiple_argument's in the same list is invalid
    7189             :         //
    7190             :         const advgetopt::option options_two_default_multiple_arguments_list[] =
    7191             :         {
    7192             :             {
    7193             :                 '\0',
    7194             :                 advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
    7195             :                 "filenames",
    7196             :                 nullptr,
    7197             :                 "other parameters are viewed as filenames",
    7198             :                 nullptr
    7199             :             },
    7200             :             {
    7201             :                 '\0',
    7202             :                 advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
    7203             :                 "more",
    7204             :                 nullptr,
    7205             :                 "yet other parameters are viewed as \"more\" data--here it breaks, one default max.",
    7206             :                 nullptr
    7207             :             },
    7208             :             {
    7209             :                 '\0',
    7210             :                 advgetopt::GETOPT_FLAG_END,
    7211             :                 nullptr,
    7212             :                 nullptr,
    7213             :                 nullptr,
    7214             :                 nullptr
    7215             :             }
    7216             :         };
    7217             : 
    7218             :         advgetopt::options_environment options_two_default_multiple_arguments;
    7219             :         options_two_default_multiple_arguments.f_project_name = "unittest";
    7220             :         options_two_default_multiple_arguments.f_options = options_two_default_multiple_arguments_list;
    7221             :         options_two_default_multiple_arguments.f_help_header = "Usage: try this one and we get a throw (two defaults by flag, multiple args)";
    7222             : 
    7223             :         {
    7224             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_two_default_multiple_arguments, argc, argv), advgetopt::getopt_logic_error);
    7225             :         }
    7226             : 
    7227             :         // 2 default_argument's in the same list is invalid
    7228             :         //
    7229             :         const advgetopt::option options_two_default_arguments_list[] =
    7230             :         {
    7231             :             {
    7232             :                 '\0',
    7233             :                 0,
    7234             :                 "--",
    7235             :                 nullptr,
    7236             :                 "one other parameter is viewed as a filename",
    7237             :                 nullptr
    7238             :             },
    7239             :             {
    7240             :                 '\0',
    7241             :                 0,
    7242             :                 "--",
    7243             :                 nullptr,
    7244             :                 "yet other parameter viewed as \"more\" data--here it breaks, one default max.",
    7245             :                 nullptr
    7246             :             },
    7247             :             {
    7248             :                 '\0',
    7249             :                 advgetopt::GETOPT_FLAG_END,
    7250             :                 nullptr,
    7251             :                 nullptr,
    7252             :                 nullptr,
    7253             :                 nullptr
    7254             :             }
    7255             :         };
    7256             : 
    7257             :         advgetopt::options_environment options_two_default_arguments;
    7258             :         options_two_default_arguments.f_project_name = "unittest";
    7259             :         options_two_default_arguments.f_options = options_two_default_arguments_list;
    7260             :         options_two_default_arguments.f_help_header = "Usage: try this one and we get a throw (two default args by name)";
    7261             : 
    7262             :         {
    7263             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_two_default_arguments, argc, argv), advgetopt::getopt_logic_error);
    7264             :         }
    7265             : 
    7266             :         // mix of default arguments in the same list is invalid
    7267             :         //
    7268             :         const advgetopt::option options_mix_of_default_list[] =
    7269             :         {
    7270             :             {
    7271             :                 '\0',
    7272             :                 advgetopt::GETOPT_FLAG_MULTIPLE,
    7273             :                 "--",
    7274             :                 nullptr,
    7275             :                 "other parameters are viewed as filenames",
    7276             :                 nullptr
    7277             :             },
    7278             :             {
    7279             :                 '\0',
    7280             :                 0,
    7281             :                 "--",
    7282             :                 nullptr,
    7283             :                 "yet other parameter viewed as \"more\" data--here it breaks, one default max.",
    7284             :                 nullptr
    7285             :             },
    7286             :             {
    7287             :                 '\0',
    7288             :                 advgetopt::GETOPT_FLAG_END,
    7289             :                 nullptr,
    7290             :                 nullptr,
    7291             :                 nullptr,
    7292             :                 nullptr
    7293             :             }
    7294             :         };
    7295             : 
    7296             :         advgetopt::options_environment options_mix_of_default;
    7297             :         options_mix_of_default.f_project_name = "unittest";
    7298             :         options_mix_of_default.f_options = options_mix_of_default_list;
    7299             :         options_mix_of_default.f_help_header = "Usage: try this one and we get a throw (mix flags of defaults by name)";
    7300             :         options_mix_of_default.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    7301             : 
    7302             :         {
    7303             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_mix_of_default, argc, argv), advgetopt::getopt_logic_error);
    7304             :         }
    7305             : 
    7306             :         // try the - and -- without a default in the arguments
    7307             :         //
    7308             :         const advgetopt::option options_no_defaults_list[] =
    7309             :         {
    7310             :             {
    7311             :                 '\0',
    7312             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
    7313             :                 "verbose",
    7314             :                 nullptr,
    7315             :                 "just a flag to test.",
    7316             :                 0
    7317             :             },
    7318             :             {
    7319             :                 '\0',
    7320             :                 advgetopt::GETOPT_FLAG_END,
    7321             :                 nullptr,
    7322             :                 nullptr,
    7323             :                 nullptr,
    7324             :                 nullptr
    7325             :             }
    7326             :         };
    7327             : 
    7328             :         advgetopt::options_environment options_no_defaults;
    7329             :         options_no_defaults.f_project_name = "unittest";
    7330             :         options_no_defaults.f_options = options_no_defaults_list;
    7331             :         options_no_defaults.f_help_header = "Usage: try this one and we get a throw (no defaults)";
    7332             : 
    7333             :         {
    7334             :             // a filename by itself is a problem when there is no default
    7335             :             //
    7336             :             char const * sub_cargv[] =
    7337             :             {
    7338             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7339             :                 "--verbose",
    7340             :                 "this",
    7341             :                 "filename",
    7342             :                 nullptr
    7343             :             };
    7344             :             const int sub_argc(sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1);
    7345             :             char ** sub_argv(const_cast<char **>(sub_cargv));
    7346             : 
    7347             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"this\"; standalone parameters are not accepted by this program.");
    7348             :             advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
    7349             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7350             :         }
    7351             :         {
    7352             :             // a '-' by itself is a problem when there is no default because it
    7353             :             // is expected to represent a filename (stdin)
    7354             :             //
    7355             :             char const * sub_cargv[] =
    7356             :             {
    7357             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7358             :                 "--verbose",
    7359             :                 "-",
    7360             :                 nullptr
    7361             :             };
    7362             :             const int sub_argc(sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1);
    7363             :             char **sub_argv(const_cast<char **>(sub_cargv));
    7364             : 
    7365             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus - is not accepted by this program.");
    7366             :             advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
    7367             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7368             :         }
    7369             :         {
    7370             :             // the -- by itself would be fine, but since it represents a
    7371             :             // transition from arguments to only filenames (or whatever the
    7372             :             // program expects as default options) it generates an error if
    7373             :             // no default options are accepted
    7374             :             //
    7375             :             const char *sub_cargv[] =
    7376             :             {
    7377             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7378             :                 "--verbose",
    7379             :                 "--", // already just by itself it causes problems
    7380             :                 nullptr
    7381             :             };
    7382             :             const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
    7383             :             char **sub_argv = const_cast<char **>(sub_cargv);
    7384             : 
    7385             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus -- is not accepted by this program.");
    7386             :             advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
    7387             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7388             :         }
    7389             :         {
    7390             :             const char *sub_cargv[] =
    7391             :             {
    7392             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7393             :                 "--verbose",
    7394             :                 "--",
    7395             :                 "66",
    7396             :                 "--filenames",
    7397             :                 "extra",
    7398             :                 "--file",
    7399             :                 "names",
    7400             :                 nullptr
    7401             :             };
    7402             :             const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
    7403             :             char **sub_argv = const_cast<char **>(sub_cargv);
    7404             : 
    7405             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus -- is not accepted by this program.");
    7406             :             advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
    7407             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7408             :         }
    7409             :         {
    7410             :             // check that -v, that does not exist, generates a usage error
    7411             :             const char *sub_cargv[] =
    7412             :             {
    7413             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7414             :                 "-v",
    7415             :                 nullptr
    7416             :             };
    7417             :             const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
    7418             :             char **sub_argv = const_cast<char **>(sub_cargv);
    7419             : 
    7420             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -v is not supported.");
    7421             :             advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
    7422             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7423             :         }
    7424             : 
    7425             :         // check -- when default does not allowed environment variables
    7426             :         //
    7427             :         const advgetopt::option options_no_defaults_in_envvar_list[] =
    7428             :         {
    7429             :             {
    7430             :                 '\0',
    7431             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_ENVIRONMENT_VARIABLE | advgetopt::GETOPT_FLAG_FLAG,
    7432             :                 "verbose",
    7433             :                 nullptr,
    7434             :                 "just a flag to test.",
    7435             :                 nullptr
    7436             :             },
    7437             :             {
    7438             :                 '\0',
    7439             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
    7440             :                 "--",
    7441             :                 nullptr,
    7442             :                 "default multiple filenames",
    7443             :                 nullptr
    7444             :             },
    7445             :             {
    7446             :                 '\0',
    7447             :                 advgetopt::GETOPT_FLAG_END,
    7448             :                 nullptr,
    7449             :                 nullptr,
    7450             :                 nullptr,
    7451             :                 nullptr
    7452             :             }
    7453             :         };
    7454             : 
    7455             :         advgetopt::options_environment options_no_defaults_in_envvar;
    7456             :         options_no_defaults_in_envvar.f_project_name = "unittest";
    7457             :         options_no_defaults_in_envvar.f_options = options_no_defaults_in_envvar_list;
    7458             :         options_no_defaults_in_envvar.f_help_header = "Usage: try this one and we get a throw (no defaults in envvar)";
    7459             :         options_no_defaults_in_envvar.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    7460             : 
    7461             :         {
    7462             :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose - no default here");
    7463             :             char const * sub_cargv[] =
    7464             :             {
    7465             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7466             :                 "--verbose",
    7467             :                 "-",
    7468             :                 "here",
    7469             :                 "it",
    7470             :                 "works",
    7471             :                 nullptr
    7472             :             };
    7473             :             int const sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
    7474             :             char **sub_argv = const_cast<char **>(sub_cargv);
    7475             : 
    7476             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option - is not supported in the environment variable.");
    7477             :             advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
    7478             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7479             :         }
    7480             :         {
    7481             :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose no default here");
    7482             :             const char *sub_cargv[] =
    7483             :             {
    7484             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7485             :                 "--verbose",
    7486             :                 "-",
    7487             :                 "here",
    7488             :                 "it",
    7489             :                 "works",
    7490             :                 nullptr
    7491             :             };
    7492             :             const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
    7493             :             char **sub_argv = const_cast<char **>(sub_cargv);
    7494             : 
    7495             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported in the environment variable.");
    7496             :             advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
    7497             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7498             :         }
    7499             :         {
    7500             :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose -- foo bar blah");
    7501             :             const char *sub_cargv[] =
    7502             :             {
    7503             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7504             :                 "--verbose",
    7505             :                 "here",
    7506             :                 "it",
    7507             :                 "works",
    7508             :                 "--",
    7509             :                 "66",
    7510             :                 "--filenames",
    7511             :                 "extra",
    7512             :                 "--file",
    7513             :                 "names",
    7514             :                 nullptr
    7515             :             };
    7516             :             const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
    7517             :             char **sub_argv = const_cast<char **>(sub_cargv);
    7518             : 
    7519             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -- is not supported in the environment variable.");
    7520             :             advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
    7521             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7522             :         }
    7523             : 
    7524             :         // unnknown long options
    7525             :         //
    7526             :         const advgetopt::option valid_options_unknown_command_line_option_list[] =
    7527             :         {
    7528             :             {
    7529             :                 '\0',
    7530             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
    7531             :                 "command",
    7532             :                 nullptr,
    7533             :                 "there is a --command, but the user tries --verbose!",
    7534             :                 nullptr
    7535             :             },
    7536             :             {
    7537             :                 '\0',
    7538             :                 advgetopt::GETOPT_FLAG_END,
    7539             :                 nullptr,
    7540             :                 nullptr,
    7541             :                 nullptr,
    7542             :                 nullptr
    7543             :             }
    7544             :         };
    7545             : 
    7546             :         advgetopt::options_environment valid_options_unknown_command_line_option;
    7547             :         valid_options_unknown_command_line_option.f_project_name = "unittest";
    7548             :         valid_options_unknown_command_line_option.f_options = valid_options_unknown_command_line_option_list;
    7549             :         valid_options_unknown_command_line_option.f_help_header = "Usage: try this one and we get a throw (unknown command line option)";
    7550             : 
    7551             :         {
    7552             :             const char *sub_cargv[] =
    7553             :             {
    7554             :                 "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
    7555             :                 "--verbose",
    7556             :                 nullptr
    7557             :             };
    7558             :             const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
    7559             :             char **sub_argv = const_cast<char **>(sub_cargv);
    7560             : 
    7561             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --verbose is not supported.");
    7562             :             advgetopt::getopt opt(valid_options_unknown_command_line_option, sub_argc, sub_argv);
    7563             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7564             :         }
    7565             : 
    7566             :         // illegal short or long option in variable
    7567             :         //
    7568             :         const advgetopt::option options_illegal_in_variable_list[] =
    7569             :         {
    7570             :             {
    7571             :                 'v',
    7572             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
    7573             :                 "verbose",
    7574             :                 nullptr,
    7575             :                 "just a flag to test.",
    7576             :                 nullptr
    7577             :             },
    7578             :             {
    7579             :                 '\0',
    7580             :                 advgetopt::GETOPT_FLAG_END,
    7581             :                 nullptr,
    7582             :                 nullptr,
    7583             :                 nullptr,
    7584             :                 nullptr
    7585             :             }
    7586             :         };
    7587             : 
    7588             :         advgetopt::options_environment options_illegal_in_variable;
    7589             :         options_illegal_in_variable.f_project_name = "unittest";
    7590             :         options_illegal_in_variable.f_options = options_illegal_in_variable_list;
    7591             :         options_illegal_in_variable.f_help_header = "Usage: try this one and we get a throw (illegal in variable)";
    7592             :         options_illegal_in_variable.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    7593             : 
    7594             :         {
    7595             :             // long
    7596             :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose");
    7597             : 
    7598             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --verbose is not supported in the environment variable.");
    7599             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7600             :             advgetopt::getopt opt(options_illegal_in_variable, argc, argv);
    7601             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7602             :         }
    7603             :         {
    7604             :             // short
    7605             :             snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-v");
    7606             : 
    7607             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -v is not supported in the environment variable.");
    7608             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7609             :             advgetopt::getopt opt(options_illegal_in_variable, argc, argv);
    7610             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7611             :         }
    7612             : 
    7613             :         // configuration file options must have a long name
    7614             :         //
    7615             :         const advgetopt::option configuration_long_name_missing_list[] =
    7616             :         {
    7617             :             {
    7618             :                 'c',
    7619             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_CONFIGURATION_FILE,
    7620             :                 nullptr,
    7621             :                 nullptr,
    7622             :                 "a valid option",
    7623             :                 nullptr
    7624             :             },
    7625             :             {
    7626             :                 '\0',
    7627             :                 advgetopt::GETOPT_FLAG_END,
    7628             :                 nullptr,
    7629             :                 nullptr,
    7630             :                 nullptr,
    7631             :                 nullptr
    7632             :             }
    7633             :         };
    7634             : 
    7635             :         advgetopt::options_environment configuration_long_name_missing;
    7636             :         configuration_long_name_missing.f_project_name = "unittest";
    7637             :         configuration_long_name_missing.f_options = configuration_long_name_missing_list;
    7638             :         configuration_long_name_missing.f_help_header = "Usage: try this one and we get a throw (long name missing)";
    7639             :         configuration_long_name_missing.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    7640             : 
    7641             :         {
    7642             :             CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(configuration_long_name_missing, argc, argv), advgetopt::getopt_logic_error);
    7643             :         }
    7644             : 
    7645             :         // create invalid configuration files
    7646             :         //
    7647             :         const advgetopt::option valid_options_list[] =
    7648             :         {
    7649             :             {
    7650             :                 '\0',
    7651             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_CONFIGURATION_FILE,
    7652             :                 "valid",
    7653             :                 nullptr,
    7654             :                 "a valid option",
    7655             :                 nullptr
    7656             :             },
    7657             :             {
    7658             :                 '\0',
    7659             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE,
    7660             :                 "command",
    7661             :                 nullptr,
    7662             :                 "a valid command, but not a valid configuration option",
    7663             :                 nullptr
    7664             :             },
    7665             :             {
    7666             :                 '\0',
    7667             :                 advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
    7668             :                 "filename",
    7669             :                 nullptr,
    7670             :                 "other parameters are viewed as filenames",
    7671             :                 nullptr
    7672             :             },
    7673             :             {
    7674             :                 '\0',
    7675             :                 advgetopt::GETOPT_FLAG_END,
    7676             :                 nullptr,
    7677             :                 nullptr,
    7678             :                 nullptr,
    7679             :                 nullptr
    7680             :             }
    7681             :         };
    7682             : 
    7683             :         std::string tmpdir(SNAP_CATCH2_NAMESPACE::g_tmp_dir);
    7684             :         tmpdir += "/.config";
    7685             :         std::stringstream ss;
    7686             :         ss << "mkdir -p " << tmpdir;
    7687             :         if(system(ss.str().c_str()) != 0)
    7688             :         {
    7689             :             std::cerr << "fatal error: creating sub-temporary directory \"" << tmpdir << "\" failed.\n";
    7690             :             exit(1);
    7691             :         }
    7692             : 
    7693             :         std::string const config_filename(tmpdir + "/advgetopt.config");
    7694             :         char const * invalid_confs[] =
    7695             :         {
    7696             :             config_filename.c_str(),
    7697             :             nullptr
    7698             :         };
    7699             : 
    7700             :         advgetopt::options_environment valid_options;
    7701             :         valid_options.f_project_name = "unittest";
    7702             :         valid_options.f_options = valid_options_list;
    7703             :         valid_options.f_help_header = "Usage: try this one and we get a throw (valid options!)";
    7704             :         valid_options.f_configuration_files = invalid_confs;
    7705             : 
    7706             :         {
    7707             :             // '=' operator missing
    7708             :             {
    7709             :                 std::ofstream config_file;
    7710             :                 config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
    7711             :                 CATCH_REQUIRE(config_file.good());
    7712             :                 config_file <<
    7713             :                     "# Auto-generated\n"
    7714             :                     "valid param\n"
    7715             :                     "# no spaces acceptable in param names\n"
    7716             :                 ;
    7717             :             }
    7718             :             {
    7719             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option name from \"valid param\" on line 2 in configuration file \""
    7720             :                                         + config_filename
    7721             :                                         + "\" cannot include a space, missing assignment operator?");
    7722             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7723             :                 advgetopt::getopt opt(valid_options, argc, argv);
    7724             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7725             :             }
    7726             :         }
    7727             :         {
    7728             :             // same effect with a few extra spaces
    7729             :             {
    7730             :                 std::ofstream config_file;
    7731             :                 config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
    7732             :                 CATCH_REQUIRE(config_file.good());
    7733             :                 config_file <<
    7734             :                     "# Auto-generated\n"
    7735             :                     " valid param \n"
    7736             :                     "# no spaces acceptable in param names\n"
    7737             :                 ;
    7738             :             }
    7739             :             {
    7740             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option name from \" valid param \" on line 2 in configuration file \""
    7741             :                                         + config_filename
    7742             :                                         + "\" cannot include a space, missing assignment operator?");
    7743             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7744             :                 advgetopt::getopt opt(valid_options, argc, argv);
    7745             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7746             :             }
    7747             :         }
    7748             :         {
    7749             :             // param name missing
    7750             :             {
    7751             :                 std::ofstream config_file;
    7752             :                 config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
    7753             :                 CATCH_REQUIRE(config_file.good());
    7754             :                 config_file <<
    7755             :                     "# Auto-generated\n"
    7756             :                     " = valid param\n"
    7757             :                     "# no spaces acceptable in param names\n"
    7758             :                 ;
    7759             :             }
    7760             :             {
    7761             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: no option name in \" = valid param\" on line 2 from configuration file \""
    7762             :                                         + config_filename
    7763             :                                         + "\", missing name before = sign?");
    7764             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7765             :                 advgetopt::getopt opt(valid_options, argc, argv);
    7766             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7767             :             }
    7768             :         }
    7769             :         {
    7770             :             // param name starts with a dash or more
    7771             :             {
    7772             :                 std::ofstream config_file;
    7773             :                 config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
    7774             :                 CATCH_REQUIRE(config_file.good());
    7775             :                 config_file <<
    7776             :                     "# Auto-generated\n"
    7777             :                     "--valid=param\n"
    7778             :                     "# no spaces acceptable in param names\n"
    7779             :                 ;
    7780             :             }
    7781             :             {
    7782             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option names in configuration files cannot start with a dash or an underscore in \"--valid=param\" on line 2 from configuration file \""
    7783             :                                         + config_filename
    7784             :                                         + "\".");
    7785             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7786             :                 advgetopt::getopt opt(valid_options, argc, argv);
    7787             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7788             :             }
    7789             :         }
    7790             :         {
    7791             :             // unknown param name
    7792             :             {
    7793             :                 std::ofstream config_file;
    7794             :                 config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
    7795             :                 CATCH_REQUIRE(config_file.good());
    7796             :                 config_file <<
    7797             :                     "# Auto-generated\n"
    7798             :                     "invalid=param\n"
    7799             :                     "# no spaces acceptable in param names\n"
    7800             :                 ;
    7801             :             }
    7802             :             {
    7803             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: unknown option \"invalid\" found in configuration file \""
    7804             :                                         + config_filename
    7805             :                                         + "\".");
    7806             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7807             :                 advgetopt::getopt opt(valid_options, argc, argv);
    7808             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7809             :             }
    7810             :         }
    7811             :         {
    7812             :             // known command, not valid in configuration file
    7813             :             {
    7814             :                 std::ofstream config_file;
    7815             :                 config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
    7816             :                 CATCH_REQUIRE(config_file.good());
    7817             :                 config_file <<
    7818             :                     "# Auto-generated\n"
    7819             :                     "command=value\n"
    7820             :                     "# no spaces acceptable in param names\n"
    7821             :                 ;
    7822             :             }
    7823             :             {
    7824             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"command\" is not supported in configuration files (found in \""
    7825             :                                         + config_filename
    7826             :                                         + "\").");
    7827             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
    7828             :                 advgetopt::getopt opt(valid_options, argc, argv);
    7829             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    7830             :             }
    7831             :         }
    7832             : 
    7833             : #if 0
    7834             :     // in version 2.x we do not have this case anymore
    7835             : 
    7836             :         // one of the options has an invalid mode; explicit option
    7837             :         {
    7838             :             const advgetopt::option options_list[] =
    7839             :             {
    7840             :                 {
    7841             :                     '\0',
    7842             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR,
    7843             :                     "mode",
    7844             :                     nullptr,
    7845             :                     "an argument with an invalid mode to see that we get an exception",
    7846             :                     static_cast<advgetopt::getopt::argument_mode_t>(static_cast<int>(advgetopt::getopt::argument_mode_t::end_of_options) + 1)
    7847             :                 },
    7848             :                 {
    7849             :                     '\0',
    7850             :                     advgetopt::GETOPT_FLAG_END,
    7851             :                     nullptr,
    7852             :                     nullptr,
    7853             :                     nullptr,
    7854             :                     nullptr
    7855             :                 }
    7856             :             };
    7857             : 
    7858             :             advgetopt::options_environment options;
    7859             :             options.f_project_name = "unittest";
    7860             :             options.f_options = options_list;
    7861             :             options.f_help_header = "Usage: one of the options has an invalid mode";
    7862             : 
    7863             :             {
    7864             :                 const char *cargv2[] =
    7865             :                 {
    7866             :                     "tests/unittests/unittest_advgetopt",
    7867             :                     "--mode",
    7868             :                     "test",
    7869             :                     nullptr
    7870             :                 };
    7871             :                 const int argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    7872             :                 char **argv2 = const_cast<char **>(cargv2);
    7873             : 
    7874             :                 // here we hit the one in add_options() (plural)
    7875             :                 // the one in add_option() is not reachable because it is called only
    7876             :                 // when a default option is defined and that means the mode is
    7877             :                 // correct
    7878             :                 CATCH_REQUIRE_THROWS_AS( { advgetopt::getopt opt(argc2, argv2, options, confs, nullptr); }, advgetopt::getopt_invalid );
    7879             :             }
    7880             :             {
    7881             :                 const char *cargv2[] =
    7882             :                 {
    7883             :                     "tests/unittests/unittest_advgetopt",
    7884             :                     nullptr
    7885             :                 };
    7886             :                 const int argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    7887             :                 char **argv2 = const_cast<char **>(cargv2);
    7888             : 
    7889             :                 // this one checks that the --mode flag does indeed generate a
    7890             :                 // throw when not used on the command line but then gets shown
    7891             :                 // in the usage() function
    7892             :                 advgetopt::getopt opt(argc2, argv2, options, confs, nullptr);
    7893             :                 for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
    7894             :                 {
    7895             :                     CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_invalid);
    7896             :                 }
    7897             :             }
    7898             :         }
    7899             : #endif
    7900             : 
    7901             :         // a valid initialization, but not so valid calls afterward
    7902             :         {
    7903             :             advgetopt::option const options_list[] =
    7904             :             {
    7905             :                 {
    7906             :                     '\0',
    7907             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
    7908             :                     "validate",
    7909             :                     nullptr,
    7910             :                     "this is used to validate different things.",
    7911             :                     nullptr
    7912             :                 },
    7913             :                 {
    7914             :                     '\0',
    7915             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    7916             :                     "long",
    7917             :                     nullptr,
    7918             :                     "used to validate that invalid integers generate an error.",
    7919             :                     nullptr
    7920             :                 },
    7921             :                 {
    7922             :                     'o',
    7923             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    7924             :                     "out-of-bounds",
    7925             :                     nullptr,
    7926             :                     "valid values from 1 to 9.",
    7927             :                     nullptr
    7928             :                 },
    7929             :                 {
    7930             :                     '\0',
    7931             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    7932             :                     "not-specified-and-no-default",
    7933             :                     nullptr,
    7934             :                     "test long without having used the option and no default.",
    7935             :                     nullptr
    7936             :                 },
    7937             :                 {
    7938             :                     '\0',
    7939             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    7940             :                     "not-specified-with-invalid-default",
    7941             :                     "123abc",
    7942             :                     "test long with an invalid default value.",
    7943             :                     nullptr
    7944             :                 },
    7945             :                 {
    7946             :                     '\0',
    7947             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    7948             :                     "not-specified-string-without-default",
    7949             :                     nullptr,
    7950             :                     "test long with an invalid default value.",
    7951             :                     nullptr
    7952             :                 },
    7953             :                 {
    7954             :                     '\0',
    7955             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    7956             :                     "string",
    7957             :                     nullptr,
    7958             :                     "test long with an invalid default value.",
    7959             :                     nullptr
    7960             :                 },
    7961             :                 {
    7962             :                     '\0',
    7963             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
    7964             :                     "filename",
    7965             :                     nullptr,
    7966             :                     "other parameters are viewed as filenames",
    7967             :                     nullptr
    7968             :                 },
    7969             :                 {
    7970             :                     '\0',
    7971             :                     advgetopt::GETOPT_FLAG_END,
    7972             :                     nullptr,
    7973             :                     nullptr,
    7974             :                     nullptr,
    7975             :                     nullptr
    7976             :                 }
    7977             :             };
    7978             :             char const * cargv2[] =
    7979             :             {
    7980             :                 "tests/unittests/unittest_advgetopt",
    7981             :                 "--validate",
    7982             :                 "--long",
    7983             :                 "123abc",
    7984             :                 "--double",
    7985             :                 "12.3abc",
    7986             :                 "--out-of-bounds",
    7987             :                 "123",
    7988             :                 "--out-of-bounds-dbl",
    7989             :                 "123.5",
    7990             :                 "--string",
    7991             :                 "string value",
    7992             :                 nullptr
    7993             :             };
    7994             :             int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    7995             :             char ** argv2 = const_cast<char **>(cargv2);
    7996             : 
    7997             :             advgetopt::options_environment options;
    7998             :             options.f_project_name = "unittest";
    7999             :             options.f_options = options_list;
    8000             :             options.f_help_header = "Usage: one of the options has an invalid mode";
    8001             :             options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    8002             : 
    8003             :             advgetopt::getopt opt(options, argc2, argv2);
    8004             : 
    8005             :             // cannot get the default without a valid name!
    8006             :             CATCH_REQUIRE_THROWS_AS( opt.get_default(""), advgetopt::getopt_logic_error);
    8007             : 
    8008             :             // cannot get a long named "blah"
    8009             :             CATCH_REQUIRE_THROWS_AS(opt.get_long("blah"), advgetopt::getopt_logic_error);
    8010             :             // existing "long", but only 1 entry
    8011             :             CATCH_REQUIRE_THROWS_AS(opt.get_long("long", 100), advgetopt::getopt_undefined);
    8012             :             long l(-1);
    8013             :             CATCH_REQUIRE_THROWS_AS(l = opt.get_long("not-specified-and-no-default", 0), advgetopt::getopt_logic_error);
    8014             :             CATCH_REQUIRE(l == -1);
    8015             :             CATCH_REQUIRE_THROWS_AS(l = opt.get_long("not-specified-with-invalid-default", 0), advgetopt::getopt_logic_error);
    8016             :             CATCH_REQUIRE(l == -1);
    8017             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (123abc) in parameter --long.");
    8018             :             l = opt.get_long("long");
    8019             :             CATCH_REQUIRE(l == -1);
    8020             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: 123 is out of bounds (1..9 inclusive) in parameter --out-of-bounds.");
    8021             :             l = opt.get_long("out-of-bounds", 0, 1, 9);
    8022             :             CATCH_REQUIRE(l == -1);
    8023             :             SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (123abc) in parameter --double.");
    8024             : 
    8025             :             std::string s;
    8026             :             CATCH_REQUIRE_THROWS_AS( s = opt.get_string("not-specified-string-without-default", 0), advgetopt::getopt_logic_error);
    8027             :             CATCH_REQUIRE(s.empty());
    8028             :             CATCH_REQUIRE_THROWS_AS( s = opt.get_string("string", 100), advgetopt::getopt_undefined);
    8029             :             CATCH_REQUIRE(s.empty());
    8030             : 
    8031             :             SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    8032             : 
    8033             :             // reuse all those invalid options with the reset() function
    8034             :             // and expect the same result
    8035             :             // (the constructor is expected to call reset() the exact same way)
    8036             :             //  -- this changed in version 2.x; we can't reset the option definitions
    8037             :             //
    8038             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_empty_list, confs, nullptr), advgetopt::getopt_invalid);
    8039             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_no_name_list, confs, nullptr), advgetopt::getopt_invalid);
    8040             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_2chars_minimum, confs, nullptr), advgetopt::getopt_invalid);
    8041             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_2chars_minimum2, confs, nullptr), advgetopt::getopt_invalid);
    8042             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_defined_twice, confs, "ADVGETOPT_TEST_OPTIONS"), advgetopt::getopt_invalid);
    8043             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_short_defined_twice, confs, nullptr), advgetopt::getopt_invalid);
    8044             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_two_default_multiple_arguments, confs, nullptr), advgetopt::getopt_invalid_default);
    8045             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_two_default_arguments, confs, "ADVGETOPT_TEST_OPTIONS"), advgetopt::getopt_invalid_default);
    8046             :             //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_mix_of_default, confs, nullptr), advgetopt::getopt_invalid_default);
    8047             :         }
    8048             : 
    8049             :         // valid initialization + usage calls
    8050             :         {
    8051             :             const advgetopt::option options_list[] =
    8052             :             {
    8053             :                 {
    8054             :                     '\0',
    8055             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
    8056             :                     "validate",
    8057             :                     nullptr,
    8058             :                     "this is used to validate different things.",
    8059             :                     nullptr
    8060             :                 },
    8061             :                 {
    8062             :                     '\0',
    8063             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8064             :                     "long",
    8065             :                     nullptr,
    8066             :                     "used to validate that invalid numbers generate an error.",
    8067             :                     nullptr
    8068             :                 },
    8069             :                 {
    8070             :                     'o',
    8071             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8072             :                     "out-of-bounds",
    8073             :                     nullptr,
    8074             :                     "valid values from 1 to 9.",
    8075             :                     nullptr
    8076             :                 },
    8077             :                 {
    8078             :                     '\0',
    8079             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8080             :                     "not-specified-and-no-default",
    8081             :                     nullptr,
    8082             :                     "test long without having used the option and no default.",
    8083             :                     nullptr
    8084             :                 },
    8085             :                 {
    8086             :                     '\0',
    8087             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
    8088             :                     "not-specified-with-invalid-default",
    8089             :                     "123abc",
    8090             :                     "test long with an invalid default value.",
    8091             :                     nullptr
    8092             :                 },
    8093             :                 {
    8094             :                     '\0',
    8095             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8096             :                     "not-specified-string-without-default",
    8097             :                     nullptr,
    8098             :                     "test long with an invalid default value.",
    8099             :                     nullptr
    8100             :                 },
    8101             :                 {
    8102             :                     '\0',
    8103             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8104             :                     "string",
    8105             :                     nullptr,
    8106             :                     "test long with an invalid default value.",
    8107             :                     nullptr
    8108             :                 },
    8109             :                 {
    8110             :                     'u',
    8111             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE,
    8112             :                     "unique",
    8113             :                     nullptr,
    8114             :                     "test long with an invalid default value.",
    8115             :                     nullptr
    8116             :                 },
    8117             :                 {
    8118             :                     'q',
    8119             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
    8120             :                     "quiet",
    8121             :                     nullptr,
    8122             :                     "test long with an invalid default value.",
    8123             :                     nullptr
    8124             :                 },
    8125             :                 {
    8126             :                     '\0',
    8127             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
    8128             :                     "filename",
    8129             :                     nullptr,
    8130             :                     "other parameters are viewed as filenames.",
    8131             :                     nullptr
    8132             :                 },
    8133             :                 {
    8134             :                     '\0',
    8135             :                     advgetopt::GETOPT_FLAG_END,
    8136             :                     nullptr,
    8137             :                     nullptr,
    8138             :                     nullptr,
    8139             :                     nullptr
    8140             :                 }
    8141             :             };
    8142             :             char const * cargv2[] =
    8143             :             {
    8144             :                 "tests/unittests/unittest_advgetopt",
    8145             :                 "--validate",
    8146             :                 "--long",
    8147             :                 "123abc",
    8148             :                 "--out-of-bounds",
    8149             :                 "123",
    8150             :                 "--string",
    8151             :                 "string value",
    8152             :                 nullptr
    8153             :             };
    8154             :             int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8155             :             char ** argv2 = const_cast<char **>(cargv2);
    8156             : 
    8157             :             advgetopt::options_environment options;
    8158             :             options.f_project_name = "unittest";
    8159             :             options.f_options = options_list;
    8160             :             options.f_help_header = "Usage: try this one and we get a throw (valid options + usage calls)";
    8161             :             options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    8162             : 
    8163             :             // this initialization works as expected
    8164             :             advgetopt::getopt opt(options, argc2, argv2);
    8165             : 
    8166             :             // all of the following have the exiting exception
    8167             :             CATCH_REQUIRE(opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) ==
    8168             :     "Usage: try this one and we get a throw (valid options + usage calls)\n"
    8169             :     "   --long <arg>               used to validate that invalid numbers generate an\n"
    8170             :     "                              error.\n"
    8171             :     "   --not-specified-and-no-default <arg>\n"
    8172             :     "                              test long without having used the option and no\n"
    8173             :     "                              default.\n"
    8174             :     "   --not-specified-string-without-default <arg>\n"
    8175             :     "                              test long with an invalid default value.\n"
    8176             :     "   --not-specified-with-invalid-default <arg> {<arg>} (default is \"123abc\")\n"
    8177             :     "                              test long with an invalid default value.\n"
    8178             :     "   --out-of-bounds or -o <arg>\n"
    8179             :     "                              valid values from 1 to 9.\n"
    8180             :     "   --quiet or -q {<arg>}      test long with an invalid default value.\n"
    8181             :     "   --string <arg>             test long with an invalid default value.\n"
    8182             :     "   --unique or -u [<arg>]     test long with an invalid default value.\n"
    8183             :     "   --validate                 this is used to validate different things.\n"
    8184             :     "   [default arguments]        other parameters are viewed as filenames.\n"
    8185             :                             );
    8186             :         }
    8187             : 
    8188             :         // valid initialization + usage calls with a few different options
    8189             :         {
    8190             :             const advgetopt::option options_list[] =
    8191             :             {
    8192             :                 {
    8193             :                     '\0',
    8194             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
    8195             :                     "validate",
    8196             :                     nullptr,
    8197             :                     "this is used to validate different things.",
    8198             :                     nullptr
    8199             :                 },
    8200             :                 {
    8201             :                     '\0',
    8202             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8203             :                     "long",
    8204             :                     nullptr,
    8205             :                     "used to validate that invalid numbers generate an error.",
    8206             :                     nullptr
    8207             :                 },
    8208             :                 {
    8209             :                     'o',
    8210             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8211             :                     "out-of-bounds",
    8212             :                     nullptr,
    8213             :                     "valid values from 1 to 9.",
    8214             :                     nullptr
    8215             :                 },
    8216             :                 {
    8217             :                     '\0',
    8218             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8219             :                     "not-specified-and-no-default",
    8220             :                     nullptr,
    8221             :                     "test long without having used the option and no default.",
    8222             :                     nullptr
    8223             :                 },
    8224             :                 {
    8225             :                     '\0',
    8226             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
    8227             :                     "not-specified-with-invalid-default",
    8228             :                     "123abc",
    8229             :                     "test long with an invalid default value.",
    8230             :                     nullptr
    8231             :                 },
    8232             :                 {
    8233             :                     '\0',
    8234             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8235             :                     "not-specified-string-without-default",
    8236             :                     nullptr,
    8237             :                     "test long with an invalid default value.",
    8238             :                     nullptr
    8239             :                 },
    8240             :                 {
    8241             :                     '\0',
    8242             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8243             :                     "string",
    8244             :                     nullptr,
    8245             :                     "test long with an invalid default value.",
    8246             :                     nullptr
    8247             :                 },
    8248             :                 {
    8249             :                     'u',
    8250             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE,
    8251             :                     "unique",
    8252             :                     nullptr,
    8253             :                     "test long with an invalid default value.",
    8254             :                     nullptr
    8255             :                 },
    8256             :                 {
    8257             :                     'q',
    8258             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
    8259             :                     "quiet",
    8260             :                     nullptr,
    8261             :                     "test long with an invalid default value.",
    8262             :                     nullptr
    8263             :                 },
    8264             :                 {
    8265             :                     'l',
    8266             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
    8267             :                     "not-in-v2-though",
    8268             :                     nullptr,
    8269             :                     "long with just a letter.",
    8270             :                     nullptr
    8271             :                 },
    8272             :                 {
    8273             :                     '\0',
    8274             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE,
    8275             :                     "--",
    8276             :                     nullptr,
    8277             :                     "other parameters are viewed as filenames; and we need at least one option with a very long help to check that it wraps perfectly (we'd really need to get the output of the command and check that against what is expected because at this time the test is rather blind in that respect! FIXED IN v2!)",
    8278             :                     nullptr
    8279             :                 },
    8280             :                 {
    8281             :                     '\0',
    8282             :                     advgetopt::GETOPT_FLAG_END,
    8283             :                     nullptr,
    8284             :                     nullptr,
    8285             :                     nullptr,
    8286             :                     nullptr
    8287             :                 }
    8288             :             };
    8289             : 
    8290             :             advgetopt::options_environment options;
    8291             :             options.f_project_name = "unittest";
    8292             :             options.f_options = options_list;
    8293             :             options.f_help_header = "Usage: try this one and we get a throw (valid options + usage calls bis)";
    8294             :             options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    8295             : 
    8296             :             {
    8297             :                 // make sure that --long (REQUIRED) fails if the
    8298             :                 // long value is not specified
    8299             :                 //
    8300             :                 char const * cargv2[] =
    8301             :                 {
    8302             :                     "tests/unittests/unittest_advgetopt",
    8303             :                     "--validate",
    8304             :                     "--long",
    8305             :                     "--out-of-bounds",
    8306             :                     "123",
    8307             :                     "--string",
    8308             :                     "string value",
    8309             :                     nullptr
    8310             :                 };
    8311             :                 int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8312             :                 char ** argv2 = const_cast<char **>(cargv2);
    8313             : 
    8314             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --long expects an argument.");
    8315             :                 advgetopt::getopt opt(options, argc2, argv2);
    8316             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    8317             :             }
    8318             :             {
    8319             :                 // again with the lone -l (no long name)
    8320             :                 //
    8321             :                 char const * cargv2[] =
    8322             :                 {
    8323             :                     "tests/unittests/unittest_advgetopt",
    8324             :                     "--validate",
    8325             :                     "-l",
    8326             :                     "--out-of-bounds",
    8327             :                     "123",
    8328             :                     "--string",
    8329             :                     "string value",
    8330             :                     nullptr
    8331             :                 };
    8332             :                 int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8333             :                 char ** argv2 = const_cast<char **>(cargv2);
    8334             : 
    8335             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --not-in-v2-though expects an argument.");
    8336             :                 advgetopt::getopt opt(options, argc2, argv2);
    8337             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    8338             :             }
    8339             :             {
    8340             :                 char const * cargv2[] =
    8341             :                 {
    8342             :                     "tests/unittests/unittest_advgetopt",
    8343             :                     "--validate",
    8344             :                     "--long",
    8345             :                     "123abc",
    8346             :                     "--out-of-bounds",
    8347             :                     "123",
    8348             :                     "--string",
    8349             :                     "string value",
    8350             :                     nullptr
    8351             :                 };
    8352             :                 int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8353             :                 char ** argv2 = const_cast<char **>(cargv2);
    8354             : 
    8355             :                 // this initialization works as expected
    8356             :                 advgetopt::getopt opt(options, argc2, argv2);
    8357             : 
    8358             :                 // all of the following have the exiting exception
    8359             :     //            for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
    8360             :     //            {
    8361             :     //                CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_exit);
    8362             :     //            }
    8363             :                 CATCH_REQUIRE(opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) ==
    8364             :     "Usage: try this one and we get a throw (valid options + usage calls bis)\n"
    8365             :     "   --long <arg>               used to validate that invalid numbers generate an\n"
    8366             :     "                              error.\n"
    8367             :     "   --not-in-v2-though or -l <arg>\n"
    8368             :     "                              long with just a letter.\n"
    8369             :     "   --not-specified-and-no-default <arg>\n"
    8370             :     "                              test long without having used the option and no\n"
    8371             :     "                              default.\n"
    8372             :     "   --not-specified-string-without-default <arg>\n"
    8373             :     "                              test long with an invalid default value.\n"
    8374             :     "   --not-specified-with-invalid-default <arg> {<arg>} (default is \"123abc\")\n"
    8375             :     "                              test long with an invalid default value.\n"
    8376             :     "   --out-of-bounds or -o <arg>\n"
    8377             :     "                              valid values from 1 to 9.\n"
    8378             :     "   --quiet or -q {<arg>}      test long with an invalid default value.\n"
    8379             :     "   --string <arg>             test long with an invalid default value.\n"
    8380             :     "   --unique or -u [<arg>]     test long with an invalid default value.\n"
    8381             :     "   --validate                 this is used to validate different things.\n"
    8382             :     "   [default argument]         other parameters are viewed as filenames; and we\n"
    8383             :     "                              need at least one option with a very long help to\n"
    8384             :     "                              check that it wraps perfectly (we'd really need to\n"
    8385             :     "                              get the output of the command and check that\n"
    8386             :     "                              against what is expected because at this time the\n"
    8387             :     "                              test is rather blind in that respect! FIXED IN\n"
    8388             :     "                              v2!)\n"
    8389             :                             );
    8390             :             }
    8391             :         }
    8392             : 
    8393             :         // strange entry without a name
    8394             :         {
    8395             :             advgetopt::option const options_list[] =
    8396             :             {
    8397             :                 {
    8398             :                     '\0',
    8399             :                     advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR | advgetopt::GETOPT_FLAG_FLAG,
    8400             :                     nullptr,
    8401             :                     nullptr,
    8402             :                     "this entry has help, but no valid name...",
    8403             :                     nullptr
    8404             :                 },
    8405             :                 {
    8406             :                     'v',
    8407             :                     advgetopt::GETOPT_FLAG_FLAG,
    8408             :                     "verbose",
    8409             :                     nullptr,
    8410             :                     "show more stuff when found on the command line.",
    8411             :                     nullptr
    8412             :                 },
    8413             :                 {
    8414             :                     '\0',
    8415             :                     advgetopt::GETOPT_FLAG_END,
    8416             :                     nullptr,
    8417             :                     nullptr,
    8418             :                     nullptr,
    8419             :                     nullptr
    8420             :                 }
    8421             :             };
    8422             : 
    8423             :             advgetopt::options_environment options;
    8424             :             options.f_project_name = "unittest";
    8425             :             options.f_options = options_list;
    8426             :             options.f_help_header = "Usage: try this one and we get a throw (strange empty entry!)";
    8427             :             options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
    8428             : 
    8429             :             {
    8430             :                 char const * cargv2[] =
    8431             :                 {
    8432             :                     "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
    8433             :                     nullptr
    8434             :                 };
    8435             :                 int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8436             :                 char ** argv2 = const_cast<char **>(cargv2);
    8437             : 
    8438             :                 // this initialization works as expected
    8439             :                 //
    8440             :                 CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options, argc2, argv2), advgetopt::getopt_logic_error );
    8441             : 
    8442             :     //            // all of the following have the exiting exception
    8443             :     //            for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
    8444             :     //            {
    8445             :     //                CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_invalid);
    8446             :     //            }
    8447             :     //std::cout << "test usage output here? " << opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) << "\n";
    8448             :             }
    8449             :         }
    8450             : 
    8451             :         // required multiple without arguments
    8452             :         {
    8453             :             advgetopt::option const options_list[] =
    8454             :             {
    8455             :                 {
    8456             :                     'f',
    8457             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
    8458             :                     "filenames",
    8459             :                     nullptr,
    8460             :                     "test a required multiple without any arguments and fail.",
    8461             :                     nullptr
    8462             :                 },
    8463             :                 {
    8464             :                     '\0',
    8465             :                     advgetopt::GETOPT_FLAG_END,
    8466             :                     nullptr,
    8467             :                     nullptr,
    8468             :                     nullptr,
    8469             :                     nullptr
    8470             :                 }
    8471             :             };
    8472             : 
    8473             :             advgetopt::options_environment options;
    8474             :             options.f_project_name = "unittest";
    8475             :             options.f_options = options_list;
    8476             :             options.f_help_header = "Usage: try this one and we get a throw (required multiple without args)";
    8477             : 
    8478             :             {
    8479             :                 // first with -f
    8480             :                 char const * cargv2[] =
    8481             :                 {
    8482             :                     "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
    8483             :                     "-f",
    8484             :                     nullptr
    8485             :                 };
    8486             :                 int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8487             :                 char ** argv2 = const_cast<char **>(cargv2);
    8488             : 
    8489             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
    8490             :                 advgetopt::getopt opt(options, argc2, argv2);
    8491             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    8492             :             }
    8493             :             {
    8494             :                 // second with --filenames
    8495             :                 const char *cargv2[] =
    8496             :                 {
    8497             :                     "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
    8498             :                     "--filenames",
    8499             :                     nullptr
    8500             :                 };
    8501             :                 int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8502             :                 char ** argv2 = const_cast<char **>(cargv2);
    8503             : 
    8504             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
    8505             :                 advgetopt::getopt opt(options, argc2, argv2);
    8506             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    8507             :             }
    8508             :         }
    8509             : 
    8510             :         // required multiple without arguments, short name only
    8511             :         {
    8512             :             advgetopt::option const options_list[] =
    8513             :             {
    8514             :                 {
    8515             :                     'f',
    8516             :                     advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
    8517             :                     "filenames",
    8518             :                     nullptr,
    8519             :                     "test a required multiple without any arguments and fail.",
    8520             :                     nullptr
    8521             :                 },
    8522             :                 {
    8523             :                     '\0',
    8524             :                     advgetopt::GETOPT_FLAG_END,
    8525             :                     nullptr,
    8526             :                     nullptr,
    8527             :                     nullptr,
    8528             :                     nullptr
    8529             :                 }
    8530             :             };
    8531             : 
    8532             :             advgetopt::options_environment options;
    8533             :             options.f_project_name = "unittest";
    8534             :             options.f_options = options_list;
    8535             :             options.f_help_header = "Usage: try this one and we get a throw (required multiple without args + short name)";
    8536             : 
    8537             :             {
    8538             :                 // -f only in this case
    8539             :                 char const * cargv2[] =
    8540             :                 {
    8541             :                     "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
    8542             :                     "-f",
    8543             :                     nullptr
    8544             :                 };
    8545             :                 int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
    8546             :                 char ** argv2 = const_cast<char **>(cargv2);
    8547             : 
    8548             :                 SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
    8549             :                 advgetopt::getopt opt(options, argc2, argv2);
    8550             :                 SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    8551             :             }
    8552             :         }
    8553             :     }
    8554             :     CATCH_END_SECTION()
    8555             : }
    8556             : #endif
    8557             : 
    8558             : 
    8559             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.13