summaryrefslogtreecommitdiff
path: root/src/tests/hs_create_table_tests.c
blob: e2c8ca8e5fc51e56fdf1459898c9ed409d637783 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "hs_tests.h"

static int testfunc(lua_State *L) { return 0; }

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * tests for hs_create_table
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

TEST(table_correct_index)
{
    int index = hs_create_table(L);
    mu_assert("returned incorrect index!", index == lua_gettop(L));
    return 0;
}

#define load_key(index, value, pushf) do {		\
      pushf(L, value); lua_gettable(L, index);		\
      mu_assert("value at key '" #value "' is nil!",	\
		!lua_isnil(L, -1));			\
   } while(0)

#define loadkey_bool(index, value)		\
   load_key(index, value, lua_pushboolean)
#define loadkey_int(index, value)		\
   load_key(index, value, lua_pushinteger)
#define loadkey_num(index, value)		\
   load_key(index, value, lua_pushnumber)
#define loadkey_tbl(index, value) do {				\
      lua_pushvalue(L, value); lua_gettable(L, index);		\
      mu_assert("value at table (index '" #value "') is nil!",	\
		!lua_isnil(L, -1));				\
   } while(0)
#define loadkey_func(index, value) do {					\
      lua_pushvalue(L, value); lua_gettable(L, index);			\
      mu_assert("value at function (index '" #value "') is nil!",	\
		!lua_isnil(L, -1));					\
   } while(0)
#define loadkey_cfunc(index, value)		\
   load_key(index, value, lua_pushcfunction)
#define loadkey_user(index, value) do {					\
      lua_pushvalue(L, value); lua_gettable(L, index);			\
      mu_assert("value at userdata (index '" #value "') is nil!",	\
		!lua_isnil(L, -1));					\
   } while(0)
#define loadkey_light(index, value)			\
   load_key(index, value, lua_pushlightuserdata)

#define check_value(is_type, typestring, type, conversion, comparison)	\
   do {									\
      mu_assert("value is not of type " typestring, is_type(L, -1));	\
      type value = conversion(L, -1); lua_pop(L, 1);			\
      mu_assert("test " #comparison " failed!", (comparison));	\
      lua_pop(L, 1); /* remove key */					\
   } while(0)

static inline compare_ptrs(lua_State *L, int index0, int index1)
{
   return lua_topointer(L, index0) == lua_topointer(L, index1);
}

#define checkval_bool(expected)			\
   check_value(lua_isboolean, "boolean", bool, lua_toboolean, value==expected)
#define checkval_int(expected)			\
   check_value(lua_isnumber, "integer", lua_Integer, lua_tointeger, value==expected)
#define checkval_num(expected)			\
   check_value(lua_isnumber, "number", lua_Number, lua_tonumber, value==expected)
#define checkval_str(expected)			\
   check_value(lua_isstring, "string", const char *, lua_tostring, strcmp(value, expected))
#define checkval_tbl(expected)			\
   check_value(lua_istable, "table", void *, lua_topointer, value==lua_topointer(L, expected)
#define checkval_func(expected)			\
   check_value(lua_isfunction, "function", void *, lua_topointer, value==lua_topointer(L, expected))
#define checkval_cfunc(expected)			\
   check_value(lua_iscfunction, "C function", lua_CFunction, lua_tocfunction, value==expected)
#define checkval_user(expected)			\
   check_value(lua_isuserdata, "userdata", void *, lua_topointer, value==lua_topointer(L, expected))
#define checkval_light(expected)			\
   check_value(lua_islightuserdata, "light userdata", void *, lua_tolightuserdata, value==expected)

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

TEST(create_table_bool_bool)
{
   int index = hs_create_table
      (L, hs_bool_bool(true, true), hs_bool_bool(false, true));
   loadkey_bool(index, true);
   checkval_bool(true);
   loadkey_bool(index, false);
   checkval_bool(true);
   return 0;
}

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * test suite
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

void hs_create_table_tests()
{
    printf("running hs_create_table() tests...\n");
    mu_run_test("return correct stack index", table_correct_index);
    mu_run_test("create table with boolean keys and boolean values",
		create_table_bool_bool);
}