LCOV - code coverage report
Current view: top level - tests - catch_arguments.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.5 % 3560 3505
Test Date: 2026-01-18 09:38:57 Functions: 100.0 % 16 16
Legend: Lines: hit not hit

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

Generated by: LCOV version 2.0-1

Snap C++ | List of projects | List of versions