LCOV - code coverage report
Current view: top level - tests - catch_options_sources.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 323 323 100.0 %
Date: 2024-10-05 13:34:54 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2006-2024  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             : // boost
      31             : //
      32             : #include    <boost/algorithm/string/replace.hpp>
      33             : 
      34             : 
      35             : // snapdev
      36             : //
      37             : #include    <snapdev/safe_setenv.h>
      38             : 
      39             : 
      40             : // C++
      41             : //
      42             : #include    <fstream>
      43             : 
      44             : 
      45             : // last include
      46             : //
      47             : #include    <snapdev/poison.h>
      48             : 
      49             : 
      50             : 
      51             : 
      52             : 
      53           1 : CATCH_TEST_CASE("options_sources", "[options][sources][valid]")
      54             : {
      55           1 :     CATCH_START_SECTION("System options only")
      56             :     {
      57           1 :         advgetopt::option const options[] =
      58             :         {
      59             :             advgetopt::define_option(
      60             :                   advgetopt::Name("verbose")
      61             :                 , advgetopt::ShortName('v')
      62             :                 , advgetopt::Flags(advgetopt::command_flags<
      63             :                               advgetopt::GETOPT_FLAG_REQUIRED
      64             :                             | advgetopt::GETOPT_FLAG_DYNAMIC_CONFIGURATION>())
      65             :                 , advgetopt::Help("make it all verbose.")
      66             :             ),
      67             :             advgetopt::end_options()
      68             :         };
      69             : 
      70           1 :         advgetopt::options_environment environment_options;
      71           1 :         environment_options.f_project_name = "unittest";
      72           1 :         environment_options.f_group_name = "sources";
      73           1 :         environment_options.f_options = options;
      74           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
      75           1 :         environment_options.f_help_header = "Usage: test valid options from system options only";
      76             : 
      77           1 :         char const * cargv[] =
      78             :         {
      79             :             "tests/options-parser",
      80             :             "--license",
      81             :             "--show-option-sources",
      82             :             "--version",
      83             :             nullptr
      84             :         };
      85           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
      86           1 :         char ** argv = const_cast<char **>(cargv);
      87             : 
      88           1 :         advgetopt::getopt opt(environment_options, argc, argv);
      89             : 
      90           3 :         advgetopt::option_info::pointer_t verbose(opt.get_option("verbose"));
      91           1 :         CATCH_REQUIRE(verbose != nullptr);
      92           1 :         verbose->set_value(0, "true");
      93             : 
      94           3 :         advgetopt::option_info::pointer_t copyright(opt.get_option("copyright"));
      95           1 :         CATCH_REQUIRE(copyright != nullptr);
      96           1 :         copyright->set_value(0, "1", advgetopt::string_list_t(), advgetopt::option_source_t::SOURCE_DYNAMIC);
      97           1 :         copyright->reset();
      98             : 
      99           3 :         advgetopt::option_info::pointer_t version(opt.get_option("version"));
     100           1 :         CATCH_REQUIRE(version != nullptr);
     101             : 
     102           1 :         SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--version\" can't be directly updated.");
     103           1 :         version->set_value(0, "true");
     104           1 :         SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
     105             : 
     106             :         // check that we got source info as expected
     107             : 
     108           3 :         advgetopt::option_info::pointer_t license(opt.get_option("license"));
     109           1 :         CATCH_REQUIRE(license != nullptr);
     110           1 :         advgetopt::string_list_t license_sources(license->trace_sources());
     111           1 :         CATCH_REQUIRE(license_sources.size() == 1);
     112           1 :         CATCH_REQUIRE(license_sources[0] == "license= [command-line]");
     113             : 
     114           3 :         advgetopt::option_info::pointer_t show(opt.get_option("show-option-sources"));
     115           1 :         CATCH_REQUIRE(show != nullptr);
     116           1 :         advgetopt::string_list_t show_option_sources(show->trace_sources());
     117           1 :         CATCH_REQUIRE(show_option_sources.size() == 1);
     118           1 :         CATCH_REQUIRE(show_option_sources[0] == "show-option-sources= [command-line]");
     119             : 
     120           1 :         advgetopt::string_list_t verbose_sources(verbose->trace_sources());
     121           1 :         CATCH_REQUIRE(verbose_sources.size() == 1);
     122           1 :         CATCH_REQUIRE(verbose_sources[0] == "verbose=true [direct]");
     123             : 
     124           3 :         advgetopt::option_info::pointer_t help(opt.get_option("help"));
     125           1 :         CATCH_REQUIRE(help != nullptr);
     126           1 :         advgetopt::string_list_t help_sources(help->trace_sources());
     127           1 :         CATCH_REQUIRE(help_sources.size() == 0);
     128             : 
     129           1 :         advgetopt::string_list_t copyright_sources(copyright->trace_sources());
     130           1 :         CATCH_REQUIRE(copyright_sources.size() == 2);
     131           1 :         CATCH_REQUIRE(copyright_sources[0] == "copyright=1 [dynamic]");
     132           1 :         CATCH_REQUIRE(copyright_sources[1] == "copyright [*undefined-source*]");
     133             : 
     134             :         // process system options now
     135           1 :         std::stringstream ss;
     136           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     137           1 :         CATCH_REQUIRE(result == (advgetopt::SYSTEM_OPTION_SHOW_OPTION_SOURCES
     138             :                                | advgetopt::SYSTEM_OPTION_VERSION
     139             :                                | advgetopt::SYSTEM_OPTION_LICENSE));
     140           1 :         CATCH_REQUIRE_LONG_STRING(ss.str(),
     141             : "warning: no version found.\n"
     142             : "warning: no license found.\n"
     143             : "Option Sources:\n"
     144             : "  1. option \"build-date\" (undefined)\n"
     145             : "\n"
     146             : "  2. option \"compiler-version\" (undefined)\n"
     147             : "\n"
     148             : "  3. option \"configuration-filenames\" (undefined)\n"
     149             : "\n"
     150             : "  4. option \"copyright\"\n"
     151             : "     copyright=1 [dynamic]\n"
     152             : "     copyright [*undefined-source*]\n"
     153             : "\n"
     154             : "  5. option \"environment-variable-name\" (undefined)\n"
     155             : "\n"
     156             : "  6. option \"has-sanitizer\" (undefined)\n"
     157             : "\n"
     158             : "  7. option \"help\" (undefined)\n"
     159             : "\n"
     160             : "  8. option \"license\"\n"
     161             : "     license= [command-line]\n"
     162             : "\n"
     163             : "  9. option \"long-help\" (undefined)\n"
     164             : "\n"
     165             : "  10. option \"path-to-option-definitions\" (undefined)\n"
     166             : "\n"
     167             : "  11. option \"print-option\" (undefined)\n"
     168             : "\n"
     169             : "  12. option \"show-option-sources\"\n"
     170             : "     show-option-sources= [command-line]\n"
     171             : "\n"
     172             : "  13. option \"system-help\" (undefined)\n"
     173             : "\n"
     174             : "  14. option \"verbose\"\n"
     175             : "     verbose=true [direct]\n"
     176             : "\n"
     177             : "  15. option \"version\"\n"
     178             : "     version= [command-line]\n"
     179             : "\n"
     180             : );
     181           1 :     }
     182           1 :     CATCH_END_SECTION()
     183           1 : }
     184             : 
     185             : 
     186           2 : CATCH_TEST_CASE("options_sources_environment_variable_and_config_file", "[options][sources][valid][config][environment_variable]")
     187             : {
     188           2 :     CATCH_START_SECTION("load options from a config file, environment variable, and command line with --config-dir on the command line")
     189             :     {
     190           1 :         SNAP_CATCH2_NAMESPACE::init_tmp_dir("sources", "src");
     191             : 
     192             :         {
     193           1 :             std::ofstream config_file;
     194           1 :             config_file.open(SNAP_CATCH2_NAMESPACE::g_config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
     195           1 :             CATCH_REQUIRE(config_file.good());
     196             :             config_file <<
     197             :                 "# Auto-generated\n"
     198             :                 "unique     = perfect  \n"
     199             :                 "definition = long value here\n"
     200             :                 "sources    = just fine \t\n"
     201             :                 "multiple   = value\r\n"
     202             :                 "good       = variable \n"
     203             :                 "organized  = set\n"
     204           1 :                 "more       = data\t \n"
     205             :             ;
     206           1 :         }
     207             : 
     208           1 :         advgetopt::option const options[] =
     209             :         {
     210             :             advgetopt::define_option(
     211             :                   advgetopt::Name("unique")
     212             :                 , advgetopt::ShortName('u')
     213             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     214             :                 , advgetopt::Help("unique option.")
     215             :                 , advgetopt::DefaultValue("long")
     216             :             ),
     217             :             advgetopt::define_option(
     218             :                   advgetopt::Name("color")
     219             :                 , advgetopt::ShortName('c')
     220             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     221             :                                                       , advgetopt::GETOPT_FLAG_MULTIPLE
     222             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     223             :                 , advgetopt::Help("specify a color.")
     224             :             ),
     225             :             advgetopt::define_option(
     226             :                   advgetopt::Name("definition")
     227             :                 , advgetopt::ShortName('d')
     228             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     229             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     230             :                 , advgetopt::Help("complete definition.")
     231             :             ),
     232             :             advgetopt::define_option(
     233             :                   advgetopt::Name("sources")
     234             :                 , advgetopt::ShortName('s')
     235             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     236             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     237             :                 , advgetopt::Help("where it all came from.")
     238             :             ),
     239             :             advgetopt::define_option(
     240             :                   advgetopt::Name("multiple")
     241             :                 , advgetopt::ShortName('m')
     242             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     243             :                                                       , advgetopt::GETOPT_FLAG_MULTIPLE
     244             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     245             :                 , advgetopt::Help("whether we have one or more.")
     246             :             ),
     247             :             advgetopt::define_option(
     248             :                   advgetopt::Name("zap")
     249             :                 , advgetopt::ShortName('z')
     250             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     251             :                 , advgetopt::Help("zap all of it.")
     252             :             ),
     253             :             advgetopt::define_option(
     254             :                   advgetopt::Name("good")
     255             :                 , advgetopt::ShortName('g')
     256             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     257             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     258             :                 , advgetopt::Help("current status.")
     259             :             ),
     260             :             advgetopt::define_option(
     261             :                   advgetopt::Name("organized")
     262             :                 , advgetopt::ShortName('o')
     263             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     264             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     265             :                 , advgetopt::Help("how the whole thing was organized.")
     266             :             ),
     267             :             advgetopt::define_option(
     268             :                   advgetopt::Name("more")
     269             :                 , advgetopt::ShortName('+')
     270             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     271             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     272             :                 , advgetopt::Help("anything more you can think of.")
     273             :             ),
     274             :             advgetopt::define_option(
     275             :                   advgetopt::Name("verbose")
     276             :                 , advgetopt::ShortName('v')
     277             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     278             :                 , advgetopt::Help("anything more you can think of.")
     279             :             ),
     280             :             advgetopt::end_options()
     281             :         };
     282             : 
     283           1 :         snapdev::safe_setenv env(
     284             :                   "ADVGETOPT_TEST_OPTIONS"
     285           5 :                 , "--verbose --more=instructions --color black orange purple --sources=all");
     286             : 
     287           1 :         advgetopt::options_environment environment_options;
     288           1 :         environment_options.f_project_name = "unittest";
     289           1 :         environment_options.f_group_name = "sources";
     290           1 :         environment_options.f_options = options;
     291           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
     292           1 :         environment_options.f_configuration_filename = "src.config";
     293           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     294           1 :         environment_options.f_help_header = "Usage: test source from command line, environment variable, and configuration file";
     295           1 :         environment_options.f_version = "1.2.3";
     296             : 
     297           2 :         std::string const config_dir("--config-dir=" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config");
     298           1 :         char const * cargv[] =
     299             :         {
     300             :             "tests/options-parser",
     301             :             "--version",
     302             :             "--show-option-sources",
     303             :             "--more=magical",
     304             :             "--organized",
     305             :             "logically",
     306             :             "--zap",
     307           1 :             config_dir.c_str(),
     308             :             nullptr
     309           1 :         };
     310           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     311           1 :         char ** argv = const_cast<char **>(cargv);
     312             : 
     313           1 :         advgetopt::getopt opt(environment_options, argc, argv);
     314             : 
     315             :         // verify command line options
     316             : 
     317           3 :         advgetopt::option_info::pointer_t version(opt.get_option("version"));
     318           1 :         CATCH_REQUIRE(version != nullptr);
     319           1 :         CATCH_REQUIRE(opt.is_defined("version"));
     320           1 :         advgetopt::string_list_t version_sources(version->trace_sources());
     321           1 :         CATCH_REQUIRE(version_sources.size() == 1);
     322           1 :         CATCH_REQUIRE(version_sources[0] == "version= [command-line]");
     323             : 
     324           3 :         advgetopt::option_info::pointer_t show(opt.get_option("show-option-sources"));
     325           1 :         CATCH_REQUIRE(show != nullptr);
     326           1 :         CATCH_REQUIRE(opt.is_defined("show-option-sources"));
     327           1 :         advgetopt::string_list_t show_option_sources(show->trace_sources());
     328           1 :         CATCH_REQUIRE(show_option_sources.size() == 1);
     329           1 :         CATCH_REQUIRE(show_option_sources[0] == "show-option-sources= [command-line]");
     330             : 
     331           3 :         advgetopt::option_info::pointer_t more(opt.get_option("more"));
     332           1 :         CATCH_REQUIRE(more != nullptr);
     333           1 :         CATCH_REQUIRE(opt.is_defined("more"));
     334           1 :         advgetopt::string_list_t more_sources(more->trace_sources());
     335           1 :         CATCH_REQUIRE(more_sources.size() == 3);
     336           2 :         std::string expected_config("more=data [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]");
     337           1 :         CATCH_REQUIRE(more_sources[0] == expected_config);
     338           1 :         CATCH_REQUIRE(more_sources[1] == "more=instructions [environment-variable]");
     339           1 :         CATCH_REQUIRE(more_sources[2] == "more=magical [command-line]");
     340             : 
     341           3 :         advgetopt::option_info::pointer_t organized(opt.get_option("organized"));
     342           1 :         CATCH_REQUIRE(organized != nullptr);
     343           1 :         CATCH_REQUIRE(opt.is_defined("organized"));
     344           1 :         advgetopt::string_list_t organized_sources(organized->trace_sources());
     345           1 :         CATCH_REQUIRE(organized_sources.size() == 2);
     346           1 :         expected_config = "organized=set [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]";
     347           1 :         CATCH_REQUIRE(organized_sources[0] == expected_config);
     348           1 :         CATCH_REQUIRE(organized_sources[1] == "organized=logically [command-line]");
     349             : 
     350           3 :         advgetopt::option_info::pointer_t zap(opt.get_option("zap"));
     351           1 :         CATCH_REQUIRE(zap != nullptr);
     352           1 :         CATCH_REQUIRE(opt.is_defined("zap"));
     353           1 :         advgetopt::string_list_t zap_sources(zap->trace_sources());
     354           1 :         CATCH_REQUIRE(zap_sources.size() == 1);
     355           1 :         CATCH_REQUIRE(zap_sources[0] == "zap= [command-line]");
     356             : 
     357           3 :         advgetopt::option_info::pointer_t config_dir_opt(opt.get_option("config-dir"));
     358           1 :         CATCH_REQUIRE(config_dir_opt != nullptr);
     359           1 :         CATCH_REQUIRE(opt.is_defined("config_dir"));
     360           1 :         advgetopt::string_list_t config_dir_sources(config_dir_opt->trace_sources());
     361           1 :         CATCH_REQUIRE(config_dir_sources.size() == 1);
     362           1 :         expected_config = "config-dir[0]=" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config [command-line]";
     363           1 :         CATCH_REQUIRE(config_dir_sources[0] == expected_config);
     364             : 
     365             :         // verify environment variable options which are not also on the command line
     366             : 
     367           3 :         advgetopt::option_info::pointer_t verbose(opt.get_option("verbose"));
     368           1 :         CATCH_REQUIRE(verbose != nullptr);
     369           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
     370           1 :         advgetopt::string_list_t verbose_sources(verbose->trace_sources());
     371           1 :         CATCH_REQUIRE(verbose_sources.size() == 1);
     372           1 :         CATCH_REQUIRE(verbose_sources[0] == "verbose= [environment-variable]");
     373             : 
     374           3 :         advgetopt::option_info::pointer_t color(opt.get_option("color"));
     375           1 :         CATCH_REQUIRE(color != nullptr);
     376           1 :         CATCH_REQUIRE(opt.is_defined("color"));
     377           1 :         advgetopt::string_list_t color_sources(color->trace_sources());
     378           1 :         CATCH_REQUIRE(color_sources.size() == 3);
     379           1 :         CATCH_REQUIRE(color_sources[0] == "color[0]=black [environment-variable]");
     380           1 :         CATCH_REQUIRE(color_sources[1] == "color[1]=orange [environment-variable]");
     381           1 :         CATCH_REQUIRE(color_sources[2] == "color[2]=purple [environment-variable]");
     382             : 
     383           3 :         advgetopt::option_info::pointer_t sources(opt.get_option("sources"));
     384           1 :         CATCH_REQUIRE(sources != nullptr);
     385           1 :         CATCH_REQUIRE(opt.is_defined("sources"));
     386           1 :         advgetopt::string_list_t sources_sources(sources->trace_sources());
     387           1 :         CATCH_REQUIRE(sources_sources.size() == 2);
     388           1 :         expected_config = "sources=just fine [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]";
     389           1 :         CATCH_REQUIRE(sources_sources[0] == expected_config);
     390           1 :         CATCH_REQUIRE(sources_sources[1] == "sources=all [environment-variable]");
     391             : 
     392             :         // verify configuration file parameters that appear no where else
     393             : 
     394           3 :         advgetopt::option_info::pointer_t unique(opt.get_option("unique"));
     395           1 :         CATCH_REQUIRE(unique != nullptr);
     396           1 :         CATCH_REQUIRE(opt.is_defined("unique"));
     397           1 :         advgetopt::string_list_t unique_sources(unique->trace_sources());
     398           1 :         CATCH_REQUIRE(unique_sources.size() == 1);
     399           1 :         expected_config = "unique=perfect [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]";
     400           1 :         CATCH_REQUIRE(unique_sources[0] == expected_config);
     401             : 
     402           3 :         advgetopt::option_info::pointer_t definition(opt.get_option("definition"));
     403           1 :         CATCH_REQUIRE(definition != nullptr);
     404           1 :         CATCH_REQUIRE(opt.is_defined("definition"));
     405           1 :         advgetopt::string_list_t definition_sources(definition->trace_sources());
     406           1 :         CATCH_REQUIRE(definition_sources.size() == 1);
     407           1 :         expected_config = "definition=long value here [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]";
     408           1 :         CATCH_REQUIRE(definition_sources[0] == expected_config);
     409             : 
     410           3 :         advgetopt::option_info::pointer_t multiple(opt.get_option("multiple"));
     411           1 :         CATCH_REQUIRE(multiple != nullptr);
     412           1 :         CATCH_REQUIRE(opt.is_defined("multiple"));
     413           1 :         advgetopt::string_list_t multiple_sources(multiple->trace_sources());
     414           1 :         CATCH_REQUIRE(multiple_sources.size() == 1);
     415           1 :         expected_config = "multiple[0]=value [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]";
     416           1 :         CATCH_REQUIRE(multiple_sources[0] == expected_config);
     417             : 
     418           3 :         advgetopt::option_info::pointer_t good(opt.get_option("good"));
     419           1 :         CATCH_REQUIRE(good != nullptr);
     420           1 :         CATCH_REQUIRE(opt.is_defined("good"));
     421           1 :         advgetopt::string_list_t good_sources(good->trace_sources());
     422           1 :         CATCH_REQUIRE(good_sources.size() == 1);
     423           1 :         expected_config = "good=variable [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]";
     424           1 :         CATCH_REQUIRE(good_sources[0] == expected_config);
     425             : 
     426             :         // process system options now
     427           1 :         std::stringstream ss;
     428           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     429           1 :         CATCH_REQUIRE(result == (advgetopt::SYSTEM_OPTION_SHOW_OPTION_SOURCES
     430             :                                | advgetopt::SYSTEM_OPTION_VERSION
     431             :                                | advgetopt::SYSTEM_OPTION_CONFIG_DIR));
     432           1 :         CATCH_REQUIRE_LONG_STRING(ss.str(),
     433             : "1.2.3\n"
     434             : "Option Sources:\n"
     435             : "  1. option \"build-date\" (undefined)\n"
     436             : "\n"
     437             : "  2. option \"color\"\n"
     438             : "     color[0]=black [environment-variable]\n"
     439             : "     color[1]=orange [environment-variable]\n"
     440             : "     color[2]=purple [environment-variable]\n"
     441             : "\n"
     442             : "  3. option \"compiler-version\" (undefined)\n"
     443             : "\n"
     444             : "  4. option \"config-dir\"\n"
     445             : "     config-dir[0]=" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config [command-line]\n"
     446             : "\n"
     447             : "  5. option \"configuration-filenames\" (undefined)\n"
     448             : "\n"
     449             : "  6. option \"copyright\" (undefined)\n"
     450             : "\n"
     451             : "  7. option \"definition\"\n"
     452             : "     definition=long value here [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]\n"
     453             : "\n"
     454             : "  8. option \"environment-variable-name\" (undefined)\n"
     455             : "\n"
     456             : "  9. option \"good\"\n"
     457             : "     good=variable [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]\n"
     458             : "\n"
     459             : "  10. option \"has-sanitizer\" (undefined)\n"
     460             : "\n"
     461             : "  11. option \"help\" (undefined)\n"
     462             : "\n"
     463             : "  12. option \"license\" (undefined)\n"
     464             : "\n"
     465             : "  13. option \"long-help\" (undefined)\n"
     466             : "\n"
     467             : "  14. option \"more\"\n"
     468             : "     more=data [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]\n"
     469             : "     more=instructions [environment-variable]\n"
     470             : "     more=magical [command-line]\n"
     471             : "\n"
     472             : "  15. option \"multiple\"\n"
     473             : "     multiple[0]=value [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]\n"
     474             : "\n"
     475             : "  16. option \"organized\"\n"
     476             : "     organized=set [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]\n"
     477             : "     organized=logically [command-line]\n"
     478             : "\n"
     479             : "  17. option \"path-to-option-definitions\" (undefined)\n"
     480             : "\n"
     481             : "  18. option \"print-option\" (undefined)\n"
     482             : "\n"
     483             : "  19. option \"show-option-sources\"\n"
     484             : "     show-option-sources= [command-line]\n"
     485             : "\n"
     486             : "  20. option \"sources\"\n"
     487             : "     sources=just fine [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]\n"
     488             : "     sources=all [environment-variable]\n"
     489             : "\n"
     490             : "  21. option \"system-help\" (undefined)\n"
     491             : "\n"
     492             : "  22. option \"unique\"\n"
     493             : "     unique=perfect [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/src.config\"]\n"
     494             : "\n"
     495             : "  23. option \"verbose\"\n"
     496             : "     verbose= [environment-variable]\n"
     497             : "\n"
     498             : "  24. option \"version\"\n"
     499             : "     version= [command-line]\n"
     500             : "\n"
     501             : "  25. option \"zap\"\n"
     502             : "     zap= [command-line]\n"
     503             : "\n"
     504             : );
     505           1 :     }
     506           2 :     CATCH_END_SECTION()
     507             : 
     508           2 :     CATCH_START_SECTION("load options from a config file, environment variable, and command line with --config-dir in the environment variable")
     509             :     {
     510           1 :         SNAP_CATCH2_NAMESPACE::init_tmp_dir("sources", "hidden");
     511             : 
     512             :         {
     513           1 :             std::ofstream config_file;
     514           1 :             config_file.open(SNAP_CATCH2_NAMESPACE::g_config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
     515           1 :             CATCH_REQUIRE(config_file.good());
     516             :             config_file <<
     517             :                 "# Auto-generated\n"
     518             :                 "unique     = perfect  \n"
     519             :                 "definition = long value here\n"
     520             :                 "sources    = just fine \t\n"
     521             :                 "multiple   = the origin of life\r\n"
     522             :                 "good       = variable \n"
     523             :                 "organized  = set\n"
     524           1 :                 "more       = data\t \n"
     525             :             ;
     526           1 :         }
     527             : 
     528           1 :         std::string const sub_config_file(boost::replace_all_copy(
     529             :                   SNAP_CATCH2_NAMESPACE::g_config_project_filename
     530             :                 , "50"
     531           1 :                 , "65"));
     532             :         {
     533           1 :             std::ofstream config_file;
     534           1 :             config_file.open(sub_config_file, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
     535           1 :             CATCH_REQUIRE(config_file.good());
     536             :             config_file <<
     537             :                 "definition=\"this is a better definition\"\n"
     538             :                 "#sources=overwrite\n"
     539             :                 "multiple=should we not see this one instead?\n"
     540             :                 "good=enhanced\n"
     541           1 :                 "# Auto-generated\n"
     542             :             ;
     543           1 :         }
     544             : 
     545           1 :         advgetopt::option const options[] =
     546             :         {
     547             :             advgetopt::define_option(
     548             :                   advgetopt::Name("unique")
     549             :                 , advgetopt::ShortName('u')
     550             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
     551             :                 , advgetopt::Help("unique option.")
     552             :                 , advgetopt::DefaultValue("long")
     553             :             ),
     554             :             advgetopt::define_option(
     555             :                   advgetopt::Name("color")
     556             :                 , advgetopt::ShortName('c')
     557             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     558             :                                                       , advgetopt::GETOPT_FLAG_MULTIPLE
     559             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     560             :                 , advgetopt::Help("specify a color.")
     561             :             ),
     562             :             advgetopt::define_option(
     563             :                   advgetopt::Name("definition")
     564             :                 , advgetopt::ShortName('d')
     565             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     566             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     567             :                 , advgetopt::Help("complete definition.")
     568             :             ),
     569             :             advgetopt::define_option(
     570             :                   advgetopt::Name("sources")
     571             :                 , advgetopt::ShortName('s')
     572             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     573             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     574             :                 , advgetopt::Help("where it all came from.")
     575             :             ),
     576             :             advgetopt::define_option(
     577             :                   advgetopt::Name("multiple")
     578             :                 , advgetopt::ShortName('m')
     579             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     580             :                                                       , advgetopt::GETOPT_FLAG_MULTIPLE
     581             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     582             :                 , advgetopt::Help("whether we have one or more.")
     583             :             ),
     584             :             advgetopt::define_option(
     585             :                   advgetopt::Name("zap")
     586             :                 , advgetopt::ShortName('z')
     587             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     588             :                 , advgetopt::Help("zap all of it.")
     589             :             ),
     590             :             advgetopt::define_option(
     591             :                   advgetopt::Name("good")
     592             :                 , advgetopt::ShortName('g')
     593             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     594             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     595             :                 , advgetopt::Help("current status.")
     596             :             ),
     597             :             advgetopt::define_option(
     598             :                   advgetopt::Name("organized")
     599             :                 , advgetopt::ShortName('o')
     600             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     601             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
     602             :                 , advgetopt::Help("how the whole thing was organized.")
     603             :             ),
     604             :             advgetopt::define_option(
     605             :                   advgetopt::Name("more")
     606             :                 , advgetopt::ShortName('+')
     607             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_REQUIRED
     608             :                                                       , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     609             :                 , advgetopt::Help("anything more you can think of.")
     610             :             ),
     611             :             advgetopt::define_option(
     612             :                   advgetopt::Name("verbose")
     613             :                 , advgetopt::ShortName('v')
     614             :                 , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
     615             :                 , advgetopt::Help("anything more you can think of.")
     616             :             ),
     617             :             advgetopt::end_options()
     618             :         };
     619             : 
     620           2 :         std::string const config_dir("--config-dir=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config\"");
     621           1 :         snapdev::safe_setenv env(
     622             :                   "ADVGETOPT_TEST_OPTIONS"
     623             :                 , "--verbose --more=instructions "
     624           2 :                 + config_dir
     625           5 :                 + " --color black orange purple --sources=all --multiple here too");
     626             : 
     627           1 :         advgetopt::options_environment environment_options;
     628           1 :         environment_options.f_project_name = "unittest";
     629           1 :         environment_options.f_group_name = "sources";
     630           1 :         environment_options.f_options = options;
     631           1 :         environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
     632           1 :         environment_options.f_configuration_filename = "hidden.config";
     633           1 :         environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
     634           1 :         environment_options.f_help_header = "Usage: test source from command line, environment variable, and configuration file";
     635           1 :         environment_options.f_license = "GPL 2 or GPL 3";
     636             : 
     637           1 :         char const * cargv[] =
     638             :         {
     639             :             "tests/options-parser",
     640             :             "--license",
     641             :             "--show-option-sources",
     642             :             "--more=magical",
     643             :             "--multiple=first",
     644             :             "--organized",
     645             :             "logically",
     646             :             "--zap",
     647             :             "--multiple=last",
     648             :             "--copyright",
     649             :             nullptr
     650             :         };
     651           1 :         int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
     652           1 :         char ** argv = const_cast<char **>(cargv);
     653             : 
     654           1 :         advgetopt::getopt opt(environment_options, argc, argv);
     655             : 
     656             :         // verify command line options
     657             : 
     658           3 :         advgetopt::option_info::pointer_t license(opt.get_option("license"));
     659           1 :         CATCH_REQUIRE(license != nullptr);
     660           1 :         CATCH_REQUIRE(opt.is_defined("license"));
     661           1 :         advgetopt::string_list_t license_sources(license->trace_sources());
     662           1 :         CATCH_REQUIRE(license_sources.size() == 1);
     663           1 :         CATCH_REQUIRE(license_sources[0] == "license= [command-line]");
     664             : 
     665           3 :         advgetopt::option_info::pointer_t show(opt.get_option("show-option-sources"));
     666           1 :         CATCH_REQUIRE(show != nullptr);
     667           1 :         CATCH_REQUIRE(opt.is_defined("show-option-sources"));
     668           1 :         advgetopt::string_list_t show_option_sources(show->trace_sources());
     669           1 :         CATCH_REQUIRE(show_option_sources.size() == 1);
     670           1 :         CATCH_REQUIRE(show_option_sources[0] == "show-option-sources= [command-line]");
     671             : 
     672           3 :         advgetopt::option_info::pointer_t more(opt.get_option("more"));
     673           1 :         CATCH_REQUIRE(more != nullptr);
     674           1 :         CATCH_REQUIRE(opt.is_defined("more"));
     675           1 :         advgetopt::string_list_t more_sources(more->trace_sources());
     676           1 :         CATCH_REQUIRE(more_sources.size() == 3);
     677           2 :         std::string expected_config("more=data [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]");
     678           1 :         CATCH_REQUIRE(more_sources[0] == expected_config);
     679           1 :         CATCH_REQUIRE(more_sources[1] == "more=instructions [environment-variable]");
     680           1 :         CATCH_REQUIRE(more_sources[2] == "more=magical [command-line]");
     681             : 
     682           3 :         advgetopt::option_info::pointer_t organized(opt.get_option("organized"));
     683           1 :         CATCH_REQUIRE(organized != nullptr);
     684           1 :         CATCH_REQUIRE(opt.is_defined("organized"));
     685           1 :         advgetopt::string_list_t organized_sources(organized->trace_sources());
     686           1 :         CATCH_REQUIRE(organized_sources.size() == 2);
     687           1 :         expected_config = "organized=set [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]";
     688           1 :         CATCH_REQUIRE(organized_sources[0] == expected_config);
     689           1 :         CATCH_REQUIRE(organized_sources[1] == "organized=logically [command-line]");
     690             : 
     691           3 :         advgetopt::option_info::pointer_t multiple(opt.get_option("multiple"));
     692           1 :         CATCH_REQUIRE(multiple != nullptr);
     693           1 :         CATCH_REQUIRE(opt.is_defined("multiple"));
     694           1 :         advgetopt::string_list_t multiple_sources(multiple->trace_sources());
     695           1 :         CATCH_REQUIRE(multiple_sources.size() == 6);
     696           1 :         expected_config = "multiple[0]=the origin of life [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]";
     697           1 :         CATCH_REQUIRE(multiple_sources[0] == expected_config);
     698           1 :         expected_config = "multiple[0]=should we not see this one instead? [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/sources.d/65-hidden.config\"]";       // TODO: this should not be [0]?
     699           1 :         CATCH_REQUIRE(multiple_sources[1] == expected_config);
     700           1 :         expected_config = "multiple[1]=here [environment-variable]";       // TODO: this should not be [1]?
     701           1 :         CATCH_REQUIRE(multiple_sources[2] == expected_config);
     702           1 :         expected_config = "multiple[2]=too [environment-variable]";       // TODO: this should not be [2]?
     703           1 :         CATCH_REQUIRE(multiple_sources[3] == expected_config);
     704           1 :         expected_config = "multiple[0]=first [command-line]";       // TODO: this should not be [0]?
     705           1 :         CATCH_REQUIRE(multiple_sources[4] == expected_config);
     706           1 :         expected_config = "multiple[0]=last [command-line]";        // TODO: this should not be [0]?
     707           1 :         CATCH_REQUIRE(multiple_sources[5] == expected_config);
     708             : 
     709           3 :         advgetopt::option_info::pointer_t zap(opt.get_option("zap"));
     710           1 :         CATCH_REQUIRE(zap != nullptr);
     711           1 :         CATCH_REQUIRE(opt.is_defined("zap"));
     712           1 :         advgetopt::string_list_t zap_sources(zap->trace_sources());
     713           1 :         CATCH_REQUIRE(zap_sources.size() == 1);
     714           1 :         CATCH_REQUIRE(zap_sources[0] == "zap= [command-line]");
     715             : 
     716             :         // verify environment variable options which are not also on the command line
     717             : 
     718           3 :         advgetopt::option_info::pointer_t verbose(opt.get_option("verbose"));
     719           1 :         CATCH_REQUIRE(verbose != nullptr);
     720           1 :         CATCH_REQUIRE(opt.is_defined("verbose"));
     721           1 :         advgetopt::string_list_t verbose_sources(verbose->trace_sources());
     722           1 :         CATCH_REQUIRE(verbose_sources.size() == 1);
     723           1 :         CATCH_REQUIRE(verbose_sources[0] == "verbose= [environment-variable]");
     724             : 
     725           3 :         advgetopt::option_info::pointer_t color(opt.get_option("color"));
     726           1 :         CATCH_REQUIRE(color != nullptr);
     727           1 :         CATCH_REQUIRE(opt.is_defined("color"));
     728           1 :         advgetopt::string_list_t color_sources(color->trace_sources());
     729           1 :         CATCH_REQUIRE(color_sources.size() == 3);
     730           1 :         CATCH_REQUIRE(color_sources[0] == "color[0]=black [environment-variable]");
     731           1 :         CATCH_REQUIRE(color_sources[1] == "color[1]=orange [environment-variable]");
     732           1 :         CATCH_REQUIRE(color_sources[2] == "color[2]=purple [environment-variable]");
     733             : 
     734           3 :         advgetopt::option_info::pointer_t sources(opt.get_option("sources"));
     735           1 :         CATCH_REQUIRE(sources != nullptr);
     736           1 :         CATCH_REQUIRE(opt.is_defined("sources"));
     737           1 :         advgetopt::string_list_t sources_sources(sources->trace_sources());
     738           1 :         CATCH_REQUIRE(sources_sources.size() == 2);
     739           1 :         expected_config = "sources=just fine [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]";
     740           1 :         CATCH_REQUIRE(sources_sources[0] == expected_config);
     741           1 :         CATCH_REQUIRE(sources_sources[1] == "sources=all [environment-variable]");
     742             : 
     743           3 :         advgetopt::option_info::pointer_t config_dir_opt(opt.get_option("config-dir"));
     744           1 :         CATCH_REQUIRE(config_dir_opt != nullptr);
     745           1 :         CATCH_REQUIRE(opt.is_defined("config_dir"));
     746           1 :         advgetopt::string_list_t config_dir_sources(config_dir_opt->trace_sources());
     747           1 :         CATCH_REQUIRE(config_dir_sources.size() == 1);
     748           1 :         expected_config = "config-dir[0]=" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config [environment-variable]";
     749           1 :         CATCH_REQUIRE(config_dir_sources[0] == expected_config);
     750             : 
     751             :         // verify configuration file parameters that appear no where else
     752             : 
     753           3 :         advgetopt::option_info::pointer_t unique(opt.get_option("unique"));
     754           1 :         CATCH_REQUIRE(unique != nullptr);
     755           1 :         CATCH_REQUIRE(opt.is_defined("unique"));
     756           1 :         advgetopt::string_list_t unique_sources(unique->trace_sources());
     757           1 :         CATCH_REQUIRE(unique_sources.size() == 1);
     758           1 :         expected_config = "unique=perfect [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]";
     759           1 :         CATCH_REQUIRE(unique_sources[0] == expected_config);
     760             : 
     761           3 :         advgetopt::option_info::pointer_t definition(opt.get_option("definition"));
     762           1 :         CATCH_REQUIRE(definition != nullptr);
     763           1 :         CATCH_REQUIRE(opt.is_defined("definition"));
     764           1 :         advgetopt::string_list_t definition_sources(definition->trace_sources());
     765           1 :         CATCH_REQUIRE(definition_sources.size() == 2);
     766           1 :         expected_config = "definition=long value here [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]";
     767           1 :         CATCH_REQUIRE(definition_sources[0] == expected_config);
     768           1 :         expected_config = "definition=this is a better definition [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/sources.d/65-hidden.config\"]";
     769           1 :         CATCH_REQUIRE(definition_sources[1] == expected_config);
     770             : 
     771           3 :         advgetopt::option_info::pointer_t good(opt.get_option("good"));
     772           1 :         CATCH_REQUIRE(good != nullptr);
     773           1 :         CATCH_REQUIRE(opt.is_defined("good"));
     774           1 :         advgetopt::string_list_t good_sources(good->trace_sources());
     775           1 :         CATCH_REQUIRE(good_sources.size() == 2);
     776           1 :         expected_config = "good=variable [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]";
     777           1 :         CATCH_REQUIRE(good_sources[0] == expected_config);
     778           1 :         expected_config = "good=enhanced [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/sources.d/65-hidden.config\"]";
     779           1 :         CATCH_REQUIRE(good_sources[1] == expected_config);
     780             : 
     781             :         // process system options now
     782           1 :         std::stringstream ss;
     783           1 :         advgetopt::flag_t const result(opt.process_system_options(ss));
     784           1 :         CATCH_REQUIRE(result == (advgetopt::SYSTEM_OPTION_SHOW_OPTION_SOURCES
     785             :                                | advgetopt::SYSTEM_OPTION_LICENSE
     786             :                                | advgetopt::SYSTEM_OPTION_COPYRIGHT
     787             :                                | advgetopt::SYSTEM_OPTION_CONFIG_DIR));
     788             : //std::cerr << "++++++++++++++++ [" << ss.str() << "]\n";;
     789           1 :         CATCH_REQUIRE_LONG_STRING(ss.str(),
     790             : "warning: no copyright notice found.\n"
     791             : "GPL 2 or GPL 3\n"
     792             : "Option Sources:\n"
     793             : "  1. option \"build-date\" (undefined)\n"
     794             : "\n"
     795             : "  2. option \"color\"\n"
     796             : "     color[0]=black [environment-variable]\n"
     797             : "     color[1]=orange [environment-variable]\n"
     798             : "     color[2]=purple [environment-variable]\n"
     799             : "\n"
     800             : "  3. option \"compiler-version\" (undefined)\n"
     801             : "\n"
     802             : "  4. option \"config-dir\"\n"
     803             : "     config-dir[0]=" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config [environment-variable]\n"
     804             : "\n"
     805             : "  5. option \"configuration-filenames\" (undefined)\n"
     806             : "\n"
     807             : "  6. option \"copyright\"\n"
     808             : "     copyright= [command-line]\n"
     809             : "\n"
     810             : "  7. option \"definition\"\n"
     811             : "     definition=long value here [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]\n"
     812             : "     definition=this is a better definition [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/sources.d/65-hidden.config\"]\n"
     813             : "\n"
     814             : "  8. option \"environment-variable-name\" (undefined)\n"
     815             : "\n"
     816             : "  9. option \"good\"\n"
     817             : "     good=variable [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]\n"
     818             : "     good=enhanced [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/sources.d/65-hidden.config\"]\n"
     819             : "\n"
     820             : "  10. option \"has-sanitizer\" (undefined)\n"
     821             : "\n"
     822             : "  11. option \"help\" (undefined)\n"
     823             : "\n"
     824             : "  12. option \"license\"\n"
     825             : "     license= [command-line]\n"
     826             : "\n"
     827             : "  13. option \"long-help\" (undefined)\n"
     828             : "\n"
     829             : "  14. option \"more\"\n"
     830             : "     more=data [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]\n"
     831             : "     more=instructions [environment-variable]\n"
     832             : "     more=magical [command-line]\n"
     833             : "\n"
     834             : "  15. option \"multiple\"\n"
     835             : "     multiple[0]=the origin of life [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]\n"
     836             : "     multiple[0]=should we not see this one instead? [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/sources.d/65-hidden.config\"]\n"
     837             : "     multiple[1]=here [environment-variable]\n"
     838             : "     multiple[2]=too [environment-variable]\n"
     839             : "     multiple[0]=first [command-line]\n"
     840             : "     multiple[0]=last [command-line]\n"
     841             : "\n"
     842             : "  16. option \"organized\"\n"
     843             : "     organized=set [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]\n"
     844             : "     organized=logically [command-line]\n"
     845             : "\n"
     846             : "  17. option \"path-to-option-definitions\" (undefined)\n"
     847             : "\n"
     848             : "  18. option \"print-option\" (undefined)\n"
     849             : "\n"
     850             : "  19. option \"show-option-sources\"\n"
     851             : "     show-option-sources= [command-line]\n"
     852             : "\n"
     853             : "  20. option \"sources\"\n"
     854             : "     sources=just fine [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]\n"
     855             : "     sources=all [environment-variable]\n"
     856             : "\n"
     857             : "  21. option \"system-help\" (undefined)\n"
     858             : "\n"
     859             : "  22. option \"unique\"\n"
     860             : "     unique=perfect [configuration=\"" + SNAP_CATCH2_NAMESPACE::g_tmp_dir() + "/.config/hidden.config\"]\n"
     861             : "\n"
     862             : "  23. option \"verbose\"\n"
     863             : "     verbose= [environment-variable]\n"
     864             : "\n"
     865             : "  24. option \"version\" (undefined)\n"
     866             : "\n"
     867             : "  25. option \"zap\"\n"
     868             : "     zap= [command-line]\n"
     869             : "\n"
     870             : );
     871           1 :     }
     872           2 :     CATCH_END_SECTION()
     873           2 : }
     874             : 
     875             : 
     876             : 
     877             : 
     878             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.14

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