LCOV - code coverage report
Current view: top level - tests - options_sources.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 314 314 100.0 %
Date: 2021-08-20 21:57:12 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13