LCOV - code coverage report
Current view: top level - tests - arguments.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 3135 3147 99.6 %
Date: 2019-08-10 16:09:07 Functions: 16 16 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.12