summaryrefslogtreecommitdiff
path: root/libs/honeysuckle/src/tests/hs_parse_overloaded_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/honeysuckle/src/tests/hs_parse_overloaded_tests.c')
-rw-r--r--libs/honeysuckle/src/tests/hs_parse_overloaded_tests.c188
1 files changed, 188 insertions, 0 deletions
diff --git a/libs/honeysuckle/src/tests/hs_parse_overloaded_tests.c b/libs/honeysuckle/src/tests/hs_parse_overloaded_tests.c
new file mode 100644
index 0000000..0680253
--- /dev/null
+++ b/libs/honeysuckle/src/tests/hs_parse_overloaded_tests.c
@@ -0,0 +1,188 @@
+#include "hs_tests.h"
+
+static int testfunc(lua_State *L) { return 0; }
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * tests for hs_parse_overloaded
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+#define PARSE_OVERLOADED \
+ bool b; lua_Integer i; int ti, fi, ni; lua_Number f; \
+ char *str; lua_CFunction fn; void *user, *light; \
+ int choice = hs_parse_overloaded \
+ (L, \
+ hs_overload(hs_bool(b)), \
+ hs_overload(hs_int(i)), \
+ hs_overload(hs_num(f)), \
+ hs_overload(hs_str(str)), \
+ hs_overload(hs_tbl(ti)), \
+ hs_overload(hs_func(fi)), \
+ hs_overload(hs_cfunc(fn)), \
+ hs_overload(hs_user(user)), \
+ hs_overload(hs_light(light)), \
+ hs_overload(hs_nil(ni)));
+
+TEST(parse_bool_overloaded)
+{
+ lua_pushboolean(L, true);
+ PARSE_OVERLOADED;
+ mu_assert("boolean option was not chosen!", choice == 0);
+ mu_assert("failed to properly parse boolean!", b);
+ return 0;
+}
+
+TEST(parse_integer_overloaded)
+{
+ lua_pushinteger(L, 5);
+ PARSE_OVERLOADED;
+ mu_assert("integer option was not chosen!", choice == 1);
+ mu_assert("failed to properly parse integer!", i == 5);
+ return 0;
+}
+
+TEST(parse_number_overloaded)
+{
+ lua_pushnumber(L, 42.0f);
+ PARSE_OVERLOADED;
+ mu_assert("number option was not chosen!", choice == 2);
+ mu_assert("failed to properly parse boolean!", f == 42.0f);
+ return 0;
+}
+
+TEST(parse_string_overloaded)
+{
+ lua_pushstring(L, "hello, world!");
+ PARSE_OVERLOADED;
+ mu_assert("string option was not chosen!", choice == 3);
+ mu_assert("failed to properly parse string!",
+ strcmp(str, "hello, world!") == 0);
+ return 0;
+}
+
+TEST(parse_table_overloaded)
+{
+ lua_getglobal(L, "debug");
+ int expected = lua_gettop(L);
+ PARSE_OVERLOADED;
+ mu_assert("table option was not chosen!", choice == 4);
+ mu_assert("failed to properly parse table!", ti == expected);
+ return 0;
+}
+
+TEST(parse_function_overloaded)
+{
+ luaL_loadstring(L, "print('hello, world!')");
+ int expected = lua_gettop(L);
+ PARSE_OVERLOADED;
+ mu_assert("function option was not chosen!", choice == 5);
+ mu_assert("failed to properly parse function!", fi == expected);
+ return 0;
+}
+
+TEST(parse_cfunction_overloaded)
+{
+ lua_pushcfunction(L, testfunc);
+ PARSE_OVERLOADED;
+ mu_assert("C function option was not chosen!", choice == 6);
+ mu_assert("failed to properly parse C function!", fn == testfunc);
+ return 0;
+}
+
+TEST(parse_userdata_overloaded)
+{
+ void *userdata = lua_newuserdata(L, sizeof(char));
+ PARSE_OVERLOADED;
+ mu_assert("userdata option was not chosen!", choice == 7);
+ mu_assert("failed to properly parse userdata!", user == userdata);
+ return 0;
+}
+
+TEST(parse_lightuserdata_overloaded)
+{
+ int five = 5;
+ lua_pushlightuserdata(L, &five);
+ PARSE_OVERLOADED;
+ mu_assert("light userdata option was not chosen!", choice == 8);
+ mu_assert("failed to properly parse light userdata!", light == &five);
+ return 0;
+}
+
+TEST(parse_nil_overloaded)
+{
+ lua_pushnil(L);
+ int expected = lua_gettop(L);
+ PARSE_OVERLOADED;
+ mu_assert("nil option was not chosen!", choice == 9);
+ mu_assert("failed to properly parse nil!", ni == expected);
+ return 0;
+}
+
+TEST(parse_2_3_overload_0)
+{
+ lua_pushinteger(L, 69);
+ lua_pushstring(L, "foo");
+ lua_Integer i; char *str; void *data;
+ int choice = hs_parse_overloaded
+ (L,
+ hs_overload(hs_int(i), hs_str(str)),
+ hs_overload(hs_int(i), hs_str(str), hs_user(data)));
+
+ mu_assert("incorrectly selected option other than 0!", choice == 0);
+ mu_assert("failed to properly parse integer!", i == 69);
+ mu_assert("failed to properly parse string!", strcmp(str, "foo") == 0);
+ return 0;
+}
+
+TEST(parse_2_3_overload_1)
+{
+ lua_pushinteger(L, 69);
+ lua_pushstring(L, "foo");
+ void *userdata = lua_newuserdata(L, sizeof(char));
+ lua_Integer i; char *str; void *data;
+ int choice = hs_parse_overloaded
+ (L,
+ hs_overload(hs_int(i), hs_str(str)),
+ hs_overload(hs_int(i), hs_str(str), hs_user(data)));
+
+ mu_assert("incorrectly selected option other than 1!", choice == 1);
+ mu_assert("failed to properly parse integer!", i == 69);
+ mu_assert("failed to properly parse string!", strcmp(str, "foo") == 0);
+ mu_assert("failed to properly parse userdata!", userdata == data);
+ return 0;
+}
+
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * test suite
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+void hs_parse_overloaded_tests()
+{
+ /* the commented tests below require more work to ensure that
+ * they function correctly. Due to type ambiguities that are
+ * useful in other contexts, overloads differing only in a
+ * number/integer, function/cfunction, or userdata/lightuserdata
+ * in the same position are not readily distinguishable from one
+ * another.
+ */
+
+ printf("running hs_parse_overloaded() parsing tests...\n");
+ mu_run_test("parse bool overloaded", parse_bool_overloaded);
+ mu_run_test("parse integer overloaded", parse_integer_overloaded);
+ // mu_run_test("parse number overloaded", parse_number_overloaded);
+ mu_run_test("parse string overloaded", parse_string_overloaded);
+ mu_run_test("parse table overloaded", parse_table_overloaded);
+ mu_run_test("parse function overloaded", parse_function_overloaded);
+ // mu_run_test("parse cfunction overloaded", parse_cfunction_overloaded);
+ mu_run_test("parse userdata overloaded", parse_userdata_overloaded);
+ // mu_run_test("parse lightuserdata overloaded", parse_lightuserdata_overloaded);
+ mu_run_test("parse nil overloaded", parse_nil_overloaded);
+ mu_run_test("parse 2/3 overload 0", parse_2_3_overload_0);
+ mu_run_test("parse 2/3 overload 1", parse_2_3_overload_1);
+}