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

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

Generated by: LCOV version 1.12