xref: /freebsd/contrib/kyua/utils/text/operations_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2012 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis //   documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis //   may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis //   without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis 
29*b0d29bc4SBrooks Davis #include "utils/text/operations.ipp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis #include <iostream>
32*b0d29bc4SBrooks Davis #include <set>
33*b0d29bc4SBrooks Davis #include <string>
34*b0d29bc4SBrooks Davis #include <vector>
35*b0d29bc4SBrooks Davis 
36*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
37*b0d29bc4SBrooks Davis 
38*b0d29bc4SBrooks Davis #include "utils/text/exceptions.hpp"
39*b0d29bc4SBrooks Davis 
40*b0d29bc4SBrooks Davis namespace text = utils::text;
41*b0d29bc4SBrooks Davis 
42*b0d29bc4SBrooks Davis 
43*b0d29bc4SBrooks Davis namespace {
44*b0d29bc4SBrooks Davis 
45*b0d29bc4SBrooks Davis 
46*b0d29bc4SBrooks Davis /// Tests text::refill() on an input string with a range of widths.
47*b0d29bc4SBrooks Davis ///
48*b0d29bc4SBrooks Davis /// \param expected The expected refilled paragraph.
49*b0d29bc4SBrooks Davis /// \param input The input paragraph to be refilled.
50*b0d29bc4SBrooks Davis /// \param first_width The first width to validate.
51*b0d29bc4SBrooks Davis /// \param last_width The last width to validate (inclusive).
52*b0d29bc4SBrooks Davis static void
refill_test(const char * expected,const char * input,const std::size_t first_width,const std::size_t last_width)53*b0d29bc4SBrooks Davis refill_test(const char* expected, const char* input,
54*b0d29bc4SBrooks Davis             const std::size_t first_width, const std::size_t last_width)
55*b0d29bc4SBrooks Davis {
56*b0d29bc4SBrooks Davis     for (std::size_t width = first_width; width <= last_width; ++width) {
57*b0d29bc4SBrooks Davis         const std::vector< std::string > lines = text::split(expected, '\n');
58*b0d29bc4SBrooks Davis         std::cout << "Breaking at width " << width << '\n';
59*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(expected, text::refill_as_string(input, width));
60*b0d29bc4SBrooks Davis         ATF_REQUIRE(lines == text::refill(input, width));
61*b0d29bc4SBrooks Davis     }
62*b0d29bc4SBrooks Davis }
63*b0d29bc4SBrooks Davis 
64*b0d29bc4SBrooks Davis 
65*b0d29bc4SBrooks Davis }  // anonymous namespace
66*b0d29bc4SBrooks Davis 
67*b0d29bc4SBrooks Davis 
68*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(escape_xml__empty);
ATF_TEST_CASE_BODY(escape_xml__empty)69*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(escape_xml__empty)
70*b0d29bc4SBrooks Davis {
71*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("", text::escape_xml(""));
72*b0d29bc4SBrooks Davis }
73*b0d29bc4SBrooks Davis 
74*b0d29bc4SBrooks Davis 
75*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(escape_xml__no_escaping);
ATF_TEST_CASE_BODY(escape_xml__no_escaping)76*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(escape_xml__no_escaping)
77*b0d29bc4SBrooks Davis {
78*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("a", text::escape_xml("a"));
79*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("Some text!", text::escape_xml("Some text!"));
80*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("\n\t\r", text::escape_xml("\n\t\r"));
81*b0d29bc4SBrooks Davis }
82*b0d29bc4SBrooks Davis 
83*b0d29bc4SBrooks Davis 
84*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(escape_xml__some_escaping);
ATF_TEST_CASE_BODY(escape_xml__some_escaping)85*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(escape_xml__some_escaping)
86*b0d29bc4SBrooks Davis {
87*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("&apos;", text::escape_xml("'"));
88*b0d29bc4SBrooks Davis 
89*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo &quot;bar&amp; &lt;tag&gt; yay&apos; baz",
90*b0d29bc4SBrooks Davis                    text::escape_xml("foo \"bar& <tag> yay' baz"));
91*b0d29bc4SBrooks Davis 
92*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("&quot;&amp;&lt;&gt;&apos;", text::escape_xml("\"&<>'"));
93*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("&amp;&amp;&amp;", text::escape_xml("&&&"));
94*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("&amp;#8;&amp;#11;", text::escape_xml("\b\v"));
95*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("\t&amp;#127;BAR&amp;", text::escape_xml("\t\x7f""BAR&"));
96*b0d29bc4SBrooks Davis }
97*b0d29bc4SBrooks Davis 
98*b0d29bc4SBrooks Davis 
99*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(quote__empty);
ATF_TEST_CASE_BODY(quote__empty)100*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(quote__empty)
101*b0d29bc4SBrooks Davis {
102*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("''", text::quote("", '\''));
103*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("##", text::quote("", '#'));
104*b0d29bc4SBrooks Davis }
105*b0d29bc4SBrooks Davis 
106*b0d29bc4SBrooks Davis 
107*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(quote__no_escaping);
ATF_TEST_CASE_BODY(quote__no_escaping)108*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(quote__no_escaping)
109*b0d29bc4SBrooks Davis {
110*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("'Some text\"'", text::quote("Some text\"", '\''));
111*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("#Another'string#", text::quote("Another'string", '#'));
112*b0d29bc4SBrooks Davis }
113*b0d29bc4SBrooks Davis 
114*b0d29bc4SBrooks Davis 
115*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(quote__some_escaping);
ATF_TEST_CASE_BODY(quote__some_escaping)116*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(quote__some_escaping)
117*b0d29bc4SBrooks Davis {
118*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("'Some\\'text'", text::quote("Some'text", '\''));
119*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("#Some\\#text#", text::quote("Some#text", '#'));
120*b0d29bc4SBrooks Davis 
121*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("'More than one\\' quote\\''",
122*b0d29bc4SBrooks Davis                    text::quote("More than one' quote'", '\''));
123*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("'Multiple quotes \\'\\'\\' together'",
124*b0d29bc4SBrooks Davis                    text::quote("Multiple quotes ''' together", '\''));
125*b0d29bc4SBrooks Davis 
126*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("'\\'escape at the beginning'",
127*b0d29bc4SBrooks Davis                    text::quote("'escape at the beginning", '\''));
128*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("'escape at the end\\''",
129*b0d29bc4SBrooks Davis                    text::quote("escape at the end'", '\''));
130*b0d29bc4SBrooks Davis }
131*b0d29bc4SBrooks Davis 
132*b0d29bc4SBrooks Davis 
133*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(refill__empty);
ATF_TEST_CASE_BODY(refill__empty)134*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(refill__empty)
135*b0d29bc4SBrooks Davis {
136*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, text::refill("", 0).size());
137*b0d29bc4SBrooks Davis     ATF_REQUIRE(text::refill("", 0)[0].empty());
138*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("", text::refill_as_string("", 0));
139*b0d29bc4SBrooks Davis 
140*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, text::refill("", 10).size());
141*b0d29bc4SBrooks Davis     ATF_REQUIRE(text::refill("", 10)[0].empty());
142*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("", text::refill_as_string("", 10));
143*b0d29bc4SBrooks Davis }
144*b0d29bc4SBrooks Davis 
145*b0d29bc4SBrooks Davis 
146*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(refill__no_changes);
ATF_TEST_CASE_BODY(refill__no_changes)147*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(refill__no_changes)
148*b0d29bc4SBrooks Davis {
149*b0d29bc4SBrooks Davis     std::vector< std::string > exp_lines;
150*b0d29bc4SBrooks Davis     exp_lines.push_back("foo bar\nbaz");
151*b0d29bc4SBrooks Davis 
152*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_lines == text::refill("foo bar\nbaz", 12));
153*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo bar\nbaz", text::refill_as_string("foo bar\nbaz", 12));
154*b0d29bc4SBrooks Davis 
155*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_lines == text::refill("foo bar\nbaz", 18));
156*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo bar\nbaz", text::refill_as_string("foo bar\nbaz", 80));
157*b0d29bc4SBrooks Davis }
158*b0d29bc4SBrooks Davis 
159*b0d29bc4SBrooks Davis 
160*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(refill__break_one);
ATF_TEST_CASE_BODY(refill__break_one)161*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(refill__break_one)
162*b0d29bc4SBrooks Davis {
163*b0d29bc4SBrooks Davis     refill_test("only break the\nfirst line", "only break the first line",
164*b0d29bc4SBrooks Davis                 14, 19);
165*b0d29bc4SBrooks Davis }
166*b0d29bc4SBrooks Davis 
167*b0d29bc4SBrooks Davis 
168*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(refill__break_one__not_first_word);
ATF_TEST_CASE_BODY(refill__break_one__not_first_word)169*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(refill__break_one__not_first_word)
170*b0d29bc4SBrooks Davis {
171*b0d29bc4SBrooks Davis     refill_test("first-long-word\nother\nwords", "first-long-word other words",
172*b0d29bc4SBrooks Davis                 6, 10);
173*b0d29bc4SBrooks Davis     refill_test("first-long-word\nother words", "first-long-word other words",
174*b0d29bc4SBrooks Davis                 11, 20);
175*b0d29bc4SBrooks Davis     refill_test("first-long-word other\nwords", "first-long-word other words",
176*b0d29bc4SBrooks Davis                 21, 26);
177*b0d29bc4SBrooks Davis     refill_test("first-long-word other words", "first-long-word other words",
178*b0d29bc4SBrooks Davis                 27, 28);
179*b0d29bc4SBrooks Davis }
180*b0d29bc4SBrooks Davis 
181*b0d29bc4SBrooks Davis 
182*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(refill__break_many);
ATF_TEST_CASE_BODY(refill__break_many)183*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(refill__break_many)
184*b0d29bc4SBrooks Davis {
185*b0d29bc4SBrooks Davis     refill_test("this is a long\nparagraph to be\nsplit into\npieces",
186*b0d29bc4SBrooks Davis                 "this is a long paragraph to be split into pieces",
187*b0d29bc4SBrooks Davis                 15, 15);
188*b0d29bc4SBrooks Davis }
189*b0d29bc4SBrooks Davis 
190*b0d29bc4SBrooks Davis 
191*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(refill__cannot_break);
ATF_TEST_CASE_BODY(refill__cannot_break)192*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(refill__cannot_break)
193*b0d29bc4SBrooks Davis {
194*b0d29bc4SBrooks Davis     refill_test("this-is-a-long-string", "this-is-a-long-string", 5, 5);
195*b0d29bc4SBrooks Davis 
196*b0d29bc4SBrooks Davis     refill_test("this is\na-string-with-long-words",
197*b0d29bc4SBrooks Davis                 "this is a-string-with-long-words", 10, 10);
198*b0d29bc4SBrooks Davis }
199*b0d29bc4SBrooks Davis 
200*b0d29bc4SBrooks Davis 
201*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(refill__preserve_whitespace);
ATF_TEST_CASE_BODY(refill__preserve_whitespace)202*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(refill__preserve_whitespace)
203*b0d29bc4SBrooks Davis {
204*b0d29bc4SBrooks Davis     refill_test("foo  bar baz  ", "foo  bar baz  ", 80, 80);
205*b0d29bc4SBrooks Davis     refill_test("foo  \n bar", "foo    bar", 5, 5);
206*b0d29bc4SBrooks Davis 
207*b0d29bc4SBrooks Davis     std::vector< std::string > exp_lines;
208*b0d29bc4SBrooks Davis     exp_lines.push_back("foo \n");
209*b0d29bc4SBrooks Davis     exp_lines.push_back(" bar");
210*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_lines == text::refill("foo \n  bar", 5));
211*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo \n\n bar", text::refill_as_string("foo \n  bar", 5));
212*b0d29bc4SBrooks Davis }
213*b0d29bc4SBrooks Davis 
214*b0d29bc4SBrooks Davis 
215*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(join__empty);
ATF_TEST_CASE_BODY(join__empty)216*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(join__empty)
217*b0d29bc4SBrooks Davis {
218*b0d29bc4SBrooks Davis     std::vector< std::string > lines;
219*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("", text::join(lines, " "));
220*b0d29bc4SBrooks Davis }
221*b0d29bc4SBrooks Davis 
222*b0d29bc4SBrooks Davis 
223*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(join__one);
ATF_TEST_CASE_BODY(join__one)224*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(join__one)
225*b0d29bc4SBrooks Davis {
226*b0d29bc4SBrooks Davis     std::vector< std::string > lines;
227*b0d29bc4SBrooks Davis     lines.push_back("first line");
228*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first line", text::join(lines, "*"));
229*b0d29bc4SBrooks Davis }
230*b0d29bc4SBrooks Davis 
231*b0d29bc4SBrooks Davis 
232*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(join__several);
ATF_TEST_CASE_BODY(join__several)233*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(join__several)
234*b0d29bc4SBrooks Davis {
235*b0d29bc4SBrooks Davis     std::vector< std::string > lines;
236*b0d29bc4SBrooks Davis     lines.push_back("first abc");
237*b0d29bc4SBrooks Davis     lines.push_back("second");
238*b0d29bc4SBrooks Davis     lines.push_back("and last line");
239*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first abc second and last line", text::join(lines, " "));
240*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first abc***second***and last line",
241*b0d29bc4SBrooks Davis                    text::join(lines, "***"));
242*b0d29bc4SBrooks Davis }
243*b0d29bc4SBrooks Davis 
244*b0d29bc4SBrooks Davis 
245*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(join__unordered);
ATF_TEST_CASE_BODY(join__unordered)246*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(join__unordered)
247*b0d29bc4SBrooks Davis {
248*b0d29bc4SBrooks Davis     std::set< std::string > lines;
249*b0d29bc4SBrooks Davis     lines.insert("first");
250*b0d29bc4SBrooks Davis     lines.insert("second");
251*b0d29bc4SBrooks Davis     const std::string joined = text::join(lines, " ");
252*b0d29bc4SBrooks Davis     ATF_REQUIRE(joined == "first second" || joined == "second first");
253*b0d29bc4SBrooks Davis }
254*b0d29bc4SBrooks Davis 
255*b0d29bc4SBrooks Davis 
256*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(split__empty);
ATF_TEST_CASE_BODY(split__empty)257*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(split__empty)
258*b0d29bc4SBrooks Davis {
259*b0d29bc4SBrooks Davis     std::vector< std::string > words = text::split("", ' ');
260*b0d29bc4SBrooks Davis     std::vector< std::string > exp_words;
261*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_words == words);
262*b0d29bc4SBrooks Davis }
263*b0d29bc4SBrooks Davis 
264*b0d29bc4SBrooks Davis 
265*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(split__one);
ATF_TEST_CASE_BODY(split__one)266*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(split__one)
267*b0d29bc4SBrooks Davis {
268*b0d29bc4SBrooks Davis     std::vector< std::string > words = text::split("foo", ' ');
269*b0d29bc4SBrooks Davis     std::vector< std::string > exp_words;
270*b0d29bc4SBrooks Davis     exp_words.push_back("foo");
271*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_words == words);
272*b0d29bc4SBrooks Davis }
273*b0d29bc4SBrooks Davis 
274*b0d29bc4SBrooks Davis 
275*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(split__several__simple);
ATF_TEST_CASE_BODY(split__several__simple)276*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(split__several__simple)
277*b0d29bc4SBrooks Davis {
278*b0d29bc4SBrooks Davis     std::vector< std::string > words = text::split("foo bar baz", ' ');
279*b0d29bc4SBrooks Davis     std::vector< std::string > exp_words;
280*b0d29bc4SBrooks Davis     exp_words.push_back("foo");
281*b0d29bc4SBrooks Davis     exp_words.push_back("bar");
282*b0d29bc4SBrooks Davis     exp_words.push_back("baz");
283*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_words == words);
284*b0d29bc4SBrooks Davis }
285*b0d29bc4SBrooks Davis 
286*b0d29bc4SBrooks Davis 
287*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(split__several__delimiters);
ATF_TEST_CASE_BODY(split__several__delimiters)288*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(split__several__delimiters)
289*b0d29bc4SBrooks Davis {
290*b0d29bc4SBrooks Davis     std::vector< std::string > words = text::split("XfooXXbarXXXbazXX", 'X');
291*b0d29bc4SBrooks Davis     std::vector< std::string > exp_words;
292*b0d29bc4SBrooks Davis     exp_words.push_back("");
293*b0d29bc4SBrooks Davis     exp_words.push_back("foo");
294*b0d29bc4SBrooks Davis     exp_words.push_back("");
295*b0d29bc4SBrooks Davis     exp_words.push_back("bar");
296*b0d29bc4SBrooks Davis     exp_words.push_back("");
297*b0d29bc4SBrooks Davis     exp_words.push_back("");
298*b0d29bc4SBrooks Davis     exp_words.push_back("baz");
299*b0d29bc4SBrooks Davis     exp_words.push_back("");
300*b0d29bc4SBrooks Davis     exp_words.push_back("");
301*b0d29bc4SBrooks Davis     ATF_REQUIRE(exp_words == words);
302*b0d29bc4SBrooks Davis }
303*b0d29bc4SBrooks Davis 
304*b0d29bc4SBrooks Davis 
305*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(replace_all__empty);
ATF_TEST_CASE_BODY(replace_all__empty)306*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(replace_all__empty)
307*b0d29bc4SBrooks Davis {
308*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("", text::replace_all("", "search", "replacement"));
309*b0d29bc4SBrooks Davis }
310*b0d29bc4SBrooks Davis 
311*b0d29bc4SBrooks Davis 
312*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(replace_all__none);
ATF_TEST_CASE_BODY(replace_all__none)313*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(replace_all__none)
314*b0d29bc4SBrooks Davis {
315*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("string without matches",
316*b0d29bc4SBrooks Davis                    text::replace_all("string without matches",
317*b0d29bc4SBrooks Davis                                      "WITHOUT", "replacement"));
318*b0d29bc4SBrooks Davis }
319*b0d29bc4SBrooks Davis 
320*b0d29bc4SBrooks Davis 
321*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(replace_all__one);
ATF_TEST_CASE_BODY(replace_all__one)322*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(replace_all__one)
323*b0d29bc4SBrooks Davis {
324*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("string replacement matches",
325*b0d29bc4SBrooks Davis                    text::replace_all("string without matches",
326*b0d29bc4SBrooks Davis                                      "without", "replacement"));
327*b0d29bc4SBrooks Davis }
328*b0d29bc4SBrooks Davis 
329*b0d29bc4SBrooks Davis 
330*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(replace_all__several);
ATF_TEST_CASE_BODY(replace_all__several)331*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(replace_all__several)
332*b0d29bc4SBrooks Davis {
333*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("OO fOO bar OOf baz OO",
334*b0d29bc4SBrooks Davis                    text::replace_all("oo foo bar oof baz oo",
335*b0d29bc4SBrooks Davis                                      "oo", "OO"));
336*b0d29bc4SBrooks Davis }
337*b0d29bc4SBrooks Davis 
338*b0d29bc4SBrooks Davis 
339*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_type__ok__bool);
ATF_TEST_CASE_BODY(to_type__ok__bool)340*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(to_type__ok__bool)
341*b0d29bc4SBrooks Davis {
342*b0d29bc4SBrooks Davis     ATF_REQUIRE( text::to_type< bool >("true"));
343*b0d29bc4SBrooks Davis     ATF_REQUIRE(!text::to_type< bool >("false"));
344*b0d29bc4SBrooks Davis }
345*b0d29bc4SBrooks Davis 
346*b0d29bc4SBrooks Davis 
347*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_type__ok__numerical);
ATF_TEST_CASE_BODY(to_type__ok__numerical)348*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(to_type__ok__numerical)
349*b0d29bc4SBrooks Davis {
350*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(12, text::to_type< int >("12"));
351*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(18745, text::to_type< int >("18745"));
352*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(-12345, text::to_type< int >("-12345"));
353*b0d29bc4SBrooks Davis 
354*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(12.0, text::to_type< double >("12"));
355*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(12.5, text::to_type< double >("12.5"));
356*b0d29bc4SBrooks Davis }
357*b0d29bc4SBrooks Davis 
358*b0d29bc4SBrooks Davis 
359*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_type__ok__string);
ATF_TEST_CASE_BODY(to_type__ok__string)360*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(to_type__ok__string)
361*b0d29bc4SBrooks Davis {
362*b0d29bc4SBrooks Davis     // While this seems redundant, having this particular specialization that
363*b0d29bc4SBrooks Davis     // does nothing allows callers to delegate work to to_type without worrying
364*b0d29bc4SBrooks Davis     // about the particular type being converted.
365*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("", text::to_type< std::string >(""));
366*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("  abcd  ", text::to_type< std::string >("  abcd  "));
367*b0d29bc4SBrooks Davis }
368*b0d29bc4SBrooks Davis 
369*b0d29bc4SBrooks Davis 
370*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_type__empty);
ATF_TEST_CASE_BODY(to_type__empty)371*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(to_type__empty)
372*b0d29bc4SBrooks Davis {
373*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< int >(""));
374*b0d29bc4SBrooks Davis }
375*b0d29bc4SBrooks Davis 
376*b0d29bc4SBrooks Davis 
377*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_type__invalid__bool);
ATF_TEST_CASE_BODY(to_type__invalid__bool)378*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(to_type__invalid__bool)
379*b0d29bc4SBrooks Davis {
380*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< bool >(""));
381*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< bool >("true "));
382*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< bool >("foo"));
383*b0d29bc4SBrooks Davis }
384*b0d29bc4SBrooks Davis 
385*b0d29bc4SBrooks Davis 
386*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_type__invalid__numerical);
ATF_TEST_CASE_BODY(to_type__invalid__numerical)387*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(to_type__invalid__numerical)
388*b0d29bc4SBrooks Davis {
389*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< int >(" 3"));
390*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< int >("3 "));
391*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< int >("3a"));
392*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(text::value_error, text::to_type< int >("a3"));
393*b0d29bc4SBrooks Davis }
394*b0d29bc4SBrooks Davis 
395*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)396*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
397*b0d29bc4SBrooks Davis {
398*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, escape_xml__empty);
399*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, escape_xml__no_escaping);
400*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, escape_xml__some_escaping);
401*b0d29bc4SBrooks Davis 
402*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, quote__empty);
403*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, quote__no_escaping);
404*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, quote__some_escaping);
405*b0d29bc4SBrooks Davis 
406*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, refill__empty);
407*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, refill__no_changes);
408*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, refill__break_one);
409*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, refill__break_one__not_first_word);
410*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, refill__break_many);
411*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, refill__cannot_break);
412*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, refill__preserve_whitespace);
413*b0d29bc4SBrooks Davis 
414*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, join__empty);
415*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, join__one);
416*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, join__several);
417*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, join__unordered);
418*b0d29bc4SBrooks Davis 
419*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, split__empty);
420*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, split__one);
421*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, split__several__simple);
422*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, split__several__delimiters);
423*b0d29bc4SBrooks Davis 
424*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, replace_all__empty);
425*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, replace_all__none);
426*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, replace_all__one);
427*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, replace_all__several);
428*b0d29bc4SBrooks Davis 
429*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_type__ok__bool);
430*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_type__ok__numerical);
431*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_type__ok__string);
432*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_type__empty);
433*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_type__invalid__bool);
434*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_type__invalid__numerical);
435*b0d29bc4SBrooks Davis }
436