Line data Source code
1 : // Copyright (c) 2018-2025 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 8 : CATCH_TEST_CASE("tokenize_string", "[string]")
50 : {
51 8 : CATCH_START_SECTION("tokenize_string: empty input non-empty output if keeping empty entries")
52 : {
53 1 : std::vector<std::string> tokens;
54 5 : CATCH_REQUIRE(snapdev::tokenize_string(
55 : tokens
56 : , ""
57 : , " ") == 1);
58 1 : CATCH_REQUIRE(tokens.size() == 1);
59 1 : CATCH_REQUIRE(tokens[0] == "");
60 1 : }
61 8 : CATCH_END_SECTION()
62 :
63 8 : CATCH_START_SECTION("tokenize_string: empty input empty output when removing empty entries")
64 : {
65 1 : std::vector<std::string> tokens;
66 5 : CATCH_REQUIRE(snapdev::tokenize_string(
67 : tokens
68 : , ""
69 : , " "
70 : , true) == 0);
71 1 : CATCH_REQUIRE(tokens.size() == 0);
72 1 : }
73 8 : CATCH_END_SECTION()
74 :
75 8 : CATCH_START_SECTION("tokenize_string: keep empty entries")
76 : {
77 1 : std::vector<std::string> tokens;
78 5 : CATCH_REQUIRE(snapdev::tokenize_string(
79 : tokens
80 : , " foo catch bar "
81 : , " ") == 13);
82 1 : CATCH_REQUIRE(tokens.size() == 13);
83 1 : CATCH_REQUIRE(tokens[ 0] == "");
84 1 : CATCH_REQUIRE(tokens[ 1] == "");
85 1 : CATCH_REQUIRE(tokens[ 2] == "");
86 1 : CATCH_REQUIRE(tokens[ 3] == "foo");
87 1 : CATCH_REQUIRE(tokens[ 4] == "");
88 1 : CATCH_REQUIRE(tokens[ 5] == "");
89 1 : CATCH_REQUIRE(tokens[ 6] == "");
90 1 : CATCH_REQUIRE(tokens[ 7] == "catch");
91 1 : CATCH_REQUIRE(tokens[ 8] == "");
92 1 : CATCH_REQUIRE(tokens[ 9] == "bar");
93 1 : CATCH_REQUIRE(tokens[10] == "");
94 1 : CATCH_REQUIRE(tokens[11] == "");
95 1 : CATCH_REQUIRE(tokens[12] == "");
96 1 : }
97 8 : CATCH_END_SECTION()
98 :
99 8 : CATCH_START_SECTION("tokenize_string: remove empty entries")
100 : {
101 1 : std::vector<std::string> tokens;
102 5 : CATCH_REQUIRE(snapdev::tokenize_string(
103 : tokens
104 : , " foo catch bar "
105 : , " "
106 : , true) == 3);
107 1 : CATCH_REQUIRE(tokens.size() == 3);
108 1 : CATCH_REQUIRE(tokens[0] == "foo");
109 1 : CATCH_REQUIRE(tokens[1] == "catch");
110 1 : CATCH_REQUIRE(tokens[2] == "bar");
111 1 : }
112 8 : CATCH_END_SECTION()
113 :
114 8 : CATCH_START_SECTION("tokenize_string: comma separated")
115 : {
116 1 : std::vector<std::string> tokens;
117 5 : CATCH_REQUIRE(snapdev::tokenize_string(
118 : tokens
119 : , ",,,foo,,,,catch,,bar,,,"
120 : , ",") == 13);
121 1 : CATCH_REQUIRE(tokens.size() == 13);
122 1 : CATCH_REQUIRE(tokens[ 0] == "");
123 1 : CATCH_REQUIRE(tokens[ 1] == "");
124 1 : CATCH_REQUIRE(tokens[ 2] == "");
125 1 : CATCH_REQUIRE(tokens[ 3] == "foo");
126 1 : CATCH_REQUIRE(tokens[ 4] == "");
127 1 : CATCH_REQUIRE(tokens[ 5] == "");
128 1 : CATCH_REQUIRE(tokens[ 6] == "");
129 1 : CATCH_REQUIRE(tokens[ 7] == "catch");
130 1 : CATCH_REQUIRE(tokens[ 8] == "");
131 1 : CATCH_REQUIRE(tokens[ 9] == "bar");
132 1 : CATCH_REQUIRE(tokens[10] == "");
133 1 : CATCH_REQUIRE(tokens[11] == "");
134 1 : CATCH_REQUIRE(tokens[12] == "");
135 1 : }
136 8 : CATCH_END_SECTION()
137 :
138 8 : CATCH_START_SECTION("tokenize_string: comma separated, remove empty")
139 : {
140 1 : std::vector<std::string> tokens;
141 5 : CATCH_REQUIRE(snapdev::tokenize_string(
142 : tokens
143 : , ",,, foo ,,,,catch ,,bar ,,,"
144 : , ","
145 : , true) == 3);
146 1 : CATCH_REQUIRE(tokens.size() == 3);
147 1 : CATCH_REQUIRE(tokens[0] == " foo ");
148 1 : CATCH_REQUIRE(tokens[1] == "catch ");
149 1 : CATCH_REQUIRE(tokens[2] == "bar ");
150 1 : }
151 8 : CATCH_END_SECTION()
152 :
153 8 : CATCH_START_SECTION("tokenize_string: comma separated, remove empty and trim")
154 : {
155 1 : std::vector<std::string> tokens;
156 7 : CATCH_REQUIRE(snapdev::tokenize_string(
157 : tokens
158 : , ", ,, foo ,, ,,catch ,,bar ,,, "
159 : , ","
160 : , true
161 : , " ") == 3);
162 1 : CATCH_REQUIRE(tokens.size() == 3);
163 1 : CATCH_REQUIRE(tokens[0] == "foo");
164 1 : CATCH_REQUIRE(tokens[1] == "catch");
165 1 : CATCH_REQUIRE(tokens[2] == "bar");
166 1 : }
167 8 : CATCH_END_SECTION()
168 :
169 8 : CATCH_START_SECTION("tokenize_string: arrow (string) separated, remove empty and trim")
170 : {
171 1 : std::vector<std::string> tokens;
172 7 : CATCH_REQUIRE(snapdev::tokenize_string(
173 : tokens
174 : , "a => b => c => d"
175 : , "=>"
176 : , true
177 : , " "
178 : , snapdev::string_predicate<decltype(tokens)>) == 4);
179 1 : CATCH_REQUIRE(tokens.size() == 4);
180 1 : CATCH_REQUIRE(tokens[0] == "a");
181 1 : CATCH_REQUIRE(tokens[1] == "b");
182 1 : CATCH_REQUIRE(tokens[2] == "c");
183 1 : CATCH_REQUIRE(tokens[3] == "d");
184 1 : }
185 8 : CATCH_END_SECTION()
186 8 : }
187 :
188 : //template<class ContainerT, typename PredicateT = decltype(character_predicate<ContainerT>)>
189 : //size_t tokenize_string(ContainerT & tokens
190 : // , typename ContainerT::value_type const & str
191 : // , typename ContainerT::value_type const & delimiters
192 : // , bool const trim_empty = false
193 : // , typename ContainerT::value_type const & trim_string = typename ContainerT::value_type()
194 : // , PredicateT compare_function = &character_predicate<ContainerT>)
195 :
196 :
197 :
198 : // vim: ts=4 sw=4 et
|