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

          Line data    Source code
       1             : /*
       2             :  * Files:
       3             :  *    tests/utils.cpp
       4             :  *
       5             :  * License:
       6             :  *    Copyright (c) 2006-2019  Made to Order Software Corp.  All Rights Reserved
       7             :  *
       8             :  *    https://snapwebsites.org/
       9             :  *    contact@m2osw.com
      10             :  *
      11             :  *    This program is free software; you can redistribute it and/or modify
      12             :  *    it under the terms of the GNU General Public License as published by
      13             :  *    the Free Software Foundation; either version 2 of the License, or
      14             :  *    (at your option) any later version.
      15             :  *
      16             :  *    This program is distributed in the hope that it will be useful,
      17             :  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
      18             :  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19             :  *    GNU General Public License for more details.
      20             :  *
      21             :  *    You should have received a copy of the GNU General Public License along
      22             :  *    with this program; if not, write to the Free Software Foundation, Inc.,
      23             :  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      24             :  *
      25             :  * Authors:
      26             :  *    Alexis Wilke   alexis@m2osw.com
      27             :  */
      28             : 
      29             : // self
      30             : //
      31             : #include "main.h"
      32             : 
      33             : // advgetopt lib
      34             : //
      35             : #include <advgetopt/utils.h>
      36             : 
      37             : // snapdev lib
      38             : //
      39             : #include <snapdev/safe_setenv.h>
      40             : 
      41             : 
      42             : 
      43           3 : CATCH_TEST_CASE("utils_unquote", "[utils][valid]")
      44             : {
      45           2 :     CATCH_START_SECTION("Unquote")
      46           1 :         CATCH_REQUIRE(advgetopt::unquote("") == "");
      47           1 :         CATCH_REQUIRE(advgetopt::unquote("a") == "a");
      48           1 :         CATCH_REQUIRE(advgetopt::unquote("ab") == "ab");
      49           1 :         CATCH_REQUIRE(advgetopt::unquote("abc") == "abc");
      50             : 
      51           1 :         CATCH_REQUIRE(advgetopt::unquote("''") == "");
      52           1 :         CATCH_REQUIRE(advgetopt::unquote("'a'") == "a");
      53           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab'") == "ab");
      54           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc'") == "abc");
      55           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd'") == "abcd");
      56             : 
      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           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd\"") == "abcd");
      62             : 
      63           1 :         CATCH_REQUIRE(advgetopt::unquote("\"'") == "\"'");
      64           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a'") == "\"a'");
      65           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab'") == "\"ab'");
      66           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc'") == "\"abc'");
      67           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd'") == "\"abcd'");
      68             : 
      69           1 :         CATCH_REQUIRE(advgetopt::unquote("'\"") == "'\"");
      70           1 :         CATCH_REQUIRE(advgetopt::unquote("'a\"") == "'a\"");
      71           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab\"") == "'ab\"");
      72           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc\"") == "'abc\"");
      73           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd\"") == "'abcd\"");
      74             : 
      75           1 :         CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
      76           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a") == "\"a");
      77           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab") == "\"ab");
      78           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc") == "\"abc");
      79           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd") == "\"abcd");
      80             : 
      81           1 :         CATCH_REQUIRE(advgetopt::unquote("'") == "'");
      82           1 :         CATCH_REQUIRE(advgetopt::unquote("'a") == "'a");
      83           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab") == "'ab");
      84           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc") == "'abc");
      85           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd") == "'abcd");
      86             : 
      87           1 :         CATCH_REQUIRE(advgetopt::unquote("'") == "'");
      88           1 :         CATCH_REQUIRE(advgetopt::unquote("a'") == "a'");
      89           1 :         CATCH_REQUIRE(advgetopt::unquote("ab'") == "ab'");
      90           1 :         CATCH_REQUIRE(advgetopt::unquote("abc'") == "abc'");
      91           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd'") == "abcd'");
      92             : 
      93           1 :         CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
      94           1 :         CATCH_REQUIRE(advgetopt::unquote("a\"") == "a\"");
      95           1 :         CATCH_REQUIRE(advgetopt::unquote("ab\"") == "ab\"");
      96           1 :         CATCH_REQUIRE(advgetopt::unquote("abc\"") == "abc\"");
      97           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd\"") == "abcd\"");
      98             :     CATCH_END_SECTION()
      99           1 : }
     100             : 
     101             : 
     102             : 
     103             : 
     104          13 : CATCH_TEST_CASE("utils_split", "[utils][valid]")
     105             : {
     106          22 :     CATCH_START_SECTION("Split three words")
     107           2 :         advgetopt::string_list_t result;
     108           3 :         advgetopt::split_string("test with spaces"
     109             :                               , result
     110           2 :                               , {" "});
     111           1 :         CATCH_REQUIRE(result.size() == 3);
     112           1 :         CATCH_REQUIRE(result[0] == "test");
     113           1 :         CATCH_REQUIRE(result[1] == "with");
     114           1 :         CATCH_REQUIRE(result[2] == "spaces");
     115             :     CATCH_END_SECTION()
     116             : 
     117          22 :     CATCH_START_SECTION("Split three words, one with single quotes")
     118           2 :         advgetopt::string_list_t result;
     119           3 :         advgetopt::split_string("test 'with quotes and' spaces"
     120             :                               , result
     121           2 :                               , {" "});
     122           1 :         CATCH_REQUIRE(result.size() == 3);
     123           1 :         CATCH_REQUIRE(result[0] == "test");
     124           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     125           1 :         CATCH_REQUIRE(result[2] == "spaces");
     126             :     CATCH_END_SECTION()
     127             : 
     128          22 :     CATCH_START_SECTION("Split three words, one with double quotes")
     129           2 :         advgetopt::string_list_t result;
     130           3 :         advgetopt::split_string("test \"with quotes and\" spaces"
     131             :                               , result
     132           2 :                               , {" "});
     133           1 :         CATCH_REQUIRE(result.size() == 3);
     134           1 :         CATCH_REQUIRE(result[0] == "test");
     135           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     136           1 :         CATCH_REQUIRE(result[2] == "spaces");
     137             :     CATCH_END_SECTION()
     138             : 
     139          22 :     CATCH_START_SECTION("Split three words, one with single quotes but no spaces")
     140           2 :         advgetopt::string_list_t result;
     141           3 :         advgetopt::split_string("test'with quotes and'nospaces"
     142             :                               , result
     143           2 :                               , {" "});
     144           1 :         CATCH_REQUIRE(result.size() == 3);
     145           1 :         CATCH_REQUIRE(result[0] == "test");
     146           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     147           1 :         CATCH_REQUIRE(result[2] == "nospaces");
     148             :     CATCH_END_SECTION()
     149             : 
     150          22 :     CATCH_START_SECTION("Split three words, one with double quotes but no spaces")
     151           2 :         advgetopt::string_list_t result;
     152           3 :         advgetopt::split_string("test\"with quotes and\"nospaces"
     153             :                               , result
     154           2 :                               , {" "});
     155           1 :         CATCH_REQUIRE(result.size() == 3);
     156           1 :         CATCH_REQUIRE(result[0] == "test");
     157           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     158           1 :         CATCH_REQUIRE(result[2] == "nospaces");
     159             :     CATCH_END_SECTION()
     160             : 
     161          22 :     CATCH_START_SECTION("Split five words, four separators")
     162           2 :         advgetopt::string_list_t result;
     163           6 :         advgetopt::split_string("test,with quite|many;separators"
     164             :                               , result
     165           5 :                               , {" ",",","|",";"});
     166           1 :         CATCH_REQUIRE(result.size() == 5);
     167           1 :         CATCH_REQUIRE(result[0] == "test");
     168           1 :         CATCH_REQUIRE(result[1] == "with");
     169           1 :         CATCH_REQUIRE(result[2] == "quite");
     170           1 :         CATCH_REQUIRE(result[3] == "many");
     171           1 :         CATCH_REQUIRE(result[4] == "separators");
     172             :     CATCH_END_SECTION()
     173             : 
     174          22 :     CATCH_START_SECTION("Split five words, multiple/repeated separators")
     175           2 :         advgetopt::string_list_t result;
     176           6 :         advgetopt::split_string("test, with quite|||many ; separators"
     177             :                               , result
     178           5 :                               , {" ",",","|",";"});
     179           1 :         CATCH_REQUIRE(result.size() == 5);
     180           1 :         CATCH_REQUIRE(result[0] == "test");
     181           1 :         CATCH_REQUIRE(result[1] == "with");
     182           1 :         CATCH_REQUIRE(result[2] == "quite");
     183           1 :         CATCH_REQUIRE(result[3] == "many");
     184           1 :         CATCH_REQUIRE(result[4] == "separators");
     185             :     CATCH_END_SECTION()
     186             : 
     187          22 :     CATCH_START_SECTION("Split five words, and empty entries")
     188           2 :         advgetopt::string_list_t result;
     189           6 :         advgetopt::split_string("|||test, with quite\"\"many ; ''separators''"
     190             :                               , result
     191           5 :                               , {" ",",","|",";"});
     192           1 :         CATCH_REQUIRE(result.size() == 5);
     193           1 :         CATCH_REQUIRE(result[0] == "test");
     194           1 :         CATCH_REQUIRE(result[1] == "with");
     195           1 :         CATCH_REQUIRE(result[2] == "quite");
     196           1 :         CATCH_REQUIRE(result[3] == "many");
     197           1 :         CATCH_REQUIRE(result[4] == "separators");
     198             :     CATCH_END_SECTION()
     199             : 
     200          22 :     CATCH_START_SECTION("Split five words, start/end with separator")
     201           2 :         advgetopt::string_list_t result;
     202           3 :         advgetopt::split_string("|start|and|end|with|separator|"
     203             :                               , result
     204           2 :                               , {"|"});
     205           1 :         CATCH_REQUIRE(result.size() == 5);
     206           1 :         CATCH_REQUIRE(result[0] == "start");
     207           1 :         CATCH_REQUIRE(result[1] == "and");
     208           1 :         CATCH_REQUIRE(result[2] == "end");
     209           1 :         CATCH_REQUIRE(result[3] == "with");
     210           1 :         CATCH_REQUIRE(result[4] == "separator");
     211             :     CATCH_END_SECTION()
     212             : 
     213          22 :     CATCH_START_SECTION("Split five words, unclosed double quote")
     214           2 :         advgetopt::string_list_t result;
     215           3 :         advgetopt::split_string("\"unclosed quote|mark"
     216             :                               , result
     217           2 :                               , {"|"});
     218           1 :         CATCH_REQUIRE(result.size() == 1);
     219           1 :         CATCH_REQUIRE(result[0] == "unclosed quote|mark");
     220             :     CATCH_END_SECTION()
     221             : 
     222          22 :     CATCH_START_SECTION("Split five words, unclosed single quote")
     223           2 :         advgetopt::string_list_t result;
     224           4 :         advgetopt::split_string("here is an \"unclosed quote|mark"
     225             :                               , result
     226           3 :                               , {"|"," "});
     227             :         //CATCH_REQUIRE(result.size() == 4);
     228           1 :         CATCH_REQUIRE(result[0] == "here");
     229           1 :         CATCH_REQUIRE(result[1] == "is");
     230           1 :         CATCH_REQUIRE(result[2] == "an");
     231           1 :         CATCH_REQUIRE(result[3] == "unclosed quote|mark");
     232             :     CATCH_END_SECTION()
     233          11 : }
     234             : 
     235             : 
     236             : 
     237             : 
     238           5 : CATCH_TEST_CASE("utils_insert_project_name", "[utils][valid]")
     239             : {
     240           6 :     CATCH_START_SECTION("Full insert")
     241             :         {
     242             :             std::string fullname(advgetopt::insert_project_name(
     243             :                               "/this/is/a/path"
     244           2 :                             , "project-name"));
     245           1 :             CATCH_REQUIRE(fullname == "/this/is/a/project-name.d/path");
     246             :         }
     247             : 
     248             :         {
     249             :             std::string fullname(advgetopt::insert_project_name(
     250             :                               "/this/is/a/basename.ext"
     251           2 :                             , "project-name"));
     252           1 :             CATCH_REQUIRE(fullname == "/this/is/a/project-name.d/basename.ext");
     253             :         }
     254             :     CATCH_END_SECTION()
     255             : 
     256           6 :     CATCH_START_SECTION("Empty cases")
     257             :         {
     258             :             std::string fullname(advgetopt::insert_project_name(
     259             :                               "/this/is/a/path"
     260           2 :                             , nullptr));
     261           1 :             CATCH_REQUIRE(fullname == std::string());
     262             :         }
     263             : 
     264             :         {
     265             :             std::string fullname(advgetopt::insert_project_name(
     266             :                               "/this/is/a/path"
     267           2 :                             , ""));
     268           1 :             CATCH_REQUIRE(fullname == std::string());
     269             :         }
     270             : 
     271             :         {
     272             :             std::string fullname(advgetopt::insert_project_name(
     273             :                               ""
     274           2 :                             , "project-name"));
     275           1 :             CATCH_REQUIRE(fullname == std::string());
     276             :         }
     277             :     CATCH_END_SECTION()
     278             : 
     279           6 :     CATCH_START_SECTION("Basename Only")
     280             :         {
     281             :             std::string fullname(advgetopt::insert_project_name(
     282             :                               "basename"
     283           2 :                             , "advgetopt"));
     284           1 :             CATCH_REQUIRE(fullname == "advgetopt.d/basename");
     285             :         }
     286             : 
     287             :         {
     288             :             std::string fullname(advgetopt::insert_project_name(
     289             :                               "basename.ext"
     290           2 :                             , "advgetopt"));
     291           1 :             CATCH_REQUIRE(fullname == "advgetopt.d/basename.ext");
     292             :         }
     293             :     CATCH_END_SECTION()
     294           3 : }
     295             : 
     296             : 
     297             : 
     298             : 
     299             : 
     300             : 
     301             : 
     302           5 : CATCH_TEST_CASE("utils_handle_user_directory", "[utils][valid]")
     303             : {
     304           6 :     CATCH_START_SECTION("Valid cases")
     305           2 :         snap::safe_setenv env("HOME", "/home/advgetopt");
     306             : 
     307             :         {
     308           2 :             std::string result(advgetopt::handle_user_directory("~"));
     309           1 :             CATCH_REQUIRE(result == "/home/advgetopt");
     310             :         }
     311             : 
     312             :         {
     313           2 :             std::string result(advgetopt::handle_user_directory("~/"));
     314           1 :             CATCH_REQUIRE(result == "/home/advgetopt/");
     315             :         }
     316             : 
     317             :         {
     318           2 :             std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
     319           1 :             CATCH_REQUIRE(result == "/home/advgetopt/.config/advgetopt.conf");
     320             :         }
     321             :     CATCH_END_SECTION()
     322             : 
     323           6 :     CATCH_START_SECTION("$HOME is empty")
     324           2 :         snap::safe_setenv env("HOME", "");
     325             : 
     326             :         {
     327           2 :             std::string result(advgetopt::handle_user_directory("~"));
     328           1 :             CATCH_REQUIRE(result == "~");
     329             :         }
     330             : 
     331             :         {
     332           2 :             std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
     333           1 :             CATCH_REQUIRE(result == "~/.config/advgetopt.conf");
     334             :         }
     335             :     CATCH_END_SECTION()
     336             : 
     337           6 :     CATCH_START_SECTION("Paths do not start with ~")
     338           2 :         snap::safe_setenv env("HOME", "/home/advgetopt");
     339             : 
     340             :         {
     341           2 :             std::string result(advgetopt::handle_user_directory("/~"));
     342           1 :             CATCH_REQUIRE(result == "/~");
     343             :         }
     344             : 
     345             :         {
     346           2 :             std::string result(advgetopt::handle_user_directory("/~/.config/advgetopt.conf"));
     347           1 :             CATCH_REQUIRE(result == "/~/.config/advgetopt.conf");
     348             :         }
     349             :     CATCH_END_SECTION()
     350           9 : }
     351             : 
     352             : 
     353             : 
     354             : 
     355             : 
     356             : 
     357             : 
     358             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.12