summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gl/window.c4
-rw-r--r--src/gl/window.test.c68
2 files changed, 67 insertions, 5 deletions
diff --git a/src/gl/window.c b/src/gl/window.c
index 80d636d..834d6ce 100644
--- a/src/gl/window.c
+++ b/src/gl/window.c
@@ -5,6 +5,8 @@
int gl_init(lua_State *L)
{
- glfwInit();
+ if (glfwInit() != GLFW_TRUE) {
+ hs_throw_error(L, "failed to initialize GLFW");
+ }
return 0;
}
diff --git a/src/gl/window.test.c b/src/gl/window.test.c
index 33b52a4..1403221 100644
--- a/src/gl/window.test.c
+++ b/src/gl/window.test.c
@@ -1,11 +1,16 @@
+#include <string.h>
#include <lua.h>
#include <lauxlib.h>
+#include <honeysuckle.h>
#include "test/honey-test.h"
int mock_glfwInit();
+int mock_hs_throw_error(lua_State *L, const char *format_string, ...);
#define glfwInit mock_glfwInit
+#define hs_throw_error mock_hs_throw_error
#include "gl/window.c"
#undef glfwInit
+#undef hs_throw_error
lily_mock_t *mock_glfwInit_data = NULL;
@@ -18,12 +23,45 @@ int mock_glfwInit()
return result;
}
+lily_mock_t *mock_hs_throw_error_data = NULL;
+int mock_hs_throw_error(lua_State *L, const char *format_string, ...)
+{
+ /* to avoid basically just re-implementing printf parsing here,
+ i am limiting this function to be able to receive strings only */
+
+ /* count format specifiers */
+ char *ptr = strchr(format_string, '%');
+ int n_args = 0;
+ while (ptr != NULL) {
+ n_args += 1;
+ ptr = strchr(ptr+1, '%');
+ }
+
+ /* store arguments */
+ struct lily_mock_arg_t args[] = {
+ { sizeof(const char*), &format_string },
+ { sizeof(int), &n_args },
+ };
+ lily_mock_call(mock_hs_throw_error_data, args);
+
+ /* store format arguments */
+ va_list vl;
+ va_start(vl, format_string);
+ for (int i=0; i<n_args; i++) {
+ char *str = va_arg(vl, char*);
+ mock_enqueue(mock_hs_throw_error, char*, str);
+ }
+}
+
+/* ~~~~~~~~ TESTS ~~~~~~~~ */
void gl_init_succeeds();
+void gl_init_fail_glfwInit();
void suite_window()
{
lily_run_test(gl_init_succeeds);
+ lily_run_test(gl_init_fail_glfwInit);
CLEAN_MOCK(mock_glfwInit);
}
@@ -35,13 +73,35 @@ void suite_window()
void gl_init_succeeds()
{
USE_MOCK(mock_glfwInit);
- lua_State *L = luaL_newstate();
+ USE_MOCK(mock_hs_throw_error);
/* queue success */
mock_enqueue(mock_glfwInit, int, GLFW_TRUE);
- lua_pushcfunction(L, gl_init);
- int error = lua_pcall(L, 0, 0, 0);
+ gl_init(NULL);
+
+ lily_assert_int_equal(mock_glfwInit_data->n_calls, 1);
+ lily_assert_int_equal(mock_hs_throw_error_data->n_calls, 0);
+}
+
+
+void gl_init_fail_glfwInit()
+{
+ USE_MOCK(mock_glfwInit);
+ USE_MOCK(mock_hs_throw_error);
+
+ /* queue failure */
+ mock_enqueue(mock_glfwInit, int, GLFW_FALSE);
+ gl_init(NULL);
- lily_assert_int_equal(error, 0);
lily_assert_int_equal(mock_glfwInit_data->n_calls, 1);
+ lily_assert_int_equal(mock_hs_throw_error_data->n_calls, 1);
+
+ const char *fmt; int argc;
+ struct lily_mock_arg_t args[] = {
+ { sizeof(const char*), &fmt },
+ { sizeof(int), &argc },
+ };
+ lily_get_call(mock_hs_throw_error_data, args, 0);
+
+ lily_assert_string_equal((char*) fmt, "failed to initialize GLFW");
}