diff options
author | sanine <sanine.not@pm.me> | 2021-08-28 23:35:04 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2021-08-28 23:35:04 -0500 |
commit | 98edb48249a82d892c985bba2f503efbabc2f507 (patch) | |
tree | ecbe3b3276bc79791c2a7550583d09c25bf0170c /src | |
parent | 44af9bfec8f7d50b35a952e6e50a251e23c7e22c (diff) |
begin correcting stack sequencing bug in hs_create_table tests
Diffstat (limited to 'src')
-rw-r--r-- | src/tests/hs_create_table_tests.c | 598 |
1 files changed, 70 insertions, 528 deletions
diff --git a/src/tests/hs_create_table_tests.c b/src/tests/hs_create_table_tests.c index 403ca19..5205690 100644 --- a/src/tests/hs_create_table_tests.c +++ b/src/tests/hs_create_table_tests.c @@ -80,6 +80,15 @@ TEST(table_correct_index) #define checkval_light(expected) \ check_value(lua_islightuserdata, "light userdata", void *, lua_touserdata, value==expected) +#define store(name) \ + lua_pushvalue(L, -1); \ + int name ## _ref = luaL_ref(L, LUA_REGISTRYINDEX); \ + int name = lua_gettop(L); + +#define load(name) \ + lua_rawgeti(L, LUA_REGISTRYINDEX, name ## _ref); \ + name = lua_gettop(L); + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * @@ -90,8 +99,11 @@ TEST(table_correct_index) TEST(create_table_bool_bool) { + int oldtop = lua_gettop(L); int index = hs_create_table (L, hs_bool_bool(true, true), hs_bool_bool(false, true)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + loadkey_bool(index, true); checkval_bool(true); loadkey_bool(index, false); @@ -101,8 +113,11 @@ TEST(create_table_bool_bool) TEST(create_table_bool_int) { + int oldtop = lua_gettop(L); int index = hs_create_table (L, hs_bool_int(true, 15), hs_bool_int(false, 25)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + loadkey_bool(index, true); checkval_int(15); loadkey_bool(index, false); @@ -112,8 +127,11 @@ TEST(create_table_bool_int) TEST(create_table_bool_num) { + int oldtop = lua_gettop(L); int index = hs_create_table (L, hs_bool_num(true, 2.718), hs_bool_num(false, 1.618)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + loadkey_bool(index, true); checkval_num(2.718); loadkey_bool(index, false); @@ -123,8 +141,11 @@ TEST(create_table_bool_num) TEST(create_table_bool_str) { + int oldtop = lua_gettop(L); int index = hs_create_table (L, hs_bool_str(true, "hello"), hs_bool_str(false, "world")); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + loadkey_bool(index, true); checkval_str("hello"); loadkey_bool(index, false); @@ -134,38 +155,58 @@ TEST(create_table_bool_str) TEST(create_table_bool_tbl) { + int oldtop = lua_gettop(L); + lua_newtable(L); - int tbl1 = lua_gettop(L); + store(value1); lua_newtable(L); - int tbl2 = lua_gettop(L); + store(value2); + int index = hs_create_table - (L, hs_bool_tbl(true, tbl1), hs_bool_tbl(false, tbl2)); + (L, hs_bool_tbl(true, value1), hs_bool_tbl(false, value2)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + + load(value1); + load(value2); + loadkey_bool(index, true); - checkval_tbl(tbl1); + checkval_tbl(value1); loadkey_bool(index, false); - checkval_tbl(tbl2); + checkval_tbl(value2); return 0; } TEST(create_table_bool_func) { + int oldtop = lua_gettop(L); + luaL_loadstring(L, "print('hello')"); - int func1 = lua_gettop(L); + store(value1); luaL_loadstring(L, "print('hello')"); - int func2 = lua_gettop(L); + store(value2); + int index = hs_create_table - (L, hs_bool_func(true, func1), hs_bool_func(false, func2)); + (L, hs_bool_func(true, value1), hs_bool_func(false, value2)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + + load(value1); + load(value2); + loadkey_bool(index, true); - checkval_func(func1); + checkval_func(value1); loadkey_bool(index, false); - checkval_func(func2); + checkval_func(value2); return 0; } TEST(create_table_bool_cfunc) { + + int oldtop = lua_gettop(L); int index = hs_create_table (L, hs_bool_cfunc(true, testfunc1), hs_bool_cfunc(false, testfunc2)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + loadkey_bool(index, true); checkval_cfunc(testfunc1); loadkey_bool(index, false); @@ -176,12 +217,20 @@ TEST(create_table_bool_cfunc) TEST(create_table_bool_user) { + int oldtop = lua_gettop(L); + lua_newuserdata(L, sizeof(char)); - int user1 = lua_gettop(L); + store(user1); lua_newuserdata(L, sizeof(char)); - int user2 = lua_gettop(L); + store(user2); + int index = hs_create_table (L, hs_bool_user(true, user1), hs_bool_user(false, user2)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + + load(user1); + load(user2); + loadkey_bool(index, true); checkval_user(user1); loadkey_bool(index, false); @@ -195,8 +244,12 @@ TEST(create_table_bool_light) void *light1 = (void *) &a1; int a2 = 6; void *light2 = (void *) &a2; + + int oldtop = lua_gettop(L); int index = hs_create_table (L, hs_bool_light(true, light1), hs_bool_light(false, light2)); + mu_assert_equal(oldtop + 1, lua_gettop(L)); + loadkey_bool(index, true); checkval_light(light1); loadkey_bool(index, false); @@ -207,518 +260,6 @@ TEST(create_table_bool_light) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - * integer keys - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - */ - -TEST(create_table_int_bool) -{ - int index = hs_create_table - (L, hs_int_bool(15, true), hs_int_bool(25, true)); - loadkey_int(index, 15); - checkval_bool(true); - loadkey_int(index, 25); - checkval_bool(true); - return 0; -} - -TEST(create_table_int_int) -{ - int index = hs_create_table - (L, hs_int_int(15, 15), hs_int_int(25, 25)); - loadkey_int(index, 15); - checkval_int(15); - loadkey_int(index, 25); - checkval_int(25); - return 0; -} - -TEST(create_table_int_num) -{ - int index = hs_create_table - (L, hs_int_num(15, 2.718), hs_int_num(25, 1.618)); - loadkey_int(index, 15); - checkval_num(2.718); - loadkey_int(index, 25); - checkval_num(1.618); - return 0; -} - -TEST(create_table_int_str) -{ - int index = hs_create_table - (L, hs_int_str(15, "hello"), hs_int_str(25, "world")); - loadkey_int(index, 15); - checkval_str("hello"); - loadkey_int(index, 25); - checkval_str("world"); - return 0; -} - -TEST(create_table_int_tbl) -{ - lua_newtable(L); - int tbl1 = lua_gettop(L); - lua_newtable(L); - int tbl2 = lua_gettop(L); - int index = hs_create_table - (L, hs_int_tbl(15, tbl1), hs_int_tbl(25, tbl2)); - loadkey_int(index, 15); - checkval_tbl(tbl1); - loadkey_int(index, 25); - checkval_tbl(tbl2); - return 0; -} - -TEST(create_table_int_func) -{ - luaL_loadstring(L, "print('hello')"); - int func1 = lua_gettop(L); - luaL_loadstring(L, "print('hello')"); - int func2 = lua_gettop(L); - int index = hs_create_table - (L, hs_int_func(15, func1), hs_int_func(25, func2)); - loadkey_int(index, 15); - checkval_func(func1); - loadkey_int(index, 25); - checkval_func(func2); - return 0; -} - -TEST(create_table_int_cfunc) -{ - int index = hs_create_table - (L, hs_int_cfunc(15, testfunc1), hs_int_cfunc(25, testfunc2)); - loadkey_int(index, 15); - checkval_cfunc(testfunc1); - loadkey_int(index, 25); - checkval_cfunc(testfunc2); - return 0; -} - - -TEST(create_table_int_user) -{ - lua_newuserdata(L, sizeof(char)); - int user1 = lua_gettop(L); - lua_newuserdata(L, sizeof(char)); - int user2 = lua_gettop(L); - int index = hs_create_table - (L, hs_int_user(15, user1), hs_int_user(25, user2)); - loadkey_int(index, 15); - checkval_user(user1); - loadkey_int(index, 25); - checkval_user(user2); - return 0; -} - -TEST(create_table_int_light) -{ - int a1 = 5; - void *light1 = (void *) &a1; - int a2 = 6; - void *light2 = (void *) &a2; - int index = hs_create_table - (L, hs_int_light(15, light1), hs_int_light(25, light2)); - loadkey_int(index, 15); - checkval_light(light1); - loadkey_int(index, 25); - checkval_light(light2); - return 0; -} - - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * number keys - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - */ - -TEST(create_table_num_bool) -{ - int index = hs_create_table - (L, hs_num_bool(43.3f, true), hs_num_bool(63.75f, true)); - loadkey_num(index, 43.3f); - checkval_bool(true); - loadkey_num(index, 63.75f); - checkval_bool(true); - return 0; -} - -TEST(create_table_num_int) -{ - int index = hs_create_table - (L, hs_num_int(43.3f, 15), hs_num_int(63.75f, 25)); - loadkey_num(index, 43.3f); - checkval_int(15); - loadkey_num(index, 63.75f); - checkval_int(25); - return 0; -} - -TEST(create_table_num_num) -{ - int index = hs_create_table - (L, hs_num_num(43.3f, 2.718), hs_num_num(63.75f, 1.618)); - loadkey_num(index, 43.3f); - checkval_num(2.718); - loadkey_num(index, 63.75f); - checkval_num(1.618); - return 0; -} - -TEST(create_table_num_str) -{ - int index = hs_create_table - (L, hs_num_str(43.3f, "hello"), hs_num_str(63.75f, "world")); - loadkey_num(index, 43.3f); - checkval_str("hello"); - loadkey_num(index, 63.75f); - checkval_str("world"); - return 0; -} - -TEST(create_table_num_tbl) -{ - lua_newtable(L); - int tbl1 = lua_gettop(L); - lua_newtable(L); - int tbl2 = lua_gettop(L); - int index = hs_create_table - (L, hs_num_tbl(43.3f, tbl1), hs_num_tbl(63.75f, tbl2)); - loadkey_num(index, 43.3f); - checkval_tbl(tbl1); - loadkey_num(index, 63.75f); - checkval_tbl(tbl2); - return 0; -} - -TEST(create_table_num_func) -{ - luaL_loadstring(L, "print('hello')"); - int func1 = lua_gettop(L); - luaL_loadstring(L, "print('hello')"); - int func2 = lua_gettop(L); - int index = hs_create_table - (L, hs_num_func(43.3f, func1), hs_num_func(63.75f, func2)); - loadkey_num(index, 43.3f); - checkval_func(func1); - loadkey_num(index, 63.75f); - checkval_func(func2); - return 0; -} - -TEST(create_table_num_cfunc) -{ - int index = hs_create_table - (L, hs_num_cfunc(43.3f, testfunc1), hs_num_cfunc(63.75f, testfunc2)); - loadkey_num(index, 43.3f); - checkval_cfunc(testfunc1); - loadkey_num(index, 63.75f); - checkval_cfunc(testfunc2); - return 0; -} - - -TEST(create_table_num_user) -{ - lua_newuserdata(L, sizeof(char)); - int user1 = lua_gettop(L); - lua_newuserdata(L, sizeof(char)); - int user2 = lua_gettop(L); - int index = hs_create_table - (L, hs_num_user(43.3f, user1), hs_num_user(63.75f, user2)); - loadkey_num(index, 43.3f); - checkval_user(user1); - loadkey_num(index, 63.75f); - checkval_user(user2); - return 0; -} - -TEST(create_table_num_light) -{ - int a1 = 5; - void *light1 = (void *) &a1; - int a2 = 6; - void *light2 = (void *) &a2; - int index = hs_create_table - (L, hs_num_light(43.3f, light1), hs_num_light(63.75f, light2)); - loadkey_num(index, 43.3f); - checkval_light(light1); - loadkey_num(index, 63.75f); - checkval_light(light2); - return 0; -} - - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * string keys - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - */ - -TEST(create_table_str_bool) -{ - int index = hs_create_table - (L, hs_str_bool("hello", true), hs_str_bool("world", true)); - loadkey_str(index, "hello"); - checkval_bool(true); - loadkey_str(index, "world"); - checkval_bool(true); - return 0; -} - -TEST(create_table_str_int) -{ - int index = hs_create_table - (L, hs_str_int("hello", 15), hs_str_int("world", 25)); - loadkey_str(index, "hello"); - checkval_int(15); - loadkey_str(index, "world"); - checkval_int(25); - return 0; -} - -TEST(create_table_str_num) -{ - int index = hs_create_table - (L, hs_str_num("hello", 2.718), hs_str_num("world", 1.618)); - loadkey_str(index, "hello"); - checkval_num(2.718); - loadkey_str(index, "world"); - checkval_num(1.618); - return 0; -} - -TEST(create_table_str_str) -{ - int index = hs_create_table - (L, hs_str_str("hello", "hello"), hs_str_str("world", "world")); - loadkey_str(index, "hello"); - checkval_str("hello"); - loadkey_str(index, "world"); - checkval_str("world"); - return 0; -} - -TEST(create_table_str_tbl) -{ - lua_newtable(L); - int tbl1 = lua_gettop(L); - lua_newtable(L); - int tbl2 = lua_gettop(L); - int index = hs_create_table - (L, hs_str_tbl("hello", tbl1), hs_str_tbl("world", tbl2)); - loadkey_str(index, "hello"); - checkval_tbl(tbl1); - loadkey_str(index, "world"); - checkval_tbl(tbl2); - return 0; -} - -TEST(create_table_str_func) -{ - luaL_loadstring(L, "print('hello')"); - int func1 = lua_gettop(L); - luaL_loadstring(L, "print('hello')"); - int func2 = lua_gettop(L); - int index = hs_create_table - (L, hs_str_func("hello", func1), hs_str_func("world", func2)); - loadkey_str(index, "hello"); - checkval_func(func1); - loadkey_str(index, "world"); - checkval_func(func2); - return 0; -} - -TEST(create_table_str_cfunc) -{ - int index = hs_create_table - (L, hs_str_cfunc("hello", testfunc1), hs_str_cfunc("world", testfunc2)); - loadkey_str(index, "hello"); - checkval_cfunc(testfunc1); - loadkey_str(index, "world"); - checkval_cfunc(testfunc2); - return 0; -} - - -TEST(create_table_str_user) -{ - lua_newuserdata(L, sizeof(char)); - int user1 = lua_gettop(L); - lua_newuserdata(L, sizeof(char)); - int user2 = lua_gettop(L); - int index = hs_create_table - (L, hs_str_user("hello", user1), hs_str_user("world", user2)); - loadkey_str(index, "hello"); - checkval_user(user1); - loadkey_str(index, "world"); - checkval_user(user2); - return 0; -} - -TEST(create_table_str_light) -{ - int a1 = 5; - void *light1 = (void *) &a1; - int a2 = 6; - void *light2 = (void *) &a2; - int index = hs_create_table - (L, hs_str_light("hello", light1), hs_str_light("world", light2)); - loadkey_str(index, "hello"); - checkval_light(light1); - loadkey_str(index, "world"); - checkval_light(light2); - return 0; -} - - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * table keys - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - */ - -#define create_table_keys() \ - lua_newtable(L); int table1_a = lua_gettop(L); \ - lua_newtable(L); int table2_a = lua_gettop(L); \ - lua_pushvalue(L, table1_a); int table1_b = lua_gettop(L); \ - lua_pushvalue(L, table2_a); int table2_b = lua_gettop(L); - - -TEST(create_table_tbl_bool) -{ - create_table_keys(); - int index = hs_create_table - (L, hs_tbl_bool(table1_a, true), hs_tbl_bool(table2_a, true)); - loadkey_tbl(index, table1_b); - checkval_bool(true); - loadkey_tbl(index, table2_b); - checkval_bool(true); - return 0; -} - -TEST(create_table_tbl_int) -{ - create_table_keys(); - int index = hs_create_table - (L, hs_tbl_int(table1_a, 15), hs_tbl_int(table2_a, 25)); - loadkey_tbl(index, table1_b); - checkval_int(15); - loadkey_tbl(index, table2_b); - checkval_int(25); - return 0; -} - -TEST(create_table_tbl_num) -{ - create_table_keys(); - int index = hs_create_table - (L, hs_tbl_num(table1_a, 2.718), hs_tbl_num(table2_a, 1.618)); - loadkey_tbl(index, table1_b); - checkval_num(2.718); - loadkey_tbl(index, table2_b); - checkval_num(1.618); - return 0; -} - -TEST(create_table_tbl_str) -{ - create_table_keys(); - int index = hs_create_table - (L, hs_tbl_str(table1_a, "hello"), hs_tbl_str(table2_a, "world")); - loadkey_tbl(index, table1_b); - checkval_str("hello"); - loadkey_tbl(index, table2_b); - checkval_str("world"); - return 0; -} - -TEST(create_table_tbl_tbl) -{ - create_table_keys(); - lua_newtable(L); - int tbl1 = lua_gettop(L); - lua_newtable(L); - int tbl2 = lua_gettop(L); - int index = hs_create_table - (L, hs_tbl_tbl(table1_a, tbl1), hs_tbl_tbl(table2_a, tbl2)); - loadkey_tbl(index, table1_b); - checkval_tbl(tbl1); - loadkey_tbl(index, table2_b); - checkval_tbl(tbl2); - return 0; -} - -TEST(create_table_tbl_func) -{ - create_table_keys(); - luaL_loadstring(L, "print('hello')"); - int func1 = lua_gettop(L); - luaL_loadstring(L, "print('hello')"); - int func2 = lua_gettop(L); - int index = hs_create_table - (L, hs_tbl_func(table1_a, func1), hs_tbl_func(table2_a, func2)); - loadkey_tbl(index, table1_b); - checkval_func(func1); - loadkey_tbl(index, table2_b); - checkval_func(func2); - return 0; -} - -TEST(create_table_tbl_cfunc) -{ - create_table_keys(); - int index = hs_create_table - (L, hs_tbl_cfunc(table1_a, testfunc1), hs_tbl_cfunc(table2_a, testfunc2)); - loadkey_tbl(index, table1_b); - checkval_cfunc(testfunc1); - loadkey_tbl(index, table2_b); - checkval_cfunc(testfunc2); - return 0; -} - - -TEST(create_table_tbl_user) -{ - create_table_keys(); - lua_newuserdata(L, sizeof(char)); - int user1 = lua_gettop(L); - lua_newuserdata(L, sizeof(char)); - int user2 = lua_gettop(L); - int index = hs_create_table - (L, hs_tbl_user(table1_a, user1), hs_tbl_user(table2_a, user2)); - loadkey_tbl(index, table1_b); - checkval_user(user1); - loadkey_tbl(index, table2_b); - checkval_user(user2); - return 0; -} - -TEST(create_table_tbl_light) -{ - create_table_keys(); - int a1 = 5; - void *light1 = (void *) &a1; - int a2 = 6; - void *light2 = (void *) &a2; - int index = hs_create_table - (L, hs_tbl_light(table1_a, light1), hs_tbl_light(table2_a, light2)); - loadkey_tbl(index, table1_b); - checkval_light(light1); - loadkey_tbl(index, table2_b); - checkval_light(light2); - return 0; -} - - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * * test suite * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -750,7 +291,7 @@ void hs_create_table_tests() mu_run_test("create table with boolean keys and light userdata values", \ create_table_bool_light); - /* integer keys */ + /* integer keys / mu_run_test("create table with integer keys and boolean values", create_table_int_bool); mu_run_test("create table with integer keys and integer values", \ @@ -770,7 +311,7 @@ void hs_create_table_tests() mu_run_test("create table with integer keys and light userdata values", \ create_table_int_light); - /* number keys */ + /* number keys / mu_run_test("create table with number keys and boolean values", create_table_num_bool); mu_run_test("create table with number keys and integer values", \ @@ -790,7 +331,7 @@ void hs_create_table_tests() mu_run_test("create table with number keys and light userdata values", \ create_table_num_light); - /* string keys */ + /* string keys / mu_run_test("create table with string keys and boolean values", create_table_str_bool); mu_run_test("create table with string keys and integer values", \ @@ -810,7 +351,7 @@ void hs_create_table_tests() mu_run_test("create table with string keys and light userdata values", \ create_table_str_light); - /* table keys */ + /* table keys / mu_run_test("create table with table keys and boolean values", create_table_tbl_bool); mu_run_test("create table with table keys and integer values", \ @@ -829,5 +370,6 @@ void hs_create_table_tests() create_table_tbl_user); mu_run_test("create table with table keys and light userdata values", \ create_table_tbl_light); + /**/ } |