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

          Line data    Source code
       1             : /*
       2             :  * Files:
       3             :  *    tests/options_info.cpp
       4             :  *
       5             :  * License:
       6             :  *    Copyright (c) 2006-2019  Made to Order Software Corp.  All Rights Reserved
       7             :  *
       8             :  *    https://snapwebsites.org/
       9             :  *    contact@m2osw.com
      10             :  *
      11             :  *    This program is free software; you can redistribute it and/or modify
      12             :  *    it under the terms of the GNU General Public License as published by
      13             :  *    the Free Software Foundation; either version 2 of the License, or
      14             :  *    (at your option) any later version.
      15             :  *
      16             :  *    This program is distributed in the hope that it will be useful,
      17             :  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
      18             :  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19             :  *    GNU General Public License for more details.
      20             :  *
      21             :  *    You should have received a copy of the GNU General Public License along
      22             :  *    with this program; if not, write to the Free Software Foundation, Inc.,
      23             :  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      24             :  *
      25             :  * Authors:
      26             :  *    Alexis Wilke   alexis@m2osw.com
      27             :  */
      28             : 
      29             : // self
      30             : //
      31             : #include "main.h"
      32             : 
      33             : // advgetopt lib
      34             : //
      35             : #include <advgetopt/exception.h>
      36             : 
      37             : // C++ lib
      38             : //
      39             : #include <fstream>
      40             : 
      41             : 
      42             : 
      43             : 
      44             : 
      45           3 : CATCH_TEST_CASE("to_from_short_name", "[option_info][valid][basic][short_name]")
      46             : {
      47           2 :     CATCH_START_SECTION("Short name to string and back")
      48             :         // wc == U'\0' is a special case
      49             :         //
      50           1 :         CATCH_REQUIRE(advgetopt::NO_SHORT_NAME == U'\0');
      51           1 :         CATCH_REQUIRE(advgetopt::short_name_to_string(U'\0') == std::string());
      52           1 :         CATCH_REQUIRE(advgetopt::string_to_short_name(std::string()) == U'\0');
      53             : 
      54     1112064 :         for(char32_t wc(1); wc < 0x110000; ++wc)
      55             :         {
      56     1112063 :             if(wc == 0xD800)
      57             :             {
      58           1 :                 wc = 0xE000;
      59             :             }
      60     2224126 :             std::string str(advgetopt::short_name_to_string(wc));
      61     1112063 :             CATCH_REQUIRE(advgetopt::string_to_short_name(str) == wc);
      62             : 
      63             :             // add a second character to prove that string_to_short_name()
      64             :             // only works with one character
      65             :             //
      66     1112063 :             char32_t const second_char(rand() % (0xD800 - 0x20) + 0x20);
      67     1112063 :             str += advgetopt::short_name_to_string(second_char);
      68     1112063 :             CATCH_REQUIRE(advgetopt::string_to_short_name(str) == advgetopt::NO_SHORT_NAME);
      69             :         }
      70             :     CATCH_END_SECTION()
      71           1 : }
      72             : 
      73             : 
      74             : 
      75             : 
      76             : 
      77           5 : CATCH_TEST_CASE("option_info_basics", "[option_info][valid][basic]")
      78             : {
      79           6 :     CATCH_START_SECTION("Simple option (verify defaults)")
      80           2 :         advgetopt::option_info verbose("verbose");
      81             : 
      82           1 :         CATCH_REQUIRE(verbose.get_name() == "verbose");
      83           1 :         CATCH_REQUIRE(verbose.get_short_name() == advgetopt::NO_SHORT_NAME);
      84           1 :         CATCH_REQUIRE_FALSE(verbose.is_default_option());
      85           1 :         CATCH_REQUIRE(verbose.get_flags() == 0);
      86             : 
      87           1 :         advgetopt::flag_t flag(1);
      88          31 :         do
      89             :         {
      90          32 :             CATCH_REQUIRE(verbose.has_flag(flag) == 0);
      91          32 :             flag <<= 1;
      92             :         }
      93          32 :         while(flag != 0);
      94             : 
      95           1 :         CATCH_REQUIRE_FALSE(verbose.has_default());
      96           1 :         CATCH_REQUIRE(verbose.get_default().empty());
      97           1 :         CATCH_REQUIRE(verbose.get_help().empty());
      98             : 
      99           1 :         CATCH_REQUIRE(verbose.get_alias_destination() == nullptr);
     100           1 :         CATCH_REQUIRE(verbose.get_multiple_separators().empty());
     101           1 :         CATCH_REQUIRE_FALSE(verbose.is_defined());
     102           1 :         CATCH_REQUIRE(verbose.size() == 0);
     103             :     CATCH_END_SECTION()
     104             : 
     105           6 :     CATCH_START_SECTION("Auto-default")
     106           2 :         advgetopt::option_info auto_default("--");
     107             : 
     108           1 :         CATCH_REQUIRE(auto_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
     109           1 :         CATCH_REQUIRE(auto_default.is_default_option());
     110             : 
     111           1 :         auto_default.add_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
     112             : 
     113           1 :         CATCH_REQUIRE(auto_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
     114           1 :         CATCH_REQUIRE(auto_default.is_default_option());
     115             : 
     116           1 :         auto_default.remove_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
     117             : 
     118           1 :         CATCH_REQUIRE_FALSE(auto_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION)); // unfortunate?
     119           1 :         CATCH_REQUIRE(auto_default.is_default_option());
     120             :     CATCH_END_SECTION()
     121             : 
     122           6 :     CATCH_START_SECTION("Explicit default")
     123           2 :         advgetopt::option_info explicit_default("filenames", 'f');
     124             : 
     125           1 :         CATCH_REQUIRE_FALSE(explicit_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
     126           1 :         CATCH_REQUIRE_FALSE(explicit_default.is_default_option());
     127             : 
     128           1 :         explicit_default.add_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
     129             : 
     130           1 :         CATCH_REQUIRE(explicit_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
     131           1 :         CATCH_REQUIRE(explicit_default.is_default_option());
     132             : 
     133           1 :         explicit_default.remove_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
     134             : 
     135           1 :         CATCH_REQUIRE_FALSE(explicit_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
     136           1 :         CATCH_REQUIRE_FALSE(explicit_default.is_default_option());
     137             :     CATCH_END_SECTION()
     138           3 : }
     139             : 
     140             : 
     141             : 
     142           3 : CATCH_TEST_CASE("option_info_flags", "[option_info][valid][flags]")
     143             : {
     144           2 :     CATCH_START_SECTION("Check flags")
     145           2 :         advgetopt::option_info flags("flags", 'f');
     146             : 
     147           1 :         advgetopt::flag_t flag(1);
     148          31 :         do
     149             :         {
     150          32 :             CATCH_REQUIRE(flags.get_flags() == 0);
     151             : 
     152          32 :             advgetopt::flag_t clear(1);
     153         992 :             do
     154             :             {
     155        1024 :                 CATCH_REQUIRE_FALSE(flags.has_flag(clear));
     156        1024 :                 clear <<= 1;
     157             :             }
     158        1024 :             while(clear != 0);
     159             : 
     160          32 :             flags.add_flag(flag);
     161          32 :             CATCH_REQUIRE(flags.has_flag(flag));
     162          32 :             CATCH_REQUIRE(flags.get_flags() == flag);
     163             : 
     164          32 :             advgetopt::flag_t set(1);
     165         992 :             do
     166             :             {
     167        1024 :                 if(set == flag)
     168             :                 {
     169          32 :                     CATCH_REQUIRE(flags.has_flag(set));
     170             :                 }
     171             :                 else
     172             :                 {
     173         992 :                     CATCH_REQUIRE_FALSE(flags.has_flag(set));
     174             :                 }
     175        1024 :                 set <<= 1;
     176             :             }
     177        1024 :             while(set != 0);
     178             : 
     179          32 :             flags.remove_flag(flag);
     180          32 :             CATCH_REQUIRE(flags.get_flags() == 0);
     181             : 
     182          32 :             clear = 1;
     183         992 :             do
     184             :             {
     185        1024 :                 CATCH_REQUIRE_FALSE(flags.has_flag(clear));
     186        1024 :                 clear <<= 1;
     187             :             }
     188        1024 :             while(clear != 0);
     189             : 
     190          32 :             flag <<= 1;
     191             :         }
     192          32 :         while(flag != 0);
     193             : 
     194           1 :         flag = 1;
     195          31 :         do
     196             :         {
     197          32 :             CATCH_REQUIRE(flags.get_flags() == 0);
     198             : 
     199          32 :             advgetopt::flag_t clear(1);
     200         992 :             do
     201             :             {
     202        1024 :                 CATCH_REQUIRE_FALSE(flags.has_flag(clear));
     203        1024 :                 clear <<= 1;
     204             :             }
     205        1024 :             while(clear != 0);
     206             : 
     207          32 :             flags.set_flags(flag);
     208          32 :             CATCH_REQUIRE(flags.has_flag(flag));
     209          32 :             CATCH_REQUIRE(flags.get_flags() == flag);
     210             : 
     211          32 :             advgetopt::flag_t set(1);
     212         992 :             do
     213             :             {
     214        1024 :                 if(set == flag)
     215             :                 {
     216          32 :                     CATCH_REQUIRE(flags.has_flag(set));
     217             :                 }
     218             :                 else
     219             :                 {
     220         992 :                     CATCH_REQUIRE_FALSE(flags.has_flag(set));
     221             :                 }
     222        1024 :                 set <<= 1;
     223             :             }
     224        1024 :             while(set != 0);
     225             : 
     226          32 :             flags.set_flags(0);
     227          32 :             CATCH_REQUIRE(flags.get_flags() == 0);
     228             : 
     229          32 :             clear = 1;
     230         992 :             do
     231             :             {
     232        1024 :                 CATCH_REQUIRE_FALSE(flags.has_flag(clear));
     233        1024 :                 clear <<= 1;
     234             :             }
     235        1024 :             while(clear != 0);
     236             : 
     237          32 :             flag <<= 1;
     238             :         }
     239          32 :         while(flag != 0);
     240             :     CATCH_END_SECTION()
     241           1 : }
     242             : 
     243             : 
     244             : 
     245           3 : CATCH_TEST_CASE("option_info_default", "[option_info][valid][default]")
     246             : {
     247           2 :     CATCH_START_SECTION("Set/remove default")
     248           2 :         advgetopt::option_info with_default("with_default", 'w');
     249             : 
     250           1 :         CATCH_REQUIRE_FALSE(with_default.has_default());
     251           1 :         CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     252           1 :         CATCH_REQUIRE(with_default.get_default().empty());
     253             : 
     254           1 :         with_default.set_default("working");
     255           1 :         CATCH_REQUIRE(with_default.has_default());
     256           1 :         CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     257           1 :         CATCH_REQUIRE(with_default.get_default() == "working");
     258             : 
     259           1 :         with_default.remove_default();
     260           1 :         CATCH_REQUIRE_FALSE(with_default.has_default());
     261           1 :         CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     262           1 :         CATCH_REQUIRE(with_default.get_default().empty());
     263             : 
     264           2 :         std::string const default_value("other");
     265           1 :         with_default.set_default(default_value);
     266           1 :         CATCH_REQUIRE(with_default.has_default());
     267           1 :         CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     268           1 :         CATCH_REQUIRE(with_default.get_default() == default_value);
     269             : 
     270           1 :         with_default.remove_default();
     271           1 :         CATCH_REQUIRE_FALSE(with_default.has_default());
     272           1 :         CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     273           1 :         CATCH_REQUIRE(with_default.get_default().empty());
     274             : 
     275           2 :         std::string const empty_default;
     276           1 :         with_default.set_default(empty_default);
     277           1 :         CATCH_REQUIRE(with_default.has_default());
     278           1 :         CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     279           1 :         CATCH_REQUIRE(with_default.get_default().empty());
     280             : 
     281           1 :         with_default.remove_default();
     282           1 :         CATCH_REQUIRE_FALSE(with_default.has_default());
     283           1 :         CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     284           1 :         CATCH_REQUIRE(with_default.get_default().empty());
     285             : 
     286           1 :         with_default.set_default(nullptr); // no effects
     287           1 :         CATCH_REQUIRE_FALSE(with_default.has_default());
     288           1 :         CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     289           1 :         CATCH_REQUIRE(with_default.get_default().empty());
     290             : 
     291           2 :         std::string const null_value("null works too");
     292           1 :         with_default.set_default(null_value);
     293           1 :         CATCH_REQUIRE(with_default.has_default());
     294           1 :         CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     295           1 :         CATCH_REQUIRE(with_default.get_default() == null_value);
     296             : 
     297           1 :         with_default.set_default(nullptr); // no effects
     298           1 :         CATCH_REQUIRE(with_default.has_default());
     299           1 :         CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     300           1 :         CATCH_REQUIRE(with_default.get_default() == null_value);
     301             : 
     302           1 :         with_default.remove_default();
     303           1 :         CATCH_REQUIRE_FALSE(with_default.has_default());
     304           1 :         CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
     305           1 :         CATCH_REQUIRE(with_default.get_default().empty());
     306             :     CATCH_END_SECTION()
     307           1 : }
     308             : 
     309             : 
     310             : 
     311           3 : CATCH_TEST_CASE("option_info_help", "[option_info][valid][help]")
     312             : {
     313           2 :     CATCH_START_SECTION("Check help")
     314           2 :         advgetopt::option_info help("help", 'h');
     315             : 
     316           1 :         CATCH_REQUIRE(help.get_help().empty());
     317             : 
     318           1 :         help.set_help("help me");
     319           1 :         CATCH_REQUIRE(help.get_help() == "help me");
     320             : 
     321           2 :         std::string const msg("help msg");
     322           1 :         help.set_help(msg);
     323           1 :         CATCH_REQUIRE(help.get_help() == msg);
     324             : 
     325           1 :         help.set_help(nullptr);
     326           1 :         CATCH_REQUIRE(help.get_help() == msg);
     327             : 
     328           1 :         help.set_help("");
     329           1 :         CATCH_REQUIRE(help.get_help().empty());
     330             :     CATCH_END_SECTION()
     331           1 : }
     332             : 
     333             : 
     334             : 
     335           6 : CATCH_TEST_CASE("option_info_validator", "[option_info][valid][validator]")
     336             : {
     337           8 :     CATCH_START_SECTION("Check validator (one value)")
     338           2 :         advgetopt::option_info auto_validate("validator", 'C');
     339             : 
     340           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     341             : 
     342           1 :         auto_validate.set_value(0, "51");
     343           1 :         CATCH_REQUIRE(auto_validate.size() == 1);
     344           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "51");
     345           1 :         CATCH_REQUIRE(auto_validate.get_long(0) == 51);
     346             : 
     347           1 :         auto_validate.set_validator(nullptr);
     348           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     349             : 
     350           2 :         advgetopt::validator::pointer_t integer_validator(advgetopt::validator::create("integer", {"1","2","5","6","8"}));
     351           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"51\" given to parameter --validator is not considered valid.");
     352           1 :         auto_validate.set_validator(integer_validator);
     353           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     354           1 :         CATCH_REQUIRE(auto_validate.get_validator() == integer_validator);
     355             : 
     356           1 :         auto_validate.set_value(0, "6");
     357             : 
     358           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"3\" given to parameter --validator is not considered valid.");
     359           1 :         auto_validate.set_value(0, "3");
     360           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     361             : 
     362           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"11\" given to parameter --validator is not considered valid.");
     363           1 :         auto_validate.set_value(0, "11");
     364           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     365             :     CATCH_END_SECTION()
     366             : 
     367           8 :     CATCH_START_SECTION("Check validator (multiple values)")
     368           2 :         advgetopt::option_info auto_validate("validator", 'C');
     369             : 
     370           1 :         auto_validate.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     371             : 
     372           2 :         advgetopt::string_list_t list{","};
     373           1 :         auto_validate.set_multiple_separators(list);
     374             : 
     375           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     376             : 
     377           1 :         auto_validate.set_value(0, "-15");
     378           1 :         CATCH_REQUIRE(auto_validate.size() == 1);
     379           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "-15");
     380           1 :         CATCH_REQUIRE(auto_validate.get_long(0) == -15);
     381             : 
     382           1 :         auto_validate.set_validator(nullptr);
     383           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     384             : 
     385           2 :         advgetopt::validator::pointer_t integer_validator(advgetopt::validator::create("integer", {"-1","2","5","6","18"}));
     386           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"-15\" given to parameter --validator is not considered valid.");
     387           1 :         auto_validate.set_validator(integer_validator);
     388           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     389           1 :         CATCH_REQUIRE(auto_validate.get_validator() == integer_validator);
     390             : 
     391           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"3\" given to parameter --validator is not considered valid.");
     392           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"11\" given to parameter --validator is not considered valid.");
     393           1 :         auto_validate.set_multiple_value("6,3,18,11");
     394           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     395           1 :         CATCH_REQUIRE(auto_validate.size() == 2);
     396           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "6");
     397           1 :         CATCH_REQUIRE(auto_validate.get_long(0) == 6);
     398           1 :         CATCH_REQUIRE(auto_validate.get_value(1) == "18");
     399           1 :         CATCH_REQUIRE(auto_validate.get_long(1) == 18);
     400             : 
     401           1 :         auto_validate.set_validator(nullptr);
     402           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     403             : 
     404           1 :         auto_validate.set_multiple_value("6,3,18,11");
     405           1 :         CATCH_REQUIRE(auto_validate.size() == 4);
     406           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "6");
     407           1 :         CATCH_REQUIRE(auto_validate.get_long(0) == 6);
     408           1 :         CATCH_REQUIRE(auto_validate.get_value(1) == "3");
     409           1 :         CATCH_REQUIRE(auto_validate.get_long(1) == 3);
     410           1 :         CATCH_REQUIRE(auto_validate.get_value(2) == "18");
     411           1 :         CATCH_REQUIRE(auto_validate.get_long(2) == 18);
     412           1 :         CATCH_REQUIRE(auto_validate.get_value(3) == "11");
     413           1 :         CATCH_REQUIRE(auto_validate.get_long(3) == 11);
     414             :     CATCH_END_SECTION()
     415             : 
     416           8 :     CATCH_START_SECTION("Check integer validator from string (multiple values)")
     417           2 :         advgetopt::option_info auto_validate("validator", 'C');
     418             : 
     419           1 :         auto_validate.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     420             : 
     421           2 :         advgetopt::string_list_t list{","};
     422           1 :         auto_validate.set_multiple_separators(list);
     423             : 
     424           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     425             : 
     426           1 :         auto_validate.set_value(0, "35");
     427           1 :         CATCH_REQUIRE(auto_validate.size() == 1);
     428           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "35");
     429           1 :         CATCH_REQUIRE(auto_validate.get_long(0) == 35);
     430             : 
     431           1 :         auto_validate.set_validator(nullptr);
     432           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     433             : 
     434           1 :         auto_validate.set_validator(std::string());
     435           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     436             : 
     437           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"35\" given to parameter --validator is not considered valid.");
     438           1 :         auto_validate.set_validator("integer(-1,2,5,6,18)");
     439           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     440           1 :         CATCH_REQUIRE(auto_validate.get_validator() != nullptr);
     441           1 :         CATCH_REQUIRE(auto_validate.get_validator()->name() == "integer");
     442             : 
     443           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"3\" given to parameter --validator is not considered valid.");
     444           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"11\" given to parameter --validator is not considered valid.");
     445           1 :         auto_validate.set_multiple_value("6,3,18,11");
     446           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     447           1 :         CATCH_REQUIRE(auto_validate.size() == 2);
     448           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "6");
     449           1 :         CATCH_REQUIRE(auto_validate.get_long(0) == 6);
     450           1 :         CATCH_REQUIRE(auto_validate.get_value(1) == "18");
     451           1 :         CATCH_REQUIRE(auto_validate.get_long(1) == 18);
     452             : 
     453           1 :         auto_validate.set_validator(std::string());
     454           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     455             : 
     456           1 :         auto_validate.set_multiple_value("6,3,18,11");
     457           1 :         CATCH_REQUIRE(auto_validate.size() == 4);
     458           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "6");
     459           1 :         CATCH_REQUIRE(auto_validate.get_long(0) == 6);
     460           1 :         CATCH_REQUIRE(auto_validate.get_value(1) == "3");
     461           1 :         CATCH_REQUIRE(auto_validate.get_long(1) == 3);
     462           1 :         CATCH_REQUIRE(auto_validate.get_value(2) == "18");
     463           1 :         CATCH_REQUIRE(auto_validate.get_long(2) == 18);
     464           1 :         CATCH_REQUIRE(auto_validate.get_value(3) == "11");
     465           1 :         CATCH_REQUIRE(auto_validate.get_long(3) == 11);
     466             :     CATCH_END_SECTION()
     467             : 
     468           8 :     CATCH_START_SECTION("Check regex validator from string (multiple values)")
     469           2 :         advgetopt::option_info auto_validate("validator", 'C');
     470             : 
     471           1 :         auto_validate.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     472             : 
     473           2 :         advgetopt::string_list_t list{","};
     474           1 :         auto_validate.set_multiple_separators(list);
     475             : 
     476           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     477             : 
     478           1 :         auto_validate.set_value(0, "abc");
     479           1 :         CATCH_REQUIRE(auto_validate.size() == 1);
     480           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "abc");
     481             : 
     482           1 :         auto_validate.set_validator(nullptr);
     483           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     484             : 
     485           1 :         auto_validate.set_validator(std::string());
     486           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     487             : 
     488           1 :         auto_validate.set_validator("/^[a-z]+$/");
     489           1 :         CATCH_REQUIRE(auto_validate.get_validator() != nullptr);
     490           1 :         CATCH_REQUIRE(auto_validate.get_validator()->name() == "regex");
     491             : 
     492           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"33\" given to parameter --validator is not considered valid.");
     493           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"45\" given to parameter --validator is not considered valid.");
     494           1 :         auto_validate.set_multiple_value("abc,qqq,33,zac,pop,45");
     495           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     496           1 :         CATCH_REQUIRE(auto_validate.size() == 4);
     497           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "abc");
     498           1 :         CATCH_REQUIRE(auto_validate.get_value(1) == "qqq");
     499           1 :         CATCH_REQUIRE(auto_validate.get_value(2) == "zac");
     500           1 :         CATCH_REQUIRE(auto_validate.get_value(3) == "pop");
     501             : 
     502           1 :         auto_validate.set_validator(std::string());
     503           1 :         CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
     504             : 
     505           1 :         auto_validate.set_multiple_value("abc,-56,zoc");
     506           1 :         CATCH_REQUIRE(auto_validate.size() == 3);
     507           1 :         CATCH_REQUIRE(auto_validate.get_value(0) == "abc");
     508           1 :         CATCH_REQUIRE(auto_validate.get_value(1) == "-56");
     509           1 :         CATCH_REQUIRE(auto_validate.get_value(2) == "zoc");
     510             :     CATCH_END_SECTION()
     511           4 : }
     512             : 
     513             : 
     514             : 
     515             : 
     516           3 : CATCH_TEST_CASE("option_info_alias", "[option_info][valid][alias]")
     517             : {
     518           2 :     CATCH_START_SECTION("Check alias")
     519           2 :         advgetopt::option_info::pointer_t option(std::make_shared<advgetopt::option_info>("option", 'o'));
     520           2 :         advgetopt::option_info alias("alias", 'a');
     521             : 
     522           1 :         CATCH_REQUIRE(alias.get_alias_destination() == nullptr);
     523             : 
     524           1 :         alias.set_alias_destination(option);
     525             : 
     526           1 :         CATCH_REQUIRE(alias.get_alias_destination() == option);
     527             :     CATCH_END_SECTION()
     528           1 : }
     529             : 
     530             : 
     531             : 
     532           3 : CATCH_TEST_CASE("option_info_multiple_separators", "[option_info][valid][separators][multiple]")
     533             : {
     534           2 :     CATCH_START_SECTION("Check multiple separators")
     535           2 :         advgetopt::option_info separators("names", 'n');
     536             : 
     537           1 :         separators.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     538             : 
     539           1 :         CATCH_REQUIRE(separators.get_multiple_separators().empty());
     540             : 
     541           1 :         separators.set_multiple_separators(nullptr);
     542           1 :         CATCH_REQUIRE(separators.get_multiple_separators().empty());
     543             : 
     544           1 :         separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
     545           1 :         CATCH_REQUIRE(separators.size() == 1);
     546           1 :         CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
     547             : 
     548           2 :         advgetopt::string_list_t empty_list;
     549           1 :         separators.set_multiple_separators(empty_list);
     550           1 :         CATCH_REQUIRE(separators.get_multiple_separators().empty());
     551             : 
     552           1 :         separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
     553           1 :         CATCH_REQUIRE(separators.size() == 1);
     554           1 :         CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
     555             : 
     556             :         char const * const empty_separator_list[]{
     557             :             nullptr
     558           1 :         };
     559           1 :         separators.set_multiple_separators(empty_separator_list);
     560           1 :         CATCH_REQUIRE(separators.get_multiple_separators().empty());
     561             : 
     562           1 :         separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
     563           1 :         CATCH_REQUIRE(separators.size() == 1);
     564           1 :         CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
     565             : 
     566             :         char const * const separator_list[]{
     567             :             ",",
     568             :             ";",
     569             :             " ",
     570             :             "^",
     571             :             nullptr
     572           1 :         };
     573           1 :         separators.set_multiple_separators(separator_list);
     574           1 :         CATCH_REQUIRE(separators.get_multiple_separators().size() == 4);
     575             : 
     576           1 :         separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
     577           1 :         CATCH_REQUIRE(separators.size() == 5);
     578           1 :         CATCH_REQUIRE(separators.get_value(0) == "n1");
     579           1 :         CATCH_REQUIRE(separators.get_value(1) == "n2");
     580           1 :         CATCH_REQUIRE(separators.get_value(2) == "n3");
     581           1 :         CATCH_REQUIRE(separators.get_value(3) == "n4");
     582           1 :         CATCH_REQUIRE(separators.get_value(4) == "n5");
     583             : 
     584           1 :         separators.set_multiple_separators(empty_separator_list);
     585           1 :         CATCH_REQUIRE(separators.get_multiple_separators().empty());
     586             : 
     587           1 :         separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
     588           1 :         CATCH_REQUIRE(separators.size() == 1);
     589           1 :         CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
     590             : 
     591             :         advgetopt::string_list_t list{
     592             :             ",",
     593             :             ";",
     594             :             " ",
     595             :             "^"
     596           2 :         };
     597           1 :         separators.set_multiple_separators(list);
     598           1 :         CATCH_REQUIRE(separators.get_multiple_separators().size() == 4);
     599             : 
     600           1 :         separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
     601           1 :         CATCH_REQUIRE(separators.size() == 5);
     602           1 :         CATCH_REQUIRE(separators.get_value(0) == "n1");
     603           1 :         CATCH_REQUIRE(separators.get_value(1) == "n2");
     604           1 :         CATCH_REQUIRE(separators.get_value(2) == "n3");
     605           1 :         CATCH_REQUIRE(separators.get_value(3) == "n4");
     606           1 :         CATCH_REQUIRE(separators.get_value(4) == "n5");
     607             : 
     608           1 :         separators.set_multiple_separators(empty_list);
     609           1 :         CATCH_REQUIRE(separators.get_multiple_separators().empty());
     610             : 
     611           1 :         separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
     612           1 :         CATCH_REQUIRE(separators.size() == 1);
     613           1 :         CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
     614             :     CATCH_END_SECTION()
     615           1 : }
     616             : 
     617             : 
     618             : 
     619           6 : CATCH_TEST_CASE("option_info_add_value", "[option_info][valid][add][multiple]")
     620             : {
     621           8 :     CATCH_START_SECTION("Add value, verify lock (add/remove flag explicitly)")
     622           2 :         advgetopt::option_info one_value("names", 'n');
     623             : 
     624           1 :         CATCH_REQUIRE(one_value.size() == 0);
     625             : 
     626           1 :         one_value.add_value("value one");
     627           1 :         CATCH_REQUIRE(one_value.size() == 1);
     628           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value one");
     629             : 
     630           1 :         one_value.add_value("value two");
     631           1 :         CATCH_REQUIRE(one_value.size() == 1);
     632           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value two");
     633             : 
     634           1 :         one_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
     635             : 
     636           1 :         one_value.add_value("value three");
     637           1 :         CATCH_REQUIRE(one_value.size() == 1);
     638           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value two");
     639             : 
     640           1 :         one_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
     641             : 
     642           1 :         one_value.add_value("value four");
     643           1 :         CATCH_REQUIRE(one_value.size() == 1);
     644           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value four");
     645             : 
     646           1 :         one_value.reset();
     647           1 :         CATCH_REQUIRE(one_value.size() == 0);
     648             : 
     649             :         // to verify that the f_integer was reset we kind of very much
     650             :         // have to re-add a value
     651             :         //
     652           1 :         one_value.set_value(0, "value one");
     653           1 :         CATCH_REQUIRE(one_value.size() == 1);
     654           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value one");
     655             :     CATCH_END_SECTION()
     656             : 
     657           8 :     CATCH_START_SECTION("Add value, verify integer")
     658           2 :         advgetopt::option_info one_value("names", 'n');
     659             : 
     660           1 :         CATCH_REQUIRE(one_value.size() == 0);
     661             : 
     662           1 :         one_value.add_value("123");
     663           1 :         CATCH_REQUIRE(one_value.size() == 1);
     664           1 :         CATCH_REQUIRE(one_value.get_value(0) == "123");
     665           1 :         CATCH_REQUIRE(one_value.get_long(0) == 123);
     666             : 
     667           1 :         one_value.add_value("456");
     668           1 :         CATCH_REQUIRE(one_value.size() == 1);
     669           1 :         CATCH_REQUIRE(one_value.get_value(0) == "456");
     670           1 :         CATCH_REQUIRE(one_value.get_long(0) == 456);
     671             : 
     672           1 :         one_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
     673             : 
     674           1 :         one_value.add_value("789");
     675           1 :         CATCH_REQUIRE(one_value.size() == 1);
     676           1 :         CATCH_REQUIRE(one_value.get_value(0) == "456");
     677           1 :         CATCH_REQUIRE(one_value.get_long(0) == 456);
     678             : 
     679           1 :         one_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
     680             : 
     681           1 :         one_value.add_value("505");
     682           1 :         CATCH_REQUIRE(one_value.size() == 1);
     683           1 :         CATCH_REQUIRE(one_value.get_value(0) == "505");
     684           1 :         CATCH_REQUIRE(one_value.get_long(0) == 505);
     685             : 
     686           1 :         one_value.reset();
     687           1 :         CATCH_REQUIRE(one_value.size() == 0);
     688             : 
     689             :         // to verify that the f_integer was reset we kind of very much
     690             :         // have to re-add a value
     691             :         //
     692           1 :         one_value.set_value(0, "123");
     693           1 :         CATCH_REQUIRE(one_value.size() == 1);
     694           1 :         CATCH_REQUIRE(one_value.get_value(0) == "123");
     695           1 :         CATCH_REQUIRE(one_value.get_long(0) == 123);
     696             :     CATCH_END_SECTION()
     697             : 
     698           8 :     CATCH_START_SECTION("Add value, verify multiple strings")
     699           2 :         advgetopt::option_info multi_value("names", 'n');
     700             : 
     701           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     702             : 
     703           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     704             : 
     705           1 :         multi_value.add_value("value one");
     706           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     707           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     708             : 
     709           1 :         multi_value.add_value("value two");
     710           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     711           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     712           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "value two");
     713             : 
     714           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
     715             : 
     716           1 :         multi_value.add_value("value three");
     717           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     718           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     719           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "value two");
     720             : 
     721           1 :         multi_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
     722             : 
     723           1 :         multi_value.add_value("value four");
     724           1 :         CATCH_REQUIRE(multi_value.size() == 3);
     725           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     726           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "value two");
     727           1 :         CATCH_REQUIRE(multi_value.get_value(2) == "value four");
     728             : 
     729           1 :         multi_value.reset();
     730           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     731             : 
     732             :         // to verify that the f_integer was reset we kind of very much
     733             :         // have to re-add a value
     734             :         //
     735           1 :         multi_value.set_value(0, "value one");
     736           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     737           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     738             :     CATCH_END_SECTION()
     739             : 
     740           8 :     CATCH_START_SECTION("Add value, verify multiple integers")
     741           2 :         advgetopt::option_info multi_value("names", 'n');
     742             : 
     743           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     744             : 
     745           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     746             : 
     747           1 :         multi_value.add_value("123");
     748           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     749           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     750           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     751             : 
     752           1 :         multi_value.add_value("456");
     753           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     754           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     755           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     756           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "456");
     757           1 :         CATCH_REQUIRE(multi_value.get_long(1) == 456);
     758             : 
     759           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
     760             : 
     761           1 :         multi_value.add_value("789");
     762           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     763           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     764           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     765           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "456");
     766           1 :         CATCH_REQUIRE(multi_value.get_long(1) == 456);
     767             : 
     768           1 :         multi_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
     769             : 
     770           1 :         multi_value.add_value("505");
     771           1 :         CATCH_REQUIRE(multi_value.size() == 3);
     772           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     773           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     774           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "456");
     775           1 :         CATCH_REQUIRE(multi_value.get_long(1) == 456);
     776           1 :         CATCH_REQUIRE(multi_value.get_value(2) == "505");
     777           1 :         CATCH_REQUIRE(multi_value.get_long(2) == 505);
     778             : 
     779           1 :         multi_value.reset();
     780           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     781             : 
     782             :         // to verify that the f_integer was reset we kind of very much
     783             :         // have to re-add a value
     784             :         //
     785           1 :         multi_value.set_value(0, "123");
     786           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     787           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     788           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     789             :     CATCH_END_SECTION()
     790           4 : }
     791             : 
     792             : 
     793             : 
     794           6 : CATCH_TEST_CASE("option_info_set_value", "[option_info][valid][set][multiple]")
     795             : {
     796           8 :     CATCH_START_SECTION("Set value, verify lock (use lock()/unlock() functions)")
     797           2 :         advgetopt::option_info one_value("names", 'n');
     798             : 
     799           1 :         CATCH_REQUIRE(one_value.size() == 0);
     800             : 
     801           1 :         one_value.set_value(0, "value one");
     802           1 :         CATCH_REQUIRE(one_value.size() == 1);
     803           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value one");
     804             : 
     805           1 :         one_value.set_value(0, "value two");
     806           1 :         CATCH_REQUIRE(one_value.size() == 1);
     807           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value two");
     808             : 
     809           1 :         one_value.lock();
     810             : 
     811           1 :         one_value.set_value(0, "value three");
     812           1 :         CATCH_REQUIRE(one_value.size() == 1);
     813           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value two");
     814             : 
     815           1 :         one_value.unlock();
     816             : 
     817           1 :         one_value.set_value(0, "value four");
     818           1 :         CATCH_REQUIRE(one_value.size() == 1);
     819           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value four");
     820             : 
     821           1 :         one_value.reset();
     822           1 :         CATCH_REQUIRE(one_value.size() == 0);
     823             : 
     824             :         // to verify that the f_integer was reset we kind of very much
     825             :         // have to re-add a value
     826             :         //
     827           1 :         one_value.set_value(0, "value one");
     828           1 :         CATCH_REQUIRE(one_value.size() == 1);
     829           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value one");
     830             :     CATCH_END_SECTION()
     831             : 
     832           8 :     CATCH_START_SECTION("Set value, verify integer")
     833           2 :         advgetopt::option_info one_value("names", 'n');
     834             : 
     835           1 :         CATCH_REQUIRE(one_value.size() == 0);
     836             : 
     837           1 :         one_value.set_value(0, "123");
     838           1 :         CATCH_REQUIRE(one_value.size() == 1);
     839           1 :         CATCH_REQUIRE(one_value.get_value(0) == "123");
     840           1 :         CATCH_REQUIRE(one_value.get_long(0) == 123);
     841             : 
     842           1 :         one_value.set_value(0, "456");
     843           1 :         CATCH_REQUIRE(one_value.size() == 1);
     844           1 :         CATCH_REQUIRE(one_value.get_value(0) == "456");
     845           1 :         CATCH_REQUIRE(one_value.get_long(0) == 456);
     846             : 
     847           1 :         one_value.lock();
     848             : 
     849           1 :         one_value.set_value(0, "789");
     850           1 :         CATCH_REQUIRE(one_value.size() == 1);
     851           1 :         CATCH_REQUIRE(one_value.get_value(0) == "456");
     852           1 :         CATCH_REQUIRE(one_value.get_long(0) == 456);
     853             : 
     854           1 :         one_value.unlock();
     855             : 
     856           1 :         one_value.set_value(0, "505");
     857           1 :         CATCH_REQUIRE(one_value.size() == 1);
     858           1 :         CATCH_REQUIRE(one_value.get_value(0) == "505");
     859           1 :         CATCH_REQUIRE(one_value.get_long(0) == 505);
     860             : 
     861           1 :         one_value.reset();
     862           1 :         CATCH_REQUIRE(one_value.size() == 0);
     863             : 
     864             :         // to verify that the f_integer was reset we kind of very much
     865             :         // have to re-add a value
     866             :         //
     867           1 :         one_value.set_value(0, "123");
     868           1 :         CATCH_REQUIRE(one_value.size() == 1);
     869           1 :         CATCH_REQUIRE(one_value.get_value(0) == "123");
     870           1 :         CATCH_REQUIRE(one_value.get_long(0) == 123);
     871             :     CATCH_END_SECTION()
     872             : 
     873           8 :     CATCH_START_SECTION("Set value, verify multiple strings (with MULTIPLE & lock(false))")
     874           2 :         advgetopt::option_info multi_value("names", 'n');
     875             : 
     876           1 :         multi_value.lock(false);
     877             : 
     878           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     879             : 
     880           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     881             : 
     882           1 :         multi_value.set_value(0, "value one");
     883           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     884           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     885             : 
     886           1 :         multi_value.set_value(1, "value two");
     887           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     888           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     889           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "value two");
     890             : 
     891           1 :         multi_value.lock(false);
     892             : 
     893           1 :         multi_value.set_value(2, "value three");
     894           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     895           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     896           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "value two");
     897             : 
     898           1 :         multi_value.unlock();
     899             : 
     900           1 :         multi_value.set_value(2, "value four");
     901           1 :         CATCH_REQUIRE(multi_value.size() == 3);
     902           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     903           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "value two");
     904           1 :         CATCH_REQUIRE(multi_value.get_value(2) == "value four");
     905             : 
     906           1 :         multi_value.reset();
     907           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     908             : 
     909             :         // to verify that the f_integer was reset we kind of very much
     910             :         // have to re-add a value
     911             :         //
     912           1 :         multi_value.set_value(0, "value one");
     913           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     914           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
     915             :     CATCH_END_SECTION()
     916             : 
     917           8 :     CATCH_START_SECTION("Set value, verify multiple integers (with MULTIPLE & lock(false))")
     918           2 :         advgetopt::option_info multi_value("names", 'n');
     919             : 
     920           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     921             : 
     922           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
     923             : 
     924           1 :         multi_value.lock(false);
     925             : 
     926           1 :         multi_value.set_value(0, "123");
     927           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     928           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     929           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     930             : 
     931           1 :         multi_value.set_value(1, "456");
     932           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     933           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     934           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     935           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "456");
     936           1 :         CATCH_REQUIRE(multi_value.get_long(1) == 456);
     937             : 
     938           1 :         multi_value.lock(false);
     939             : 
     940           1 :         multi_value.set_value(2, "789");
     941           1 :         CATCH_REQUIRE(multi_value.size() == 2);
     942           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     943           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     944           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "456");
     945           1 :         CATCH_REQUIRE(multi_value.get_long(1) == 456);
     946             : 
     947           1 :         multi_value.unlock();
     948             : 
     949           1 :         multi_value.set_value(2, "505");
     950           1 :         CATCH_REQUIRE(multi_value.size() == 3);
     951           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     952           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     953           1 :         CATCH_REQUIRE(multi_value.get_value(1) == "456");
     954           1 :         CATCH_REQUIRE(multi_value.get_long(1) == 456);
     955           1 :         CATCH_REQUIRE(multi_value.get_value(2) == "505");
     956           1 :         CATCH_REQUIRE(multi_value.get_long(2) == 505);
     957             : 
     958           1 :         multi_value.reset();
     959           1 :         CATCH_REQUIRE(multi_value.size() == 0);
     960             : 
     961             :         // to verify that the f_integer was reset we kind of very much
     962             :         // have to re-add a value
     963             :         //
     964           1 :         multi_value.set_value(0, "123");
     965           1 :         CATCH_REQUIRE(multi_value.size() == 1);
     966           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
     967           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
     968             :     CATCH_END_SECTION()
     969           4 : }
     970             : 
     971             : 
     972             : 
     973           6 : CATCH_TEST_CASE("option_info_section_functions", "[option_info][valid][add][section]")
     974             : {
     975           8 :     CATCH_START_SECTION("Value without sections")
     976           2 :         advgetopt::option_info value("no-sections", 'z');
     977             : 
     978           1 :         CATCH_REQUIRE(value.get_basename() == "no-sections");
     979           1 :         CATCH_REQUIRE(value.get_section_name() == std::string());
     980           1 :         CATCH_REQUIRE(value.get_section_name_list().empty());
     981             :     CATCH_END_SECTION()
     982             : 
     983           8 :     CATCH_START_SECTION("Value with one section")
     984           2 :         advgetopt::option_info value("one::section", 'o');
     985             : 
     986           1 :         CATCH_REQUIRE(value.get_basename() == "section");
     987           1 :         CATCH_REQUIRE(value.get_section_name() == "one");
     988           2 :         advgetopt::string_list_t sections(value.get_section_name_list());
     989           1 :         CATCH_REQUIRE(sections.size() == 1);
     990           1 :         CATCH_REQUIRE(sections[0] == "one");
     991             :     CATCH_END_SECTION()
     992             : 
     993           8 :     CATCH_START_SECTION("Value with two sections")
     994           2 :         advgetopt::option_info value("one::two::section", 't');
     995             : 
     996           1 :         CATCH_REQUIRE(value.get_basename() == "section");
     997           1 :         CATCH_REQUIRE(value.get_section_name() == "one::two");
     998           2 :         advgetopt::string_list_t sections(value.get_section_name_list());
     999           1 :         CATCH_REQUIRE(sections.size() == 2);
    1000           1 :         CATCH_REQUIRE(sections[0] == "one");
    1001           1 :         CATCH_REQUIRE(sections[1] == "two");
    1002             :     CATCH_END_SECTION()
    1003             : 
    1004           8 :     CATCH_START_SECTION("Value with three sections")
    1005           2 :         advgetopt::option_info value("s1::s2::s3::section", 'f');
    1006             : 
    1007           1 :         CATCH_REQUIRE(value.get_basename() == "section");
    1008           1 :         CATCH_REQUIRE(value.get_section_name() == "s1::s2::s3");
    1009           2 :         advgetopt::string_list_t sections(value.get_section_name_list());
    1010           1 :         CATCH_REQUIRE(sections.size() == 3);
    1011           1 :         CATCH_REQUIRE(sections[0] == "s1");
    1012           1 :         CATCH_REQUIRE(sections[1] == "s2");
    1013           1 :         CATCH_REQUIRE(sections[2] == "s3");
    1014             :     CATCH_END_SECTION()
    1015           4 : }
    1016             : 
    1017             : 
    1018             : 
    1019             : 
    1020           3 : CATCH_TEST_CASE("redefine_option_short_name", "[options][valid][config]")
    1021             : {
    1022           2 :     CATCH_START_SECTION("Test adding '-<delta>' to '--config-dir'")
    1023             :     {
    1024             :         advgetopt::option const options[] =
    1025             :         {
    1026             :             advgetopt::define_option(
    1027             :                   advgetopt::Name("group")
    1028             :                 , advgetopt::ShortName('g')
    1029             :                 , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
    1030             :                 , advgetopt::Help("group name.")
    1031             :             ),
    1032             :             advgetopt::end_options()
    1033           1 :         };
    1034             : 
    1035           1 :         advgetopt::options_environment environment_options;
    1036           1 :         environment_options.f_project_name = "unittest";
    1037           1 :         environment_options.f_options = options;
    1038           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1039           1 :         environment_options.f_configuration_filename = "snaplog.conf";
    1040           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    1041             : 
    1042             :         char const * cargv[] =
    1043             :         {
    1044             :             "/usr/bin/arguments",
    1045             :             "-g",
    1046             :             "m2osw",
    1047             :             "-L",
    1048             :             "-\xE2\xB5\xA0",        // Delta character
    1049             :             "/opt/advgetopt/config",
    1050             :             nullptr
    1051           1 :         };
    1052           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
    1053           1 :         char ** argv = const_cast<char **>(cargv);
    1054             : 
    1055           2 :         advgetopt::getopt opt(environment_options);
    1056           1 :         opt.parse_program_name(argv);
    1057             : 
    1058           1 :         CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
    1059           1 :         opt.set_short_name("config-dir", 0x2D60);
    1060             : 
    1061           1 :         opt.parse_arguments(argc, argv);
    1062             : 
    1063             :         // check that the result is valid
    1064             : 
    1065             :         // an invalid parameter, MUST NOT EXIST
    1066           1 :         CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
    1067           1 :         CATCH_REQUIRE(opt.get_option('Z') == nullptr);
    1068           1 :         CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
    1069           1 :         CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
    1070           1 :         CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
    1071             : 
    1072             :         // the valid parameter
    1073           1 :         CATCH_REQUIRE(opt.get_option("group") != nullptr);
    1074           1 :         CATCH_REQUIRE(opt.get_option('g') == opt.get_option("group"));
    1075           1 :         CATCH_REQUIRE(opt.is_defined("group"));
    1076           1 :         CATCH_REQUIRE(opt.get_string("group") == "m2osw");
    1077           1 :         CATCH_REQUIRE(opt.get_string("group", 0) == "m2osw");
    1078           1 :         CATCH_REQUIRE(opt.get_default("group").empty());
    1079           1 :         CATCH_REQUIRE(opt.size("group") == 1);
    1080             : 
    1081             :         // the license system parameter
    1082           1 :         CATCH_REQUIRE(opt.get_option("license") != nullptr);
    1083           1 :         CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
    1084           1 :         CATCH_REQUIRE(opt.is_defined("license"));
    1085           1 :         CATCH_REQUIRE(opt.get_default("license").empty());
    1086           1 :         CATCH_REQUIRE(opt.size("license") == 1);
    1087             : 
    1088             :         // the config-dir system parameter
    1089           1 :         CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
    1090           1 :         CATCH_REQUIRE(opt.get_option(static_cast<advgetopt::short_name_t>(0x2D60)) == opt.get_option("config-dir"));
    1091           1 :         CATCH_REQUIRE(opt.is_defined("config-dir"));
    1092           1 :         CATCH_REQUIRE(opt.get_default("config-dir").empty());
    1093           1 :         CATCH_REQUIRE(opt.size("config-dir") == 1);
    1094           1 :         CATCH_REQUIRE(opt.get_string("config-dir") == "/opt/advgetopt/config");
    1095             : 
    1096             :         // other parameters
    1097           1 :         CATCH_REQUIRE(opt.get_program_name() == "arguments");
    1098           1 :         CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
    1099             :     }
    1100             :     CATCH_END_SECTION()
    1101           1 : }
    1102             : 
    1103             : 
    1104             : 
    1105             : 
    1106             : 
    1107             : 
    1108             : 
    1109             : 
    1110             : 
    1111          16 : CATCH_TEST_CASE("invalid_option_info", "[option_info][invalid]")
    1112             : {
    1113          28 :     CATCH_START_SECTION("No name")
    1114           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1115             :                   advgetopt::option_info("")
    1116             :                 , advgetopt::getopt_exception_logic
    1117             :                 , Catch::Matchers::ExceptionMessage(
    1118             :                           "option_info::option_info(): all options must at least have a long name."));
    1119             : 
    1120           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1121             :                   advgetopt::option_info("", 'v')
    1122             :                 , advgetopt::getopt_exception_logic
    1123             :                 , Catch::Matchers::ExceptionMessage(
    1124             :                           "option_info::option_info(): all options must at least have a long name (short name: 'v'.)"));
    1125             : 
    1126           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1127             :                   advgetopt::option_info(std::string())
    1128             :                 , advgetopt::getopt_exception_logic
    1129             :                 , Catch::Matchers::ExceptionMessage(
    1130             :                           "option_info::option_info(): all options must at least have a long name."));
    1131             : 
    1132           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1133             :                   advgetopt::option_info(std::string(), 'p')
    1134             :                 , advgetopt::getopt_exception_logic
    1135             :                 , Catch::Matchers::ExceptionMessage(
    1136             :                           "option_info::option_info(): all options must at least have a long name (short name: 'p'.)"));
    1137             :     CATCH_END_SECTION()
    1138             : 
    1139          28 :     CATCH_START_SECTION("Default with short name")
    1140           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1141             :                   advgetopt::option_info("--", 'f')
    1142             :                 , advgetopt::getopt_exception_logic
    1143             :                 , Catch::Matchers::ExceptionMessage(
    1144             :                           "option_info::option_info(): the default parameter \"--\" cannot include a short name ('f'.)"));
    1145             :     CATCH_END_SECTION()
    1146             : 
    1147          28 :     CATCH_START_SECTION("Long name cannot start with a dash (-)")
    1148           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1149             :                   advgetopt::option_info("--dashes")
    1150             :                 , advgetopt::getopt_exception_logic
    1151             :                 , Catch::Matchers::ExceptionMessage(
    1152             :                           "option_info::option_info(): an option cannot start with a dash (-), \"--dashes\" is not valid."));
    1153             :     CATCH_END_SECTION()
    1154             : 
    1155          28 :     CATCH_START_SECTION("Short name cannot be a dash (-)")
    1156           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1157             :                   advgetopt::option_info("dash", '-')
    1158             :                 , advgetopt::getopt_exception_logic
    1159             :                 , Catch::Matchers::ExceptionMessage(
    1160             :                           "option_info::option_info(): the short name of an option cannot be the dash (-)."));
    1161             :     CATCH_END_SECTION()
    1162             : 
    1163          28 :     CATCH_START_SECTION("Get value when undefined")
    1164           2 :         advgetopt::option_info verbose("verbose", 'v');
    1165           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1166             :                   verbose.get_value()
    1167             :                 , advgetopt::getopt_exception_undefined
    1168             :                 , Catch::Matchers::ExceptionMessage(
    1169             :                           "option_info::get_value(): no value at index 0 (idx >= 0) for --verbose so you can't get this value."));
    1170             :     CATCH_END_SECTION()
    1171             : 
    1172          28 :     CATCH_START_SECTION("Get long when undefined")
    1173           2 :         advgetopt::option_info verbose("verbose", 'v');
    1174           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1175             :                   verbose.get_long()
    1176             :                 , advgetopt::getopt_exception_undefined
    1177             :                 , Catch::Matchers::ExceptionMessage(
    1178             :                           "option_info::get_long(): no value at index 0 (idx >= 0) for --verbose so you can't get this value."));
    1179             :     CATCH_END_SECTION()
    1180             : 
    1181          28 :     CATCH_START_SECTION("Check alias of alias")
    1182           2 :         advgetopt::option_info::pointer_t option(std::make_shared<advgetopt::option_info>("option", 'o'));
    1183           2 :         advgetopt::option_info alias("alias", 'a');
    1184             : 
    1185           1 :         option->add_flag(advgetopt::GETOPT_FLAG_ALIAS);
    1186             : 
    1187           1 :         CATCH_REQUIRE(alias.get_alias_destination() == nullptr);
    1188             : 
    1189           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1190             :                   alias.set_alias_destination(option)
    1191             :                 , advgetopt::getopt_exception_invalid
    1192             :                 , Catch::Matchers::ExceptionMessage(
    1193             :                           "option_info::set_alias(): you can't set an alias as"
    1194             :                           " an alias of another option."));
    1195             : 
    1196           1 :         CATCH_REQUIRE(alias.get_alias_destination() == nullptr);
    1197             :     CATCH_END_SECTION()
    1198             : 
    1199          28 :     CATCH_START_SECTION("Set value, verify multiple strings (with MULTIPLE)")
    1200           2 :         advgetopt::option_info multi_value("names", 'n');
    1201             : 
    1202           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
    1203             : 
    1204           1 :         CATCH_REQUIRE(multi_value.size() == 0);
    1205             : 
    1206           1 :         multi_value.set_value(0, "value one");
    1207           1 :         CATCH_REQUIRE(multi_value.size() == 1);
    1208           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
    1209             : 
    1210           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1211             :                   multi_value.set_value(2, "value two")
    1212             :                 , advgetopt::getopt_exception_logic
    1213             :                 , Catch::Matchers::ExceptionMessage(
    1214             :                     "option_info::set_value(): no value at index 2 and it is not the last available index + 1 (idx > 1) so you can't set this value (try add_value() maybe?)."));
    1215             : 
    1216           1 :         CATCH_REQUIRE(multi_value.size() == 1);
    1217           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "value one");
    1218             :     CATCH_END_SECTION()
    1219             : 
    1220          28 :     CATCH_START_SECTION("Set value, verify multiple integers (with MULTIPLE)")
    1221           2 :         advgetopt::option_info multi_value("names", 'n');
    1222             : 
    1223           1 :         multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
    1224             : 
    1225           1 :         CATCH_REQUIRE(multi_value.size() == 0);
    1226             : 
    1227           1 :         multi_value.set_value(0, "123");
    1228           1 :         CATCH_REQUIRE(multi_value.size() == 1);
    1229           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
    1230           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
    1231             : 
    1232           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1233             :                   multi_value.set_value(2, "456")
    1234             :                 , advgetopt::getopt_exception_logic
    1235             :                 , Catch::Matchers::ExceptionMessage(
    1236             :                     "option_info::set_value(): no value at index 2 and it is not the last available index + 1 (idx > 1) so you can't set this value (try add_value() maybe?)."));
    1237             : 
    1238           1 :         CATCH_REQUIRE(multi_value.size() == 1);
    1239           1 :         CATCH_REQUIRE(multi_value.get_value(0) == "123");
    1240           1 :         CATCH_REQUIRE(multi_value.get_long(0) == 123);
    1241             :     CATCH_END_SECTION()
    1242             : 
    1243          28 :     CATCH_START_SECTION("Set value, verify multiple strings (without MULTIPLE)")
    1244           2 :         advgetopt::option_info one_value("names", 'n');
    1245             : 
    1246           1 :         CATCH_REQUIRE(one_value.size() == 0);
    1247             : 
    1248           1 :         one_value.set_value(0, "value one");
    1249           1 :         CATCH_REQUIRE(one_value.size() == 1);
    1250           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value one");
    1251             : 
    1252           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1253             :                   one_value.set_value(1, "value two")
    1254             :                 , advgetopt::getopt_exception_logic
    1255             :                 , Catch::Matchers::ExceptionMessage(
    1256             :                     "option_info::set_value(): single value option \"--names\" does not accepts index 1 which is not 0."));
    1257             : 
    1258           1 :         CATCH_REQUIRE(one_value.size() == 1);
    1259           1 :         CATCH_REQUIRE(one_value.get_value(0) == "value one");
    1260             :     CATCH_END_SECTION()
    1261             : 
    1262          28 :     CATCH_START_SECTION("Set value, verify multiple integers (without MULTIPLE)")
    1263           2 :         advgetopt::option_info one_value("names", 'n');
    1264             : 
    1265           1 :         CATCH_REQUIRE(one_value.size() == 0);
    1266             : 
    1267           1 :         one_value.set_value(0, "123");
    1268           1 :         CATCH_REQUIRE(one_value.size() == 1);
    1269           1 :         CATCH_REQUIRE(one_value.get_value(0) == "123");
    1270           1 :         CATCH_REQUIRE(one_value.get_long(0) == 123);
    1271             : 
    1272           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1273             :                   one_value.set_value(1, "456")
    1274             :                 , advgetopt::getopt_exception_logic
    1275             :                 , Catch::Matchers::ExceptionMessage(
    1276             :                     "option_info::set_value(): single value option \"--names\" does not accepts index 1 which is not 0."));
    1277             : 
    1278           1 :         CATCH_REQUIRE(one_value.size() == 1);
    1279           1 :         CATCH_REQUIRE(one_value.get_value(0) == "123");
    1280           1 :         CATCH_REQUIRE(one_value.get_long(0) == 123);
    1281             :     CATCH_END_SECTION()
    1282             : 
    1283          28 :     CATCH_START_SECTION("Long number too large")
    1284           2 :         advgetopt::option_info size("size", 's');
    1285             : 
    1286           1 :         CATCH_REQUIRE(size.size() == 0);
    1287             : 
    1288             :         // really too large
    1289             :         //
    1290           1 :         size.set_value(0, "100000000000000000000");
    1291           1 :         CATCH_REQUIRE(size.size() == 1);
    1292           1 :         CATCH_REQUIRE(size.get_value(0) == "100000000000000000000");
    1293             : 
    1294           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (100000000000000000000) in parameter --size at offset 0.");
    1295           1 :         CATCH_REQUIRE(size.get_long(0) == -1);
    1296           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    1297             : 
    1298             :         // too large by 1
    1299             :         //
    1300           1 :         size.set_value(0, "9223372036854775808");
    1301           1 :         CATCH_REQUIRE(size.size() == 1);
    1302           1 :         CATCH_REQUIRE(size.get_value(0) == "9223372036854775808");
    1303             : 
    1304           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (9223372036854775808) in parameter --size at offset 0.");
    1305           1 :         CATCH_REQUIRE(size.get_long(0) == -1);
    1306           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    1307             : 
    1308             :         // too small by 1
    1309             :         //
    1310           1 :         size.set_value(0, "-9223372036854775809");
    1311           1 :         CATCH_REQUIRE(size.size() == 1);
    1312           1 :         CATCH_REQUIRE(size.get_value(0) == "-9223372036854775809");
    1313             : 
    1314           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (-9223372036854775809) in parameter --size at offset 0.");
    1315           1 :         CATCH_REQUIRE(size.get_long(0) == -1);
    1316           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    1317             : 
    1318             :         // not a valid number
    1319             :         //
    1320           1 :         size.set_value(0, "97 potatoes");
    1321           1 :         CATCH_REQUIRE(size.size() == 1);
    1322           1 :         CATCH_REQUIRE(size.get_value(0) == "97 potatoes");
    1323             : 
    1324           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (97 potatoes) in parameter --size at offset 0.");
    1325           1 :         CATCH_REQUIRE(size.get_long(0) == -1);
    1326           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
    1327             :     CATCH_END_SECTION()
    1328             : 
    1329          28 :     CATCH_START_SECTION("Check multiple separators")
    1330           2 :         advgetopt::option_info separators("names", 'n');
    1331             : 
    1332             :         advgetopt::string_list_t list{
    1333             :             ",",
    1334             :             ";",
    1335             :             " ",
    1336             :             "^"
    1337           2 :         };
    1338           1 :         separators.set_multiple_separators(list);
    1339             : 
    1340           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1341             :                   separators.set_multiple_value("n1,n2;n3 n4 ^ n5")
    1342             :                 , advgetopt::getopt_exception_logic
    1343             :                 , Catch::Matchers::ExceptionMessage(
    1344             :                     "option_info::set_multiple_value(): parameter --names expects zero or one parameter."
    1345             :                     " The set_multiple_value() function should not be called with parameters that only accept one value."));
    1346             : 
    1347           1 :         CATCH_REQUIRE(separators.size() == 0);
    1348             :     CATCH_END_SECTION()
    1349             : 
    1350          28 :     CATCH_START_SECTION("Check multiple separators")
    1351           2 :         advgetopt::option_info auto_validate("validator", 'C');
    1352           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1353             :                   auto_validate.set_validator("regex('^[a-z]+$/'")
    1354             :                 , advgetopt::getopt_exception_logic
    1355             :                 , Catch::Matchers::ExceptionMessage(
    1356             :                     "invalid validator parameter definition: \"regex('^[a-z]+$/'\", the ')' is missing."));
    1357             :     CATCH_END_SECTION()
    1358          14 : }
    1359             : 
    1360             : 
    1361             : 
    1362             : 
    1363           4 : CATCH_TEST_CASE("check_invalid_config_dir_short_names", "[arguments][invalid][getopt][config]")
    1364             : {
    1365           4 :     CATCH_START_SECTION("Trying to set NO_SHORT_NAME as '--config-dir' short name (option_info)")
    1366             :     {
    1367             :         advgetopt::option const options[] =
    1368             :         {
    1369             :             advgetopt::define_option(
    1370             :                   advgetopt::Name("print")
    1371             :                 , advgetopt::ShortName(U'p')
    1372             :                 , advgetopt::Flags(advgetopt::command_flags<>())
    1373             :                 , advgetopt::Help("output filename.")
    1374             :             ),
    1375             :             advgetopt::end_options()
    1376           1 :         };
    1377             : 
    1378           1 :         advgetopt::options_environment environment_options;
    1379           1 :         environment_options.f_project_name = "unittest";
    1380           1 :         environment_options.f_options = options;
    1381           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1382           1 :         environment_options.f_configuration_filename = "snapwatchdog.conf";
    1383           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    1384             : 
    1385           2 :         advgetopt::getopt opt(environment_options);
    1386             : 
    1387           1 :         CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
    1388           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1389             :                   opt.set_short_name("config-dir", advgetopt::NO_SHORT_NAME)
    1390             :                 , advgetopt::getopt_exception_logic
    1391             :                 , Catch::Matchers::ExceptionMessage(
    1392             :                               "The short name of option \"config-dir\" cannot be set to NO_SHORT_NAME."));
    1393             :     }
    1394             :     CATCH_END_SECTION()
    1395             : 
    1396           4 :     CATCH_START_SECTION("Trying to change short name of '--version' (option_info)")
    1397             :     {
    1398             :         advgetopt::option const options[] =
    1399             :         {
    1400             :             advgetopt::define_option(
    1401             :                   advgetopt::Name("print")
    1402             :                 , advgetopt::ShortName('p')
    1403             :                 , advgetopt::Flags(advgetopt::command_flags<>())
    1404             :                 , advgetopt::Help("print all info.")
    1405             :             ),
    1406             :             advgetopt::end_options()
    1407           1 :         };
    1408             : 
    1409           1 :         advgetopt::options_environment environment_options;
    1410           1 :         environment_options.f_project_name = "unittest";
    1411           1 :         environment_options.f_options = options;
    1412           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
    1413           1 :         environment_options.f_configuration_filename = "";
    1414           1 :         environment_options.f_help_header = "Usage: test --config-dir";
    1415             : 
    1416           2 :         advgetopt::getopt opt(environment_options);
    1417             : 
    1418           1 :         CATCH_REQUIRE(opt.get_option("version") != nullptr);
    1419           1 :         CATCH_REQUIRE_THROWS_MATCHES(
    1420             :                   opt.set_short_name("version", U'v')   // set to lowercase...
    1421             :                 , advgetopt::getopt_exception_logic
    1422             :                 , Catch::Matchers::ExceptionMessage(
    1423             :                               "The short name of option \"version\" cannot be changed from 'V' to 'v'."));
    1424             :     }
    1425             :     CATCH_END_SECTION()
    1426           8 : }
    1427             : 
    1428             : 
    1429             : 
    1430             : 
    1431             : 
    1432             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.12