Line data Source code
1 : // Copyright (c) 2018-2023 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/snapdev
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 3 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
17 : // along with this program. If not, see <https://www.gnu.org/licenses/>.
18 :
19 : /** \file
20 : * \brief Verify that the tokenize_string() function works.
21 : *
22 : * This file implements tests for the tokenize_string() function.
23 : */
24 :
25 : // self
26 : //
27 : #include <snapdev/tokenize_string.h>
28 :
29 : #include "catch_main.h"
30 :
31 :
32 : // last include
33 : //
34 : #include <snapdev/poison.h>
35 :
36 :
37 : namespace
38 : {
39 :
40 :
41 :
42 :
43 :
44 : }
45 : // no name namespace
46 :
47 :
48 :
49 6 : CATCH_TEST_CASE("tokenize_string", "[string]")
50 : {
51 6 : CATCH_START_SECTION("generate tokens: keep empty entries")
52 : {
53 1 : std::vector<std::string> tokens;
54 1 : CATCH_REQUIRE(snapdev::tokenize_string(
55 : tokens
56 : , " foo catch bar "
57 : , " ") == 13);
58 1 : CATCH_REQUIRE(tokens.size() == 13);
59 1 : CATCH_REQUIRE(tokens[ 0] == "");
60 1 : CATCH_REQUIRE(tokens[ 1] == "");
61 1 : CATCH_REQUIRE(tokens[ 2] == "");
62 1 : CATCH_REQUIRE(tokens[ 3] == "foo");
63 1 : CATCH_REQUIRE(tokens[ 4] == "");
64 1 : CATCH_REQUIRE(tokens[ 5] == "");
65 1 : CATCH_REQUIRE(tokens[ 6] == "");
66 1 : CATCH_REQUIRE(tokens[ 7] == "catch");
67 1 : CATCH_REQUIRE(tokens[ 8] == "");
68 1 : CATCH_REQUIRE(tokens[ 9] == "bar");
69 1 : CATCH_REQUIRE(tokens[10] == "");
70 1 : CATCH_REQUIRE(tokens[11] == "");
71 1 : CATCH_REQUIRE(tokens[12] == "");
72 1 : }
73 6 : CATCH_END_SECTION()
74 :
75 6 : CATCH_START_SECTION("generate tokens: remove empty entries")
76 : {
77 1 : std::vector<std::string> tokens;
78 1 : CATCH_REQUIRE(snapdev::tokenize_string(
79 : tokens
80 : , " foo catch bar "
81 : , " "
82 : , true) == 3);
83 1 : CATCH_REQUIRE(tokens.size() == 3);
84 1 : CATCH_REQUIRE(tokens[0] == "foo");
85 1 : CATCH_REQUIRE(tokens[1] == "catch");
86 1 : CATCH_REQUIRE(tokens[2] == "bar");
87 1 : }
88 6 : CATCH_END_SECTION()
89 :
90 6 : CATCH_START_SECTION("generate tokens: comma separated")
91 : {
92 1 : std::vector<std::string> tokens;
93 1 : CATCH_REQUIRE(snapdev::tokenize_string(
94 : tokens
95 : , ",,,foo,,,,catch,,bar,,,"
96 : , ",") == 13);
97 1 : CATCH_REQUIRE(tokens.size() == 13);
98 1 : CATCH_REQUIRE(tokens[ 0] == "");
99 1 : CATCH_REQUIRE(tokens[ 1] == "");
100 1 : CATCH_REQUIRE(tokens[ 2] == "");
101 1 : CATCH_REQUIRE(tokens[ 3] == "foo");
102 1 : CATCH_REQUIRE(tokens[ 4] == "");
103 1 : CATCH_REQUIRE(tokens[ 5] == "");
104 1 : CATCH_REQUIRE(tokens[ 6] == "");
105 1 : CATCH_REQUIRE(tokens[ 7] == "catch");
106 1 : CATCH_REQUIRE(tokens[ 8] == "");
107 1 : CATCH_REQUIRE(tokens[ 9] == "bar");
108 1 : CATCH_REQUIRE(tokens[10] == "");
109 1 : CATCH_REQUIRE(tokens[11] == "");
110 1 : CATCH_REQUIRE(tokens[12] == "");
111 1 : }
112 6 : CATCH_END_SECTION()
113 :
114 6 : CATCH_START_SECTION("generate tokens: comma separated, remove empty")
115 : {
116 1 : std::vector<std::string> tokens;
117 1 : CATCH_REQUIRE(snapdev::tokenize_string(
118 : tokens
119 : , ",,, foo ,,,,catch ,,bar ,,,"
120 : , ","
121 : , true) == 3);
122 1 : CATCH_REQUIRE(tokens.size() == 3);
123 1 : CATCH_REQUIRE(tokens[0] == " foo ");
124 1 : CATCH_REQUIRE(tokens[1] == "catch ");
125 1 : CATCH_REQUIRE(tokens[2] == "bar ");
126 1 : }
127 6 : CATCH_END_SECTION()
128 :
129 6 : CATCH_START_SECTION("generate tokens: comma separated, remove empty and trim")
130 : {
131 1 : std::vector<std::string> tokens;
132 1 : CATCH_REQUIRE(snapdev::tokenize_string(
133 : tokens
134 : , ", ,, foo ,, ,,catch ,,bar ,,, "
135 : , ","
136 : , true
137 : , " ") == 3);
138 1 : CATCH_REQUIRE(tokens.size() == 3);
139 1 : CATCH_REQUIRE(tokens[0] == "foo");
140 1 : CATCH_REQUIRE(tokens[1] == "catch");
141 1 : CATCH_REQUIRE(tokens[2] == "bar");
142 1 : }
143 6 : CATCH_END_SECTION()
144 :
145 6 : CATCH_START_SECTION("generate tokens: arrow (string) separated, remove empty and trim")
146 : {
147 1 : std::vector<std::string> tokens;
148 1 : CATCH_REQUIRE(snapdev::tokenize_string(
149 : tokens
150 : , "a => b => c => d"
151 : , "=>"
152 : , true
153 : , " "
154 : , snapdev::string_predicate<decltype(tokens)>) == 4);
155 1 : CATCH_REQUIRE(tokens.size() == 4);
156 1 : CATCH_REQUIRE(tokens[0] == "a");
157 1 : CATCH_REQUIRE(tokens[1] == "b");
158 1 : CATCH_REQUIRE(tokens[2] == "c");
159 1 : CATCH_REQUIRE(tokens[3] == "d");
160 1 : }
161 6 : CATCH_END_SECTION()
162 6 : }
163 :
164 : //template<class ContainerT, typename PredicateT = decltype(character_predicate<ContainerT>)>
165 : //size_t tokenize_string(ContainerT & tokens
166 : // , typename ContainerT::value_type const & str
167 : // , typename ContainerT::value_type const & delimiters
168 : // , bool const trim_empty = false
169 : // , typename ContainerT::value_type const & trim_string = typename ContainerT::value_type()
170 : // , PredicateT compare_function = &character_predicate<ContainerT>)
171 :
172 :
173 :
174 : // vim: ts=4 sw=4 et
|