1 // Copyright 2011 Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above copyright 11 // notice, this list of conditions and the following disclaimer in the 12 // documentation and/or other materials provided with the distribution. 13 // * Neither the name of Google Inc. nor the names of its contributors 14 // may be used to endorse or promote products derived from this software 15 // without specific prior written permission. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 #include "state.ipp" 30 31 #include <cstring> 32 #include <fstream> 33 #include <iostream> 34 #include <stdexcept> 35 36 #include <atf-c++.hpp> 37 #include <lua.hpp> 38 39 #include "c_gate.hpp" 40 #include "exceptions.hpp" 41 #include "test_utils.hpp" 42 43 44 // A note about the lutok::state tests. 45 // 46 // The methods of lutok::state are, in general, thin wrappers around the 47 // corresponding Lua C API methods. The tests below are simple unit tests that 48 // ensure that these functions just delegate the calls to the Lua library. We 49 // do not intend to test the validity of the methods themselves (that's the 50 // job of the Lua authors). That said, we test those conditions we rely on, 51 // such as the reporting of errors and the default values to the API. 52 // 53 // Lastly, for every test case that stresses a single lutok::state method, we 54 // only call that method directly. All other Lua state manipulation operations 55 // are performed by means of direct calls to the Lua C API. This is to ensure 56 // that the wrapped methods are really talking to Lua. 57 58 59 namespace { 60 61 62 /// Checks if a symbol is available. 63 /// 64 /// \param state The Lua state. 65 /// \param symbol The symbol to check for. 66 /// 67 /// \return True if the symbol is defined, false otherwise. 68 static bool 69 is_available(lutok::state& state, const char* symbol) 70 { 71 luaL_loadstring(raw(state), (std::string("return ") + symbol).c_str()); 72 const bool ok = (lua_pcall(raw(state), 0, 1, 0) == 0 && 73 !lua_isnil(raw(state), -1)); 74 lua_pop(raw(state), 1); 75 std::cout << "Symbol " << symbol << (ok ? " found\n" : " not found\n"); 76 return ok; 77 } 78 79 80 /// Checks that no modules are present or that only one has been loaded. 81 /// 82 /// \post The test case terminates if there is any module present when expected 83 /// is empty or if there two modules loaded when expected is defined. 84 /// 85 /// \param state The Lua state. 86 /// \param expected The module to expect. Empty if no modules are allowed. 87 static void 88 check_modules(lutok::state& state, const std::string& expected) 89 { 90 std::cout << "Checking loaded modules" << 91 (expected.empty() ? "" : (" (" + expected + " expected)")) << "\n"; 92 ATF_REQUIRE(!((expected == "base") ^ (is_available(state, "assert")))); 93 ATF_REQUIRE(!((expected == "string") ^ 94 (is_available(state, "string.byte")))); 95 ATF_REQUIRE(!((expected == "table") ^ 96 (is_available(state, "table.concat")))); 97 } 98 99 100 /// A C closure that returns its two integral upvalues. 101 /// 102 /// \post stack(-2) contains the first upvalue. 103 /// \post stack(-1) contains the second upvalue. 104 /// 105 /// \param raw_state The raw Lua state. 106 /// 107 /// \return The number of result values, i.e. 2. 108 static int 109 c_get_upvalues(lua_State* raw_state) 110 { 111 lutok::state state = lutok::state_c_gate::connect(raw_state); 112 const int i1 = lua_tointeger(raw_state, state.upvalue_index(1)); 113 const int i2 = lua_tointeger(raw_state, state.upvalue_index(2)); 114 lua_pushinteger(raw_state, i1); 115 lua_pushinteger(raw_state, i2); 116 return 2; 117 } 118 119 120 /// A custom C++ multiply function with one of its factors on its closure. 121 /// 122 /// \pre stack(-1) contains the second factor. 123 /// \post stack(-1) contains the product of the two input factors. 124 /// 125 /// \param state The Lua state. 126 /// 127 /// \return The number of result values, i.e. 1. 128 static int 129 cxx_multiply_closure(lutok::state& state) 130 { 131 const int f1 = lua_tointeger(raw(state), lua_upvalueindex(1)); 132 const int f2 = lua_tointeger(raw(state), -1); 133 lua_pushinteger(raw(state), f1 * f2); 134 return 1; 135 } 136 137 138 /// A custom C++ integral division function for Lua. 139 /// 140 /// \pre stack(-2) contains the dividend. 141 /// \pre stack(-1) contains the divisor. 142 /// \post stack(-2) contains the quotient of the division. 143 /// \post stack(-1) contains the remainder of the division. 144 /// 145 /// \param state The Lua state. 146 /// 147 /// \return The number of result values, i.e. 1. 148 /// 149 /// \throw std::runtime_error If the divisor is zero. 150 /// \throw std::string If the dividend or the divisor are negative. This is an 151 /// exception not derived from std::exception on purpose to ensure that the 152 /// C++ wrapping correctly captures any exception regardless of its type. 153 static int 154 cxx_divide(lutok::state& state) 155 { 156 const int dividend = state.to_integer(-2); 157 const int divisor = state.to_integer(-1); 158 if (divisor == 0) 159 throw std::runtime_error("Divisor is 0"); 160 if (dividend < 0 || divisor < 0) 161 throw std::string("Cannot divide negative numbers"); 162 state.push_integer(dividend / divisor); 163 state.push_integer(dividend % divisor); 164 return 2; 165 } 166 167 168 /// A Lua function that raises a very long error message. 169 /// 170 /// \pre stack(-1) contains the length of the message to construct. 171 /// 172 /// \param state The Lua state. 173 /// 174 /// \return Never returns. 175 /// 176 /// \throw std::runtime_error Unconditionally, with an error message formed by 177 /// the repetition of 'A' as many times as requested. 178 static int 179 raise_long_error(lutok::state& state) 180 { 181 const int length = state.to_integer(); 182 throw std::runtime_error(std::string(length, 'A').c_str()); 183 } 184 185 186 } // anonymous namespace 187 188 189 ATF_TEST_CASE_WITHOUT_HEAD(close); 190 ATF_TEST_CASE_BODY(close) 191 { 192 lutok::state state; 193 state.close(); 194 // The destructor for state will run now. If it does a second close, we may 195 // crash, so let's see if we don't. 196 } 197 198 199 ATF_TEST_CASE_WITHOUT_HEAD(get_global__ok); 200 ATF_TEST_CASE_BODY(get_global__ok) 201 { 202 lutok::state state; 203 ATF_REQUIRE(luaL_dostring(raw(state), "test_variable = 3") == 0); 204 state.get_global("test_variable"); 205 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 206 lua_pop(raw(state), 1); 207 } 208 209 210 ATF_TEST_CASE_WITHOUT_HEAD(get_global__undefined); 211 ATF_TEST_CASE_BODY(get_global__undefined) 212 { 213 lutok::state state; 214 state.get_global("test_variable"); 215 ATF_REQUIRE(lua_isnil(raw(state), -1)); 216 lua_pop(raw(state), 1); 217 } 218 219 220 ATF_TEST_CASE_WITHOUT_HEAD(get_global_table); 221 ATF_TEST_CASE_BODY(get_global_table) 222 { 223 lutok::state state; 224 ATF_REQUIRE(luaL_dostring(raw(state), "global_variable = 'hello'") == 0); 225 state.get_global_table(); 226 lua_pushstring(raw(state), "global_variable"); 227 lua_gettable(raw(state), -2); 228 ATF_REQUIRE(lua_isstring(raw(state), -1)); 229 ATF_REQUIRE(std::strcmp("hello", lua_tostring(raw(state), -1)) == 0); 230 lua_pop(raw(state), 2); 231 } 232 233 234 ATF_TEST_CASE_WITHOUT_HEAD(get_metafield__ok); 235 ATF_TEST_CASE_BODY(get_metafield__ok) 236 { 237 lutok::state state; 238 luaL_openlibs(raw(state)); 239 ATF_REQUIRE(luaL_dostring(raw(state), "meta = { foo = 567 }; " 240 "t = {}; setmetatable(t, meta)") == 0); 241 lua_getglobal(raw(state), "t"); 242 ATF_REQUIRE(state.get_metafield(-1, "foo")); 243 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 244 ATF_REQUIRE_EQ(567, lua_tointeger(raw(state), -1)); 245 lua_pop(raw(state), 2); 246 } 247 248 249 ATF_TEST_CASE_WITHOUT_HEAD(get_metafield__undefined); 250 ATF_TEST_CASE_BODY(get_metafield__undefined) 251 { 252 lutok::state state; 253 luaL_openlibs(raw(state)); 254 ATF_REQUIRE(luaL_dostring(raw(state), "meta = { foo = 567 }; " 255 "t = {}; setmetatable(t, meta)") == 0); 256 lua_getglobal(raw(state), "t"); 257 ATF_REQUIRE(!state.get_metafield(-1, "bar")); 258 lua_pop(raw(state), 1); 259 } 260 261 262 ATF_TEST_CASE_WITHOUT_HEAD(get_metatable__top); 263 ATF_TEST_CASE_BODY(get_metatable__top) 264 { 265 lutok::state state; 266 luaL_openlibs(raw(state)); 267 ATF_REQUIRE(luaL_dostring(raw(state), "meta = { foo = 567 }; " 268 "t = {}; setmetatable(t, meta)") == 0); 269 lua_getglobal(raw(state), "t"); 270 ATF_REQUIRE(state.get_metatable()); 271 ATF_REQUIRE(lua_istable(raw(state), -1)); 272 lua_pushstring(raw(state), "foo"); 273 lua_gettable(raw(state), -2); 274 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 275 ATF_REQUIRE_EQ(567, lua_tointeger(raw(state), -1)); 276 lua_pop(raw(state), 3); 277 } 278 279 280 ATF_TEST_CASE_WITHOUT_HEAD(get_metatable__explicit); 281 ATF_TEST_CASE_BODY(get_metatable__explicit) 282 { 283 lutok::state state; 284 luaL_openlibs(raw(state)); 285 ATF_REQUIRE(luaL_dostring(raw(state), "meta = { foo = 567 }; " 286 "t = {}; setmetatable(t, meta)") == 0); 287 lua_getglobal(raw(state), "t"); 288 lua_pushinteger(raw(state), 5555); 289 ATF_REQUIRE(state.get_metatable(-2)); 290 ATF_REQUIRE(lua_istable(raw(state), -1)); 291 lua_pushstring(raw(state), "foo"); 292 lua_gettable(raw(state), -2); 293 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 294 ATF_REQUIRE_EQ(567, lua_tointeger(raw(state), -1)); 295 lua_pop(raw(state), 4); 296 } 297 298 299 ATF_TEST_CASE_WITHOUT_HEAD(get_metatable__undefined); 300 ATF_TEST_CASE_BODY(get_metatable__undefined) 301 { 302 lutok::state state; 303 ATF_REQUIRE(luaL_dostring(raw(state), "t = {}") == 0); 304 lua_getglobal(raw(state), "t"); 305 ATF_REQUIRE(!state.get_metatable(-1)); 306 lua_pop(raw(state), 1); 307 } 308 309 310 ATF_TEST_CASE_WITHOUT_HEAD(get_table__ok); 311 ATF_TEST_CASE_BODY(get_table__ok) 312 { 313 lutok::state state; 314 ATF_REQUIRE(luaL_dostring(raw(state), "t = { a = 1, bar = 234 }") == 0); 315 lua_getglobal(raw(state), "t"); 316 lua_pushstring(raw(state), "bar"); 317 state.get_table(); 318 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 319 ATF_REQUIRE_EQ(234, lua_tointeger(raw(state), -1)); 320 lua_pop(raw(state), 2); 321 } 322 323 324 ATF_TEST_CASE_WITHOUT_HEAD(get_table__nil); 325 ATF_TEST_CASE_BODY(get_table__nil) 326 { 327 lutok::state state; 328 lua_pushnil(raw(state)); 329 lua_pushinteger(raw(state), 1); 330 REQUIRE_API_ERROR("lua_gettable", state.get_table()); 331 ATF_REQUIRE_EQ(2, lua_gettop(raw(state))); 332 lua_pop(raw(state), 2); 333 } 334 335 336 ATF_TEST_CASE_WITHOUT_HEAD(get_table__unknown_index); 337 ATF_TEST_CASE_BODY(get_table__unknown_index) 338 { 339 lutok::state state; 340 ATF_REQUIRE(luaL_dostring(raw(state), 341 "the_table = { foo = 1, bar = 2 }") == 0); 342 lua_getglobal(raw(state), "the_table"); 343 lua_pushstring(raw(state), "baz"); 344 state.get_table(); 345 ATF_REQUIRE(lua_isnil(raw(state), -1)); 346 lua_pop(raw(state), 2); 347 } 348 349 350 ATF_TEST_CASE_WITHOUT_HEAD(get_top); 351 ATF_TEST_CASE_BODY(get_top) 352 { 353 lutok::state state; 354 ATF_REQUIRE_EQ(0, state.get_top()); 355 lua_pushinteger(raw(state), 3); 356 ATF_REQUIRE_EQ(1, state.get_top()); 357 lua_pushinteger(raw(state), 3); 358 ATF_REQUIRE_EQ(2, state.get_top()); 359 lua_pop(raw(state), 2); 360 } 361 362 363 ATF_TEST_CASE_WITHOUT_HEAD(insert); 364 ATF_TEST_CASE_BODY(insert) 365 { 366 lutok::state state; 367 lua_pushinteger(raw(state), 1); 368 lua_pushinteger(raw(state), 2); 369 lua_pushinteger(raw(state), 3); 370 lua_pushinteger(raw(state), 4); 371 state.insert(-3); 372 ATF_REQUIRE_EQ(3, lua_tointeger(raw(state), -1)); 373 ATF_REQUIRE_EQ(2, lua_tointeger(raw(state), -2)); 374 ATF_REQUIRE_EQ(4, lua_tointeger(raw(state), -3)); 375 ATF_REQUIRE_EQ(1, lua_tointeger(raw(state), -4)); 376 lua_pop(raw(state), 4); 377 } 378 379 380 ATF_TEST_CASE_WITHOUT_HEAD(is_boolean__empty); 381 ATF_TEST_CASE_BODY(is_boolean__empty) 382 { 383 lutok::state state; 384 ATF_REQUIRE(!state.is_boolean()); 385 } 386 387 388 ATF_TEST_CASE_WITHOUT_HEAD(is_boolean__top); 389 ATF_TEST_CASE_BODY(is_boolean__top) 390 { 391 lutok::state state; 392 lua_pushnil(raw(state)); 393 ATF_REQUIRE(!state.is_boolean()); 394 lua_pushboolean(raw(state), 1); 395 ATF_REQUIRE(state.is_boolean()); 396 lua_pop(raw(state), 2); 397 } 398 399 400 ATF_TEST_CASE_WITHOUT_HEAD(is_boolean__explicit); 401 ATF_TEST_CASE_BODY(is_boolean__explicit) 402 { 403 lutok::state state; 404 lua_pushboolean(raw(state), 1); 405 ATF_REQUIRE(state.is_boolean(-1)); 406 lua_pushinteger(raw(state), 5); 407 ATF_REQUIRE(!state.is_boolean(-1)); 408 ATF_REQUIRE(state.is_boolean(-2)); 409 lua_pop(raw(state), 2); 410 } 411 412 413 ATF_TEST_CASE_WITHOUT_HEAD(is_function__empty); 414 ATF_TEST_CASE_BODY(is_function__empty) 415 { 416 lutok::state state; 417 ATF_REQUIRE(!state.is_function()); 418 } 419 420 421 ATF_TEST_CASE_WITHOUT_HEAD(is_function__top); 422 ATF_TEST_CASE_BODY(is_function__top) 423 { 424 lutok::state state; 425 luaL_dostring(raw(state), "function my_func(a, b) return a + b; end"); 426 427 lua_pushnil(raw(state)); 428 ATF_REQUIRE(!state.is_function()); 429 lua_getglobal(raw(state), "my_func"); 430 ATF_REQUIRE(state.is_function()); 431 lua_pop(raw(state), 2); 432 } 433 434 435 ATF_TEST_CASE_WITHOUT_HEAD(is_function__explicit); 436 ATF_TEST_CASE_BODY(is_function__explicit) 437 { 438 lutok::state state; 439 luaL_dostring(raw(state), "function my_func(a, b) return a + b; end"); 440 441 lua_getglobal(raw(state), "my_func"); 442 ATF_REQUIRE(state.is_function(-1)); 443 lua_pushinteger(raw(state), 5); 444 ATF_REQUIRE(!state.is_function(-1)); 445 ATF_REQUIRE(state.is_function(-2)); 446 lua_pop(raw(state), 2); 447 } 448 449 450 ATF_TEST_CASE_WITHOUT_HEAD(is_nil__empty); 451 ATF_TEST_CASE_BODY(is_nil__empty) 452 { 453 lutok::state state; 454 ATF_REQUIRE(state.is_nil()); 455 } 456 457 458 ATF_TEST_CASE_WITHOUT_HEAD(is_nil__top); 459 ATF_TEST_CASE_BODY(is_nil__top) 460 { 461 lutok::state state; 462 lua_pushnil(raw(state)); 463 ATF_REQUIRE(state.is_nil()); 464 lua_pushinteger(raw(state), 5); 465 ATF_REQUIRE(!state.is_nil()); 466 lua_pop(raw(state), 2); 467 } 468 469 470 ATF_TEST_CASE_WITHOUT_HEAD(is_nil__explicit); 471 ATF_TEST_CASE_BODY(is_nil__explicit) 472 { 473 lutok::state state; 474 lua_pushnil(raw(state)); 475 ATF_REQUIRE(state.is_nil(-1)); 476 lua_pushinteger(raw(state), 5); 477 ATF_REQUIRE(!state.is_nil(-1)); 478 ATF_REQUIRE(state.is_nil(-2)); 479 lua_pop(raw(state), 2); 480 } 481 482 483 ATF_TEST_CASE_WITHOUT_HEAD(is_number__empty); 484 ATF_TEST_CASE_BODY(is_number__empty) 485 { 486 lutok::state state; 487 ATF_REQUIRE(!state.is_number()); 488 } 489 490 491 ATF_TEST_CASE_WITHOUT_HEAD(is_number__top); 492 ATF_TEST_CASE_BODY(is_number__top) 493 { 494 lutok::state state; 495 lua_pushnil(raw(state)); 496 ATF_REQUIRE(!state.is_number()); 497 lua_pushinteger(raw(state), 5); 498 ATF_REQUIRE(state.is_number()); 499 lua_pop(raw(state), 2); 500 } 501 502 503 ATF_TEST_CASE_WITHOUT_HEAD(is_number__explicit); 504 ATF_TEST_CASE_BODY(is_number__explicit) 505 { 506 lutok::state state; 507 lua_pushnil(raw(state)); 508 ATF_REQUIRE(!state.is_number(-1)); 509 lua_pushinteger(raw(state), 5); 510 ATF_REQUIRE(state.is_number(-1)); 511 ATF_REQUIRE(!state.is_number(-2)); 512 lua_pop(raw(state), 2); 513 } 514 515 516 ATF_TEST_CASE_WITHOUT_HEAD(is_string__empty); 517 ATF_TEST_CASE_BODY(is_string__empty) 518 { 519 lutok::state state; 520 ATF_REQUIRE(!state.is_string()); 521 } 522 523 524 ATF_TEST_CASE_WITHOUT_HEAD(is_string__top); 525 ATF_TEST_CASE_BODY(is_string__top) 526 { 527 lutok::state state; 528 lua_pushnil(raw(state)); 529 ATF_REQUIRE(!state.is_string()); 530 lua_pushinteger(raw(state), 3); 531 ATF_REQUIRE(state.is_string()); 532 lua_pushstring(raw(state), "foo"); 533 ATF_REQUIRE(state.is_string()); 534 lua_pop(raw(state), 3); 535 } 536 537 538 ATF_TEST_CASE_WITHOUT_HEAD(is_string__explicit); 539 ATF_TEST_CASE_BODY(is_string__explicit) 540 { 541 lutok::state state; 542 lua_pushinteger(raw(state), 3); 543 ATF_REQUIRE(state.is_string(-1)); 544 lua_pushnil(raw(state)); 545 ATF_REQUIRE(!state.is_string(-1)); 546 ATF_REQUIRE(state.is_string(-2)); 547 lua_pushstring(raw(state), "foo"); 548 ATF_REQUIRE(state.is_string(-1)); 549 ATF_REQUIRE(!state.is_string(-2)); 550 ATF_REQUIRE(state.is_string(-3)); 551 lua_pop(raw(state), 3); 552 } 553 554 555 ATF_TEST_CASE_WITHOUT_HEAD(is_table__empty); 556 ATF_TEST_CASE_BODY(is_table__empty) 557 { 558 lutok::state state; 559 ATF_REQUIRE(!state.is_table()); 560 } 561 562 563 ATF_TEST_CASE_WITHOUT_HEAD(is_table__top); 564 ATF_TEST_CASE_BODY(is_table__top) 565 { 566 lutok::state state; 567 luaL_dostring(raw(state), "t = {3, 4, 5}"); 568 569 lua_pushstring(raw(state), "foo"); 570 ATF_REQUIRE(!state.is_table()); 571 lua_getglobal(raw(state), "t"); 572 ATF_REQUIRE(state.is_table()); 573 lua_pop(raw(state), 2); 574 } 575 576 577 ATF_TEST_CASE_WITHOUT_HEAD(is_table__explicit); 578 ATF_TEST_CASE_BODY(is_table__explicit) 579 { 580 lutok::state state; 581 luaL_dostring(raw(state), "t = {3, 4, 5}"); 582 583 lua_pushstring(raw(state), "foo"); 584 ATF_REQUIRE(!state.is_table(-1)); 585 lua_getglobal(raw(state), "t"); 586 ATF_REQUIRE(state.is_table(-1)); 587 ATF_REQUIRE(!state.is_table(-2)); 588 lua_pop(raw(state), 2); 589 } 590 591 592 ATF_TEST_CASE_WITHOUT_HEAD(is_userdata__empty); 593 ATF_TEST_CASE_BODY(is_userdata__empty) 594 { 595 lutok::state state; 596 ATF_REQUIRE(!state.is_userdata()); 597 } 598 599 600 ATF_TEST_CASE_WITHOUT_HEAD(is_userdata__top); 601 ATF_TEST_CASE_BODY(is_userdata__top) 602 { 603 lutok::state state; 604 605 lua_pushstring(raw(state), "foo"); 606 ATF_REQUIRE(!state.is_userdata()); 607 lua_newuserdata(raw(state), 1234); 608 ATF_REQUIRE(state.is_userdata()); 609 lua_pop(raw(state), 2); 610 } 611 612 613 ATF_TEST_CASE_WITHOUT_HEAD(is_userdata__explicit); 614 ATF_TEST_CASE_BODY(is_userdata__explicit) 615 { 616 lutok::state state; 617 618 lua_pushstring(raw(state), "foo"); 619 ATF_REQUIRE(!state.is_userdata(-1)); 620 lua_newuserdata(raw(state), 543); 621 ATF_REQUIRE(state.is_userdata(-1)); 622 ATF_REQUIRE(!state.is_userdata(-2)); 623 lua_pop(raw(state), 2); 624 } 625 626 627 ATF_TEST_CASE_WITHOUT_HEAD(load_file__ok); 628 ATF_TEST_CASE_BODY(load_file__ok) 629 { 630 std::ofstream output("test.lua"); 631 output << "in_the_file = \"oh yes\"\n"; 632 output.close(); 633 634 lutok::state state; 635 state.load_file("test.lua"); 636 ATF_REQUIRE(lua_pcall(raw(state), 0, 0, 0) == 0); 637 lua_getglobal(raw(state), "in_the_file"); 638 ATF_REQUIRE(std::strcmp("oh yes", lua_tostring(raw(state), -1)) == 0); 639 lua_pop(raw(state), 1); 640 } 641 642 643 ATF_TEST_CASE_WITHOUT_HEAD(load_file__api_error); 644 ATF_TEST_CASE_BODY(load_file__api_error) 645 { 646 std::ofstream output("test.lua"); 647 output << "I have a bad syntax! Wohoo!\n"; 648 output.close(); 649 650 lutok::state state; 651 REQUIRE_API_ERROR("luaL_loadfile", state.load_file("test.lua")); 652 } 653 654 655 ATF_TEST_CASE_WITHOUT_HEAD(load_file__file_not_found_error); 656 ATF_TEST_CASE_BODY(load_file__file_not_found_error) 657 { 658 lutok::state state; 659 ATF_REQUIRE_THROW_RE(lutok::file_not_found_error, "missing.lua", 660 state.load_file("missing.lua")); 661 } 662 663 664 ATF_TEST_CASE_WITHOUT_HEAD(load_string__ok); 665 ATF_TEST_CASE_BODY(load_string__ok) 666 { 667 lutok::state state; 668 state.load_string("return 2 + 3"); 669 ATF_REQUIRE(lua_pcall(raw(state), 0, 1, 0) == 0); 670 ATF_REQUIRE_EQ(5, lua_tointeger(raw(state), -1)); 671 lua_pop(raw(state), 1); 672 } 673 674 675 ATF_TEST_CASE_WITHOUT_HEAD(load_string__fail); 676 ATF_TEST_CASE_BODY(load_string__fail) 677 { 678 lutok::state state; 679 REQUIRE_API_ERROR("luaL_loadstring", state.load_string("-")); 680 } 681 682 683 ATF_TEST_CASE_WITHOUT_HEAD(new_table); 684 ATF_TEST_CASE_BODY(new_table) 685 { 686 lutok::state state; 687 state.new_table(); 688 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 689 ATF_REQUIRE(lua_istable(raw(state), -1)); 690 lua_pop(raw(state), 1); 691 } 692 693 694 ATF_TEST_CASE_WITHOUT_HEAD(new_userdata); 695 ATF_TEST_CASE_BODY(new_userdata) 696 { 697 lutok::state state; 698 int* pointer = state.new_userdata< int >(); 699 *pointer = 1234; 700 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 701 ATF_REQUIRE(lua_isuserdata(raw(state), -1)); 702 lua_pop(raw(state), 1); 703 } 704 705 706 ATF_TEST_CASE_WITHOUT_HEAD(next__empty); 707 ATF_TEST_CASE_BODY(next__empty) 708 { 709 lutok::state state; 710 luaL_dostring(raw(state), "t = {}"); 711 712 lua_getglobal(raw(state), "t"); 713 lua_pushstring(raw(state), "this is a dummy value"); 714 lua_pushnil(raw(state)); 715 ATF_REQUIRE(!state.next(-3)); 716 lua_pop(raw(state), 2); 717 } 718 719 720 ATF_TEST_CASE_WITHOUT_HEAD(next__many); 721 ATF_TEST_CASE_BODY(next__many) 722 { 723 lutok::state state; 724 luaL_dostring(raw(state), "t = {}; t[1] = 100; t[2] = 200"); 725 726 lua_getglobal(raw(state), "t"); 727 lua_pushnil(raw(state)); 728 729 ATF_REQUIRE(state.next()); 730 ATF_REQUIRE_EQ(3, lua_gettop(raw(state))); 731 ATF_REQUIRE(lua_isnumber(raw(state), -2)); 732 ATF_REQUIRE_EQ(1, lua_tointeger(raw(state), -2)); 733 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 734 ATF_REQUIRE_EQ(100, lua_tointeger(raw(state), -1)); 735 lua_pop(raw(state), 1); 736 737 ATF_REQUIRE(state.next()); 738 ATF_REQUIRE_EQ(3, lua_gettop(raw(state))); 739 ATF_REQUIRE(lua_isnumber(raw(state), -2)); 740 ATF_REQUIRE_EQ(2, lua_tointeger(raw(state), -2)); 741 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 742 ATF_REQUIRE_EQ(200, lua_tointeger(raw(state), -1)); 743 lua_pop(raw(state), 1); 744 745 ATF_REQUIRE(!state.next()); 746 lua_pop(raw(state), 1); 747 } 748 749 750 ATF_TEST_CASE_WITHOUT_HEAD(open_base); 751 ATF_TEST_CASE_BODY(open_base) 752 { 753 lutok::state state; 754 check_modules(state, ""); 755 state.open_base(); 756 check_modules(state, "base"); 757 } 758 759 760 ATF_TEST_CASE_WITHOUT_HEAD(open_string); 761 ATF_TEST_CASE_BODY(open_string) 762 { 763 lutok::state state; 764 check_modules(state, ""); 765 state.open_string(); 766 check_modules(state, "string"); 767 } 768 769 770 ATF_TEST_CASE_WITHOUT_HEAD(open_table); 771 ATF_TEST_CASE_BODY(open_table) 772 { 773 lutok::state state; 774 check_modules(state, ""); 775 state.open_table(); 776 check_modules(state, "table"); 777 } 778 779 780 ATF_TEST_CASE_WITHOUT_HEAD(pcall__ok); 781 ATF_TEST_CASE_BODY(pcall__ok) 782 { 783 lutok::state state; 784 luaL_loadstring(raw(state), "function mul(a, b) return a * b; end"); 785 state.pcall(0, 0, 0); 786 state.get_global_table(); 787 lua_pushstring(raw(state), "mul"); 788 lua_gettable(raw(state), -2); 789 lua_pushinteger(raw(state), 3); 790 lua_pushinteger(raw(state), 5); 791 state.pcall(2, 1, 0); 792 ATF_REQUIRE_EQ(15, lua_tointeger(raw(state), -1)); 793 lua_pop(raw(state), 2); 794 } 795 796 797 ATF_TEST_CASE_WITHOUT_HEAD(pcall__fail); 798 ATF_TEST_CASE_BODY(pcall__fail) 799 { 800 lutok::state state; 801 lua_pushnil(raw(state)); 802 REQUIRE_API_ERROR("lua_pcall", state.pcall(0, 0, 0)); 803 } 804 805 806 ATF_TEST_CASE_WITHOUT_HEAD(pop__one); 807 ATF_TEST_CASE_BODY(pop__one) 808 { 809 lutok::state state; 810 lua_pushinteger(raw(state), 10); 811 lua_pushinteger(raw(state), 20); 812 lua_pushinteger(raw(state), 30); 813 state.pop(1); 814 ATF_REQUIRE_EQ(2, lua_gettop(raw(state))); 815 ATF_REQUIRE_EQ(20, lua_tointeger(raw(state), -1)); 816 lua_pop(raw(state), 2); 817 } 818 819 820 ATF_TEST_CASE_WITHOUT_HEAD(pop__many); 821 ATF_TEST_CASE_BODY(pop__many) 822 { 823 lutok::state state; 824 lua_pushinteger(raw(state), 10); 825 lua_pushinteger(raw(state), 20); 826 lua_pushinteger(raw(state), 30); 827 state.pop(2); 828 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 829 ATF_REQUIRE_EQ(10, lua_tointeger(raw(state), -1)); 830 lua_pop(raw(state), 1); 831 } 832 833 834 ATF_TEST_CASE_WITHOUT_HEAD(push_boolean); 835 ATF_TEST_CASE_BODY(push_boolean) 836 { 837 lutok::state state; 838 state.push_boolean(true); 839 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 840 ATF_REQUIRE(lua_toboolean(raw(state), -1)); 841 state.push_boolean(false); 842 ATF_REQUIRE_EQ(2, lua_gettop(raw(state))); 843 ATF_REQUIRE(!lua_toboolean(raw(state), -1)); 844 ATF_REQUIRE(lua_toboolean(raw(state), -2)); 845 lua_pop(raw(state), 2); 846 } 847 848 849 ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_closure); 850 ATF_TEST_CASE_BODY(push_cxx_closure) 851 { 852 lutok::state state; 853 state.push_integer(15); 854 state.push_cxx_closure(cxx_multiply_closure, 1); 855 lua_setglobal(raw(state), "cxx_multiply_closure"); 856 857 ATF_REQUIRE(luaL_dostring(raw(state), 858 "return cxx_multiply_closure(10)") == 0); 859 ATF_REQUIRE_EQ(150, lua_tointeger(raw(state), -1)); 860 lua_pop(raw(state), 1); 861 } 862 863 864 ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__ok); 865 ATF_TEST_CASE_BODY(push_cxx_function__ok) 866 { 867 lutok::state state; 868 state.push_cxx_function(cxx_divide); 869 lua_setglobal(raw(state), "cxx_divide"); 870 871 ATF_REQUIRE(luaL_dostring(raw(state), "return cxx_divide(17, 3)") == 0); 872 ATF_REQUIRE_EQ(5, lua_tointeger(raw(state), -2)); 873 ATF_REQUIRE_EQ(2, lua_tointeger(raw(state), -1)); 874 lua_pop(raw(state), 2); 875 } 876 877 878 ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__fail_exception); 879 ATF_TEST_CASE_BODY(push_cxx_function__fail_exception) 880 { 881 lutok::state state; 882 state.push_cxx_function(cxx_divide); 883 lua_setglobal(raw(state), "cxx_divide"); 884 885 ATF_REQUIRE(luaL_dostring(raw(state), "return cxx_divide(15, 0)") != 0); 886 ATF_REQUIRE_MATCH("Divisor is 0", lua_tostring(raw(state), -1)); 887 lua_pop(raw(state), 1); 888 } 889 890 891 ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__fail_anything); 892 ATF_TEST_CASE_BODY(push_cxx_function__fail_anything) 893 { 894 lutok::state state; 895 state.push_cxx_function(cxx_divide); 896 lua_setglobal(raw(state), "cxx_divide"); 897 898 ATF_REQUIRE(luaL_dostring(raw(state), "return cxx_divide(-3, -1)") != 0); 899 ATF_REQUIRE_MATCH("Unhandled exception", lua_tostring(raw(state), -1)); 900 lua_pop(raw(state), 1); 901 } 902 903 904 ATF_TEST_CASE_WITHOUT_HEAD(push_cxx_function__fail_overflow); 905 ATF_TEST_CASE_BODY(push_cxx_function__fail_overflow) 906 { 907 lutok::state state; 908 state.push_cxx_function(raise_long_error); 909 lua_setglobal(raw(state), "fail"); 910 911 ATF_REQUIRE(luaL_dostring(raw(state), "return fail(900)") != 0); 912 ATF_REQUIRE_MATCH(std::string(900, 'A'), lua_tostring(raw(state), -1)); 913 lua_pop(raw(state), 1); 914 915 ATF_REQUIRE(luaL_dostring(raw(state), "return fail(8192)") != 0); 916 ATF_REQUIRE_MATCH(std::string(900, 'A'), lua_tostring(raw(state), -1)); 917 lua_pop(raw(state), 1); 918 } 919 920 921 ATF_TEST_CASE_WITHOUT_HEAD(push_integer); 922 ATF_TEST_CASE_BODY(push_integer) 923 { 924 lutok::state state; 925 state.push_integer(12); 926 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 927 ATF_REQUIRE_EQ(12, lua_tointeger(raw(state), -1)); 928 state.push_integer(34); 929 ATF_REQUIRE_EQ(2, lua_gettop(raw(state))); 930 ATF_REQUIRE_EQ(34, lua_tointeger(raw(state), -1)); 931 ATF_REQUIRE_EQ(12, lua_tointeger(raw(state), -2)); 932 lua_pop(raw(state), 2); 933 } 934 935 936 ATF_TEST_CASE_WITHOUT_HEAD(push_nil); 937 ATF_TEST_CASE_BODY(push_nil) 938 { 939 lutok::state state; 940 state.push_nil(); 941 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 942 ATF_REQUIRE(lua_isnil(raw(state), -1)); 943 state.push_integer(34); 944 ATF_REQUIRE_EQ(2, lua_gettop(raw(state))); 945 ATF_REQUIRE(!lua_isnil(raw(state), -1)); 946 ATF_REQUIRE(lua_isnil(raw(state), -2)); 947 lua_pop(raw(state), 2); 948 } 949 950 951 ATF_TEST_CASE_WITHOUT_HEAD(push_string); 952 ATF_TEST_CASE_BODY(push_string) 953 { 954 lutok::state state; 955 956 { 957 std::string str = "first"; 958 state.push_string(str); 959 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 960 ATF_REQUIRE_EQ(std::string("first"), lua_tostring(raw(state), -1)); 961 str = "second"; 962 state.push_string(str); 963 } 964 ATF_REQUIRE_EQ(2, lua_gettop(raw(state))); 965 ATF_REQUIRE_EQ(std::string("second"), lua_tostring(raw(state), -1)); 966 ATF_REQUIRE_EQ(std::string("first"), lua_tostring(raw(state), -2)); 967 lua_pop(raw(state), 2); 968 } 969 970 971 ATF_TEST_CASE_WITHOUT_HEAD(push_value__top); 972 ATF_TEST_CASE_BODY(push_value__top) 973 { 974 lutok::state state; 975 976 lua_pushinteger(raw(state), 10); 977 lua_pushinteger(raw(state), 20); 978 state.push_value(); 979 ATF_REQUIRE_EQ(3, lua_gettop(raw(state))); 980 ATF_REQUIRE_EQ(20, lua_tointeger(raw(state), -1)); 981 ATF_REQUIRE_EQ(20, lua_tointeger(raw(state), -2)); 982 ATF_REQUIRE_EQ(10, lua_tointeger(raw(state), -3)); 983 lua_pop(raw(state), 3); 984 } 985 986 987 ATF_TEST_CASE_WITHOUT_HEAD(push_value__explicit); 988 ATF_TEST_CASE_BODY(push_value__explicit) 989 { 990 lutok::state state; 991 992 lua_pushinteger(raw(state), 10); 993 lua_pushinteger(raw(state), 20); 994 state.push_value(-2); 995 ATF_REQUIRE_EQ(3, lua_gettop(raw(state))); 996 ATF_REQUIRE_EQ(10, lua_tointeger(raw(state), -1)); 997 ATF_REQUIRE_EQ(20, lua_tointeger(raw(state), -2)); 998 ATF_REQUIRE_EQ(10, lua_tointeger(raw(state), -3)); 999 lua_pop(raw(state), 3); 1000 } 1001 1002 1003 ATF_TEST_CASE_WITHOUT_HEAD(raw_get__top); 1004 ATF_TEST_CASE_BODY(raw_get__top) 1005 { 1006 lutok::state state; 1007 1008 luaL_openlibs(raw(state)); 1009 ATF_REQUIRE(luaL_dostring( 1010 raw(state), "t = {foo=123} ; setmetatable(t, {__index=1})") == 0); 1011 lua_getglobal(raw(state), "t"); 1012 lua_pushstring(raw(state), "foo"); 1013 state.raw_get(); 1014 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1015 ATF_REQUIRE_EQ(123, lua_tointeger(raw(state), -1)); 1016 lua_pop(raw(state), 2); 1017 } 1018 1019 1020 ATF_TEST_CASE_WITHOUT_HEAD(raw_get__explicit); 1021 ATF_TEST_CASE_BODY(raw_get__explicit) 1022 { 1023 lutok::state state; 1024 1025 luaL_openlibs(raw(state)); 1026 ATF_REQUIRE(luaL_dostring( 1027 raw(state), "t = {foo=123} ; setmetatable(t, {__index=1})") == 0); 1028 lua_getglobal(raw(state), "t"); 1029 lua_pushinteger(raw(state), 9876); 1030 lua_pushstring(raw(state), "foo"); 1031 state.raw_get(-3); 1032 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1033 ATF_REQUIRE_EQ(123, lua_tointeger(raw(state), -1)); 1034 ATF_REQUIRE_EQ(9876, lua_tointeger(raw(state), -2)); 1035 lua_pop(raw(state), 3); 1036 } 1037 1038 1039 ATF_TEST_CASE_WITHOUT_HEAD(raw_set__top); 1040 ATF_TEST_CASE_BODY(raw_set__top) 1041 { 1042 lutok::state state; 1043 1044 luaL_openlibs(raw(state)); 1045 ATF_REQUIRE(luaL_dostring( 1046 raw(state), "t = {} ; setmetatable(t, {__newindex=1})") == 0); 1047 lua_getglobal(raw(state), "t"); 1048 lua_pushstring(raw(state), "foo"); 1049 lua_pushinteger(raw(state), 345); 1050 state.raw_set(); 1051 ATF_REQUIRE(luaL_dostring(raw(state), "return t.foo") == 0); 1052 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1053 ATF_REQUIRE_EQ(345, lua_tointeger(raw(state), -1)); 1054 lua_pop(raw(state), 2); 1055 } 1056 1057 1058 ATF_TEST_CASE_WITHOUT_HEAD(raw_set__explicit); 1059 ATF_TEST_CASE_BODY(raw_set__explicit) 1060 { 1061 lutok::state state; 1062 1063 luaL_openlibs(raw(state)); 1064 ATF_REQUIRE(luaL_dostring( 1065 raw(state), "t = {} ; setmetatable(t, {__newindex=1})") == 0); 1066 lua_getglobal(raw(state), "t"); 1067 lua_pushinteger(raw(state), 876); 1068 lua_pushstring(raw(state), "foo"); 1069 lua_pushinteger(raw(state), 345); 1070 state.raw_set(-4); 1071 ATF_REQUIRE(luaL_dostring(raw(state), "return t.foo") == 0); 1072 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1073 ATF_REQUIRE_EQ(345, lua_tointeger(raw(state), -1)); 1074 ATF_REQUIRE_EQ(876, lua_tointeger(raw(state), -2)); 1075 lua_pop(raw(state), 3); 1076 } 1077 1078 1079 ATF_TEST_CASE_WITHOUT_HEAD(registry_index); 1080 ATF_TEST_CASE_BODY(registry_index) 1081 { 1082 lutok::state state; 1083 lua_pushvalue(raw(state), lutok::registry_index); 1084 lua_pushstring(raw(state), "custom_variable"); 1085 lua_pushstring(raw(state), "custom value"); 1086 lua_settable(raw(state), -3); 1087 lua_pop(raw(state), 1); 1088 ATF_REQUIRE(luaL_dostring(raw(state), 1089 "return custom_variable == nil") == 0); 1090 ATF_REQUIRE(lua_isboolean(raw(state), -1)); 1091 ATF_REQUIRE(lua_toboolean(raw(state), -1)); 1092 lua_pop(raw(state), 1); 1093 } 1094 1095 1096 ATF_TEST_CASE_WITHOUT_HEAD(set_global); 1097 ATF_TEST_CASE_BODY(set_global) 1098 { 1099 lutok::state state; 1100 lua_pushinteger(raw(state), 3); 1101 state.set_global("test_variable"); 1102 ATF_REQUIRE(luaL_dostring(raw(state), "return test_variable + 1") == 0); 1103 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1104 ATF_REQUIRE_EQ(4, lua_tointeger(raw(state), -1)); 1105 lua_pop(raw(state), 1); 1106 } 1107 1108 1109 ATF_TEST_CASE_WITHOUT_HEAD(set_metatable__top); 1110 ATF_TEST_CASE_BODY(set_metatable__top) 1111 { 1112 lutok::state state; 1113 ATF_REQUIRE(luaL_dostring( 1114 raw(state), 1115 "mt = {}\n" 1116 "mt.__add = function(a, b) return a[1] + b end\n" 1117 "numbers = {}\n" 1118 "numbers[1] = 5\n") == 0); 1119 1120 lua_getglobal(raw(state), "numbers"); 1121 lua_getglobal(raw(state), "mt"); 1122 state.set_metatable(); 1123 lua_pop(raw(state), 1); 1124 1125 ATF_REQUIRE(luaL_dostring(raw(state), "return numbers + 2") == 0); 1126 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1127 ATF_REQUIRE_EQ(7, lua_tointeger(raw(state), -1)); 1128 lua_pop(raw(state), 1); 1129 } 1130 1131 1132 ATF_TEST_CASE_WITHOUT_HEAD(set_metatable__explicit); 1133 ATF_TEST_CASE_BODY(set_metatable__explicit) 1134 { 1135 lutok::state state; 1136 ATF_REQUIRE(luaL_dostring( 1137 raw(state), 1138 "mt = {}\n" 1139 "mt.__add = function(a, b) return a[1] + b end\n" 1140 "numbers = {}\n" 1141 "numbers[1] = 5\n") == 0); 1142 1143 lua_getglobal(raw(state), "numbers"); 1144 lua_pushinteger(raw(state), 1234); 1145 lua_getglobal(raw(state), "mt"); 1146 state.set_metatable(-3); 1147 lua_pop(raw(state), 2); 1148 1149 ATF_REQUIRE(luaL_dostring(raw(state), "return numbers + 2") == 0); 1150 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1151 ATF_REQUIRE_EQ(7, lua_tointeger(raw(state), -1)); 1152 lua_pop(raw(state), 1); 1153 } 1154 1155 1156 ATF_TEST_CASE_WITHOUT_HEAD(set_table__ok); 1157 ATF_TEST_CASE_BODY(set_table__ok) 1158 { 1159 lutok::state state; 1160 ATF_REQUIRE(luaL_dostring(raw(state), "t = { a = 1, bar = 234 }") == 0); 1161 lua_getglobal(raw(state), "t"); 1162 1163 lua_pushstring(raw(state), "bar"); 1164 lua_pushstring(raw(state), "baz"); 1165 state.set_table(); 1166 ATF_REQUIRE_EQ(1, lua_gettop(raw(state))); 1167 1168 lua_pushstring(raw(state), "a"); 1169 lua_gettable(raw(state), -2); 1170 ATF_REQUIRE(lua_isnumber(raw(state), -1)); 1171 ATF_REQUIRE_EQ(1, lua_tointeger(raw(state), -1)); 1172 lua_pop(raw(state), 1); 1173 1174 lua_pushstring(raw(state), "bar"); 1175 lua_gettable(raw(state), -2); 1176 ATF_REQUIRE(lua_isstring(raw(state), -1)); 1177 ATF_REQUIRE_EQ(std::string("baz"), lua_tostring(raw(state), -1)); 1178 lua_pop(raw(state), 1); 1179 1180 lua_pop(raw(state), 1); 1181 } 1182 1183 1184 ATF_TEST_CASE_WITHOUT_HEAD(set_table__nil); 1185 ATF_TEST_CASE_BODY(set_table__nil) 1186 { 1187 lutok::state state; 1188 lua_pushnil(raw(state)); 1189 lua_pushinteger(raw(state), 1); 1190 lua_pushinteger(raw(state), 2); 1191 REQUIRE_API_ERROR("lua_settable", state.set_table(-3)); 1192 lua_pop(raw(state), 3); 1193 } 1194 1195 1196 ATF_TEST_CASE_WITHOUT_HEAD(to_boolean__top); 1197 ATF_TEST_CASE_BODY(to_boolean__top) 1198 { 1199 lutok::state state; 1200 lua_pushboolean(raw(state), 1); 1201 ATF_REQUIRE(state.to_boolean()); 1202 lua_pushboolean(raw(state), 0); 1203 ATF_REQUIRE(!state.to_boolean()); 1204 lua_pop(raw(state), 2); 1205 } 1206 1207 1208 ATF_TEST_CASE_WITHOUT_HEAD(to_boolean__explicit); 1209 ATF_TEST_CASE_BODY(to_boolean__explicit) 1210 { 1211 lutok::state state; 1212 lua_pushboolean(raw(state), 0); 1213 lua_pushboolean(raw(state), 1); 1214 ATF_REQUIRE(!state.to_boolean(-2)); 1215 ATF_REQUIRE(state.to_boolean(-1)); 1216 lua_pop(raw(state), 2); 1217 } 1218 1219 1220 ATF_TEST_CASE_WITHOUT_HEAD(to_integer__top); 1221 ATF_TEST_CASE_BODY(to_integer__top) 1222 { 1223 lutok::state state; 1224 lua_pushstring(raw(state), "34"); 1225 ATF_REQUIRE_EQ(34, state.to_integer()); 1226 lua_pushinteger(raw(state), 12); 1227 ATF_REQUIRE_EQ(12, state.to_integer()); 1228 lua_pop(raw(state), 2); 1229 } 1230 1231 1232 ATF_TEST_CASE_WITHOUT_HEAD(to_integer__explicit); 1233 ATF_TEST_CASE_BODY(to_integer__explicit) 1234 { 1235 lutok::state state; 1236 lua_pushinteger(raw(state), 12); 1237 lua_pushstring(raw(state), "foobar"); 1238 ATF_REQUIRE_EQ(12, state.to_integer(-2)); 1239 lua_pop(raw(state), 2); 1240 } 1241 1242 1243 ATF_TEST_CASE_WITHOUT_HEAD(to_string__top); 1244 ATF_TEST_CASE_BODY(to_string__top) 1245 { 1246 lutok::state state; 1247 lua_pushstring(raw(state), "foobar"); 1248 ATF_REQUIRE_EQ("foobar", state.to_string()); 1249 lua_pushinteger(raw(state), 12); 1250 ATF_REQUIRE_EQ("12", state.to_string()); 1251 lua_pop(raw(state), 2); 1252 } 1253 1254 1255 ATF_TEST_CASE_WITHOUT_HEAD(to_string__explicit); 1256 ATF_TEST_CASE_BODY(to_string__explicit) 1257 { 1258 lutok::state state; 1259 lua_pushstring(raw(state), "foobar"); 1260 lua_pushinteger(raw(state), 12); 1261 ATF_REQUIRE_EQ("foobar", state.to_string(-2)); 1262 ATF_REQUIRE_EQ("12", state.to_string(-1)); 1263 lua_pop(raw(state), 2); 1264 } 1265 1266 1267 ATF_TEST_CASE_WITHOUT_HEAD(to_userdata__top); 1268 ATF_TEST_CASE_BODY(to_userdata__top) 1269 { 1270 lutok::state state; 1271 { 1272 int* pointer = static_cast< int* >( 1273 lua_newuserdata(raw(state), sizeof(int))); 1274 *pointer = 987; 1275 } 1276 1277 int* pointer = state.to_userdata< int >(); 1278 ATF_REQUIRE_EQ(987, *pointer); 1279 lua_pop(raw(state), 1); 1280 } 1281 1282 1283 ATF_TEST_CASE_WITHOUT_HEAD(to_userdata__explicit); 1284 ATF_TEST_CASE_BODY(to_userdata__explicit) 1285 { 1286 lutok::state state; 1287 { 1288 int* pointer = static_cast< int* >( 1289 lua_newuserdata(raw(state), sizeof(int))); 1290 *pointer = 987; 1291 } 1292 1293 lua_pushinteger(raw(state), 3); 1294 int* pointer = state.to_userdata< int >(-2); 1295 ATF_REQUIRE_EQ(987, *pointer); 1296 lua_pop(raw(state), 2); 1297 } 1298 1299 1300 ATF_TEST_CASE_WITHOUT_HEAD(upvalue_index); 1301 ATF_TEST_CASE_BODY(upvalue_index) 1302 { 1303 lutok::state state; 1304 lua_pushinteger(raw(state), 25); 1305 lua_pushinteger(raw(state), 30); 1306 lua_pushcclosure(raw(state), c_get_upvalues, 2); 1307 lua_setglobal(raw(state), "c_get_upvalues"); 1308 1309 ATF_REQUIRE(luaL_dostring(raw(state), 1310 "return c_get_upvalues()") == 0); 1311 ATF_REQUIRE_EQ(25, lua_tointeger(raw(state), -2)); 1312 ATF_REQUIRE_EQ(30, lua_tointeger(raw(state), -1)); 1313 lua_pop(raw(state), 2); 1314 } 1315 1316 1317 ATF_INIT_TEST_CASES(tcs) 1318 { 1319 ATF_ADD_TEST_CASE(tcs, close); 1320 ATF_ADD_TEST_CASE(tcs, get_global__ok); 1321 ATF_ADD_TEST_CASE(tcs, get_global__undefined); 1322 ATF_ADD_TEST_CASE(tcs, get_global_table); 1323 ATF_ADD_TEST_CASE(tcs, get_metafield__ok); 1324 ATF_ADD_TEST_CASE(tcs, get_metafield__undefined); 1325 ATF_ADD_TEST_CASE(tcs, get_metatable__top); 1326 ATF_ADD_TEST_CASE(tcs, get_metatable__explicit); 1327 ATF_ADD_TEST_CASE(tcs, get_metatable__undefined); 1328 ATF_ADD_TEST_CASE(tcs, get_table__ok); 1329 ATF_ADD_TEST_CASE(tcs, get_table__nil); 1330 ATF_ADD_TEST_CASE(tcs, get_table__unknown_index); 1331 ATF_ADD_TEST_CASE(tcs, get_top); 1332 ATF_ADD_TEST_CASE(tcs, insert); 1333 ATF_ADD_TEST_CASE(tcs, is_boolean__empty); 1334 ATF_ADD_TEST_CASE(tcs, is_boolean__top); 1335 ATF_ADD_TEST_CASE(tcs, is_boolean__explicit); 1336 ATF_ADD_TEST_CASE(tcs, is_function__empty); 1337 ATF_ADD_TEST_CASE(tcs, is_function__top); 1338 ATF_ADD_TEST_CASE(tcs, is_function__explicit); 1339 ATF_ADD_TEST_CASE(tcs, is_nil__empty); 1340 ATF_ADD_TEST_CASE(tcs, is_nil__top); 1341 ATF_ADD_TEST_CASE(tcs, is_nil__explicit); 1342 ATF_ADD_TEST_CASE(tcs, is_number__empty); 1343 ATF_ADD_TEST_CASE(tcs, is_number__top); 1344 ATF_ADD_TEST_CASE(tcs, is_number__explicit); 1345 ATF_ADD_TEST_CASE(tcs, is_string__empty); 1346 ATF_ADD_TEST_CASE(tcs, is_string__top); 1347 ATF_ADD_TEST_CASE(tcs, is_string__explicit); 1348 ATF_ADD_TEST_CASE(tcs, is_table__empty); 1349 ATF_ADD_TEST_CASE(tcs, is_table__top); 1350 ATF_ADD_TEST_CASE(tcs, is_table__explicit); 1351 ATF_ADD_TEST_CASE(tcs, is_userdata__empty); 1352 ATF_ADD_TEST_CASE(tcs, is_userdata__top); 1353 ATF_ADD_TEST_CASE(tcs, is_userdata__explicit); 1354 ATF_ADD_TEST_CASE(tcs, load_file__ok); 1355 ATF_ADD_TEST_CASE(tcs, load_file__api_error); 1356 ATF_ADD_TEST_CASE(tcs, load_file__file_not_found_error); 1357 ATF_ADD_TEST_CASE(tcs, load_string__ok); 1358 ATF_ADD_TEST_CASE(tcs, load_string__fail); 1359 ATF_ADD_TEST_CASE(tcs, new_table); 1360 ATF_ADD_TEST_CASE(tcs, new_userdata); 1361 ATF_ADD_TEST_CASE(tcs, next__empty); 1362 ATF_ADD_TEST_CASE(tcs, next__many); 1363 ATF_ADD_TEST_CASE(tcs, open_base); 1364 ATF_ADD_TEST_CASE(tcs, open_string); 1365 ATF_ADD_TEST_CASE(tcs, open_table); 1366 ATF_ADD_TEST_CASE(tcs, pcall__ok); 1367 ATF_ADD_TEST_CASE(tcs, pcall__fail); 1368 ATF_ADD_TEST_CASE(tcs, pop__one); 1369 ATF_ADD_TEST_CASE(tcs, pop__many); 1370 ATF_ADD_TEST_CASE(tcs, push_boolean); 1371 ATF_ADD_TEST_CASE(tcs, push_cxx_closure); 1372 ATF_ADD_TEST_CASE(tcs, push_cxx_function__ok); 1373 ATF_ADD_TEST_CASE(tcs, push_cxx_function__fail_exception); 1374 ATF_ADD_TEST_CASE(tcs, push_cxx_function__fail_anything); 1375 ATF_ADD_TEST_CASE(tcs, push_cxx_function__fail_overflow); 1376 ATF_ADD_TEST_CASE(tcs, push_integer); 1377 ATF_ADD_TEST_CASE(tcs, push_nil); 1378 ATF_ADD_TEST_CASE(tcs, push_string); 1379 ATF_ADD_TEST_CASE(tcs, push_value__top); 1380 ATF_ADD_TEST_CASE(tcs, push_value__explicit); 1381 ATF_ADD_TEST_CASE(tcs, raw_get__top); 1382 ATF_ADD_TEST_CASE(tcs, raw_get__explicit); 1383 ATF_ADD_TEST_CASE(tcs, raw_set__top); 1384 ATF_ADD_TEST_CASE(tcs, raw_set__explicit); 1385 ATF_ADD_TEST_CASE(tcs, registry_index); 1386 ATF_ADD_TEST_CASE(tcs, set_global); 1387 ATF_ADD_TEST_CASE(tcs, set_metatable__top); 1388 ATF_ADD_TEST_CASE(tcs, set_metatable__explicit); 1389 ATF_ADD_TEST_CASE(tcs, set_table__ok); 1390 ATF_ADD_TEST_CASE(tcs, set_table__nil); 1391 ATF_ADD_TEST_CASE(tcs, to_boolean__top); 1392 ATF_ADD_TEST_CASE(tcs, to_boolean__explicit); 1393 ATF_ADD_TEST_CASE(tcs, to_integer__top); 1394 ATF_ADD_TEST_CASE(tcs, to_integer__explicit); 1395 ATF_ADD_TEST_CASE(tcs, to_string__top); 1396 ATF_ADD_TEST_CASE(tcs, to_string__explicit); 1397 ATF_ADD_TEST_CASE(tcs, to_userdata__top); 1398 ATF_ADD_TEST_CASE(tcs, to_userdata__explicit); 1399 ATF_ADD_TEST_CASE(tcs, upvalue_index); 1400 } 1401