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/templates.hpp"
30*b0d29bc4SBrooks Davis
31*b0d29bc4SBrooks Davis #include <fstream>
32*b0d29bc4SBrooks Davis #include <sstream>
33*b0d29bc4SBrooks Davis
34*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
35*b0d29bc4SBrooks Davis
36*b0d29bc4SBrooks Davis #include "utils/fs/operations.hpp"
37*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
38*b0d29bc4SBrooks Davis #include "utils/text/exceptions.hpp"
39*b0d29bc4SBrooks Davis
40*b0d29bc4SBrooks Davis namespace fs = utils::fs;
41*b0d29bc4SBrooks Davis namespace text = utils::text;
42*b0d29bc4SBrooks Davis
43*b0d29bc4SBrooks Davis
44*b0d29bc4SBrooks Davis namespace {
45*b0d29bc4SBrooks Davis
46*b0d29bc4SBrooks Davis
47*b0d29bc4SBrooks Davis /// Applies a set of templates to an input string and validates the output.
48*b0d29bc4SBrooks Davis ///
49*b0d29bc4SBrooks Davis /// This fails the test case if exp_output does not match the document generated
50*b0d29bc4SBrooks Davis /// by the application of the templates.
51*b0d29bc4SBrooks Davis ///
52*b0d29bc4SBrooks Davis /// \param templates The templates to apply.
53*b0d29bc4SBrooks Davis /// \param input_str The input document to which to apply the templates.
54*b0d29bc4SBrooks Davis /// \param exp_output The expected output document.
55*b0d29bc4SBrooks Davis static void
do_test_ok(const text::templates_def & templates,const std::string & input_str,const std::string & exp_output)56*b0d29bc4SBrooks Davis do_test_ok(const text::templates_def& templates, const std::string& input_str,
57*b0d29bc4SBrooks Davis const std::string& exp_output)
58*b0d29bc4SBrooks Davis {
59*b0d29bc4SBrooks Davis std::istringstream input(input_str);
60*b0d29bc4SBrooks Davis std::ostringstream output;
61*b0d29bc4SBrooks Davis
62*b0d29bc4SBrooks Davis text::instantiate(templates, input, output);
63*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_output, output.str());
64*b0d29bc4SBrooks Davis }
65*b0d29bc4SBrooks Davis
66*b0d29bc4SBrooks Davis
67*b0d29bc4SBrooks Davis /// Applies a set of templates to an input string and checks for an error.
68*b0d29bc4SBrooks Davis ///
69*b0d29bc4SBrooks Davis /// This fails the test case if the exception raised by the template processing
70*b0d29bc4SBrooks Davis /// does not match the expected message.
71*b0d29bc4SBrooks Davis ///
72*b0d29bc4SBrooks Davis /// \param templates The templates to apply.
73*b0d29bc4SBrooks Davis /// \param input_str The input document to which to apply the templates.
74*b0d29bc4SBrooks Davis /// \param exp_message The expected error message in the raised exception.
75*b0d29bc4SBrooks Davis static void
do_test_fail(const text::templates_def & templates,const std::string & input_str,const std::string & exp_message)76*b0d29bc4SBrooks Davis do_test_fail(const text::templates_def& templates, const std::string& input_str,
77*b0d29bc4SBrooks Davis const std::string& exp_message)
78*b0d29bc4SBrooks Davis {
79*b0d29bc4SBrooks Davis std::istringstream input(input_str);
80*b0d29bc4SBrooks Davis std::ostringstream output;
81*b0d29bc4SBrooks Davis
82*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, exp_message,
83*b0d29bc4SBrooks Davis text::instantiate(templates, input, output));
84*b0d29bc4SBrooks Davis }
85*b0d29bc4SBrooks Davis
86*b0d29bc4SBrooks Davis
87*b0d29bc4SBrooks Davis } // anonymous namespace
88*b0d29bc4SBrooks Davis
89*b0d29bc4SBrooks Davis
90*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__add_variable__first);
ATF_TEST_CASE_BODY(templates_def__add_variable__first)91*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__add_variable__first)
92*b0d29bc4SBrooks Davis {
93*b0d29bc4SBrooks Davis text::templates_def templates;
94*b0d29bc4SBrooks Davis templates.add_variable("the-name", "first-value");
95*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("first-value", templates.get_variable("the-name"));
96*b0d29bc4SBrooks Davis }
97*b0d29bc4SBrooks Davis
98*b0d29bc4SBrooks Davis
99*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__add_variable__replace);
ATF_TEST_CASE_BODY(templates_def__add_variable__replace)100*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__add_variable__replace)
101*b0d29bc4SBrooks Davis {
102*b0d29bc4SBrooks Davis text::templates_def templates;
103*b0d29bc4SBrooks Davis templates.add_variable("the-name", "first-value");
104*b0d29bc4SBrooks Davis templates.add_variable("the-name", "second-value");
105*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("second-value", templates.get_variable("the-name"));
106*b0d29bc4SBrooks Davis }
107*b0d29bc4SBrooks Davis
108*b0d29bc4SBrooks Davis
109*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__remove_variable);
ATF_TEST_CASE_BODY(templates_def__remove_variable)110*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__remove_variable)
111*b0d29bc4SBrooks Davis {
112*b0d29bc4SBrooks Davis text::templates_def templates;
113*b0d29bc4SBrooks Davis templates.add_variable("the-name", "the-value");
114*b0d29bc4SBrooks Davis templates.get_variable("the-name"); // Should not throw.
115*b0d29bc4SBrooks Davis templates.remove_variable("the-name");
116*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(text::syntax_error, templates.get_variable("the-name"));
117*b0d29bc4SBrooks Davis }
118*b0d29bc4SBrooks Davis
119*b0d29bc4SBrooks Davis
120*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__add_vector__first);
ATF_TEST_CASE_BODY(templates_def__add_vector__first)121*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__add_vector__first)
122*b0d29bc4SBrooks Davis {
123*b0d29bc4SBrooks Davis text::templates_def templates;
124*b0d29bc4SBrooks Davis templates.add_vector("the-name");
125*b0d29bc4SBrooks Davis ATF_REQUIRE(templates.get_vector("the-name").empty());
126*b0d29bc4SBrooks Davis }
127*b0d29bc4SBrooks Davis
128*b0d29bc4SBrooks Davis
129*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__add_vector__replace);
ATF_TEST_CASE_BODY(templates_def__add_vector__replace)130*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__add_vector__replace)
131*b0d29bc4SBrooks Davis {
132*b0d29bc4SBrooks Davis text::templates_def templates;
133*b0d29bc4SBrooks Davis templates.add_vector("the-name");
134*b0d29bc4SBrooks Davis templates.add_to_vector("the-name", "foo");
135*b0d29bc4SBrooks Davis ATF_REQUIRE(!templates.get_vector("the-name").empty());
136*b0d29bc4SBrooks Davis templates.add_vector("the-name");
137*b0d29bc4SBrooks Davis ATF_REQUIRE(templates.get_vector("the-name").empty());
138*b0d29bc4SBrooks Davis }
139*b0d29bc4SBrooks Davis
140*b0d29bc4SBrooks Davis
141*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__add_to_vector);
ATF_TEST_CASE_BODY(templates_def__add_to_vector)142*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__add_to_vector)
143*b0d29bc4SBrooks Davis {
144*b0d29bc4SBrooks Davis text::templates_def templates;
145*b0d29bc4SBrooks Davis templates.add_vector("the-name");
146*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(0, templates.get_vector("the-name").size());
147*b0d29bc4SBrooks Davis templates.add_to_vector("the-name", "first");
148*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(1, templates.get_vector("the-name").size());
149*b0d29bc4SBrooks Davis templates.add_to_vector("the-name", "second");
150*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(2, templates.get_vector("the-name").size());
151*b0d29bc4SBrooks Davis templates.add_to_vector("the-name", "third");
152*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(3, templates.get_vector("the-name").size());
153*b0d29bc4SBrooks Davis
154*b0d29bc4SBrooks Davis std::vector< std::string > expected;
155*b0d29bc4SBrooks Davis expected.push_back("first");
156*b0d29bc4SBrooks Davis expected.push_back("second");
157*b0d29bc4SBrooks Davis expected.push_back("third");
158*b0d29bc4SBrooks Davis ATF_REQUIRE(expected == templates.get_vector("the-name"));
159*b0d29bc4SBrooks Davis }
160*b0d29bc4SBrooks Davis
161*b0d29bc4SBrooks Davis
162*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__exists__variable);
ATF_TEST_CASE_BODY(templates_def__exists__variable)163*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__exists__variable)
164*b0d29bc4SBrooks Davis {
165*b0d29bc4SBrooks Davis text::templates_def templates;
166*b0d29bc4SBrooks Davis ATF_REQUIRE(!templates.exists("some-name"));
167*b0d29bc4SBrooks Davis templates.add_variable("some-name ", "foo");
168*b0d29bc4SBrooks Davis ATF_REQUIRE(!templates.exists("some-name"));
169*b0d29bc4SBrooks Davis templates.add_variable("some-name", "foo");
170*b0d29bc4SBrooks Davis ATF_REQUIRE(templates.exists("some-name"));
171*b0d29bc4SBrooks Davis }
172*b0d29bc4SBrooks Davis
173*b0d29bc4SBrooks Davis
174*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__exists__vector);
ATF_TEST_CASE_BODY(templates_def__exists__vector)175*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__exists__vector)
176*b0d29bc4SBrooks Davis {
177*b0d29bc4SBrooks Davis text::templates_def templates;
178*b0d29bc4SBrooks Davis ATF_REQUIRE(!templates.exists("some-name"));
179*b0d29bc4SBrooks Davis templates.add_vector("some-name ");
180*b0d29bc4SBrooks Davis ATF_REQUIRE(!templates.exists("some-name"));
181*b0d29bc4SBrooks Davis templates.add_vector("some-name");
182*b0d29bc4SBrooks Davis ATF_REQUIRE(templates.exists("some-name"));
183*b0d29bc4SBrooks Davis }
184*b0d29bc4SBrooks Davis
185*b0d29bc4SBrooks Davis
186*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__get_variable__ok);
ATF_TEST_CASE_BODY(templates_def__get_variable__ok)187*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__get_variable__ok)
188*b0d29bc4SBrooks Davis {
189*b0d29bc4SBrooks Davis text::templates_def templates;
190*b0d29bc4SBrooks Davis templates.add_variable("foo", "");
191*b0d29bc4SBrooks Davis templates.add_variable("bar", " baz ");
192*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("", templates.get_variable("foo"));
193*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(" baz ", templates.get_variable("bar"));
194*b0d29bc4SBrooks Davis }
195*b0d29bc4SBrooks Davis
196*b0d29bc4SBrooks Davis
197*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__get_variable__unknown);
ATF_TEST_CASE_BODY(templates_def__get_variable__unknown)198*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__get_variable__unknown)
199*b0d29bc4SBrooks Davis {
200*b0d29bc4SBrooks Davis text::templates_def templates;
201*b0d29bc4SBrooks Davis templates.add_variable("foo", "");
202*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, "Unknown variable 'foo '",
203*b0d29bc4SBrooks Davis templates.get_variable("foo "));
204*b0d29bc4SBrooks Davis }
205*b0d29bc4SBrooks Davis
206*b0d29bc4SBrooks Davis
207*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__get_vector__ok);
ATF_TEST_CASE_BODY(templates_def__get_vector__ok)208*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__get_vector__ok)
209*b0d29bc4SBrooks Davis {
210*b0d29bc4SBrooks Davis text::templates_def templates;
211*b0d29bc4SBrooks Davis templates.add_vector("foo");
212*b0d29bc4SBrooks Davis templates.add_vector("bar");
213*b0d29bc4SBrooks Davis templates.add_to_vector("bar", "baz");
214*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(0, templates.get_vector("foo").size());
215*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(1, templates.get_vector("bar").size());
216*b0d29bc4SBrooks Davis }
217*b0d29bc4SBrooks Davis
218*b0d29bc4SBrooks Davis
219*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__get_vector__unknown);
ATF_TEST_CASE_BODY(templates_def__get_vector__unknown)220*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__get_vector__unknown)
221*b0d29bc4SBrooks Davis {
222*b0d29bc4SBrooks Davis text::templates_def templates;
223*b0d29bc4SBrooks Davis templates.add_vector("foo");
224*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, "Unknown vector 'foo '",
225*b0d29bc4SBrooks Davis templates.get_vector("foo "));
226*b0d29bc4SBrooks Davis }
227*b0d29bc4SBrooks Davis
228*b0d29bc4SBrooks Davis
229*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__variable__ok);
ATF_TEST_CASE_BODY(templates_def__evaluate__variable__ok)230*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__variable__ok)
231*b0d29bc4SBrooks Davis {
232*b0d29bc4SBrooks Davis text::templates_def templates;
233*b0d29bc4SBrooks Davis templates.add_variable("foo", "");
234*b0d29bc4SBrooks Davis templates.add_variable("bar", " baz ");
235*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("", templates.evaluate("foo"));
236*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(" baz ", templates.evaluate("bar"));
237*b0d29bc4SBrooks Davis }
238*b0d29bc4SBrooks Davis
239*b0d29bc4SBrooks Davis
240*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__variable__unknown);
ATF_TEST_CASE_BODY(templates_def__evaluate__variable__unknown)241*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__variable__unknown)
242*b0d29bc4SBrooks Davis {
243*b0d29bc4SBrooks Davis text::templates_def templates;
244*b0d29bc4SBrooks Davis templates.add_variable("foo", "");
245*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, "Unknown variable 'foo1'",
246*b0d29bc4SBrooks Davis templates.evaluate("foo1"));
247*b0d29bc4SBrooks Davis }
248*b0d29bc4SBrooks Davis
249*b0d29bc4SBrooks Davis
250*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__vector__ok);
ATF_TEST_CASE_BODY(templates_def__evaluate__vector__ok)251*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__vector__ok)
252*b0d29bc4SBrooks Davis {
253*b0d29bc4SBrooks Davis text::templates_def templates;
254*b0d29bc4SBrooks Davis templates.add_vector("v");
255*b0d29bc4SBrooks Davis templates.add_to_vector("v", "foo");
256*b0d29bc4SBrooks Davis templates.add_to_vector("v", "bar");
257*b0d29bc4SBrooks Davis templates.add_to_vector("v", "baz");
258*b0d29bc4SBrooks Davis
259*b0d29bc4SBrooks Davis templates.add_variable("index", "0");
260*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", templates.evaluate("v(index)"));
261*b0d29bc4SBrooks Davis templates.add_variable("index", "1");
262*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("bar", templates.evaluate("v(index)"));
263*b0d29bc4SBrooks Davis templates.add_variable("index", "2");
264*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("baz", templates.evaluate("v(index)"));
265*b0d29bc4SBrooks Davis }
266*b0d29bc4SBrooks Davis
267*b0d29bc4SBrooks Davis
268*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__vector__unknown_vector);
ATF_TEST_CASE_BODY(templates_def__evaluate__vector__unknown_vector)269*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__vector__unknown_vector)
270*b0d29bc4SBrooks Davis {
271*b0d29bc4SBrooks Davis text::templates_def templates;
272*b0d29bc4SBrooks Davis templates.add_vector("v");
273*b0d29bc4SBrooks Davis templates.add_to_vector("v", "foo");
274*b0d29bc4SBrooks Davis templates.add_variable("index", "0");
275*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, "Unknown vector 'fooz'",
276*b0d29bc4SBrooks Davis templates.evaluate("fooz(index)"));
277*b0d29bc4SBrooks Davis }
278*b0d29bc4SBrooks Davis
279*b0d29bc4SBrooks Davis
280*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__vector__unknown_index);
ATF_TEST_CASE_BODY(templates_def__evaluate__vector__unknown_index)281*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__vector__unknown_index)
282*b0d29bc4SBrooks Davis {
283*b0d29bc4SBrooks Davis text::templates_def templates;
284*b0d29bc4SBrooks Davis templates.add_vector("v");
285*b0d29bc4SBrooks Davis templates.add_to_vector("v", "foo");
286*b0d29bc4SBrooks Davis templates.add_variable("index", "0");
287*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, "Unknown variable 'indexz'",
288*b0d29bc4SBrooks Davis templates.evaluate("v(indexz)"));
289*b0d29bc4SBrooks Davis }
290*b0d29bc4SBrooks Davis
291*b0d29bc4SBrooks Davis
292*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__vector__out_of_range);
ATF_TEST_CASE_BODY(templates_def__evaluate__vector__out_of_range)293*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__vector__out_of_range)
294*b0d29bc4SBrooks Davis {
295*b0d29bc4SBrooks Davis text::templates_def templates;
296*b0d29bc4SBrooks Davis templates.add_vector("v");
297*b0d29bc4SBrooks Davis templates.add_to_vector("v", "foo");
298*b0d29bc4SBrooks Davis templates.add_variable("index", "1");
299*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, "Index 'index' out of range "
300*b0d29bc4SBrooks Davis "at position '1'", templates.evaluate("v(index)"));
301*b0d29bc4SBrooks Davis }
302*b0d29bc4SBrooks Davis
303*b0d29bc4SBrooks Davis
304*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__defined);
ATF_TEST_CASE_BODY(templates_def__evaluate__defined)305*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__defined)
306*b0d29bc4SBrooks Davis {
307*b0d29bc4SBrooks Davis text::templates_def templates;
308*b0d29bc4SBrooks Davis templates.add_vector("the-variable");
309*b0d29bc4SBrooks Davis templates.add_vector("the-vector");
310*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("false", templates.evaluate("defined(the-variabl)"));
311*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("false", templates.evaluate("defined(the-vecto)"));
312*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("true", templates.evaluate("defined(the-variable)"));
313*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("true", templates.evaluate("defined(the-vector)"));
314*b0d29bc4SBrooks Davis }
315*b0d29bc4SBrooks Davis
316*b0d29bc4SBrooks Davis
317*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__length__ok);
ATF_TEST_CASE_BODY(templates_def__evaluate__length__ok)318*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__length__ok)
319*b0d29bc4SBrooks Davis {
320*b0d29bc4SBrooks Davis text::templates_def templates;
321*b0d29bc4SBrooks Davis templates.add_vector("v");
322*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("0", templates.evaluate("length(v)"));
323*b0d29bc4SBrooks Davis templates.add_to_vector("v", "foo");
324*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("1", templates.evaluate("length(v)"));
325*b0d29bc4SBrooks Davis templates.add_to_vector("v", "bar");
326*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("2", templates.evaluate("length(v)"));
327*b0d29bc4SBrooks Davis templates.add_to_vector("v", "baz");
328*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("3", templates.evaluate("length(v)"));
329*b0d29bc4SBrooks Davis }
330*b0d29bc4SBrooks Davis
331*b0d29bc4SBrooks Davis
332*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__length__unknown_vector);
ATF_TEST_CASE_BODY(templates_def__evaluate__length__unknown_vector)333*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__length__unknown_vector)
334*b0d29bc4SBrooks Davis {
335*b0d29bc4SBrooks Davis text::templates_def templates;
336*b0d29bc4SBrooks Davis templates.add_vector("foo1");
337*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error, "Unknown vector 'foo'",
338*b0d29bc4SBrooks Davis templates.evaluate("length(foo)"));
339*b0d29bc4SBrooks Davis }
340*b0d29bc4SBrooks Davis
341*b0d29bc4SBrooks Davis
342*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(templates_def__evaluate__parenthesis_error);
ATF_TEST_CASE_BODY(templates_def__evaluate__parenthesis_error)343*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(templates_def__evaluate__parenthesis_error)
344*b0d29bc4SBrooks Davis {
345*b0d29bc4SBrooks Davis text::templates_def templates;
346*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error,
347*b0d29bc4SBrooks Davis "Expected '\\)' in.*'foo\\(abc'",
348*b0d29bc4SBrooks Davis templates.evaluate("foo(abc"));
349*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::syntax_error,
350*b0d29bc4SBrooks Davis "Unexpected text.*'\\)' in.*'a\\(b\\)c'",
351*b0d29bc4SBrooks Davis templates.evaluate("a(b)c"));
352*b0d29bc4SBrooks Davis }
353*b0d29bc4SBrooks Davis
354*b0d29bc4SBrooks Davis
355*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__empty_input);
ATF_TEST_CASE_BODY(instantiate__empty_input)356*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__empty_input)
357*b0d29bc4SBrooks Davis {
358*b0d29bc4SBrooks Davis const text::templates_def templates;
359*b0d29bc4SBrooks Davis do_test_ok(templates, "", "");
360*b0d29bc4SBrooks Davis }
361*b0d29bc4SBrooks Davis
362*b0d29bc4SBrooks Davis
363*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__value__ok);
ATF_TEST_CASE_BODY(instantiate__value__ok)364*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__value__ok)
365*b0d29bc4SBrooks Davis {
366*b0d29bc4SBrooks Davis const std::string input =
367*b0d29bc4SBrooks Davis "first line\n"
368*b0d29bc4SBrooks Davis "%%testvar1%%\n"
369*b0d29bc4SBrooks Davis "third line\n"
370*b0d29bc4SBrooks Davis "%%testvar2%% %%testvar3%%%%testvar4%%\n"
371*b0d29bc4SBrooks Davis "fifth line\n";
372*b0d29bc4SBrooks Davis
373*b0d29bc4SBrooks Davis const std::string exp_output =
374*b0d29bc4SBrooks Davis "first line\n"
375*b0d29bc4SBrooks Davis "second line\n"
376*b0d29bc4SBrooks Davis "third line\n"
377*b0d29bc4SBrooks Davis "fourth line.\n"
378*b0d29bc4SBrooks Davis "fifth line\n";
379*b0d29bc4SBrooks Davis
380*b0d29bc4SBrooks Davis text::templates_def templates;
381*b0d29bc4SBrooks Davis templates.add_variable("testvar1", "second line");
382*b0d29bc4SBrooks Davis templates.add_variable("testvar2", "fourth");
383*b0d29bc4SBrooks Davis templates.add_variable("testvar3", "line");
384*b0d29bc4SBrooks Davis templates.add_variable("testvar4", ".");
385*b0d29bc4SBrooks Davis
386*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
387*b0d29bc4SBrooks Davis }
388*b0d29bc4SBrooks Davis
389*b0d29bc4SBrooks Davis
390*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__value__unknown_variable);
ATF_TEST_CASE_BODY(instantiate__value__unknown_variable)391*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__value__unknown_variable)
392*b0d29bc4SBrooks Davis {
393*b0d29bc4SBrooks Davis const std::string input =
394*b0d29bc4SBrooks Davis "%%testvar1%%\n";
395*b0d29bc4SBrooks Davis
396*b0d29bc4SBrooks Davis text::templates_def templates;
397*b0d29bc4SBrooks Davis templates.add_variable("testvar2", "fourth line");
398*b0d29bc4SBrooks Davis
399*b0d29bc4SBrooks Davis do_test_fail(templates, input, "Unknown variable 'testvar1'");
400*b0d29bc4SBrooks Davis }
401*b0d29bc4SBrooks Davis
402*b0d29bc4SBrooks Davis
403*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__vector_length__ok);
ATF_TEST_CASE_BODY(instantiate__vector_length__ok)404*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__vector_length__ok)
405*b0d29bc4SBrooks Davis {
406*b0d29bc4SBrooks Davis const std::string input =
407*b0d29bc4SBrooks Davis "%%length(testvector1)%%\n"
408*b0d29bc4SBrooks Davis "%%length(testvector2)%% - %%length(testvector3)%%\n";
409*b0d29bc4SBrooks Davis
410*b0d29bc4SBrooks Davis const std::string exp_output =
411*b0d29bc4SBrooks Davis "4\n"
412*b0d29bc4SBrooks Davis "0 - 1\n";
413*b0d29bc4SBrooks Davis
414*b0d29bc4SBrooks Davis text::templates_def templates;
415*b0d29bc4SBrooks Davis templates.add_vector("testvector1");
416*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "000");
417*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "111");
418*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "543");
419*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "999");
420*b0d29bc4SBrooks Davis templates.add_vector("testvector2");
421*b0d29bc4SBrooks Davis templates.add_vector("testvector3");
422*b0d29bc4SBrooks Davis templates.add_to_vector("testvector3", "123");
423*b0d29bc4SBrooks Davis
424*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
425*b0d29bc4SBrooks Davis }
426*b0d29bc4SBrooks Davis
427*b0d29bc4SBrooks Davis
428*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__vector_length__unknown_vector);
ATF_TEST_CASE_BODY(instantiate__vector_length__unknown_vector)429*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__vector_length__unknown_vector)
430*b0d29bc4SBrooks Davis {
431*b0d29bc4SBrooks Davis const std::string input =
432*b0d29bc4SBrooks Davis "%%length(testvector)%%\n";
433*b0d29bc4SBrooks Davis
434*b0d29bc4SBrooks Davis text::templates_def templates;
435*b0d29bc4SBrooks Davis templates.add_vector("testvector2");
436*b0d29bc4SBrooks Davis
437*b0d29bc4SBrooks Davis do_test_fail(templates, input, "Unknown vector 'testvector'");
438*b0d29bc4SBrooks Davis }
439*b0d29bc4SBrooks Davis
440*b0d29bc4SBrooks Davis
441*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__vector_value__ok);
ATF_TEST_CASE_BODY(instantiate__vector_value__ok)442*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__vector_value__ok)
443*b0d29bc4SBrooks Davis {
444*b0d29bc4SBrooks Davis const std::string input =
445*b0d29bc4SBrooks Davis "first line\n"
446*b0d29bc4SBrooks Davis "%%testvector1(i)%%\n"
447*b0d29bc4SBrooks Davis "third line\n"
448*b0d29bc4SBrooks Davis "%%testvector2(j)%%\n"
449*b0d29bc4SBrooks Davis "fifth line\n";
450*b0d29bc4SBrooks Davis
451*b0d29bc4SBrooks Davis const std::string exp_output =
452*b0d29bc4SBrooks Davis "first line\n"
453*b0d29bc4SBrooks Davis "543\n"
454*b0d29bc4SBrooks Davis "third line\n"
455*b0d29bc4SBrooks Davis "123\n"
456*b0d29bc4SBrooks Davis "fifth line\n";
457*b0d29bc4SBrooks Davis
458*b0d29bc4SBrooks Davis text::templates_def templates;
459*b0d29bc4SBrooks Davis templates.add_variable("i", "2");
460*b0d29bc4SBrooks Davis templates.add_variable("j", "0");
461*b0d29bc4SBrooks Davis templates.add_vector("testvector1");
462*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "000");
463*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "111");
464*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "543");
465*b0d29bc4SBrooks Davis templates.add_to_vector("testvector1", "999");
466*b0d29bc4SBrooks Davis templates.add_vector("testvector2");
467*b0d29bc4SBrooks Davis templates.add_to_vector("testvector2", "123");
468*b0d29bc4SBrooks Davis
469*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
470*b0d29bc4SBrooks Davis }
471*b0d29bc4SBrooks Davis
472*b0d29bc4SBrooks Davis
473*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__vector_value__unknown_vector);
ATF_TEST_CASE_BODY(instantiate__vector_value__unknown_vector)474*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__vector_value__unknown_vector)
475*b0d29bc4SBrooks Davis {
476*b0d29bc4SBrooks Davis const std::string input =
477*b0d29bc4SBrooks Davis "%%testvector(j)%%\n";
478*b0d29bc4SBrooks Davis
479*b0d29bc4SBrooks Davis text::templates_def templates;
480*b0d29bc4SBrooks Davis templates.add_vector("testvector2");
481*b0d29bc4SBrooks Davis
482*b0d29bc4SBrooks Davis do_test_fail(templates, input, "Unknown vector 'testvector'");
483*b0d29bc4SBrooks Davis }
484*b0d29bc4SBrooks Davis
485*b0d29bc4SBrooks Davis
486*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__vector_value__out_of_range__empty);
ATF_TEST_CASE_BODY(instantiate__vector_value__out_of_range__empty)487*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__vector_value__out_of_range__empty)
488*b0d29bc4SBrooks Davis {
489*b0d29bc4SBrooks Davis const std::string input =
490*b0d29bc4SBrooks Davis "%%testvector(j)%%\n";
491*b0d29bc4SBrooks Davis
492*b0d29bc4SBrooks Davis text::templates_def templates;
493*b0d29bc4SBrooks Davis templates.add_vector("testvector");
494*b0d29bc4SBrooks Davis templates.add_variable("j", "0");
495*b0d29bc4SBrooks Davis
496*b0d29bc4SBrooks Davis do_test_fail(templates, input, "Index 'j' out of range at position '0'");
497*b0d29bc4SBrooks Davis }
498*b0d29bc4SBrooks Davis
499*b0d29bc4SBrooks Davis
500*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__vector_value__out_of_range__not_empty);
ATF_TEST_CASE_BODY(instantiate__vector_value__out_of_range__not_empty)501*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__vector_value__out_of_range__not_empty)
502*b0d29bc4SBrooks Davis {
503*b0d29bc4SBrooks Davis const std::string input =
504*b0d29bc4SBrooks Davis "%%testvector(j)%%\n";
505*b0d29bc4SBrooks Davis
506*b0d29bc4SBrooks Davis text::templates_def templates;
507*b0d29bc4SBrooks Davis templates.add_vector("testvector");
508*b0d29bc4SBrooks Davis templates.add_to_vector("testvector", "a");
509*b0d29bc4SBrooks Davis templates.add_to_vector("testvector", "b");
510*b0d29bc4SBrooks Davis templates.add_variable("j", "2");
511*b0d29bc4SBrooks Davis
512*b0d29bc4SBrooks Davis do_test_fail(templates, input, "Index 'j' out of range at position '2'");
513*b0d29bc4SBrooks Davis }
514*b0d29bc4SBrooks Davis
515*b0d29bc4SBrooks Davis
516*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__if__one_level__taken);
ATF_TEST_CASE_BODY(instantiate__if__one_level__taken)517*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__if__one_level__taken)
518*b0d29bc4SBrooks Davis {
519*b0d29bc4SBrooks Davis const std::string input =
520*b0d29bc4SBrooks Davis "first line\n"
521*b0d29bc4SBrooks Davis "%if defined(some_var)\n"
522*b0d29bc4SBrooks Davis "hello from within the variable conditional\n"
523*b0d29bc4SBrooks Davis "%endif\n"
524*b0d29bc4SBrooks Davis "%if defined(some_vector)\n"
525*b0d29bc4SBrooks Davis "hello from within the vector conditional\n"
526*b0d29bc4SBrooks Davis "%else\n"
527*b0d29bc4SBrooks Davis "bye from within the vector conditional\n"
528*b0d29bc4SBrooks Davis "%endif\n"
529*b0d29bc4SBrooks Davis "some more\n";
530*b0d29bc4SBrooks Davis
531*b0d29bc4SBrooks Davis const std::string exp_output =
532*b0d29bc4SBrooks Davis "first line\n"
533*b0d29bc4SBrooks Davis "hello from within the variable conditional\n"
534*b0d29bc4SBrooks Davis "hello from within the vector conditional\n"
535*b0d29bc4SBrooks Davis "some more\n";
536*b0d29bc4SBrooks Davis
537*b0d29bc4SBrooks Davis text::templates_def templates;
538*b0d29bc4SBrooks Davis templates.add_variable("some_var", "zzz");
539*b0d29bc4SBrooks Davis templates.add_vector("some_vector");
540*b0d29bc4SBrooks Davis
541*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
542*b0d29bc4SBrooks Davis }
543*b0d29bc4SBrooks Davis
544*b0d29bc4SBrooks Davis
545*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__if__one_level__not_taken);
ATF_TEST_CASE_BODY(instantiate__if__one_level__not_taken)546*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__if__one_level__not_taken)
547*b0d29bc4SBrooks Davis {
548*b0d29bc4SBrooks Davis const std::string input =
549*b0d29bc4SBrooks Davis "first line\n"
550*b0d29bc4SBrooks Davis "%if defined(some_var)\n"
551*b0d29bc4SBrooks Davis "hello from within the variable conditional\n"
552*b0d29bc4SBrooks Davis "%endif\n"
553*b0d29bc4SBrooks Davis "%if defined(some_vector)\n"
554*b0d29bc4SBrooks Davis "hello from within the vector conditional\n"
555*b0d29bc4SBrooks Davis "%else\n"
556*b0d29bc4SBrooks Davis "bye from within the vector conditional\n"
557*b0d29bc4SBrooks Davis "%endif\n"
558*b0d29bc4SBrooks Davis "some more\n";
559*b0d29bc4SBrooks Davis
560*b0d29bc4SBrooks Davis const std::string exp_output =
561*b0d29bc4SBrooks Davis "first line\n"
562*b0d29bc4SBrooks Davis "bye from within the vector conditional\n"
563*b0d29bc4SBrooks Davis "some more\n";
564*b0d29bc4SBrooks Davis
565*b0d29bc4SBrooks Davis text::templates_def templates;
566*b0d29bc4SBrooks Davis
567*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
568*b0d29bc4SBrooks Davis }
569*b0d29bc4SBrooks Davis
570*b0d29bc4SBrooks Davis
571*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__if__multiple_levels__taken);
ATF_TEST_CASE_BODY(instantiate__if__multiple_levels__taken)572*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__if__multiple_levels__taken)
573*b0d29bc4SBrooks Davis {
574*b0d29bc4SBrooks Davis const std::string input =
575*b0d29bc4SBrooks Davis "first line\n"
576*b0d29bc4SBrooks Davis "%if defined(var1)\n"
577*b0d29bc4SBrooks Davis "first before\n"
578*b0d29bc4SBrooks Davis "%if length(var2)\n"
579*b0d29bc4SBrooks Davis "second before\n"
580*b0d29bc4SBrooks Davis "%if defined(var3)\n"
581*b0d29bc4SBrooks Davis "third before\n"
582*b0d29bc4SBrooks Davis "hello from within the conditional\n"
583*b0d29bc4SBrooks Davis "third after\n"
584*b0d29bc4SBrooks Davis "%endif\n"
585*b0d29bc4SBrooks Davis "second after\n"
586*b0d29bc4SBrooks Davis "%else\n"
587*b0d29bc4SBrooks Davis "second after not shown\n"
588*b0d29bc4SBrooks Davis "%endif\n"
589*b0d29bc4SBrooks Davis "first after\n"
590*b0d29bc4SBrooks Davis "%endif\n"
591*b0d29bc4SBrooks Davis "some more\n";
592*b0d29bc4SBrooks Davis
593*b0d29bc4SBrooks Davis const std::string exp_output =
594*b0d29bc4SBrooks Davis "first line\n"
595*b0d29bc4SBrooks Davis "first before\n"
596*b0d29bc4SBrooks Davis "second before\n"
597*b0d29bc4SBrooks Davis "third before\n"
598*b0d29bc4SBrooks Davis "hello from within the conditional\n"
599*b0d29bc4SBrooks Davis "third after\n"
600*b0d29bc4SBrooks Davis "second after\n"
601*b0d29bc4SBrooks Davis "first after\n"
602*b0d29bc4SBrooks Davis "some more\n";
603*b0d29bc4SBrooks Davis
604*b0d29bc4SBrooks Davis text::templates_def templates;
605*b0d29bc4SBrooks Davis templates.add_variable("var1", "false");
606*b0d29bc4SBrooks Davis templates.add_vector("var2");
607*b0d29bc4SBrooks Davis templates.add_to_vector("var2", "not-empty");
608*b0d29bc4SBrooks Davis templates.add_variable("var3", "foobar");
609*b0d29bc4SBrooks Davis
610*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
611*b0d29bc4SBrooks Davis }
612*b0d29bc4SBrooks Davis
613*b0d29bc4SBrooks Davis
614*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__if__multiple_levels__not_taken);
ATF_TEST_CASE_BODY(instantiate__if__multiple_levels__not_taken)615*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__if__multiple_levels__not_taken)
616*b0d29bc4SBrooks Davis {
617*b0d29bc4SBrooks Davis const std::string input =
618*b0d29bc4SBrooks Davis "first line\n"
619*b0d29bc4SBrooks Davis "%if defined(var1)\n"
620*b0d29bc4SBrooks Davis "first before\n"
621*b0d29bc4SBrooks Davis "%if length(var2)\n"
622*b0d29bc4SBrooks Davis "second before\n"
623*b0d29bc4SBrooks Davis "%if defined(var3)\n"
624*b0d29bc4SBrooks Davis "third before\n"
625*b0d29bc4SBrooks Davis "hello from within the conditional\n"
626*b0d29bc4SBrooks Davis "third after\n"
627*b0d29bc4SBrooks Davis "%else\n"
628*b0d29bc4SBrooks Davis "will not be shown either\n"
629*b0d29bc4SBrooks Davis "%endif\n"
630*b0d29bc4SBrooks Davis "second after\n"
631*b0d29bc4SBrooks Davis "%else\n"
632*b0d29bc4SBrooks Davis "second after shown\n"
633*b0d29bc4SBrooks Davis "%endif\n"
634*b0d29bc4SBrooks Davis "first after\n"
635*b0d29bc4SBrooks Davis "%endif\n"
636*b0d29bc4SBrooks Davis "some more\n";
637*b0d29bc4SBrooks Davis
638*b0d29bc4SBrooks Davis const std::string exp_output =
639*b0d29bc4SBrooks Davis "first line\n"
640*b0d29bc4SBrooks Davis "first before\n"
641*b0d29bc4SBrooks Davis "second after shown\n"
642*b0d29bc4SBrooks Davis "first after\n"
643*b0d29bc4SBrooks Davis "some more\n";
644*b0d29bc4SBrooks Davis
645*b0d29bc4SBrooks Davis text::templates_def templates;
646*b0d29bc4SBrooks Davis templates.add_variable("var1", "false");
647*b0d29bc4SBrooks Davis templates.add_vector("var2");
648*b0d29bc4SBrooks Davis templates.add_vector("var3");
649*b0d29bc4SBrooks Davis
650*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
651*b0d29bc4SBrooks Davis }
652*b0d29bc4SBrooks Davis
653*b0d29bc4SBrooks Davis
654*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__loop__no_iterations);
ATF_TEST_CASE_BODY(instantiate__loop__no_iterations)655*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__loop__no_iterations)
656*b0d29bc4SBrooks Davis {
657*b0d29bc4SBrooks Davis const std::string input =
658*b0d29bc4SBrooks Davis "first line\n"
659*b0d29bc4SBrooks Davis "%loop table1 i\n"
660*b0d29bc4SBrooks Davis "hello\n"
661*b0d29bc4SBrooks Davis "value in vector: %%table1(i)%%\n"
662*b0d29bc4SBrooks Davis "%if defined(var1)\n" "some other text\n" "%endif\n"
663*b0d29bc4SBrooks Davis "%endloop\n"
664*b0d29bc4SBrooks Davis "some more\n";
665*b0d29bc4SBrooks Davis
666*b0d29bc4SBrooks Davis const std::string exp_output =
667*b0d29bc4SBrooks Davis "first line\n"
668*b0d29bc4SBrooks Davis "some more\n";
669*b0d29bc4SBrooks Davis
670*b0d29bc4SBrooks Davis text::templates_def templates;
671*b0d29bc4SBrooks Davis templates.add_variable("var1", "defined");
672*b0d29bc4SBrooks Davis templates.add_vector("table1");
673*b0d29bc4SBrooks Davis
674*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
675*b0d29bc4SBrooks Davis }
676*b0d29bc4SBrooks Davis
677*b0d29bc4SBrooks Davis
678*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__loop__multiple_iterations);
ATF_TEST_CASE_BODY(instantiate__loop__multiple_iterations)679*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__loop__multiple_iterations)
680*b0d29bc4SBrooks Davis {
681*b0d29bc4SBrooks Davis const std::string input =
682*b0d29bc4SBrooks Davis "first line\n"
683*b0d29bc4SBrooks Davis "%loop table1 i\n"
684*b0d29bc4SBrooks Davis "hello %%table1(i)%% %%table2(i)%%\n"
685*b0d29bc4SBrooks Davis "%endloop\n"
686*b0d29bc4SBrooks Davis "some more\n";
687*b0d29bc4SBrooks Davis
688*b0d29bc4SBrooks Davis const std::string exp_output =
689*b0d29bc4SBrooks Davis "first line\n"
690*b0d29bc4SBrooks Davis "hello foo1 foo2\n"
691*b0d29bc4SBrooks Davis "hello bar1 bar2\n"
692*b0d29bc4SBrooks Davis "some more\n";
693*b0d29bc4SBrooks Davis
694*b0d29bc4SBrooks Davis text::templates_def templates;
695*b0d29bc4SBrooks Davis templates.add_vector("table1");
696*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "foo1");
697*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "bar1");
698*b0d29bc4SBrooks Davis templates.add_vector("table2");
699*b0d29bc4SBrooks Davis templates.add_to_vector("table2", "foo2");
700*b0d29bc4SBrooks Davis templates.add_to_vector("table2", "bar2");
701*b0d29bc4SBrooks Davis
702*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
703*b0d29bc4SBrooks Davis }
704*b0d29bc4SBrooks Davis
705*b0d29bc4SBrooks Davis
706*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__loop__nested__no_iterations);
ATF_TEST_CASE_BODY(instantiate__loop__nested__no_iterations)707*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__loop__nested__no_iterations)
708*b0d29bc4SBrooks Davis {
709*b0d29bc4SBrooks Davis const std::string input =
710*b0d29bc4SBrooks Davis "first line\n"
711*b0d29bc4SBrooks Davis "%loop table1 i\n"
712*b0d29bc4SBrooks Davis "before: %%table1(i)%%\n"
713*b0d29bc4SBrooks Davis "%loop table2 j\n"
714*b0d29bc4SBrooks Davis "before: %%table2(j)%%\n"
715*b0d29bc4SBrooks Davis "%loop table3 k\n"
716*b0d29bc4SBrooks Davis "%%table3(k)%%\n"
717*b0d29bc4SBrooks Davis "%endloop\n"
718*b0d29bc4SBrooks Davis "after: %%table2(i)%%\n"
719*b0d29bc4SBrooks Davis "%endloop\n"
720*b0d29bc4SBrooks Davis "after: %%table1(i)%%\n"
721*b0d29bc4SBrooks Davis "%endloop\n"
722*b0d29bc4SBrooks Davis "some more\n";
723*b0d29bc4SBrooks Davis
724*b0d29bc4SBrooks Davis const std::string exp_output =
725*b0d29bc4SBrooks Davis "first line\n"
726*b0d29bc4SBrooks Davis "before: a\n"
727*b0d29bc4SBrooks Davis "after: a\n"
728*b0d29bc4SBrooks Davis "before: b\n"
729*b0d29bc4SBrooks Davis "after: b\n"
730*b0d29bc4SBrooks Davis "some more\n";
731*b0d29bc4SBrooks Davis
732*b0d29bc4SBrooks Davis text::templates_def templates;
733*b0d29bc4SBrooks Davis templates.add_vector("table1");
734*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "a");
735*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "b");
736*b0d29bc4SBrooks Davis templates.add_vector("table2");
737*b0d29bc4SBrooks Davis templates.add_vector("table3");
738*b0d29bc4SBrooks Davis templates.add_to_vector("table3", "1");
739*b0d29bc4SBrooks Davis
740*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
741*b0d29bc4SBrooks Davis }
742*b0d29bc4SBrooks Davis
743*b0d29bc4SBrooks Davis
744*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__loop__nested__multiple_iterations);
ATF_TEST_CASE_BODY(instantiate__loop__nested__multiple_iterations)745*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__loop__nested__multiple_iterations)
746*b0d29bc4SBrooks Davis {
747*b0d29bc4SBrooks Davis const std::string input =
748*b0d29bc4SBrooks Davis "first line\n"
749*b0d29bc4SBrooks Davis "%loop table1 i\n"
750*b0d29bc4SBrooks Davis "%loop table2 j\n"
751*b0d29bc4SBrooks Davis "%%table1(i)%% %%table2(j)%%\n"
752*b0d29bc4SBrooks Davis "%endloop\n"
753*b0d29bc4SBrooks Davis "%endloop\n"
754*b0d29bc4SBrooks Davis "some more\n";
755*b0d29bc4SBrooks Davis
756*b0d29bc4SBrooks Davis const std::string exp_output =
757*b0d29bc4SBrooks Davis "first line\n"
758*b0d29bc4SBrooks Davis "a 1\n"
759*b0d29bc4SBrooks Davis "a 2\n"
760*b0d29bc4SBrooks Davis "a 3\n"
761*b0d29bc4SBrooks Davis "b 1\n"
762*b0d29bc4SBrooks Davis "b 2\n"
763*b0d29bc4SBrooks Davis "b 3\n"
764*b0d29bc4SBrooks Davis "some more\n";
765*b0d29bc4SBrooks Davis
766*b0d29bc4SBrooks Davis text::templates_def templates;
767*b0d29bc4SBrooks Davis templates.add_vector("table1");
768*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "a");
769*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "b");
770*b0d29bc4SBrooks Davis templates.add_vector("table2");
771*b0d29bc4SBrooks Davis templates.add_to_vector("table2", "1");
772*b0d29bc4SBrooks Davis templates.add_to_vector("table2", "2");
773*b0d29bc4SBrooks Davis templates.add_to_vector("table2", "3");
774*b0d29bc4SBrooks Davis
775*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
776*b0d29bc4SBrooks Davis }
777*b0d29bc4SBrooks Davis
778*b0d29bc4SBrooks Davis
779*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__loop__sequential);
ATF_TEST_CASE_BODY(instantiate__loop__sequential)780*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__loop__sequential)
781*b0d29bc4SBrooks Davis {
782*b0d29bc4SBrooks Davis const std::string input =
783*b0d29bc4SBrooks Davis "first line\n"
784*b0d29bc4SBrooks Davis "%loop table1 iter\n"
785*b0d29bc4SBrooks Davis "1: %%table1(iter)%%\n"
786*b0d29bc4SBrooks Davis "%endloop\n"
787*b0d29bc4SBrooks Davis "divider\n"
788*b0d29bc4SBrooks Davis "%loop table2 iter\n"
789*b0d29bc4SBrooks Davis "2: %%table2(iter)%%\n"
790*b0d29bc4SBrooks Davis "%endloop\n"
791*b0d29bc4SBrooks Davis "divider\n"
792*b0d29bc4SBrooks Davis "%loop table3 iter\n"
793*b0d29bc4SBrooks Davis "3: %%table3(iter)%%\n"
794*b0d29bc4SBrooks Davis "%endloop\n"
795*b0d29bc4SBrooks Davis "divider\n"
796*b0d29bc4SBrooks Davis "%loop table4 iter\n"
797*b0d29bc4SBrooks Davis "4: %%table4(iter)%%\n"
798*b0d29bc4SBrooks Davis "%endloop\n"
799*b0d29bc4SBrooks Davis "some more\n";
800*b0d29bc4SBrooks Davis
801*b0d29bc4SBrooks Davis const std::string exp_output =
802*b0d29bc4SBrooks Davis "first line\n"
803*b0d29bc4SBrooks Davis "1: a\n"
804*b0d29bc4SBrooks Davis "1: b\n"
805*b0d29bc4SBrooks Davis "divider\n"
806*b0d29bc4SBrooks Davis "divider\n"
807*b0d29bc4SBrooks Davis "divider\n"
808*b0d29bc4SBrooks Davis "4: 1\n"
809*b0d29bc4SBrooks Davis "4: 2\n"
810*b0d29bc4SBrooks Davis "4: 3\n"
811*b0d29bc4SBrooks Davis "some more\n";
812*b0d29bc4SBrooks Davis
813*b0d29bc4SBrooks Davis text::templates_def templates;
814*b0d29bc4SBrooks Davis templates.add_vector("table1");
815*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "a");
816*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "b");
817*b0d29bc4SBrooks Davis templates.add_vector("table2");
818*b0d29bc4SBrooks Davis templates.add_vector("table3");
819*b0d29bc4SBrooks Davis templates.add_vector("table4");
820*b0d29bc4SBrooks Davis templates.add_to_vector("table4", "1");
821*b0d29bc4SBrooks Davis templates.add_to_vector("table4", "2");
822*b0d29bc4SBrooks Davis templates.add_to_vector("table4", "3");
823*b0d29bc4SBrooks Davis
824*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
825*b0d29bc4SBrooks Davis }
826*b0d29bc4SBrooks Davis
827*b0d29bc4SBrooks Davis
828*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__loop__scoping);
ATF_TEST_CASE_BODY(instantiate__loop__scoping)829*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__loop__scoping)
830*b0d29bc4SBrooks Davis {
831*b0d29bc4SBrooks Davis const std::string input =
832*b0d29bc4SBrooks Davis "%loop table1 i\n"
833*b0d29bc4SBrooks Davis "%if defined(i)\n" "i defined inside scope 1\n" "%endif\n"
834*b0d29bc4SBrooks Davis "%loop table2 j\n"
835*b0d29bc4SBrooks Davis "%if defined(i)\n" "i defined inside scope 2\n" "%endif\n"
836*b0d29bc4SBrooks Davis "%if defined(j)\n" "j defined inside scope 2\n" "%endif\n"
837*b0d29bc4SBrooks Davis "%endloop\n"
838*b0d29bc4SBrooks Davis "%if defined(j)\n" "j defined inside scope 1\n" "%endif\n"
839*b0d29bc4SBrooks Davis "%endloop\n"
840*b0d29bc4SBrooks Davis "%if defined(i)\n" "i defined outside\n" "%endif\n"
841*b0d29bc4SBrooks Davis "%if defined(j)\n" "j defined outside\n" "%endif\n";
842*b0d29bc4SBrooks Davis
843*b0d29bc4SBrooks Davis const std::string exp_output =
844*b0d29bc4SBrooks Davis "i defined inside scope 1\n"
845*b0d29bc4SBrooks Davis "i defined inside scope 2\n"
846*b0d29bc4SBrooks Davis "j defined inside scope 2\n"
847*b0d29bc4SBrooks Davis "i defined inside scope 1\n"
848*b0d29bc4SBrooks Davis "i defined inside scope 2\n"
849*b0d29bc4SBrooks Davis "j defined inside scope 2\n";
850*b0d29bc4SBrooks Davis
851*b0d29bc4SBrooks Davis text::templates_def templates;
852*b0d29bc4SBrooks Davis templates.add_vector("table1");
853*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "first");
854*b0d29bc4SBrooks Davis templates.add_to_vector("table1", "second");
855*b0d29bc4SBrooks Davis templates.add_vector("table2");
856*b0d29bc4SBrooks Davis templates.add_to_vector("table2", "first");
857*b0d29bc4SBrooks Davis
858*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
859*b0d29bc4SBrooks Davis }
860*b0d29bc4SBrooks Davis
861*b0d29bc4SBrooks Davis
862*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__mismatched_delimiters);
ATF_TEST_CASE_BODY(instantiate__mismatched_delimiters)863*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__mismatched_delimiters)
864*b0d29bc4SBrooks Davis {
865*b0d29bc4SBrooks Davis const std::string input =
866*b0d29bc4SBrooks Davis "this is some %% text\n"
867*b0d29bc4SBrooks Davis "and this is %%var%% text%%\n";
868*b0d29bc4SBrooks Davis
869*b0d29bc4SBrooks Davis const std::string exp_output =
870*b0d29bc4SBrooks Davis "this is some %% text\n"
871*b0d29bc4SBrooks Davis "and this is some more text%%\n";
872*b0d29bc4SBrooks Davis
873*b0d29bc4SBrooks Davis text::templates_def templates;
874*b0d29bc4SBrooks Davis templates.add_variable("var", "some more");
875*b0d29bc4SBrooks Davis
876*b0d29bc4SBrooks Davis do_test_ok(templates, input, exp_output);
877*b0d29bc4SBrooks Davis }
878*b0d29bc4SBrooks Davis
879*b0d29bc4SBrooks Davis
880*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__empty_statement);
ATF_TEST_CASE_BODY(instantiate__empty_statement)881*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__empty_statement)
882*b0d29bc4SBrooks Davis {
883*b0d29bc4SBrooks Davis do_test_fail(text::templates_def(), "%\n", "Empty statement");
884*b0d29bc4SBrooks Davis }
885*b0d29bc4SBrooks Davis
886*b0d29bc4SBrooks Davis
887*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__unknown_statement);
ATF_TEST_CASE_BODY(instantiate__unknown_statement)888*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__unknown_statement)
889*b0d29bc4SBrooks Davis {
890*b0d29bc4SBrooks Davis do_test_fail(text::templates_def(), "%if2\n", "Unknown statement 'if2'");
891*b0d29bc4SBrooks Davis }
892*b0d29bc4SBrooks Davis
893*b0d29bc4SBrooks Davis
894*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__invalid_narguments);
ATF_TEST_CASE_BODY(instantiate__invalid_narguments)895*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__invalid_narguments)
896*b0d29bc4SBrooks Davis {
897*b0d29bc4SBrooks Davis do_test_fail(text::templates_def(), "%if a b\n",
898*b0d29bc4SBrooks Davis "Invalid number of arguments for statement 'if'");
899*b0d29bc4SBrooks Davis }
900*b0d29bc4SBrooks Davis
901*b0d29bc4SBrooks Davis
902*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__files__ok);
ATF_TEST_CASE_BODY(instantiate__files__ok)903*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__files__ok)
904*b0d29bc4SBrooks Davis {
905*b0d29bc4SBrooks Davis text::templates_def templates;
906*b0d29bc4SBrooks Davis templates.add_variable("string", "Hello, world!");
907*b0d29bc4SBrooks Davis
908*b0d29bc4SBrooks Davis atf::utils::create_file("input.txt", "The string is: %%string%%\n");
909*b0d29bc4SBrooks Davis
910*b0d29bc4SBrooks Davis text::instantiate(templates, fs::path("input.txt"), fs::path("output.txt"));
911*b0d29bc4SBrooks Davis
912*b0d29bc4SBrooks Davis std::ifstream output("output.txt");
913*b0d29bc4SBrooks Davis std::string line;
914*b0d29bc4SBrooks Davis ATF_REQUIRE(std::getline(output, line).good());
915*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(line, "The string is: Hello, world!");
916*b0d29bc4SBrooks Davis ATF_REQUIRE(std::getline(output, line).eof());
917*b0d29bc4SBrooks Davis }
918*b0d29bc4SBrooks Davis
919*b0d29bc4SBrooks Davis
920*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(instantiate__files__input_error);
ATF_TEST_CASE_BODY(instantiate__files__input_error)921*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__files__input_error)
922*b0d29bc4SBrooks Davis {
923*b0d29bc4SBrooks Davis text::templates_def templates;
924*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::error, "Failed to open input.txt for read",
925*b0d29bc4SBrooks Davis text::instantiate(templates, fs::path("input.txt"),
926*b0d29bc4SBrooks Davis fs::path("output.txt")));
927*b0d29bc4SBrooks Davis }
928*b0d29bc4SBrooks Davis
929*b0d29bc4SBrooks Davis
930*b0d29bc4SBrooks Davis ATF_TEST_CASE(instantiate__files__output_error);
ATF_TEST_CASE_HEAD(instantiate__files__output_error)931*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(instantiate__files__output_error)
932*b0d29bc4SBrooks Davis {
933*b0d29bc4SBrooks Davis set_md_var("require.user", "unprivileged");
934*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(instantiate__files__output_error)935*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(instantiate__files__output_error)
936*b0d29bc4SBrooks Davis {
937*b0d29bc4SBrooks Davis text::templates_def templates;
938*b0d29bc4SBrooks Davis
939*b0d29bc4SBrooks Davis atf::utils::create_file("input.txt", "");
940*b0d29bc4SBrooks Davis
941*b0d29bc4SBrooks Davis fs::mkdir(fs::path("dir"), 0444);
942*b0d29bc4SBrooks Davis
943*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(text::error, "Failed to open dir/output.txt for write",
944*b0d29bc4SBrooks Davis text::instantiate(templates, fs::path("input.txt"),
945*b0d29bc4SBrooks Davis fs::path("dir/output.txt")));
946*b0d29bc4SBrooks Davis }
947*b0d29bc4SBrooks Davis
948*b0d29bc4SBrooks Davis
ATF_INIT_TEST_CASES(tcs)949*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
950*b0d29bc4SBrooks Davis {
951*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__add_variable__first);
952*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__add_variable__replace);
953*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__remove_variable);
954*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__add_vector__first);
955*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__add_vector__replace);
956*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__add_to_vector);
957*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__exists__variable);
958*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__exists__vector);
959*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__get_variable__ok);
960*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__get_variable__unknown);
961*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__get_vector__ok);
962*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__get_vector__unknown);
963*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__variable__ok);
964*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__variable__unknown);
965*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__vector__ok);
966*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__vector__unknown_vector);
967*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__vector__unknown_index);
968*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__vector__out_of_range);
969*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__defined);
970*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__length__ok);
971*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__length__unknown_vector);
972*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, templates_def__evaluate__parenthesis_error);
973*b0d29bc4SBrooks Davis
974*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__empty_input);
975*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__value__ok);
976*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__value__unknown_variable);
977*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__vector_length__ok);
978*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__vector_length__unknown_vector);
979*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__vector_value__ok);
980*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__vector_value__unknown_vector);
981*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__vector_value__out_of_range__empty);
982*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__vector_value__out_of_range__not_empty);
983*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__if__one_level__taken);
984*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__if__one_level__not_taken);
985*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__if__multiple_levels__taken);
986*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__if__multiple_levels__not_taken);
987*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__loop__no_iterations);
988*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__loop__multiple_iterations);
989*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__loop__nested__no_iterations);
990*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__loop__nested__multiple_iterations);
991*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__loop__sequential);
992*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__loop__scoping);
993*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__mismatched_delimiters);
994*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__empty_statement);
995*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__unknown_statement);
996*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__invalid_narguments);
997*b0d29bc4SBrooks Davis
998*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__files__ok);
999*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__files__input_error);
1000*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, instantiate__files__output_error);
1001*b0d29bc4SBrooks Davis }
1002