xref: /freebsd/contrib/lutok/state_test.cpp (revision c697fb7f)
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 "state.ipp"
30*c697fb7fSBrooks Davis 
31*c697fb7fSBrooks Davis #include <cstring>
32*c697fb7fSBrooks Davis #include <fstream>
33*c697fb7fSBrooks Davis #include <iostream>
34*c697fb7fSBrooks Davis #include <stdexcept>
35*c697fb7fSBrooks Davis 
36*c697fb7fSBrooks Davis #include <atf-c++.hpp>
37*c697fb7fSBrooks Davis #include <lua.hpp>
38*c697fb7fSBrooks Davis 
39*c697fb7fSBrooks Davis #include "c_gate.hpp"
40*c697fb7fSBrooks Davis #include "exceptions.hpp"
41*c697fb7fSBrooks Davis #include "test_utils.hpp"
42*c697fb7fSBrooks Davis 
43*c697fb7fSBrooks Davis 
44*c697fb7fSBrooks Davis // A note about the lutok::state tests.
45*c697fb7fSBrooks Davis //
46*c697fb7fSBrooks Davis // The methods of lutok::state are, in general, thin wrappers around the
47*c697fb7fSBrooks Davis // corresponding Lua C API methods.  The tests below are simple unit tests that
48*c697fb7fSBrooks Davis // ensure that these functions just delegate the calls to the Lua library.  We
49*c697fb7fSBrooks Davis // do not intend to test the validity of the methods themselves (that's the
50*c697fb7fSBrooks Davis // job of the Lua authors).  That said, we test those conditions we rely on,
51*c697fb7fSBrooks Davis // such as the reporting of errors and the default values to the API.
52*c697fb7fSBrooks Davis //
53*c697fb7fSBrooks Davis // Lastly, for every test case that stresses a single lutok::state method, we
54*c697fb7fSBrooks Davis // only call that method directly.  All other Lua state manipulation operations
55*c697fb7fSBrooks Davis // are performed by means of direct calls to the Lua C API.  This is to ensure
56*c697fb7fSBrooks Davis // that the wrapped methods are really talking to Lua.
57*c697fb7fSBrooks Davis 
58*c697fb7fSBrooks Davis 
59*c697fb7fSBrooks Davis namespace {
60*c697fb7fSBrooks Davis 
61*c697fb7fSBrooks Davis 
62*c697fb7fSBrooks Davis /// Checks if a symbol is available.
63*c697fb7fSBrooks Davis ///
64*c697fb7fSBrooks Davis /// \param state The Lua state.
65*c697fb7fSBrooks Davis /// \param symbol The symbol to check for.
66*c697fb7fSBrooks Davis ///
67*c697fb7fSBrooks Davis /// \return True if the symbol is defined, false otherwise.
68*c697fb7fSBrooks Davis static bool
is_available(lutok::state & state,const char * symbol)69*c697fb7fSBrooks Davis is_available(lutok::state& state, const char* symbol)
70*c697fb7fSBrooks Davis {
71*c697fb7fSBrooks Davis     luaL_loadstring(raw(state), (std::string("return ") + symbol).c_str());
72*c697fb7fSBrooks Davis     const bool ok = (lua_pcall(raw(state), 0, 1, 0) == 0 &&
73*c697fb7fSBrooks Davis                      !lua_isnil(raw(state), -1));
74*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
75*c697fb7fSBrooks Davis     std::cout << "Symbol " << symbol << (ok ? " found\n" : " not found\n");
76*c697fb7fSBrooks Davis     return ok;
77*c697fb7fSBrooks Davis }
78*c697fb7fSBrooks Davis 
79*c697fb7fSBrooks Davis 
80*c697fb7fSBrooks Davis /// Checks that no modules are present or that only one has been loaded.
81*c697fb7fSBrooks Davis ///
82*c697fb7fSBrooks Davis /// \post The test case terminates if there is any module present when expected
83*c697fb7fSBrooks Davis /// is empty or if there two modules loaded when expected is defined.
84*c697fb7fSBrooks Davis ///
85*c697fb7fSBrooks Davis /// \param state The Lua state.
86*c697fb7fSBrooks Davis /// \param expected The module to expect.  Empty if no modules are allowed.
87*c697fb7fSBrooks Davis static void
check_modules(lutok::state & state,const std::string & expected)88*c697fb7fSBrooks Davis check_modules(lutok::state& state, const std::string& expected)
89*c697fb7fSBrooks Davis {
90*c697fb7fSBrooks Davis     std::cout << "Checking loaded modules" <<
91*c697fb7fSBrooks Davis         (expected.empty() ? "" : (" (" + expected + " expected)")) << "\n";
92*c697fb7fSBrooks Davis     ATF_REQUIRE(!((expected == "base") ^ (is_available(state, "assert"))));
93*c697fb7fSBrooks Davis     ATF_REQUIRE(!((expected == "string") ^
94*c697fb7fSBrooks Davis                   (is_available(state, "string.byte"))));
95*c697fb7fSBrooks Davis     ATF_REQUIRE(!((expected == "table") ^
96*c697fb7fSBrooks Davis                   (is_available(state, "table.concat"))));
97*c697fb7fSBrooks Davis }
98*c697fb7fSBrooks Davis 
99*c697fb7fSBrooks Davis 
100*c697fb7fSBrooks Davis /// A C closure that returns its two integral upvalues.
101*c697fb7fSBrooks Davis ///
102*c697fb7fSBrooks Davis /// \post stack(-2) contains the first upvalue.
103*c697fb7fSBrooks Davis /// \post stack(-1) contains the second upvalue.
104*c697fb7fSBrooks Davis ///
105*c697fb7fSBrooks Davis /// \param raw_state The raw Lua state.
106*c697fb7fSBrooks Davis ///
107*c697fb7fSBrooks Davis /// \return The number of result values, i.e. 2.
108*c697fb7fSBrooks Davis static int
c_get_upvalues(lua_State * raw_state)109*c697fb7fSBrooks Davis c_get_upvalues(lua_State* raw_state)
110*c697fb7fSBrooks Davis {
111*c697fb7fSBrooks Davis     lutok::state state = lutok::state_c_gate::connect(raw_state);
112*c697fb7fSBrooks Davis     const int i1 = lua_tointeger(raw_state, state.upvalue_index(1));
113*c697fb7fSBrooks Davis     const int i2 = lua_tointeger(raw_state, state.upvalue_index(2));
114*c697fb7fSBrooks Davis     lua_pushinteger(raw_state, i1);
115*c697fb7fSBrooks Davis     lua_pushinteger(raw_state, i2);
116*c697fb7fSBrooks Davis     return 2;
117*c697fb7fSBrooks Davis }
118*c697fb7fSBrooks Davis 
119*c697fb7fSBrooks Davis 
120*c697fb7fSBrooks Davis /// A custom C++ multiply function with one of its factors on its closure.
121*c697fb7fSBrooks Davis ///
122*c697fb7fSBrooks Davis /// \pre stack(-1) contains the second factor.
123*c697fb7fSBrooks Davis /// \post stack(-1) contains the product of the two input factors.
124*c697fb7fSBrooks Davis ///
125*c697fb7fSBrooks Davis /// \param state The Lua state.
126*c697fb7fSBrooks Davis ///
127*c697fb7fSBrooks Davis /// \return The number of result values, i.e. 1.
128*c697fb7fSBrooks Davis static int
cxx_multiply_closure(lutok::state & state)129*c697fb7fSBrooks Davis cxx_multiply_closure(lutok::state& state)
130*c697fb7fSBrooks Davis {
131*c697fb7fSBrooks Davis     const int f1 = lua_tointeger(raw(state), lua_upvalueindex(1));
132*c697fb7fSBrooks Davis     const int f2 = lua_tointeger(raw(state), -1);
133*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), f1 * f2);
134*c697fb7fSBrooks Davis     return 1;
135*c697fb7fSBrooks Davis }
136*c697fb7fSBrooks Davis 
137*c697fb7fSBrooks Davis 
138*c697fb7fSBrooks Davis /// A custom C++ integral division function for Lua.
139*c697fb7fSBrooks Davis ///
140*c697fb7fSBrooks Davis /// \pre stack(-2) contains the dividend.
141*c697fb7fSBrooks Davis /// \pre stack(-1) contains the divisor.
142*c697fb7fSBrooks Davis /// \post stack(-2) contains the quotient of the division.
143*c697fb7fSBrooks Davis /// \post stack(-1) contains the remainder of the division.
144*c697fb7fSBrooks Davis ///
145*c697fb7fSBrooks Davis /// \param state The Lua state.
146*c697fb7fSBrooks Davis ///
147*c697fb7fSBrooks Davis /// \return The number of result values, i.e. 1.
148*c697fb7fSBrooks Davis ///
149*c697fb7fSBrooks Davis /// \throw std::runtime_error If the divisor is zero.
150*c697fb7fSBrooks Davis /// \throw std::string If the dividend or the divisor are negative.  This is an
151*c697fb7fSBrooks Davis ///     exception not derived from std::exception on purpose to ensure that the
152*c697fb7fSBrooks Davis ///     C++ wrapping correctly captures any exception regardless of its type.
153*c697fb7fSBrooks Davis static int
cxx_divide(lutok::state & state)154*c697fb7fSBrooks Davis cxx_divide(lutok::state& state)
155*c697fb7fSBrooks Davis {
156*c697fb7fSBrooks Davis     const int dividend = state.to_integer(-2);
157*c697fb7fSBrooks Davis     const int divisor = state.to_integer(-1);
158*c697fb7fSBrooks Davis     if (divisor == 0)
159*c697fb7fSBrooks Davis         throw std::runtime_error("Divisor is 0");
160*c697fb7fSBrooks Davis     if (dividend < 0 || divisor < 0)
161*c697fb7fSBrooks Davis         throw std::string("Cannot divide negative numbers");
162*c697fb7fSBrooks Davis     state.push_integer(dividend / divisor);
163*c697fb7fSBrooks Davis     state.push_integer(dividend % divisor);
164*c697fb7fSBrooks Davis     return 2;
165*c697fb7fSBrooks Davis }
166*c697fb7fSBrooks Davis 
167*c697fb7fSBrooks Davis 
168*c697fb7fSBrooks Davis /// A Lua function that raises a very long error message.
169*c697fb7fSBrooks Davis ///
170*c697fb7fSBrooks Davis /// \pre stack(-1) contains the length of the message to construct.
171*c697fb7fSBrooks Davis ///
172*c697fb7fSBrooks Davis /// \param state The Lua state.
173*c697fb7fSBrooks Davis ///
174*c697fb7fSBrooks Davis /// \return Never returns.
175*c697fb7fSBrooks Davis ///
176*c697fb7fSBrooks Davis /// \throw std::runtime_error Unconditionally, with an error message formed by
177*c697fb7fSBrooks Davis ///     the repetition of 'A' as many times as requested.
178*c697fb7fSBrooks Davis static int
raise_long_error(lutok::state & state)179*c697fb7fSBrooks Davis raise_long_error(lutok::state& state)
180*c697fb7fSBrooks Davis {
181*c697fb7fSBrooks Davis     const int length = state.to_integer(-1);
182*c697fb7fSBrooks Davis     throw std::runtime_error(std::string(length, 'A').c_str());
183*c697fb7fSBrooks Davis }
184*c697fb7fSBrooks Davis 
185*c697fb7fSBrooks Davis 
186*c697fb7fSBrooks Davis }  // anonymous namespace
187*c697fb7fSBrooks Davis 
188*c697fb7fSBrooks Davis 
189*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(close);
ATF_TEST_CASE_BODY(close)190*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(close)
191*c697fb7fSBrooks Davis {
192*c697fb7fSBrooks Davis     lutok::state state;
193*c697fb7fSBrooks Davis     state.close();
194*c697fb7fSBrooks Davis     // The destructor for state will run now.  If it does a second close, we may
195*c697fb7fSBrooks Davis     // crash, so let's see if we don't.
196*c697fb7fSBrooks Davis }
197*c697fb7fSBrooks Davis 
198*c697fb7fSBrooks Davis 
199*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_global__ok);
ATF_TEST_CASE_BODY(get_global__ok)200*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_global__ok)
201*c697fb7fSBrooks Davis {
202*c697fb7fSBrooks Davis     lutok::state state;
203*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "test_variable = 3") == 0);
204*c697fb7fSBrooks Davis     state.get_global("test_variable");
205*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
206*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
207*c697fb7fSBrooks Davis }
208*c697fb7fSBrooks Davis 
209*c697fb7fSBrooks Davis 
210*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_global__undefined);
ATF_TEST_CASE_BODY(get_global__undefined)211*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_global__undefined)
212*c697fb7fSBrooks Davis {
213*c697fb7fSBrooks Davis     lutok::state state;
214*c697fb7fSBrooks Davis     state.get_global("test_variable");
215*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnil(raw(state), -1));
216*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
217*c697fb7fSBrooks Davis }
218*c697fb7fSBrooks Davis 
219*c697fb7fSBrooks Davis 
220*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_global_table);
ATF_TEST_CASE_BODY(get_global_table)221*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_global_table)
222*c697fb7fSBrooks Davis {
223*c697fb7fSBrooks Davis     lutok::state state;
224*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "global_variable = 'hello'") == 0);
225*c697fb7fSBrooks Davis     state.get_global_table();
226*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "global_variable");
227*c697fb7fSBrooks Davis     lua_gettable(raw(state), -2);
228*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isstring(raw(state), -1));
229*c697fb7fSBrooks Davis     ATF_REQUIRE(std::strcmp("hello", lua_tostring(raw(state), -1)) == 0);
230*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
231*c697fb7fSBrooks Davis }
232*c697fb7fSBrooks Davis 
233*c697fb7fSBrooks Davis 
234*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_metafield__ok);
ATF_TEST_CASE_BODY(get_metafield__ok)235*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_metafield__ok)
236*c697fb7fSBrooks Davis {
237*c697fb7fSBrooks Davis     lutok::state state;
238*c697fb7fSBrooks Davis     luaL_openlibs(raw(state));
239*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "meta = { foo = 567 }; "
240*c697fb7fSBrooks Davis                               "t = {}; setmetatable(t, meta)") == 0);
241*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
242*c697fb7fSBrooks Davis     ATF_REQUIRE(state.get_metafield(-1, "foo"));
243*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
244*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(567, lua_tointeger(raw(state), -1));
245*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
246*c697fb7fSBrooks Davis }
247*c697fb7fSBrooks Davis 
248*c697fb7fSBrooks Davis 
249*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_metafield__undefined);
ATF_TEST_CASE_BODY(get_metafield__undefined)250*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_metafield__undefined)
251*c697fb7fSBrooks Davis {
252*c697fb7fSBrooks Davis     lutok::state state;
253*c697fb7fSBrooks Davis     luaL_openlibs(raw(state));
254*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "meta = { foo = 567 }; "
255*c697fb7fSBrooks Davis                               "t = {}; setmetatable(t, meta)") == 0);
256*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
257*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.get_metafield(-1, "bar"));
258*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
259*c697fb7fSBrooks Davis }
260*c697fb7fSBrooks Davis 
261*c697fb7fSBrooks Davis 
262*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_metatable__ok);
ATF_TEST_CASE_BODY(get_metatable__ok)263*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_metatable__ok)
264*c697fb7fSBrooks Davis {
265*c697fb7fSBrooks Davis     lutok::state state;
266*c697fb7fSBrooks Davis     luaL_openlibs(raw(state));
267*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "meta = { foo = 567 }; "
268*c697fb7fSBrooks Davis                               "t = {}; setmetatable(t, meta)") == 0);
269*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
270*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 5555);
271*c697fb7fSBrooks Davis     ATF_REQUIRE(state.get_metatable(-2));
272*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_istable(raw(state), -1));
273*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foo");
274*c697fb7fSBrooks Davis     lua_gettable(raw(state), -2);
275*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
276*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(567, lua_tointeger(raw(state), -1));
277*c697fb7fSBrooks Davis     lua_pop(raw(state), 4);
278*c697fb7fSBrooks Davis }
279*c697fb7fSBrooks Davis 
280*c697fb7fSBrooks Davis 
281*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_metatable__undefined);
ATF_TEST_CASE_BODY(get_metatable__undefined)282*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_metatable__undefined)
283*c697fb7fSBrooks Davis {
284*c697fb7fSBrooks Davis     lutok::state state;
285*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "t = {}") == 0);
286*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
287*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.get_metatable(-1));
288*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
289*c697fb7fSBrooks Davis }
290*c697fb7fSBrooks Davis 
291*c697fb7fSBrooks Davis 
292*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_table__ok);
ATF_TEST_CASE_BODY(get_table__ok)293*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_table__ok)
294*c697fb7fSBrooks Davis {
295*c697fb7fSBrooks Davis     lutok::state state;
296*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "t = { a = 1, bar = 234 }") == 0);
297*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
298*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "bar");
299*c697fb7fSBrooks Davis     state.get_table(-2);
300*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
301*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(234, lua_tointeger(raw(state), -1));
302*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
303*c697fb7fSBrooks Davis }
304*c697fb7fSBrooks Davis 
305*c697fb7fSBrooks Davis 
306*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_table__nil);
ATF_TEST_CASE_BODY(get_table__nil)307*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_table__nil)
308*c697fb7fSBrooks Davis {
309*c697fb7fSBrooks Davis     lutok::state state;
310*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
311*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 1);
312*c697fb7fSBrooks Davis     REQUIRE_API_ERROR("lua_gettable", state.get_table(-2));
313*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_gettop(raw(state)));
314*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
315*c697fb7fSBrooks Davis }
316*c697fb7fSBrooks Davis 
317*c697fb7fSBrooks Davis 
318*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_table__unknown_index);
ATF_TEST_CASE_BODY(get_table__unknown_index)319*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_table__unknown_index)
320*c697fb7fSBrooks Davis {
321*c697fb7fSBrooks Davis     lutok::state state;
322*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state),
323*c697fb7fSBrooks Davis                               "the_table = { foo = 1, bar = 2 }") == 0);
324*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "the_table");
325*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "baz");
326*c697fb7fSBrooks Davis     state.get_table(-2);
327*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnil(raw(state), -1));
328*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
329*c697fb7fSBrooks Davis }
330*c697fb7fSBrooks Davis 
331*c697fb7fSBrooks Davis 
332*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(get_top);
ATF_TEST_CASE_BODY(get_top)333*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(get_top)
334*c697fb7fSBrooks Davis {
335*c697fb7fSBrooks Davis     lutok::state state;
336*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(0, state.get_top());
337*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 3);
338*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, state.get_top());
339*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 3);
340*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, state.get_top());
341*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
342*c697fb7fSBrooks Davis }
343*c697fb7fSBrooks Davis 
344*c697fb7fSBrooks Davis 
345*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(insert);
ATF_TEST_CASE_BODY(insert)346*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(insert)
347*c697fb7fSBrooks Davis {
348*c697fb7fSBrooks Davis     lutok::state state;
349*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 1);
350*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 2);
351*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 3);
352*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 4);
353*c697fb7fSBrooks Davis     state.insert(-3);
354*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(3, lua_tointeger(raw(state), -1));
355*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_tointeger(raw(state), -2));
356*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(4, lua_tointeger(raw(state), -3));
357*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_tointeger(raw(state), -4));
358*c697fb7fSBrooks Davis     lua_pop(raw(state), 4);
359*c697fb7fSBrooks Davis }
360*c697fb7fSBrooks Davis 
361*c697fb7fSBrooks Davis 
362*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_boolean__empty);
ATF_TEST_CASE_BODY(is_boolean__empty)363*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_boolean__empty)
364*c697fb7fSBrooks Davis {
365*c697fb7fSBrooks Davis     lutok::state state;
366*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_boolean(-1));
367*c697fb7fSBrooks Davis }
368*c697fb7fSBrooks Davis 
369*c697fb7fSBrooks Davis 
370*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_boolean__ok);
ATF_TEST_CASE_BODY(is_boolean__ok)371*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_boolean__ok)
372*c697fb7fSBrooks Davis {
373*c697fb7fSBrooks Davis     lutok::state state;
374*c697fb7fSBrooks Davis     lua_pushboolean(raw(state), 1);
375*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_boolean(-1));
376*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 5);
377*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_boolean(-1));
378*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_boolean(-2));
379*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
380*c697fb7fSBrooks Davis }
381*c697fb7fSBrooks Davis 
382*c697fb7fSBrooks Davis 
383*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_function__empty);
ATF_TEST_CASE_BODY(is_function__empty)384*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_function__empty)
385*c697fb7fSBrooks Davis {
386*c697fb7fSBrooks Davis     lutok::state state;
387*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_function(-1));
388*c697fb7fSBrooks Davis }
389*c697fb7fSBrooks Davis 
390*c697fb7fSBrooks Davis 
391*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_function__ok);
ATF_TEST_CASE_BODY(is_function__ok)392*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_function__ok)
393*c697fb7fSBrooks Davis {
394*c697fb7fSBrooks Davis     lutok::state state;
395*c697fb7fSBrooks Davis     luaL_dostring(raw(state), "function my_func(a, b) return a + b; end");
396*c697fb7fSBrooks Davis 
397*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "my_func");
398*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_function(-1));
399*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 5);
400*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_function(-1));
401*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_function(-2));
402*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
403*c697fb7fSBrooks Davis }
404*c697fb7fSBrooks Davis 
405*c697fb7fSBrooks Davis 
406*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_nil__empty);
ATF_TEST_CASE_BODY(is_nil__empty)407*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_nil__empty)
408*c697fb7fSBrooks Davis {
409*c697fb7fSBrooks Davis     lutok::state state;
410*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_nil(-1));
411*c697fb7fSBrooks Davis }
412*c697fb7fSBrooks Davis 
413*c697fb7fSBrooks Davis 
414*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_nil__ok);
ATF_TEST_CASE_BODY(is_nil__ok)415*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_nil__ok)
416*c697fb7fSBrooks Davis {
417*c697fb7fSBrooks Davis     lutok::state state;
418*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
419*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_nil(-1));
420*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 5);
421*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_nil(-1));
422*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_nil(-2));
423*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
424*c697fb7fSBrooks Davis }
425*c697fb7fSBrooks Davis 
426*c697fb7fSBrooks Davis 
427*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_number__empty);
ATF_TEST_CASE_BODY(is_number__empty)428*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_number__empty)
429*c697fb7fSBrooks Davis {
430*c697fb7fSBrooks Davis     lutok::state state;
431*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_number(-1));
432*c697fb7fSBrooks Davis }
433*c697fb7fSBrooks Davis 
434*c697fb7fSBrooks Davis 
435*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_number__ok);
ATF_TEST_CASE_BODY(is_number__ok)436*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_number__ok)
437*c697fb7fSBrooks Davis {
438*c697fb7fSBrooks Davis     lutok::state state;
439*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
440*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_number(-1));
441*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 5);
442*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_number(-1));
443*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_number(-2));
444*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
445*c697fb7fSBrooks Davis }
446*c697fb7fSBrooks Davis 
447*c697fb7fSBrooks Davis 
448*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_string__empty);
ATF_TEST_CASE_BODY(is_string__empty)449*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_string__empty)
450*c697fb7fSBrooks Davis {
451*c697fb7fSBrooks Davis     lutok::state state;
452*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_string(-1));
453*c697fb7fSBrooks Davis }
454*c697fb7fSBrooks Davis 
455*c697fb7fSBrooks Davis 
456*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_string__ok);
ATF_TEST_CASE_BODY(is_string__ok)457*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_string__ok)
458*c697fb7fSBrooks Davis {
459*c697fb7fSBrooks Davis     lutok::state state;
460*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 3);
461*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_string(-1));
462*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
463*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_string(-1));
464*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_string(-2));
465*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foo");
466*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_string(-1));
467*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_string(-2));
468*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_string(-3));
469*c697fb7fSBrooks Davis     lua_pop(raw(state), 3);
470*c697fb7fSBrooks Davis }
471*c697fb7fSBrooks Davis 
472*c697fb7fSBrooks Davis 
473*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_table__empty);
ATF_TEST_CASE_BODY(is_table__empty)474*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_table__empty)
475*c697fb7fSBrooks Davis {
476*c697fb7fSBrooks Davis     lutok::state state;
477*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_table(-1));
478*c697fb7fSBrooks Davis }
479*c697fb7fSBrooks Davis 
480*c697fb7fSBrooks Davis 
481*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_table__ok);
ATF_TEST_CASE_BODY(is_table__ok)482*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_table__ok)
483*c697fb7fSBrooks Davis {
484*c697fb7fSBrooks Davis     lutok::state state;
485*c697fb7fSBrooks Davis     luaL_dostring(raw(state), "t = {3, 4, 5}");
486*c697fb7fSBrooks Davis 
487*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foo");
488*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_table(-1));
489*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
490*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_table(-1));
491*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_table(-2));
492*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
493*c697fb7fSBrooks Davis }
494*c697fb7fSBrooks Davis 
495*c697fb7fSBrooks Davis 
496*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_userdata__empty);
ATF_TEST_CASE_BODY(is_userdata__empty)497*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_userdata__empty)
498*c697fb7fSBrooks Davis {
499*c697fb7fSBrooks Davis     lutok::state state;
500*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_userdata(-1));
501*c697fb7fSBrooks Davis }
502*c697fb7fSBrooks Davis 
503*c697fb7fSBrooks Davis 
504*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_userdata__ok);
ATF_TEST_CASE_BODY(is_userdata__ok)505*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(is_userdata__ok)
506*c697fb7fSBrooks Davis {
507*c697fb7fSBrooks Davis     lutok::state state;
508*c697fb7fSBrooks Davis 
509*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foo");
510*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_userdata(-1));
511*c697fb7fSBrooks Davis     lua_newuserdata(raw(state), 543);
512*c697fb7fSBrooks Davis     ATF_REQUIRE(state.is_userdata(-1));
513*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.is_userdata(-2));
514*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
515*c697fb7fSBrooks Davis }
516*c697fb7fSBrooks Davis 
517*c697fb7fSBrooks Davis 
518*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(load_file__ok);
ATF_TEST_CASE_BODY(load_file__ok)519*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(load_file__ok)
520*c697fb7fSBrooks Davis {
521*c697fb7fSBrooks Davis     std::ofstream output("test.lua");
522*c697fb7fSBrooks Davis     output << "in_the_file = \"oh yes\"\n";
523*c697fb7fSBrooks Davis     output.close();
524*c697fb7fSBrooks Davis 
525*c697fb7fSBrooks Davis     lutok::state state;
526*c697fb7fSBrooks Davis     state.load_file("test.lua");
527*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_pcall(raw(state), 0, 0, 0) == 0);
528*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "in_the_file");
529*c697fb7fSBrooks Davis     ATF_REQUIRE(std::strcmp("oh yes", lua_tostring(raw(state), -1)) == 0);
530*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
531*c697fb7fSBrooks Davis }
532*c697fb7fSBrooks Davis 
533*c697fb7fSBrooks Davis 
534*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(load_file__api_error);
ATF_TEST_CASE_BODY(load_file__api_error)535*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(load_file__api_error)
536*c697fb7fSBrooks Davis {
537*c697fb7fSBrooks Davis     std::ofstream output("test.lua");
538*c697fb7fSBrooks Davis     output << "I have a bad syntax!  Wohoo!\n";
539*c697fb7fSBrooks Davis     output.close();
540*c697fb7fSBrooks Davis 
541*c697fb7fSBrooks Davis     lutok::state state;
542*c697fb7fSBrooks Davis     REQUIRE_API_ERROR("luaL_loadfile", state.load_file("test.lua"));
543*c697fb7fSBrooks Davis }
544*c697fb7fSBrooks Davis 
545*c697fb7fSBrooks Davis 
546*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(load_file__file_not_found_error);
ATF_TEST_CASE_BODY(load_file__file_not_found_error)547*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(load_file__file_not_found_error)
548*c697fb7fSBrooks Davis {
549*c697fb7fSBrooks Davis     lutok::state state;
550*c697fb7fSBrooks Davis     ATF_REQUIRE_THROW_RE(lutok::file_not_found_error, "missing.lua",
551*c697fb7fSBrooks Davis                          state.load_file("missing.lua"));
552*c697fb7fSBrooks Davis }
553*c697fb7fSBrooks Davis 
554*c697fb7fSBrooks Davis 
555*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(load_string__ok);
ATF_TEST_CASE_BODY(load_string__ok)556*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(load_string__ok)
557*c697fb7fSBrooks Davis {
558*c697fb7fSBrooks Davis     lutok::state state;
559*c697fb7fSBrooks Davis     state.load_string("return 2 + 3");
560*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_pcall(raw(state), 0, 1, 0) == 0);
561*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(5, lua_tointeger(raw(state), -1));
562*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
563*c697fb7fSBrooks Davis }
564*c697fb7fSBrooks Davis 
565*c697fb7fSBrooks Davis 
566*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(load_string__fail);
ATF_TEST_CASE_BODY(load_string__fail)567*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(load_string__fail)
568*c697fb7fSBrooks Davis {
569*c697fb7fSBrooks Davis     lutok::state state;
570*c697fb7fSBrooks Davis     REQUIRE_API_ERROR("luaL_loadstring", state.load_string("-"));
571*c697fb7fSBrooks Davis }
572*c697fb7fSBrooks Davis 
573*c697fb7fSBrooks Davis 
574*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(new_table);
ATF_TEST_CASE_BODY(new_table)575*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(new_table)
576*c697fb7fSBrooks Davis {
577*c697fb7fSBrooks Davis     lutok::state state;
578*c697fb7fSBrooks Davis     state.new_table();
579*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
580*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_istable(raw(state), -1));
581*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
582*c697fb7fSBrooks Davis }
583*c697fb7fSBrooks Davis 
584*c697fb7fSBrooks Davis 
585*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(new_userdata);
ATF_TEST_CASE_BODY(new_userdata)586*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(new_userdata)
587*c697fb7fSBrooks Davis {
588*c697fb7fSBrooks Davis     lutok::state state;
589*c697fb7fSBrooks Davis     int* pointer = state.new_userdata< int >();
590*c697fb7fSBrooks Davis     *pointer = 1234;
591*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
592*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isuserdata(raw(state), -1));
593*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
594*c697fb7fSBrooks Davis }
595*c697fb7fSBrooks Davis 
596*c697fb7fSBrooks Davis 
597*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(next__empty);
ATF_TEST_CASE_BODY(next__empty)598*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(next__empty)
599*c697fb7fSBrooks Davis {
600*c697fb7fSBrooks Davis     lutok::state state;
601*c697fb7fSBrooks Davis     luaL_dostring(raw(state), "t = {}");
602*c697fb7fSBrooks Davis 
603*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
604*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "this is a dummy value");
605*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
606*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.next(-3));
607*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
608*c697fb7fSBrooks Davis }
609*c697fb7fSBrooks Davis 
610*c697fb7fSBrooks Davis 
611*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(next__many);
ATF_TEST_CASE_BODY(next__many)612*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(next__many)
613*c697fb7fSBrooks Davis {
614*c697fb7fSBrooks Davis     lutok::state state;
615*c697fb7fSBrooks Davis     luaL_dostring(raw(state), "t = {}; t[1] = 100; t[2] = 200");
616*c697fb7fSBrooks Davis 
617*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
618*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
619*c697fb7fSBrooks Davis 
620*c697fb7fSBrooks Davis     ATF_REQUIRE(state.next(-2));
621*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(3, lua_gettop(raw(state)));
622*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -2));
623*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_tointeger(raw(state), -2));
624*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
625*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(100, lua_tointeger(raw(state), -1));
626*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
627*c697fb7fSBrooks Davis 
628*c697fb7fSBrooks Davis     ATF_REQUIRE(state.next(-2));
629*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(3, lua_gettop(raw(state)));
630*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -2));
631*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_tointeger(raw(state), -2));
632*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
633*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(200, lua_tointeger(raw(state), -1));
634*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
635*c697fb7fSBrooks Davis 
636*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.next(-2));
637*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
638*c697fb7fSBrooks Davis }
639*c697fb7fSBrooks Davis 
640*c697fb7fSBrooks Davis 
641*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(open_base);
ATF_TEST_CASE_BODY(open_base)642*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(open_base)
643*c697fb7fSBrooks Davis {
644*c697fb7fSBrooks Davis     lutok::state state;
645*c697fb7fSBrooks Davis     check_modules(state, "");
646*c697fb7fSBrooks Davis     state.open_base();
647*c697fb7fSBrooks Davis     check_modules(state, "base");
648*c697fb7fSBrooks Davis }
649*c697fb7fSBrooks Davis 
650*c697fb7fSBrooks Davis 
651*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(open_all);
ATF_TEST_CASE_BODY(open_all)652*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(open_all)
653*c697fb7fSBrooks Davis {
654*c697fb7fSBrooks Davis     lutok::state state;
655*c697fb7fSBrooks Davis     check_modules(state, "");
656*c697fb7fSBrooks Davis     state.open_all();
657*c697fb7fSBrooks Davis     // Best-effort attempt at looking for a bunch of possible modules.
658*c697fb7fSBrooks Davis     ATF_REQUIRE(is_available(state, "assert"));
659*c697fb7fSBrooks Davis     ATF_REQUIRE(is_available(state, "debug.getinfo"));
660*c697fb7fSBrooks Davis     ATF_REQUIRE(is_available(state, "package.path"));
661*c697fb7fSBrooks Davis     ATF_REQUIRE(is_available(state, "string.byte"));
662*c697fb7fSBrooks Davis     ATF_REQUIRE(is_available(state, "table.concat"));
663*c697fb7fSBrooks Davis }
664*c697fb7fSBrooks Davis 
665*c697fb7fSBrooks Davis 
666*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(open_string);
ATF_TEST_CASE_BODY(open_string)667*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(open_string)
668*c697fb7fSBrooks Davis {
669*c697fb7fSBrooks Davis     lutok::state state;
670*c697fb7fSBrooks Davis     check_modules(state, "");
671*c697fb7fSBrooks Davis     state.open_string();
672*c697fb7fSBrooks Davis     check_modules(state, "string");
673*c697fb7fSBrooks Davis }
674*c697fb7fSBrooks Davis 
675*c697fb7fSBrooks Davis 
676*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(open_table);
ATF_TEST_CASE_BODY(open_table)677*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(open_table)
678*c697fb7fSBrooks Davis {
679*c697fb7fSBrooks Davis     lutok::state state;
680*c697fb7fSBrooks Davis     check_modules(state, "");
681*c697fb7fSBrooks Davis     state.open_table();
682*c697fb7fSBrooks Davis     check_modules(state, "table");
683*c697fb7fSBrooks Davis }
684*c697fb7fSBrooks Davis 
685*c697fb7fSBrooks Davis 
686*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(pcall__ok);
ATF_TEST_CASE_BODY(pcall__ok)687*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(pcall__ok)
688*c697fb7fSBrooks Davis {
689*c697fb7fSBrooks Davis     lutok::state state;
690*c697fb7fSBrooks Davis     luaL_loadstring(raw(state), "function mul(a, b) return a * b; end");
691*c697fb7fSBrooks Davis     state.pcall(0, 0, 0);
692*c697fb7fSBrooks Davis     state.get_global_table();
693*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "mul");
694*c697fb7fSBrooks Davis     lua_gettable(raw(state), -2);
695*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 3);
696*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 5);
697*c697fb7fSBrooks Davis     state.pcall(2, 1, 0);
698*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(15, lua_tointeger(raw(state), -1));
699*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
700*c697fb7fSBrooks Davis }
701*c697fb7fSBrooks Davis 
702*c697fb7fSBrooks Davis 
703*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(pcall__fail);
ATF_TEST_CASE_BODY(pcall__fail)704*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(pcall__fail)
705*c697fb7fSBrooks Davis {
706*c697fb7fSBrooks Davis     lutok::state state;
707*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
708*c697fb7fSBrooks Davis     REQUIRE_API_ERROR("lua_pcall", state.pcall(0, 0, 0));
709*c697fb7fSBrooks Davis }
710*c697fb7fSBrooks Davis 
711*c697fb7fSBrooks Davis 
712*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(pop__one);
ATF_TEST_CASE_BODY(pop__one)713*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(pop__one)
714*c697fb7fSBrooks Davis {
715*c697fb7fSBrooks Davis     lutok::state state;
716*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 10);
717*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 20);
718*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 30);
719*c697fb7fSBrooks Davis     state.pop(1);
720*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_gettop(raw(state)));
721*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(20, lua_tointeger(raw(state), -1));
722*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
723*c697fb7fSBrooks Davis }
724*c697fb7fSBrooks Davis 
725*c697fb7fSBrooks Davis 
726*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(pop__many);
ATF_TEST_CASE_BODY(pop__many)727*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(pop__many)
728*c697fb7fSBrooks Davis {
729*c697fb7fSBrooks Davis     lutok::state state;
730*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 10);
731*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 20);
732*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 30);
733*c697fb7fSBrooks Davis     state.pop(2);
734*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
735*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(10, lua_tointeger(raw(state), -1));
736*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
737*c697fb7fSBrooks Davis }
738*c697fb7fSBrooks Davis 
739*c697fb7fSBrooks Davis 
740*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_boolean);
ATF_TEST_CASE_BODY(push_boolean)741*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_boolean)
742*c697fb7fSBrooks Davis {
743*c697fb7fSBrooks Davis     lutok::state state;
744*c697fb7fSBrooks Davis     state.push_boolean(true);
745*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
746*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_toboolean(raw(state), -1));
747*c697fb7fSBrooks Davis     state.push_boolean(false);
748*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_gettop(raw(state)));
749*c697fb7fSBrooks Davis     ATF_REQUIRE(!lua_toboolean(raw(state), -1));
750*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_toboolean(raw(state), -2));
751*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
752*c697fb7fSBrooks Davis }
753*c697fb7fSBrooks Davis 
754*c697fb7fSBrooks Davis 
755*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_closure);
ATF_TEST_CASE_BODY(push_cxx_closure)756*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_cxx_closure)
757*c697fb7fSBrooks Davis {
758*c697fb7fSBrooks Davis     lutok::state state;
759*c697fb7fSBrooks Davis     state.push_integer(15);
760*c697fb7fSBrooks Davis     state.push_cxx_closure(cxx_multiply_closure, 1);
761*c697fb7fSBrooks Davis     lua_setglobal(raw(state), "cxx_multiply_closure");
762*c697fb7fSBrooks Davis 
763*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state),
764*c697fb7fSBrooks Davis                               "return cxx_multiply_closure(10)") == 0);
765*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(150, lua_tointeger(raw(state), -1));
766*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
767*c697fb7fSBrooks Davis }
768*c697fb7fSBrooks Davis 
769*c697fb7fSBrooks Davis 
770*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__ok);
ATF_TEST_CASE_BODY(push_cxx_function__ok)771*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_cxx_function__ok)
772*c697fb7fSBrooks Davis {
773*c697fb7fSBrooks Davis     lutok::state state;
774*c697fb7fSBrooks Davis     state.push_cxx_function(cxx_divide);
775*c697fb7fSBrooks Davis     lua_setglobal(raw(state), "cxx_divide");
776*c697fb7fSBrooks Davis 
777*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return cxx_divide(17, 3)") == 0);
778*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(5, lua_tointeger(raw(state), -2));
779*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_tointeger(raw(state), -1));
780*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
781*c697fb7fSBrooks Davis }
782*c697fb7fSBrooks Davis 
783*c697fb7fSBrooks Davis 
784*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__fail_exception);
ATF_TEST_CASE_BODY(push_cxx_function__fail_exception)785*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_cxx_function__fail_exception)
786*c697fb7fSBrooks Davis {
787*c697fb7fSBrooks Davis     lutok::state state;
788*c697fb7fSBrooks Davis     state.push_cxx_function(cxx_divide);
789*c697fb7fSBrooks Davis     lua_setglobal(raw(state), "cxx_divide");
790*c697fb7fSBrooks Davis 
791*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return cxx_divide(15, 0)") != 0);
792*c697fb7fSBrooks Davis     ATF_REQUIRE_MATCH("Divisor is 0", lua_tostring(raw(state), -1));
793*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
794*c697fb7fSBrooks Davis }
795*c697fb7fSBrooks Davis 
796*c697fb7fSBrooks Davis 
797*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__fail_anything);
ATF_TEST_CASE_BODY(push_cxx_function__fail_anything)798*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_cxx_function__fail_anything)
799*c697fb7fSBrooks Davis {
800*c697fb7fSBrooks Davis     lutok::state state;
801*c697fb7fSBrooks Davis     state.push_cxx_function(cxx_divide);
802*c697fb7fSBrooks Davis     lua_setglobal(raw(state), "cxx_divide");
803*c697fb7fSBrooks Davis 
804*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return cxx_divide(-3, -1)") != 0);
805*c697fb7fSBrooks Davis     ATF_REQUIRE_MATCH("Unhandled exception", lua_tostring(raw(state), -1));
806*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
807*c697fb7fSBrooks Davis }
808*c697fb7fSBrooks Davis 
809*c697fb7fSBrooks Davis 
810*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__fail_overflow);
ATF_TEST_CASE_BODY(push_cxx_function__fail_overflow)811*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_cxx_function__fail_overflow)
812*c697fb7fSBrooks Davis {
813*c697fb7fSBrooks Davis     lutok::state state;
814*c697fb7fSBrooks Davis     state.push_cxx_function(raise_long_error);
815*c697fb7fSBrooks Davis     lua_setglobal(raw(state), "fail");
816*c697fb7fSBrooks Davis 
817*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return fail(900)") != 0);
818*c697fb7fSBrooks Davis     ATF_REQUIRE_MATCH(std::string(900, 'A'), lua_tostring(raw(state), -1));
819*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
820*c697fb7fSBrooks Davis 
821*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return fail(8192)") != 0);
822*c697fb7fSBrooks Davis     ATF_REQUIRE_MATCH(std::string(900, 'A'), lua_tostring(raw(state), -1));
823*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
824*c697fb7fSBrooks Davis }
825*c697fb7fSBrooks Davis 
826*c697fb7fSBrooks Davis 
827*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_integer);
ATF_TEST_CASE_BODY(push_integer)828*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_integer)
829*c697fb7fSBrooks Davis {
830*c697fb7fSBrooks Davis     lutok::state state;
831*c697fb7fSBrooks Davis     state.push_integer(12);
832*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
833*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(12, lua_tointeger(raw(state), -1));
834*c697fb7fSBrooks Davis     state.push_integer(34);
835*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_gettop(raw(state)));
836*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(34, lua_tointeger(raw(state), -1));
837*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(12, lua_tointeger(raw(state), -2));
838*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
839*c697fb7fSBrooks Davis }
840*c697fb7fSBrooks Davis 
841*c697fb7fSBrooks Davis 
842*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_nil);
ATF_TEST_CASE_BODY(push_nil)843*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_nil)
844*c697fb7fSBrooks Davis {
845*c697fb7fSBrooks Davis     lutok::state state;
846*c697fb7fSBrooks Davis     state.push_nil();
847*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
848*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnil(raw(state), -1));
849*c697fb7fSBrooks Davis     state.push_integer(34);
850*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_gettop(raw(state)));
851*c697fb7fSBrooks Davis     ATF_REQUIRE(!lua_isnil(raw(state), -1));
852*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnil(raw(state), -2));
853*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
854*c697fb7fSBrooks Davis }
855*c697fb7fSBrooks Davis 
856*c697fb7fSBrooks Davis 
857*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_string);
ATF_TEST_CASE_BODY(push_string)858*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_string)
859*c697fb7fSBrooks Davis {
860*c697fb7fSBrooks Davis     lutok::state state;
861*c697fb7fSBrooks Davis 
862*c697fb7fSBrooks Davis     {
863*c697fb7fSBrooks Davis         std::string str = "first";
864*c697fb7fSBrooks Davis         state.push_string(str);
865*c697fb7fSBrooks Davis         ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
866*c697fb7fSBrooks Davis         ATF_REQUIRE_EQ(std::string("first"), lua_tostring(raw(state), -1));
867*c697fb7fSBrooks Davis         str = "second";
868*c697fb7fSBrooks Davis         state.push_string(str);
869*c697fb7fSBrooks Davis     }
870*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(2, lua_gettop(raw(state)));
871*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(std::string("second"), lua_tostring(raw(state), -1));
872*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(std::string("first"), lua_tostring(raw(state), -2));
873*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
874*c697fb7fSBrooks Davis }
875*c697fb7fSBrooks Davis 
876*c697fb7fSBrooks Davis 
877*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_value);
ATF_TEST_CASE_BODY(push_value)878*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(push_value)
879*c697fb7fSBrooks Davis {
880*c697fb7fSBrooks Davis     lutok::state state;
881*c697fb7fSBrooks Davis 
882*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 10);
883*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 20);
884*c697fb7fSBrooks Davis     state.push_value(-2);
885*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(3, lua_gettop(raw(state)));
886*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(10, lua_tointeger(raw(state), -1));
887*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(20, lua_tointeger(raw(state), -2));
888*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(10, lua_tointeger(raw(state), -3));
889*c697fb7fSBrooks Davis     lua_pop(raw(state), 3);
890*c697fb7fSBrooks Davis }
891*c697fb7fSBrooks Davis 
892*c697fb7fSBrooks Davis 
893*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(raw_get);
ATF_TEST_CASE_BODY(raw_get)894*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(raw_get)
895*c697fb7fSBrooks Davis {
896*c697fb7fSBrooks Davis     lutok::state state;
897*c697fb7fSBrooks Davis 
898*c697fb7fSBrooks Davis     luaL_openlibs(raw(state));
899*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(
900*c697fb7fSBrooks Davis         raw(state), "t = {foo=123} ; setmetatable(t, {__index=1})") == 0);
901*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
902*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 9876);
903*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foo");
904*c697fb7fSBrooks Davis     state.raw_get(-3);
905*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
906*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(123, lua_tointeger(raw(state), -1));
907*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(9876, lua_tointeger(raw(state), -2));
908*c697fb7fSBrooks Davis     lua_pop(raw(state), 3);
909*c697fb7fSBrooks Davis }
910*c697fb7fSBrooks Davis 
911*c697fb7fSBrooks Davis 
912*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(raw_set);
ATF_TEST_CASE_BODY(raw_set)913*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(raw_set)
914*c697fb7fSBrooks Davis {
915*c697fb7fSBrooks Davis     lutok::state state;
916*c697fb7fSBrooks Davis 
917*c697fb7fSBrooks Davis     luaL_openlibs(raw(state));
918*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(
919*c697fb7fSBrooks Davis         raw(state), "t = {} ; setmetatable(t, {__newindex=1})") == 0);
920*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
921*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 876);
922*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foo");
923*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 345);
924*c697fb7fSBrooks Davis     state.raw_set(-4);
925*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return t.foo") == 0);
926*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
927*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(345, lua_tointeger(raw(state), -1));
928*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(876, lua_tointeger(raw(state), -2));
929*c697fb7fSBrooks Davis     lua_pop(raw(state), 3);
930*c697fb7fSBrooks Davis }
931*c697fb7fSBrooks Davis 
932*c697fb7fSBrooks Davis 
933*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(registry_index);
ATF_TEST_CASE_BODY(registry_index)934*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(registry_index)
935*c697fb7fSBrooks Davis {
936*c697fb7fSBrooks Davis     lutok::state state;
937*c697fb7fSBrooks Davis     lua_pushvalue(raw(state), lutok::registry_index);
938*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "custom_variable");
939*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "custom value");
940*c697fb7fSBrooks Davis     lua_settable(raw(state), -3);
941*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
942*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state),
943*c697fb7fSBrooks Davis                               "return custom_variable == nil") == 0);
944*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isboolean(raw(state), -1));
945*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_toboolean(raw(state), -1));
946*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
947*c697fb7fSBrooks Davis }
948*c697fb7fSBrooks Davis 
949*c697fb7fSBrooks Davis 
950*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_global);
ATF_TEST_CASE_BODY(set_global)951*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(set_global)
952*c697fb7fSBrooks Davis {
953*c697fb7fSBrooks Davis     lutok::state state;
954*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 3);
955*c697fb7fSBrooks Davis     state.set_global("test_variable");
956*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return test_variable + 1") == 0);
957*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
958*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(4, lua_tointeger(raw(state), -1));
959*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
960*c697fb7fSBrooks Davis }
961*c697fb7fSBrooks Davis 
962*c697fb7fSBrooks Davis 
963*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_metatable);
ATF_TEST_CASE_BODY(set_metatable)964*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(set_metatable)
965*c697fb7fSBrooks Davis {
966*c697fb7fSBrooks Davis     lutok::state state;
967*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(
968*c697fb7fSBrooks Davis         raw(state),
969*c697fb7fSBrooks Davis         "mt = {}\n"
970*c697fb7fSBrooks Davis         "mt.__add = function(a, b) return a[1] + b end\n"
971*c697fb7fSBrooks Davis         "numbers = {}\n"
972*c697fb7fSBrooks Davis         "numbers[1] = 5\n") == 0);
973*c697fb7fSBrooks Davis 
974*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "numbers");
975*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 1234);
976*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "mt");
977*c697fb7fSBrooks Davis     state.set_metatable(-3);
978*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
979*c697fb7fSBrooks Davis 
980*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "return numbers + 2") == 0);
981*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
982*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(7, lua_tointeger(raw(state), -1));
983*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
984*c697fb7fSBrooks Davis }
985*c697fb7fSBrooks Davis 
986*c697fb7fSBrooks Davis 
987*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_table__ok);
ATF_TEST_CASE_BODY(set_table__ok)988*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(set_table__ok)
989*c697fb7fSBrooks Davis {
990*c697fb7fSBrooks Davis     lutok::state state;
991*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state), "t = { a = 1, bar = 234 }") == 0);
992*c697fb7fSBrooks Davis     lua_getglobal(raw(state), "t");
993*c697fb7fSBrooks Davis 
994*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "bar");
995*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "baz");
996*c697fb7fSBrooks Davis     state.set_table(-3);
997*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_gettop(raw(state)));
998*c697fb7fSBrooks Davis 
999*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "a");
1000*c697fb7fSBrooks Davis     lua_gettable(raw(state), -2);
1001*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isnumber(raw(state), -1));
1002*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(1, lua_tointeger(raw(state), -1));
1003*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
1004*c697fb7fSBrooks Davis 
1005*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "bar");
1006*c697fb7fSBrooks Davis     lua_gettable(raw(state), -2);
1007*c697fb7fSBrooks Davis     ATF_REQUIRE(lua_isstring(raw(state), -1));
1008*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(std::string("baz"), lua_tostring(raw(state), -1));
1009*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
1010*c697fb7fSBrooks Davis 
1011*c697fb7fSBrooks Davis     lua_pop(raw(state), 1);
1012*c697fb7fSBrooks Davis }
1013*c697fb7fSBrooks Davis 
1014*c697fb7fSBrooks Davis 
1015*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_table__nil);
ATF_TEST_CASE_BODY(set_table__nil)1016*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(set_table__nil)
1017*c697fb7fSBrooks Davis {
1018*c697fb7fSBrooks Davis     lutok::state state;
1019*c697fb7fSBrooks Davis     lua_pushnil(raw(state));
1020*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 1);
1021*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 2);
1022*c697fb7fSBrooks Davis     REQUIRE_API_ERROR("lua_settable", state.set_table(-3));
1023*c697fb7fSBrooks Davis     lua_pop(raw(state), 3);
1024*c697fb7fSBrooks Davis }
1025*c697fb7fSBrooks Davis 
1026*c697fb7fSBrooks Davis 
1027*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_boolean);
ATF_TEST_CASE_BODY(to_boolean)1028*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(to_boolean)
1029*c697fb7fSBrooks Davis {
1030*c697fb7fSBrooks Davis     lutok::state state;
1031*c697fb7fSBrooks Davis     lua_pushboolean(raw(state), 0);
1032*c697fb7fSBrooks Davis     lua_pushboolean(raw(state), 1);
1033*c697fb7fSBrooks Davis     ATF_REQUIRE(!state.to_boolean(-2));
1034*c697fb7fSBrooks Davis     ATF_REQUIRE(state.to_boolean(-1));
1035*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
1036*c697fb7fSBrooks Davis }
1037*c697fb7fSBrooks Davis 
1038*c697fb7fSBrooks Davis 
1039*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_integer);
ATF_TEST_CASE_BODY(to_integer)1040*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(to_integer)
1041*c697fb7fSBrooks Davis {
1042*c697fb7fSBrooks Davis     lutok::state state;
1043*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 12);
1044*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foobar");
1045*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(12, state.to_integer(-2));
1046*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
1047*c697fb7fSBrooks Davis }
1048*c697fb7fSBrooks Davis 
1049*c697fb7fSBrooks Davis 
1050*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_string);
ATF_TEST_CASE_BODY(to_string)1051*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(to_string)
1052*c697fb7fSBrooks Davis {
1053*c697fb7fSBrooks Davis     lutok::state state;
1054*c697fb7fSBrooks Davis     lua_pushstring(raw(state), "foobar");
1055*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 12);
1056*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ("foobar", state.to_string(-2));
1057*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ("12", state.to_string(-1));
1058*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
1059*c697fb7fSBrooks Davis }
1060*c697fb7fSBrooks Davis 
1061*c697fb7fSBrooks Davis 
1062*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(to_userdata);
ATF_TEST_CASE_BODY(to_userdata)1063*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(to_userdata)
1064*c697fb7fSBrooks Davis {
1065*c697fb7fSBrooks Davis     lutok::state state;
1066*c697fb7fSBrooks Davis     {
1067*c697fb7fSBrooks Davis         int* pointer = static_cast< int* >(
1068*c697fb7fSBrooks Davis             lua_newuserdata(raw(state), sizeof(int)));
1069*c697fb7fSBrooks Davis         *pointer = 987;
1070*c697fb7fSBrooks Davis     }
1071*c697fb7fSBrooks Davis 
1072*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 3);
1073*c697fb7fSBrooks Davis     int* pointer = state.to_userdata< int >(-2);
1074*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(987, *pointer);
1075*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
1076*c697fb7fSBrooks Davis }
1077*c697fb7fSBrooks Davis 
1078*c697fb7fSBrooks Davis 
1079*c697fb7fSBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(upvalue_index);
ATF_TEST_CASE_BODY(upvalue_index)1080*c697fb7fSBrooks Davis ATF_TEST_CASE_BODY(upvalue_index)
1081*c697fb7fSBrooks Davis {
1082*c697fb7fSBrooks Davis     lutok::state state;
1083*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 25);
1084*c697fb7fSBrooks Davis     lua_pushinteger(raw(state), 30);
1085*c697fb7fSBrooks Davis     lua_pushcclosure(raw(state), c_get_upvalues, 2);
1086*c697fb7fSBrooks Davis     lua_setglobal(raw(state), "c_get_upvalues");
1087*c697fb7fSBrooks Davis 
1088*c697fb7fSBrooks Davis     ATF_REQUIRE(luaL_dostring(raw(state),
1089*c697fb7fSBrooks Davis                               "return c_get_upvalues()") == 0);
1090*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(25, lua_tointeger(raw(state), -2));
1091*c697fb7fSBrooks Davis     ATF_REQUIRE_EQ(30, lua_tointeger(raw(state), -1));
1092*c697fb7fSBrooks Davis     lua_pop(raw(state), 2);
1093*c697fb7fSBrooks Davis }
1094*c697fb7fSBrooks Davis 
1095*c697fb7fSBrooks Davis 
ATF_INIT_TEST_CASES(tcs)1096*c697fb7fSBrooks Davis ATF_INIT_TEST_CASES(tcs)
1097*c697fb7fSBrooks Davis {
1098*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, close);
1099*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_global__ok);
1100*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_global__undefined);
1101*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_global_table);
1102*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_metafield__ok);
1103*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_metafield__undefined);
1104*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_metatable__ok);
1105*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_metatable__undefined);
1106*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_table__ok);
1107*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_table__nil);
1108*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_table__unknown_index);
1109*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, get_top);
1110*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, insert);
1111*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_boolean__empty);
1112*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_boolean__ok);
1113*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_function__empty);
1114*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_function__ok);
1115*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_nil__empty);
1116*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_nil__ok);
1117*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_number__empty);
1118*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_number__ok);
1119*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_string__empty);
1120*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_string__ok);
1121*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_table__empty);
1122*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_table__ok);
1123*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_userdata__empty);
1124*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, is_userdata__ok);
1125*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, load_file__ok);
1126*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, load_file__api_error);
1127*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, load_file__file_not_found_error);
1128*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, load_string__ok);
1129*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, load_string__fail);
1130*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, new_table);
1131*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, new_userdata);
1132*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, next__empty);
1133*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, next__many);
1134*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, open_all);
1135*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, open_base);
1136*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, open_string);
1137*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, open_table);
1138*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, pcall__ok);
1139*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, pcall__fail);
1140*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, pop__one);
1141*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, pop__many);
1142*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_boolean);
1143*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_cxx_closure);
1144*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_cxx_function__ok);
1145*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_cxx_function__fail_exception);
1146*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_cxx_function__fail_anything);
1147*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_cxx_function__fail_overflow);
1148*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_integer);
1149*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_nil);
1150*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_string);
1151*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, push_value);
1152*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, raw_get);
1153*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, raw_set);
1154*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, registry_index);
1155*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, set_global);
1156*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, set_metatable);
1157*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, set_table__ok);
1158*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, set_table__nil);
1159*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_boolean);
1160*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_integer);
1161*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_string);
1162*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, to_userdata);
1163*c697fb7fSBrooks Davis     ATF_ADD_TEST_CASE(tcs, upvalue_index);
1164*c697fb7fSBrooks Davis }
1165