LCOV - code coverage report
Current view: top level - tests - catch_options_sources.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 314 314 100.0 %
Date: 2022-03-01 20:39:45 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13