1*c697fb7fSBrooks Davis // Copyright 2011 Google Inc.
2*c697fb7fSBrooks Davis // All rights reserved.
3*c697fb7fSBrooks Davis //
4*c697fb7fSBrooks Davis // Redistribution and use in source and binary forms, with or without
5*c697fb7fSBrooks Davis // modification, are permitted provided that the following conditions are
6*c697fb7fSBrooks Davis // met:
7*c697fb7fSBrooks Davis //
8*c697fb7fSBrooks Davis // * Redistributions of source code must retain the above copyright
9*c697fb7fSBrooks Davis // notice, this list of conditions and the following disclaimer.
10*c697fb7fSBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*c697fb7fSBrooks Davis // notice, this list of conditions and the following disclaimer in the
12*c697fb7fSBrooks Davis // documentation and/or other materials provided with the distribution.
13*c697fb7fSBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*c697fb7fSBrooks Davis // may be used to endorse or promote products derived from this software
15*c697fb7fSBrooks Davis // without specific prior written permission.
16*c697fb7fSBrooks Davis //
17*c697fb7fSBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*c697fb7fSBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*c697fb7fSBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*c697fb7fSBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*c697fb7fSBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*c697fb7fSBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*c697fb7fSBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*c697fb7fSBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*c697fb7fSBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*c697fb7fSBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*c697fb7fSBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*c697fb7fSBrooks Davis
29*c697fb7fSBrooks Davis #include "operations.hpp"
30*c697fb7fSBrooks Davis
31*c697fb7fSBrooks Davis #include <fstream>
32*c697fb7fSBrooks Davis
33*c697fb7fSBrooks Davis #include <atf-c++.hpp>
34*c697fb7fSBrooks Davis
35*c697fb7fSBrooks Davis #include "exceptions.hpp"
36*c697fb7fSBrooks Davis #include "state.ipp"
37*c697fb7fSBrooks Davis #include "test_utils.hpp"
38*c697fb7fSBrooks Davis
39*c697fb7fSBrooks Davis
40*c697fb7fSBrooks Davis namespace {
41*c697fb7fSBrooks Davis
42*c697fb7fSBrooks Davis
43*c697fb7fSBrooks Davis /// Addition function for injection into Lua.
44*c697fb7fSBrooks Davis ///
45*c697fb7fSBrooks Davis /// \pre stack(-2) The first summand.
46*c697fb7fSBrooks Davis /// \pre stack(-1) The second summand.
47*c697fb7fSBrooks Davis /// \post stack(-1) The result of the sum.
48*c697fb7fSBrooks Davis ///
49*c697fb7fSBrooks Davis /// \param state The Lua state.
50*c697fb7fSBrooks Davis ///
51*c697fb7fSBrooks Davis /// \return The number of results (1).
52*c697fb7fSBrooks Davis static int
hook_add(lutok::state & state)53*c697fb7fSBrooks Davis hook_add(lutok::state& state)
54*c697fb7fSBrooks Davis {
55*c697fb7fSBrooks Davis state.push_integer(state.to_integer(-1) + state.to_integer(-2));
56*c697fb7fSBrooks Davis return 1;
57*c697fb7fSBrooks Davis }
58*c697fb7fSBrooks Davis
59*c697fb7fSBrooks Davis
60*c697fb7fSBrooks Davis /// Multiplication function for injection into Lua.
61*c697fb7fSBrooks Davis ///
62*c697fb7fSBrooks Davis /// \pre stack(-2) The first factor.
63*c697fb7fSBrooks Davis /// \pre stack(-1) The second factor.
64*c697fb7fSBrooks Davis /// \post stack(-1) The product.
65*c697fb7fSBrooks Davis ///
66*c697fb7fSBrooks Davis /// \param state The Lua state.
67*c697fb7fSBrooks Davis ///
68*c697fb7fSBrooks Davis /// \return The number of results (1).
69*c697fb7fSBrooks Davis static int
hook_multiply(lutok::state & state)70*c697fb7fSBrooks Davis hook_multiply(lutok::state& state)
71*c697fb7fSBrooks Davis {
72*c697fb7fSBrooks Davis state.push_integer(state.to_integer(-1) * state.to_integer(-2));
73*c697fb7fSBrooks Davis return 1;
74*c697fb7fSBrooks Davis }
75*c697fb7fSBrooks Davis
76*c697fb7fSBrooks Davis
77*c697fb7fSBrooks Davis } // anonymous namespace
78*c697fb7fSBrooks Davis
79*c697fb7fSBrooks Davis
80*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(create_module__empty);
ATF_TEST_CASE_BODY(create_module__empty)81*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(create_module__empty)
82*c697fb7fSBrooks Davis {
83*c697fb7fSBrooks Davis lutok::state state;
84*c697fb7fSBrooks Davis std::map< std::string, lutok::cxx_function > members;
85*c697fb7fSBrooks Davis lutok::create_module(state, "my_math", members);
86*c697fb7fSBrooks Davis
87*c697fb7fSBrooks Davis state.open_base();
88*c697fb7fSBrooks Davis lutok::do_string(state, "return next(my_math) == nil", 0, 1, 0);
89*c697fb7fSBrooks Davis ATF_REQUIRE(state.to_boolean(-1));
90*c697fb7fSBrooks Davis state.pop(1);
91*c697fb7fSBrooks Davis }
92*c697fb7fSBrooks Davis
93*c697fb7fSBrooks Davis
94*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(create_module__one);
ATF_TEST_CASE_BODY(create_module__one)95*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(create_module__one)
96*c697fb7fSBrooks Davis {
97*c697fb7fSBrooks Davis lutok::state state;
98*c697fb7fSBrooks Davis std::map< std::string, lutok::cxx_function > members;
99*c697fb7fSBrooks Davis members["add"] = hook_add;
100*c697fb7fSBrooks Davis lutok::create_module(state, "my_math", members);
101*c697fb7fSBrooks Davis
102*c697fb7fSBrooks Davis lutok::do_string(state, "return my_math.add(10, 20)", 0, 1, 0);
103*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(30, state.to_integer(-1));
104*c697fb7fSBrooks Davis state.pop(1);
105*c697fb7fSBrooks Davis }
106*c697fb7fSBrooks Davis
107*c697fb7fSBrooks Davis
108*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(create_module__many);
ATF_TEST_CASE_BODY(create_module__many)109*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(create_module__many)
110*c697fb7fSBrooks Davis {
111*c697fb7fSBrooks Davis lutok::state state;
112*c697fb7fSBrooks Davis std::map< std::string, lutok::cxx_function > members;
113*c697fb7fSBrooks Davis members["add"] = hook_add;
114*c697fb7fSBrooks Davis members["multiply"] = hook_multiply;
115*c697fb7fSBrooks Davis members["add2"] = hook_add;
116*c697fb7fSBrooks Davis lutok::create_module(state, "my_math", members);
117*c697fb7fSBrooks Davis
118*c697fb7fSBrooks Davis lutok::do_string(state, "return my_math.add(10, 20)", 0, 1, 0);
119*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(30, state.to_integer(-1));
120*c697fb7fSBrooks Davis lutok::do_string(state, "return my_math.multiply(10, 20)", 0, 1, 0);
121*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(200, state.to_integer(-1));
122*c697fb7fSBrooks Davis lutok::do_string(state, "return my_math.add2(20, 30)", 0, 1, 0);
123*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(50, state.to_integer(-1));
124*c697fb7fSBrooks Davis state.pop(3);
125*c697fb7fSBrooks Davis }
126*c697fb7fSBrooks Davis
127*c697fb7fSBrooks Davis
128*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_file__some_args);
ATF_TEST_CASE_BODY(do_file__some_args)129*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_file__some_args)
130*c697fb7fSBrooks Davis {
131*c697fb7fSBrooks Davis std::ofstream output("test.lua");
132*c697fb7fSBrooks Davis output << "local a1, a2 = ...\nreturn a1 * 2, a2 * 2\n";
133*c697fb7fSBrooks Davis output.close();
134*c697fb7fSBrooks Davis
135*c697fb7fSBrooks Davis lutok::state state;
136*c697fb7fSBrooks Davis state.push_integer(456);
137*c697fb7fSBrooks Davis state.push_integer(3);
138*c697fb7fSBrooks Davis state.push_integer(5);
139*c697fb7fSBrooks Davis state.push_integer(123);
140*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(2, lutok::do_file(state, "test.lua", 3, -1, 0));
141*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(3, state.get_top());
142*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(456, state.to_integer(-3));
143*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(6, state.to_integer(-2));
144*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-1));
145*c697fb7fSBrooks Davis state.pop(3);
146*c697fb7fSBrooks Davis }
147*c697fb7fSBrooks Davis
148*c697fb7fSBrooks Davis
149*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_file__any_results);
ATF_TEST_CASE_BODY(do_file__any_results)150*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_file__any_results)
151*c697fb7fSBrooks Davis {
152*c697fb7fSBrooks Davis std::ofstream output("test.lua");
153*c697fb7fSBrooks Davis output << "return 10, 20, 30\n";
154*c697fb7fSBrooks Davis output.close();
155*c697fb7fSBrooks Davis
156*c697fb7fSBrooks Davis lutok::state state;
157*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(3, lutok::do_file(state, "test.lua", 0, -1, 0));
158*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(3, state.get_top());
159*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-3));
160*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(20, state.to_integer(-2));
161*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(30, state.to_integer(-1));
162*c697fb7fSBrooks Davis state.pop(3);
163*c697fb7fSBrooks Davis }
164*c697fb7fSBrooks Davis
165*c697fb7fSBrooks Davis
166*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_file__no_results);
ATF_TEST_CASE_BODY(do_file__no_results)167*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_file__no_results)
168*c697fb7fSBrooks Davis {
169*c697fb7fSBrooks Davis std::ofstream output("test.lua");
170*c697fb7fSBrooks Davis output << "return 10, 20, 30\n";
171*c697fb7fSBrooks Davis output.close();
172*c697fb7fSBrooks Davis
173*c697fb7fSBrooks Davis lutok::state state;
174*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(0, lutok::do_file(state, "test.lua", 0, 0, 0));
175*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(0, state.get_top());
176*c697fb7fSBrooks Davis }
177*c697fb7fSBrooks Davis
178*c697fb7fSBrooks Davis
179*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_file__many_results);
ATF_TEST_CASE_BODY(do_file__many_results)180*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_file__many_results)
181*c697fb7fSBrooks Davis {
182*c697fb7fSBrooks Davis std::ofstream output("test.lua");
183*c697fb7fSBrooks Davis output << "return 10, 20, 30\n";
184*c697fb7fSBrooks Davis output.close();
185*c697fb7fSBrooks Davis
186*c697fb7fSBrooks Davis lutok::state state;
187*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(2, lutok::do_file(state, "test.lua", 0, 2, 0));
188*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(2, state.get_top());
189*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-2));
190*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(20, state.to_integer(-1));
191*c697fb7fSBrooks Davis state.pop(2);
192*c697fb7fSBrooks Davis }
193*c697fb7fSBrooks Davis
194*c697fb7fSBrooks Davis
195*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_file__not_found);
ATF_TEST_CASE_BODY(do_file__not_found)196*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_file__not_found)
197*c697fb7fSBrooks Davis {
198*c697fb7fSBrooks Davis lutok::state state;
199*c697fb7fSBrooks Davis stack_balance_checker checker(state);
200*c697fb7fSBrooks Davis ATF_REQUIRE_THROW_RE(lutok::file_not_found_error, "missing.lua",
201*c697fb7fSBrooks Davis lutok::do_file(state, "missing.lua", 0, 0, 0));
202*c697fb7fSBrooks Davis }
203*c697fb7fSBrooks Davis
204*c697fb7fSBrooks Davis
205*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_file__error);
ATF_TEST_CASE_BODY(do_file__error)206*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_file__error)
207*c697fb7fSBrooks Davis {
208*c697fb7fSBrooks Davis std::ofstream output("test.lua");
209*c697fb7fSBrooks Davis output << "a b c\n";
210*c697fb7fSBrooks Davis output.close();
211*c697fb7fSBrooks Davis
212*c697fb7fSBrooks Davis lutok::state state;
213*c697fb7fSBrooks Davis stack_balance_checker checker(state);
214*c697fb7fSBrooks Davis ATF_REQUIRE_THROW_RE(lutok::error, "Failed to load Lua file 'test.lua'",
215*c697fb7fSBrooks Davis lutok::do_file(state, "test.lua", 0, 0, 0));
216*c697fb7fSBrooks Davis }
217*c697fb7fSBrooks Davis
218*c697fb7fSBrooks Davis
219*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_file__error_with_errfunc);
ATF_TEST_CASE_BODY(do_file__error_with_errfunc)220*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_file__error_with_errfunc)
221*c697fb7fSBrooks Davis {
222*c697fb7fSBrooks Davis std::ofstream output("test.lua");
223*c697fb7fSBrooks Davis output << "unknown_function()\n";
224*c697fb7fSBrooks Davis output.close();
225*c697fb7fSBrooks Davis
226*c697fb7fSBrooks Davis lutok::state state;
227*c697fb7fSBrooks Davis lutok::eval(state, "function(message) return 'This is an error!' end", 1);
228*c697fb7fSBrooks Davis {
229*c697fb7fSBrooks Davis stack_balance_checker checker(state);
230*c697fb7fSBrooks Davis ATF_REQUIRE_THROW_RE(lutok::error, "This is an error!",
231*c697fb7fSBrooks Davis lutok::do_file(state, "test.lua", 0, 0, -2));
232*c697fb7fSBrooks Davis }
233*c697fb7fSBrooks Davis state.pop(1);
234*c697fb7fSBrooks Davis }
235*c697fb7fSBrooks Davis
236*c697fb7fSBrooks Davis
237*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_string__some_args);
ATF_TEST_CASE_BODY(do_string__some_args)238*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_string__some_args)
239*c697fb7fSBrooks Davis {
240*c697fb7fSBrooks Davis lutok::state state;
241*c697fb7fSBrooks Davis state.push_integer(456);
242*c697fb7fSBrooks Davis state.push_integer(3);
243*c697fb7fSBrooks Davis state.push_integer(5);
244*c697fb7fSBrooks Davis state.push_integer(123);
245*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(2, lutok::do_string(
246*c697fb7fSBrooks Davis state, "local a1, a2 = ...\nreturn a1 * 2, a2 * 2\n", 3, -1, 0));
247*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(3, state.get_top());
248*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(456, state.to_integer(-3));
249*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(6, state.to_integer(-2));
250*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-1));
251*c697fb7fSBrooks Davis state.pop(3);
252*c697fb7fSBrooks Davis }
253*c697fb7fSBrooks Davis
254*c697fb7fSBrooks Davis
255*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_string__any_results);
ATF_TEST_CASE_BODY(do_string__any_results)256*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_string__any_results)
257*c697fb7fSBrooks Davis {
258*c697fb7fSBrooks Davis lutok::state state;
259*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(3, lutok::do_string(state, "return 10, 20, 30", 0, -1, 0));
260*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(3, state.get_top());
261*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-3));
262*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(20, state.to_integer(-2));
263*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(30, state.to_integer(-1));
264*c697fb7fSBrooks Davis state.pop(3);
265*c697fb7fSBrooks Davis }
266*c697fb7fSBrooks Davis
267*c697fb7fSBrooks Davis
268*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_string__no_results);
ATF_TEST_CASE_BODY(do_string__no_results)269*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_string__no_results)
270*c697fb7fSBrooks Davis {
271*c697fb7fSBrooks Davis lutok::state state;
272*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(0, lutok::do_string(state, "return 10, 20, 30", 0, 0, 0));
273*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(0, state.get_top());
274*c697fb7fSBrooks Davis }
275*c697fb7fSBrooks Davis
276*c697fb7fSBrooks Davis
277*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_string__many_results);
ATF_TEST_CASE_BODY(do_string__many_results)278*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_string__many_results)
279*c697fb7fSBrooks Davis {
280*c697fb7fSBrooks Davis lutok::state state;
281*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(2, lutok::do_string(state, "return 10, 20, 30", 0, 2, 0));
282*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(2, state.get_top());
283*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-2));
284*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(20, state.to_integer(-1));
285*c697fb7fSBrooks Davis state.pop(2);
286*c697fb7fSBrooks Davis }
287*c697fb7fSBrooks Davis
288*c697fb7fSBrooks Davis
289*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_string__error);
ATF_TEST_CASE_BODY(do_string__error)290*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_string__error)
291*c697fb7fSBrooks Davis {
292*c697fb7fSBrooks Davis lutok::state state;
293*c697fb7fSBrooks Davis stack_balance_checker checker(state);
294*c697fb7fSBrooks Davis ATF_REQUIRE_THROW_RE(lutok::error, "Failed to process Lua string 'a b c'",
295*c697fb7fSBrooks Davis lutok::do_string(state, "a b c", 0, 0, 0));
296*c697fb7fSBrooks Davis }
297*c697fb7fSBrooks Davis
298*c697fb7fSBrooks Davis
299*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(do_string__error_with_errfunc);
ATF_TEST_CASE_BODY(do_string__error_with_errfunc)300*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(do_string__error_with_errfunc)
301*c697fb7fSBrooks Davis {
302*c697fb7fSBrooks Davis lutok::state state;
303*c697fb7fSBrooks Davis lutok::eval(state, "function(message) return 'This is an error!' end", 1);
304*c697fb7fSBrooks Davis {
305*c697fb7fSBrooks Davis stack_balance_checker checker(state);
306*c697fb7fSBrooks Davis ATF_REQUIRE_THROW_RE(lutok::error, "This is an error!",
307*c697fb7fSBrooks Davis lutok::do_string(state, "unknown_function()",
308*c697fb7fSBrooks Davis 0, 0, -2));
309*c697fb7fSBrooks Davis }
310*c697fb7fSBrooks Davis state.pop(1);
311*c697fb7fSBrooks Davis }
312*c697fb7fSBrooks Davis
313*c697fb7fSBrooks Davis
314*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(eval__one_result);
ATF_TEST_CASE_BODY(eval__one_result)315*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(eval__one_result)
316*c697fb7fSBrooks Davis {
317*c697fb7fSBrooks Davis lutok::state state;
318*c697fb7fSBrooks Davis stack_balance_checker checker(state);
319*c697fb7fSBrooks Davis lutok::eval(state, "3 + 10", 1);
320*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(13, state.to_integer(-1));
321*c697fb7fSBrooks Davis state.pop(1);
322*c697fb7fSBrooks Davis }
323*c697fb7fSBrooks Davis
324*c697fb7fSBrooks Davis
325*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(eval__many_results);
ATF_TEST_CASE_BODY(eval__many_results)326*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(eval__many_results)
327*c697fb7fSBrooks Davis {
328*c697fb7fSBrooks Davis lutok::state state;
329*c697fb7fSBrooks Davis stack_balance_checker checker(state);
330*c697fb7fSBrooks Davis lutok::eval(state, "5, 8, 10", 3);
331*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(5, state.to_integer(-3));
332*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(8, state.to_integer(-2));
333*c697fb7fSBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-1));
334*c697fb7fSBrooks Davis state.pop(3);
335*c697fb7fSBrooks Davis }
336*c697fb7fSBrooks Davis
337*c697fb7fSBrooks Davis
338*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(eval__error);
ATF_TEST_CASE_BODY(eval__error)339*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(eval__error)
340*c697fb7fSBrooks Davis {
341*c697fb7fSBrooks Davis lutok::state state;
342*c697fb7fSBrooks Davis stack_balance_checker checker(state);
343*c697fb7fSBrooks Davis ATF_REQUIRE_THROW(lutok::error,
344*c697fb7fSBrooks Davis lutok::eval(state, "non_existent.method()", 1));
345*c697fb7fSBrooks Davis }
346*c697fb7fSBrooks Davis
347*c697fb7fSBrooks Davis
ATF_INIT_TEST_CASES(tcs)348*c697fb7fSBrooks Davis ATF_INIT_TEST_CASES(tcs)
349*c697fb7fSBrooks Davis {
350*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, create_module__empty);
351*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, create_module__one);
352*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, create_module__many);
353*c697fb7fSBrooks Davis
354*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_file__some_args);
355*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_file__any_results);
356*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_file__no_results);
357*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_file__many_results);
358*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_file__not_found);
359*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_file__error);
360*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_file__error_with_errfunc);
361*c697fb7fSBrooks Davis
362*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_string__some_args);
363*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_string__any_results);
364*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_string__no_results);
365*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_string__many_results);
366*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_string__error);
367*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, do_string__error_with_errfunc);
368*c697fb7fSBrooks Davis
369*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, eval__one_result);
370*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, eval__many_results);
371*c697fb7fSBrooks Davis ATF_ADD_TEST_CASE(tcs, eval__error);
372*c697fb7fSBrooks Davis }
373