1 // Boost string_algo library find_format_test.cpp file ------------------//
2
3 // Copyright (c) 2009 Steven Watanabe
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7
8 // See http://www.boost.org for updates, documentation, and revision history.
9
10 #include <boost/algorithm/string/find_format.hpp>
11 #include <boost/algorithm/string/finder.hpp>
12 #include <boost/algorithm/string/formatter.hpp>
13
14 // Include unit test framework
15 #define BOOST_TEST_MAIN
16 #include <boost/test/unit_test.hpp>
17
18 #include <boost/test/test_tools.hpp>
19
20 // We're only using const_formatter.
21 template<class Formatter>
22 struct formatter_result {
23 typedef boost::iterator_range<const char*> type;
24 };
25
26 template<class Formatter>
27 struct checked_formatter {
28 public:
checked_formatterchecked_formatter29 checked_formatter(const Formatter& formatter) : formatter_(formatter) {}
30 template< typename T >
operator ()checked_formatter31 typename formatter_result<Formatter>::type operator()( const T & s ) const {
32 BOOST_CHECK( !s.empty() );
33 return formatter_(s);
34 }
35 private:
36 Formatter formatter_;
37 };
38
39 template<class Formatter>
40 checked_formatter<Formatter>
make_checked_formatter(const Formatter & formatter)41 make_checked_formatter(const Formatter& formatter) {
42 return checked_formatter<Formatter>(formatter);
43 }
44
find_format_test()45 void find_format_test()
46 {
47 const std::string source = "$replace $replace";
48 std::string expected = "ok $replace";
49 std::string output(80, '\0');
50
51 std::string::iterator pos =
52 boost::find_format_copy(
53 output.begin(),
54 source,
55 boost::first_finder("$replace"),
56 make_checked_formatter(boost::const_formatter("ok")));
57 BOOST_CHECK(pos == output.begin() + expected.size());
58 output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
59 BOOST_CHECK_EQUAL(output, expected);
60
61 output =
62 boost::find_format_copy(
63 source,
64 boost::first_finder("$replace"),
65 make_checked_formatter(boost::const_formatter("ok")));
66 BOOST_CHECK_EQUAL(output, expected);
67
68 // now try finding a string that doesn't exist
69 output.resize(80);
70 pos =
71 boost::find_format_copy(
72 output.begin(),
73 source,
74 boost::first_finder("$noreplace"),
75 make_checked_formatter(boost::const_formatter("bad")));
76 BOOST_CHECK(pos == output.begin() + source.size());
77 output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
78 BOOST_CHECK_EQUAL(output, source);
79
80 output =
81 boost::find_format_copy(
82 source,
83 boost::first_finder("$noreplace"),
84 make_checked_formatter(boost::const_formatter("bad")));
85 BOOST_CHECK_EQUAL(output, source);
86
87 // in place version
88 output = source;
89 boost::find_format(
90 output,
91 boost::first_finder("$replace"),
92 make_checked_formatter(boost::const_formatter("ok")));
93 BOOST_CHECK_EQUAL(output, expected);
94 output = source;
95 boost::find_format(
96 output,
97 boost::first_finder("$noreplace"),
98 make_checked_formatter(boost::const_formatter("bad")));
99 BOOST_CHECK_EQUAL(output, source);
100 }
101
find_format_all_test()102 void find_format_all_test()
103 {
104 const std::string source = "$replace $replace";
105 std::string expected = "ok ok";
106 std::string output(80, '\0');
107
108 std::string::iterator pos =
109 boost::find_format_all_copy(output.begin(),
110 source,
111 boost::first_finder("$replace"),
112 boost::const_formatter("ok"));
113 BOOST_CHECK(pos == output.begin() + expected.size());
114 output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
115 BOOST_CHECK_EQUAL(output, expected);
116
117 output =
118 boost::find_format_all_copy(
119 source,
120 boost::first_finder("$replace"),
121 make_checked_formatter(boost::const_formatter("ok")));
122 BOOST_CHECK_EQUAL(output, expected);
123
124 // now try finding a string that doesn't exist
125 output.resize(80);
126 pos =
127 boost::find_format_all_copy(
128 output.begin(),
129 source,
130 boost::first_finder("$noreplace"),
131 make_checked_formatter(boost::const_formatter("bad")));
132 BOOST_CHECK(pos == output.begin() + source.size());
133 output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
134 BOOST_CHECK_EQUAL(output, source);
135
136 output =
137 boost::find_format_all_copy(
138 source,
139 boost::first_finder("$noreplace"),
140 make_checked_formatter(boost::const_formatter("bad")));
141 BOOST_CHECK_EQUAL(output, source);
142
143 // in place version
144 output = source;
145 boost::find_format_all(
146 output,
147 boost::first_finder("$replace"),
148 make_checked_formatter(boost::const_formatter("ok")));
149 BOOST_CHECK_EQUAL(output, expected);
150 output = source;
151 boost::find_format_all(
152 output,
153 boost::first_finder("$noreplace"),
154 make_checked_formatter(boost::const_formatter("bad")));
155 BOOST_CHECK_EQUAL(output, source);
156 }
157
BOOST_AUTO_TEST_CASE(test_main)158 BOOST_AUTO_TEST_CASE( test_main )
159 {
160 find_format_test();
161 find_format_all_test();
162 }
163