LCOV - code coverage report
Current view: top level - tests - catch_utils.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 385 385 100.0 %
Date: 2021-09-08 17:05:25 Functions: 8 8 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/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/conf_file.h>
      28             : #include    <advgetopt/utils.h>
      29             : 
      30             : 
      31             : // snapdev lib
      32             : //
      33             : #include    <snapdev/safe_setenv.h>
      34             : 
      35             : 
      36             : // C++ lib
      37             : //
      38             : #include    <fstream>
      39             : 
      40             : 
      41             : // last include
      42             : //
      43             : #include    <snapdev/poison.h>
      44             : 
      45             : 
      46             : 
      47          99 : int shuffle_rand(int n)
      48             : {
      49          99 :     return rand() % n;
      50             : }
      51             : 
      52             : 
      53             : 
      54           4 : CATCH_TEST_CASE("utils_unquote", "[utils][valid]")
      55             : {
      56           4 :     CATCH_START_SECTION("Unquote, default pairs")
      57           1 :         CATCH_REQUIRE(advgetopt::unquote("") == "");
      58           1 :         CATCH_REQUIRE(advgetopt::unquote("a") == "a");
      59           1 :         CATCH_REQUIRE(advgetopt::unquote("ab") == "ab");
      60           1 :         CATCH_REQUIRE(advgetopt::unquote("abc") == "abc");
      61             : 
      62           1 :         CATCH_REQUIRE(advgetopt::unquote("''") == "");
      63           1 :         CATCH_REQUIRE(advgetopt::unquote("'a'") == "a");
      64           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab'") == "ab");
      65           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc'") == "abc");
      66           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd'") == "abcd");
      67             : 
      68           1 :         CATCH_REQUIRE(advgetopt::unquote("\"\"") == "");
      69           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a\"") == "a");
      70           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab\"") == "ab");
      71           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc\"") == "abc");
      72           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd\"") == "abcd");
      73             : 
      74           1 :         CATCH_REQUIRE(advgetopt::unquote("\"'") == "\"'");
      75           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a'") == "\"a'");
      76           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab'") == "\"ab'");
      77           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc'") == "\"abc'");
      78           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd'") == "\"abcd'");
      79             : 
      80           1 :         CATCH_REQUIRE(advgetopt::unquote("'\"") == "'\"");
      81           1 :         CATCH_REQUIRE(advgetopt::unquote("'a\"") == "'a\"");
      82           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab\"") == "'ab\"");
      83           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc\"") == "'abc\"");
      84           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd\"") == "'abcd\"");
      85             : 
      86           1 :         CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
      87           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a") == "\"a");
      88           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab") == "\"ab");
      89           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc") == "\"abc");
      90           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd") == "\"abcd");
      91             : 
      92           1 :         CATCH_REQUIRE(advgetopt::unquote("'") == "'");
      93           1 :         CATCH_REQUIRE(advgetopt::unquote("'a") == "'a");
      94           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab") == "'ab");
      95           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc") == "'abc");
      96           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd") == "'abcd");
      97             : 
      98           1 :         CATCH_REQUIRE(advgetopt::unquote("'") == "'");
      99           1 :         CATCH_REQUIRE(advgetopt::unquote("a'") == "a'");
     100           1 :         CATCH_REQUIRE(advgetopt::unquote("ab'") == "ab'");
     101           1 :         CATCH_REQUIRE(advgetopt::unquote("abc'") == "abc'");
     102           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd'") == "abcd'");
     103             : 
     104           1 :         CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
     105           1 :         CATCH_REQUIRE(advgetopt::unquote("a\"") == "a\"");
     106           1 :         CATCH_REQUIRE(advgetopt::unquote("ab\"") == "ab\"");
     107           1 :         CATCH_REQUIRE(advgetopt::unquote("abc\"") == "abc\"");
     108           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd\"") == "abcd\"");
     109             :     CATCH_END_SECTION()
     110             : 
     111           4 :     CATCH_START_SECTION("Unquote, brackets")
     112           1 :         CATCH_REQUIRE(advgetopt::unquote("", "[]<>{}") == "");
     113           1 :         CATCH_REQUIRE(advgetopt::unquote("a", "[]<>{}") == "a");
     114           1 :         CATCH_REQUIRE(advgetopt::unquote("ab", "[]<>{}") == "ab");
     115           1 :         CATCH_REQUIRE(advgetopt::unquote("abc", "[]<>{}") == "abc");
     116             : 
     117           1 :         CATCH_REQUIRE(advgetopt::unquote("{}", "[]<>{}") == "");
     118           1 :         CATCH_REQUIRE(advgetopt::unquote("{a}", "[]<>{}") == "a");
     119           1 :         CATCH_REQUIRE(advgetopt::unquote("{ab}", "[]<>{}") == "ab");
     120           1 :         CATCH_REQUIRE(advgetopt::unquote("{abc}", "[]<>{}") == "abc");
     121           1 :         CATCH_REQUIRE(advgetopt::unquote("{abcd}", "[]<>{}") == "abcd");
     122             : 
     123           1 :         CATCH_REQUIRE(advgetopt::unquote("[]", "[]<>{}") == "");
     124           1 :         CATCH_REQUIRE(advgetopt::unquote("[a]", "[]<>{}") == "a");
     125           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab]", "[]<>{}") == "ab");
     126           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc]", "[]<>{}") == "abc");
     127           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd]", "[]<>{}") == "abcd");
     128             : 
     129           1 :         CATCH_REQUIRE(advgetopt::unquote("<>", "[]<>{}") == "");
     130           1 :         CATCH_REQUIRE(advgetopt::unquote("<a>", "[]<>{}") == "a");
     131           1 :         CATCH_REQUIRE(advgetopt::unquote("<ab>", "[]<>{}") == "ab");
     132           1 :         CATCH_REQUIRE(advgetopt::unquote("<abc>", "[]<>{}") == "abc");
     133           1 :         CATCH_REQUIRE(advgetopt::unquote("<abcd>", "[]<>{}") == "abcd");
     134             : 
     135           1 :         CATCH_REQUIRE(advgetopt::unquote("[}", "[]<>{}") == "[}");
     136           1 :         CATCH_REQUIRE(advgetopt::unquote("[a}", "[]<>{}") == "[a}");
     137           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab}", "[]<>{}") == "[ab}");
     138           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc}", "[]<>{}") == "[abc}");
     139           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd}", "[]<>{}") == "[abcd}");
     140             : 
     141           1 :         CATCH_REQUIRE(advgetopt::unquote("[>", "[]<>{}") == "[>");
     142           1 :         CATCH_REQUIRE(advgetopt::unquote("[a>", "[]<>{}") == "[a>");
     143           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab>", "[]<>{}") == "[ab>");
     144           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc>", "[]<>{}") == "[abc>");
     145           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd>", "[]<>{}") == "[abcd>");
     146             : 
     147           1 :         CATCH_REQUIRE(advgetopt::unquote("'\"", "[]<>{}") == "'\"");
     148           1 :         CATCH_REQUIRE(advgetopt::unquote("'a\"", "[]<>{}") == "'a\"");
     149           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab\"", "[]<>{}") == "'ab\"");
     150           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc\"", "[]<>{}") == "'abc\"");
     151           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd\"", "[]<>{}") == "'abcd\"");
     152             : 
     153           1 :         CATCH_REQUIRE(advgetopt::unquote("[", "[]<>{}") == "[");
     154           1 :         CATCH_REQUIRE(advgetopt::unquote("[a", "[]<>{}") == "[a");
     155           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab", "[]<>{}") == "[ab");
     156           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc", "[]<>{}") == "[abc");
     157           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd", "[]<>{}") == "[abcd");
     158             : 
     159           1 :         CATCH_REQUIRE(advgetopt::unquote("{", "[]<>{}") == "{");
     160           1 :         CATCH_REQUIRE(advgetopt::unquote("{a", "[]<>{}") == "{a");
     161           1 :         CATCH_REQUIRE(advgetopt::unquote("{ab", "[]<>{}") == "{ab");
     162           1 :         CATCH_REQUIRE(advgetopt::unquote("{abc", "[]<>{}") == "{abc");
     163           1 :         CATCH_REQUIRE(advgetopt::unquote("{abcd", "[]<>{}") == "{abcd");
     164             : 
     165           1 :         CATCH_REQUIRE(advgetopt::unquote("<", "[]<>{}") == "<");
     166           1 :         CATCH_REQUIRE(advgetopt::unquote("<a", "[]<>{}") == "<a");
     167           1 :         CATCH_REQUIRE(advgetopt::unquote("<ab", "[]<>{}") == "<ab");
     168           1 :         CATCH_REQUIRE(advgetopt::unquote("<abc", "[]<>{}") == "<abc");
     169           1 :         CATCH_REQUIRE(advgetopt::unquote("<abcd", "[]<>{}") == "<abcd");
     170             : 
     171           1 :         CATCH_REQUIRE(advgetopt::unquote("}", "[]<>{}") == "}");
     172           1 :         CATCH_REQUIRE(advgetopt::unquote("a}", "[]<>{}") == "a}");
     173           1 :         CATCH_REQUIRE(advgetopt::unquote("ab}", "[]<>{}") == "ab}");
     174           1 :         CATCH_REQUIRE(advgetopt::unquote("abc}", "[]<>{}") == "abc}");
     175           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd}", "[]<>{}") == "abcd}");
     176             : 
     177           1 :         CATCH_REQUIRE(advgetopt::unquote("]", "[]<>{}") == "]");
     178           1 :         CATCH_REQUIRE(advgetopt::unquote("a]", "[]<>{}") == "a]");
     179           1 :         CATCH_REQUIRE(advgetopt::unquote("ab]", "[]<>{}") == "ab]");
     180           1 :         CATCH_REQUIRE(advgetopt::unquote("abc]", "[]<>{}") == "abc]");
     181           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd]", "[]<>{}") == "abcd]");
     182             : 
     183           1 :         CATCH_REQUIRE(advgetopt::unquote(">", "[]<>{}") == ">");
     184           1 :         CATCH_REQUIRE(advgetopt::unquote("a>", "[]<>{}") == "a>");
     185           1 :         CATCH_REQUIRE(advgetopt::unquote("ab>", "[]<>{}") == "ab>");
     186           1 :         CATCH_REQUIRE(advgetopt::unquote("abc>", "[]<>{}") == "abc>");
     187           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd>", "[]<>{}") == "abcd>");
     188             :     CATCH_END_SECTION()
     189           2 : }
     190             : 
     191             : 
     192             : 
     193             : 
     194          13 : CATCH_TEST_CASE("utils_split", "[utils][valid]")
     195             : {
     196          22 :     CATCH_START_SECTION("Split three words")
     197           2 :         advgetopt::string_list_t result;
     198           2 :         advgetopt::split_string("test with spaces"
     199             :                               , result
     200           1 :                               , {" "});
     201           1 :         CATCH_REQUIRE(result.size() == 3);
     202           1 :         CATCH_REQUIRE(result[0] == "test");
     203           1 :         CATCH_REQUIRE(result[1] == "with");
     204           1 :         CATCH_REQUIRE(result[2] == "spaces");
     205             :     CATCH_END_SECTION()
     206             : 
     207          22 :     CATCH_START_SECTION("Split three words, one with single quotes")
     208           2 :         advgetopt::string_list_t result;
     209           2 :         advgetopt::split_string("test 'with quotes and' spaces"
     210             :                               , result
     211           1 :                               , {" "});
     212           1 :         CATCH_REQUIRE(result.size() == 3);
     213           1 :         CATCH_REQUIRE(result[0] == "test");
     214           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     215           1 :         CATCH_REQUIRE(result[2] == "spaces");
     216             :     CATCH_END_SECTION()
     217             : 
     218          22 :     CATCH_START_SECTION("Split three words, one with double quotes")
     219           2 :         advgetopt::string_list_t result;
     220           2 :         advgetopt::split_string("test \"with quotes and\" spaces"
     221             :                               , result
     222           1 :                               , {" "});
     223           1 :         CATCH_REQUIRE(result.size() == 3);
     224           1 :         CATCH_REQUIRE(result[0] == "test");
     225           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     226           1 :         CATCH_REQUIRE(result[2] == "spaces");
     227             :     CATCH_END_SECTION()
     228             : 
     229          22 :     CATCH_START_SECTION("Split three words, one with single quotes but no spaces")
     230           2 :         advgetopt::string_list_t result;
     231           2 :         advgetopt::split_string("test'with quotes and'nospaces"
     232             :                               , result
     233           1 :                               , {" "});
     234           1 :         CATCH_REQUIRE(result.size() == 3);
     235           1 :         CATCH_REQUIRE(result[0] == "test");
     236           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     237           1 :         CATCH_REQUIRE(result[2] == "nospaces");
     238             :     CATCH_END_SECTION()
     239             : 
     240          22 :     CATCH_START_SECTION("Split three words, one with double quotes but no spaces")
     241           2 :         advgetopt::string_list_t result;
     242           2 :         advgetopt::split_string("test\"with quotes and\"nospaces"
     243             :                               , result
     244           1 :                               , {" "});
     245           1 :         CATCH_REQUIRE(result.size() == 3);
     246           1 :         CATCH_REQUIRE(result[0] == "test");
     247           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     248           1 :         CATCH_REQUIRE(result[2] == "nospaces");
     249             :     CATCH_END_SECTION()
     250             : 
     251          22 :     CATCH_START_SECTION("Split five words, four separators")
     252           2 :         advgetopt::string_list_t result;
     253           5 :         advgetopt::split_string("test,with quite|many;separators"
     254             :                               , result
     255           4 :                               , {" ",",","|",";"});
     256           1 :         CATCH_REQUIRE(result.size() == 5);
     257           1 :         CATCH_REQUIRE(result[0] == "test");
     258           1 :         CATCH_REQUIRE(result[1] == "with");
     259           1 :         CATCH_REQUIRE(result[2] == "quite");
     260           1 :         CATCH_REQUIRE(result[3] == "many");
     261           1 :         CATCH_REQUIRE(result[4] == "separators");
     262             :     CATCH_END_SECTION()
     263             : 
     264          22 :     CATCH_START_SECTION("Split five words, multiple/repeated separators")
     265           2 :         advgetopt::string_list_t result;
     266           5 :         advgetopt::split_string("test, with quite|||many ; separators"
     267             :                               , result
     268           4 :                               , {" ",",","|",";"});
     269           1 :         CATCH_REQUIRE(result.size() == 5);
     270           1 :         CATCH_REQUIRE(result[0] == "test");
     271           1 :         CATCH_REQUIRE(result[1] == "with");
     272           1 :         CATCH_REQUIRE(result[2] == "quite");
     273           1 :         CATCH_REQUIRE(result[3] == "many");
     274           1 :         CATCH_REQUIRE(result[4] == "separators");
     275             :     CATCH_END_SECTION()
     276             : 
     277          22 :     CATCH_START_SECTION("Split five words, and empty entries")
     278           2 :         advgetopt::string_list_t result;
     279           5 :         advgetopt::split_string("|||test, with quite\"\"many ; ''separators''"
     280             :                               , result
     281           4 :                               , {" ",",","|",";"});
     282           1 :         CATCH_REQUIRE(result.size() == 5);
     283           1 :         CATCH_REQUIRE(result[0] == "test");
     284           1 :         CATCH_REQUIRE(result[1] == "with");
     285           1 :         CATCH_REQUIRE(result[2] == "quite");
     286           1 :         CATCH_REQUIRE(result[3] == "many");
     287           1 :         CATCH_REQUIRE(result[4] == "separators");
     288             :     CATCH_END_SECTION()
     289             : 
     290          22 :     CATCH_START_SECTION("Split five words, start/end with separator")
     291           2 :         advgetopt::string_list_t result;
     292           2 :         advgetopt::split_string("|start|and|end|with|separator|"
     293             :                               , result
     294           1 :                               , {"|"});
     295           1 :         CATCH_REQUIRE(result.size() == 5);
     296           1 :         CATCH_REQUIRE(result[0] == "start");
     297           1 :         CATCH_REQUIRE(result[1] == "and");
     298           1 :         CATCH_REQUIRE(result[2] == "end");
     299           1 :         CATCH_REQUIRE(result[3] == "with");
     300           1 :         CATCH_REQUIRE(result[4] == "separator");
     301             :     CATCH_END_SECTION()
     302             : 
     303          22 :     CATCH_START_SECTION("Split five words, unclosed double quote")
     304           2 :         advgetopt::string_list_t result;
     305           2 :         advgetopt::split_string("\"unclosed quote|mark"
     306             :                               , result
     307           1 :                               , {"|"});
     308           1 :         CATCH_REQUIRE(result.size() == 1);
     309           1 :         CATCH_REQUIRE(result[0] == "unclosed quote|mark");
     310             :     CATCH_END_SECTION()
     311             : 
     312          22 :     CATCH_START_SECTION("Split five words, unclosed single quote")
     313           2 :         advgetopt::string_list_t result;
     314           3 :         advgetopt::split_string("here is an \"unclosed quote|mark"
     315             :                               , result
     316           2 :                               , {"|"," "});
     317             :         //CATCH_REQUIRE(result.size() == 4);
     318           1 :         CATCH_REQUIRE(result[0] == "here");
     319           1 :         CATCH_REQUIRE(result[1] == "is");
     320           1 :         CATCH_REQUIRE(result[2] == "an");
     321           1 :         CATCH_REQUIRE(result[3] == "unclosed quote|mark");
     322             :     CATCH_END_SECTION()
     323          11 : }
     324             : 
     325             : 
     326             : 
     327             : 
     328           6 : CATCH_TEST_CASE("utils_insert_group_name", "[utils][valid]")
     329             : {
     330           8 :     CATCH_START_SECTION("Full insert")
     331             :         // CONFIG FILE HAS NO EXTENSION
     332             :         {
     333           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     334             :                               "/this/is/a/path"
     335             :                             , "group-name"
     336           2 :                             , "project-name"));
     337           1 :             CATCH_REQUIRE(fullname.size() == 1);
     338           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
     339             :         }
     340             : 
     341             :         {
     342           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     343             :                               "/this/is/a/path"
     344             :                             , "group-name"
     345           2 :                             , ""));
     346           1 :             CATCH_REQUIRE(fullname.size() == 1);
     347           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
     348             :         }
     349             : 
     350             :         {
     351           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     352             :                               "/this/is/a/path"
     353             :                             , "group-name"
     354           2 :                             , nullptr));
     355           1 :             CATCH_REQUIRE(fullname.size() == 1);
     356           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
     357             :         }
     358             : 
     359             :         {
     360           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     361             :                               "/this/is/a/path"
     362             :                             , ""
     363           2 :                             , "project-name"));
     364           1 :             CATCH_REQUIRE(fullname.size() == 1);
     365           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
     366             :         }
     367             : 
     368             :         {
     369           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     370             :                               "/this/is/a/path"
     371             :                             , nullptr
     372           2 :                             , "project-name"));
     373           1 :             CATCH_REQUIRE(fullname.size() == 1);
     374           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
     375             :         }
     376             : 
     377             :         // CONFIG FILE HAS EXTENSION
     378             :         {
     379           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     380             :                               "/this/is/a/basename.ext"
     381             :                             , "group-name"
     382           2 :                             , "project-name"));
     383           1 :             CATCH_REQUIRE(fullname.size() == 1);
     384           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
     385             :         }
     386             : 
     387             :         {
     388           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     389             :                               "/this/is/a/basename.ext"
     390             :                             , "group-name"
     391           2 :                             , ""));
     392           1 :             CATCH_REQUIRE(fullname.size() == 1);
     393           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
     394             :         }
     395             : 
     396             :         {
     397           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     398             :                               "/this/is/a/basename.ext"
     399             :                             , "group-name"
     400           2 :                             , nullptr));
     401           1 :             CATCH_REQUIRE(fullname.size() == 1);
     402           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
     403             :         }
     404             : 
     405             :         {
     406           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     407             :                               "/this/is/a/basename.ext"
     408             :                             , ""
     409           2 :                             , "project-name"));
     410           1 :             CATCH_REQUIRE(fullname.size() == 1);
     411           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
     412             :         }
     413             : 
     414             :         {
     415           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     416             :                               "/this/is/a/basename.ext"
     417             :                             , nullptr
     418           2 :                             , "project-name"));
     419           1 :             CATCH_REQUIRE(fullname.size() == 1);
     420           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
     421             :         }
     422             :     CATCH_END_SECTION()
     423             : 
     424           8 :     CATCH_START_SECTION("Empty cases")
     425             :         {
     426           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     427             :                               "/this/is/a/path"
     428             :                             , nullptr
     429           2 :                             , nullptr));
     430           1 :             CATCH_REQUIRE(fullname.empty());
     431             :         }
     432             : 
     433             :         {
     434           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     435             :                               "/this/is/a/path"
     436             :                             , nullptr
     437           2 :                             , ""));
     438           1 :             CATCH_REQUIRE(fullname.empty());
     439             :         }
     440             : 
     441             :         {
     442           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     443             :                               "/this/is/a/path"
     444             :                             , ""
     445           2 :                             , nullptr));
     446           1 :             CATCH_REQUIRE(fullname.empty());
     447             :         }
     448             : 
     449             :         {
     450           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     451             :                               "/this/is/a/path"
     452             :                             , ""
     453           2 :                             , ""));
     454           1 :             CATCH_REQUIRE(fullname.empty());
     455             :         }
     456             : 
     457             :         {
     458           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     459             :                               ""
     460             :                             , "group-name"
     461           2 :                             , "project-name"));
     462           1 :             CATCH_REQUIRE(fullname.empty());
     463             :         }
     464             : 
     465             :         {
     466           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     467             :                               ""
     468             :                             , ""
     469           2 :                             , "project-name"));
     470           1 :             CATCH_REQUIRE(fullname.empty());
     471             :         }
     472             : 
     473             :         {
     474           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     475             :                               ""
     476             :                             , nullptr
     477           2 :                             , "project-name"));
     478           1 :             CATCH_REQUIRE(fullname.empty());
     479             :         }
     480             : 
     481             :         {
     482           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     483             :                               ""
     484             :                             , nullptr
     485           2 :                             , ""));
     486           1 :             CATCH_REQUIRE(fullname.empty());
     487             :         }
     488             : 
     489             :         {
     490           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     491             :                               ""
     492             :                             , nullptr
     493           2 :                             , nullptr));
     494           1 :             CATCH_REQUIRE(fullname.empty());
     495             :         }
     496             :     CATCH_END_SECTION()
     497             : 
     498           8 :     CATCH_START_SECTION("Basename Only")
     499             :         {
     500           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     501             :                               "basename"
     502             :                             , nullptr
     503           2 :                             , "advgetopt"));
     504           1 :             CATCH_REQUIRE(fullname.size() == 1);
     505           1 :             CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename");
     506             :         }
     507             : 
     508             :         {
     509           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     510             :                               "basename.ext"
     511             :                             , "advgetopt"
     512           2 :                             , nullptr));
     513           1 :             CATCH_REQUIRE(fullname.size() == 1);
     514           1 :             CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename.ext");
     515             :         }
     516             :     CATCH_END_SECTION()
     517             : 
     518           8 :     CATCH_START_SECTION("Actual List of Files on Disk")
     519             :         {
     520           1 :             SNAP_CATCH2_NAMESPACE::init_tmp_dir("advgetopt-multi", "sorted-user-conf", false);
     521             : 
     522             :             // generate an array of numbers from 00 to 99
     523             :             //
     524           2 :             std::vector<int> numbers;
     525         101 :             for(int i = 0; i < 100; ++i)
     526             :             {
     527         100 :                 numbers.push_back(i);
     528             :             }
     529           1 :             std::random_shuffle(numbers.begin(), numbers.end(), shuffle_rand);
     530           1 :             int const max(rand() % 50 + 10);
     531           1 :             numbers.resize(max);
     532           2 :             std::string path(SNAP_CATCH2_NAMESPACE::g_config_project_filename);
     533           1 :             std::string::size_type const pos(path.rfind('/'));
     534           1 :             path = path.substr(0, pos);
     535           2 :             advgetopt::string_list_t filenames;
     536          49 :             for(int i = 0; i < max; ++i)
     537             :             {
     538          96 :                 std::stringstream ss;
     539          48 :                 ss << path;
     540          48 :                 ss << '/';
     541          48 :                 int const n(numbers[i]);
     542          48 :                 if(n < 10)
     543             :                 {
     544           5 :                     ss << '0';
     545             :                 }
     546          48 :                 ss << n;
     547          48 :                 ss << "-sorted-user-conf.config";
     548          48 :                 filenames.push_back(ss.str());
     549          96 :                 std::ofstream conf;
     550          48 :                 conf.open(ss.str(), std::ios_base::out);
     551          48 :                 CATCH_REQUIRE(conf.is_open());
     552          48 :                 conf << "# Config with a number" << std::endl;
     553          48 :                 conf << "var=\"value: " << numbers[i] << "\"" << std::endl;
     554             :             }
     555           1 :             std::sort(filenames.begin(), filenames.end());
     556           2 :             std::string const last_filename(*filenames.rbegin());
     557           1 :             std::string::size_type const slash_pos(last_filename.rfind('/'));
     558           2 :             std::string const expected_var("value: " + last_filename.substr(slash_pos + 1, 2));
     559             : 
     560           1 :             advgetopt::string_list_t fullnames(advgetopt::insert_group_name(
     561             :                               SNAP_CATCH2_NAMESPACE::g_config_filename
     562             :                             , "advgetopt-multi"
     563           2 :                             , "multi-channels"));
     564           1 :             CATCH_REQUIRE(fullnames.size() == filenames.size());
     565          49 :             for(size_t idx(0); idx < filenames.size(); ++idx)
     566             :             {
     567          48 :                 CATCH_REQUIRE(fullnames[idx] == filenames[idx]);
     568             :             }
     569             : 
     570             :             {
     571           2 :                 std::ofstream conf;
     572           1 :                 conf.open(SNAP_CATCH2_NAMESPACE::g_config_filename, std::ios_base::out);
     573           1 :                 CATCH_REQUIRE(conf.is_open());
     574           1 :                 conf << "# Original Config with a number" << std::endl;
     575           1 :                 conf << "var=master value" << std::endl;
     576             : 
     577             :                 // verify the master config file
     578             :                 //
     579           2 :                 advgetopt::conf_file_setup setup(SNAP_CATCH2_NAMESPACE::g_config_filename);
     580           2 :                 advgetopt::conf_file::pointer_t config_file(advgetopt::conf_file::get_conf_file(setup));
     581           1 :                 CATCH_REQUIRE(config_file->get_parameter("var") == "master value");
     582             :             }
     583             : 
     584             :             {
     585             :                 // run a load to verify that we indeed get the last var=...
     586             :                 // value and not some random entry
     587             :                 //
     588           2 :                 std::string temp_dir = SNAP_CATCH2_NAMESPACE::g_tmp_dir + "/.config";
     589           1 :                 char const * const dirs[] = {
     590           1 :                     temp_dir.c_str(),
     591             :                     nullptr
     592           1 :                 };
     593           1 :                 advgetopt::option opts[] = {
     594             :                     advgetopt::define_option(
     595             :                           advgetopt::Name("var")
     596             :                         , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR>())
     597             :                         , advgetopt::Help("verify loading configuration files in a serie.")
     598             :                     ),
     599             :                     advgetopt::end_options()
     600             :                 };
     601             : #pragma GCC diagnostic push
     602             : #pragma GCC diagnostic ignored "-Wpedantic"
     603           1 :                 advgetopt::options_environment env = {
     604             :                     .f_project_name = "sorted-configs",
     605             :                     .f_group_name = "advgetopt-multi",
     606             :                     .f_options = opts,
     607             :                     .f_options_files_directory = nullptr,
     608             :                     .f_environment_variable_name = nullptr,
     609             :                     .f_configuration_files = nullptr,
     610             :                     .f_configuration_filename = "sorted-user-conf.config",
     611             :                     .f_configuration_directories = dirs,
     612             :                     .f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS,
     613             :                     .f_help_header = nullptr,
     614             :                     .f_help_footer = nullptr,
     615             :                     .f_version = nullptr,
     616             :                     .f_license = nullptr,
     617             :                     .f_copyright = nullptr,
     618             :                     .f_build_date = UTC_BUILD_DATE,
     619             :                     .f_build_time = UTC_BUILD_TIME,
     620             :                     .f_groups = nullptr
     621           1 :                 };
     622             : #pragma GCC diagnostic pop
     623           1 :                 char const * const argv[] = {
     624             :                     "test",
     625             :                     nullptr
     626             :                 };
     627           2 :                 advgetopt::getopt opt(env, 1, const_cast<char **>(argv));
     628           1 :                 CATCH_REQUIRE(memcmp(&opt.get_options_environment(), &env, sizeof(env)) == 0);
     629           1 :                 CATCH_REQUIRE(opt.get_string("var") == expected_var);
     630             :             }
     631             :         }
     632             :     CATCH_END_SECTION()
     633           4 : }
     634             : 
     635             : 
     636             : 
     637             : 
     638             : 
     639             : 
     640             : 
     641           5 : CATCH_TEST_CASE("utils_handle_user_directory", "[utils][valid]")
     642             : {
     643           6 :     CATCH_START_SECTION("Valid cases")
     644           2 :         snap::safe_setenv env("HOME", "/home/advgetopt");
     645             : 
     646             :         {
     647           2 :             std::string result(advgetopt::handle_user_directory("~"));
     648           1 :             CATCH_REQUIRE(result == "/home/advgetopt");
     649             :         }
     650             : 
     651             :         {
     652           2 :             std::string result(advgetopt::handle_user_directory("~/"));
     653           1 :             CATCH_REQUIRE(result == "/home/advgetopt/");
     654             :         }
     655             : 
     656             :         {
     657           2 :             std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
     658           1 :             CATCH_REQUIRE(result == "/home/advgetopt/.config/advgetopt.conf");
     659             :         }
     660             :     CATCH_END_SECTION()
     661             : 
     662           6 :     CATCH_START_SECTION("$HOME is empty")
     663           2 :         snap::safe_setenv env("HOME", "");
     664             : 
     665             :         {
     666           2 :             std::string result(advgetopt::handle_user_directory("~"));
     667           1 :             CATCH_REQUIRE(result == "~");
     668             :         }
     669             : 
     670             :         {
     671           2 :             std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
     672           1 :             CATCH_REQUIRE(result == "~/.config/advgetopt.conf");
     673             :         }
     674             :     CATCH_END_SECTION()
     675             : 
     676           6 :     CATCH_START_SECTION("Paths do not start with ~")
     677           2 :         snap::safe_setenv env("HOME", "/home/advgetopt");
     678             : 
     679             :         {
     680           2 :             std::string result(advgetopt::handle_user_directory("/~"));
     681           1 :             CATCH_REQUIRE(result == "/~");
     682             :         }
     683             : 
     684             :         {
     685           2 :             std::string result(advgetopt::handle_user_directory("/~/.config/advgetopt.conf"));
     686           1 :             CATCH_REQUIRE(result == "/~/.config/advgetopt.conf");
     687             :         }
     688             :     CATCH_END_SECTION()
     689           3 : }
     690             : 
     691             : 
     692             : 
     693             : 
     694             : 
     695           4 : CATCH_TEST_CASE("utils_true_false", "[utils][boolean]")
     696             : {
     697           4 :     CATCH_START_SECTION("True Values")
     698             :     {
     699           1 :         CATCH_REQUIRE(advgetopt::is_true("true"));
     700           1 :         CATCH_REQUIRE(advgetopt::is_true("on"));
     701           1 :         CATCH_REQUIRE(advgetopt::is_true("1"));
     702             : 
     703           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("false"));
     704           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("off"));
     705           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("0"));
     706             : 
     707           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("random"));
     708             :     }
     709             :     CATCH_END_SECTION()
     710             : 
     711           4 :     CATCH_START_SECTION("False Values")
     712             :     {
     713           1 :         CATCH_REQUIRE(advgetopt::is_false("false"));
     714           1 :         CATCH_REQUIRE(advgetopt::is_false("off"));
     715           1 :         CATCH_REQUIRE(advgetopt::is_false("0"));
     716             : 
     717           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("true"));
     718           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("on"));
     719           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("1"));
     720             : 
     721           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("random"));
     722             :     }
     723             :     CATCH_END_SECTION()
     724           8 : }
     725             : 
     726             : 
     727             : 
     728             : 
     729             : 
     730             : 
     731             : 
     732             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.13