summaryrefslogtreecommitdiff
path: root/tests/common/test_input_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/common/test_input_alloc.c')
-rw-r--r--tests/common/test_input_alloc.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/common/test_input_alloc.c b/tests/common/test_input_alloc.c
new file mode 100644
index 0000000..e311dc0
--- /dev/null
+++ b/tests/common/test_input_alloc.c
@@ -0,0 +1,48 @@
+#include "common/input.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* This executable compiles input.c with malloc redirected here. */
+static int allocations = -1;
+void *yasl_test_malloc(size_t bytes)
+{
+ if (allocations == 0) return NULL;
+ if (allocations > 0) allocations--;
+ return calloc(1, bytes);
+}
+
+int main(void)
+{
+ struct yasl_surface *surface = (struct yasl_surface *)(uintptr_t)1;
+ for (int failure = 0; failure < 2; failure++) {
+ struct input_queue q = {0};
+ struct yasl_input_event in = {.surface = surface, .kind = YASL_INPUT_PASTE,
+ .paste = {"payload", 7}}, out;
+ /* Fail either payload allocation or the initial event-array allocation. */
+ allocations = failure;
+ assert(!input_queue_push(&q, &in));
+ assert(input_queue_pop(&q, &out) && out.kind == YASL_INPUT_RESET);
+ assert(out.surface == surface);
+ assert(!input_queue_pop(&q, &out));
+ input_queue_clear(&q);
+
+ allocations = -1;
+ assert(input_queue_push(&q, &in));
+ assert(input_queue_pop(&q, &out));
+ const char *last = out.paste.text;
+ for (size_t i = 0; i < q.capacity; i++) assert(input_queue_push(&q, &in));
+ allocations = failure;
+ assert(!input_queue_push(&q, &in));
+ assert(strcmp(last, "payload") == 0);
+ assert(!q.count && q.reset_pending);
+ allocations = -1;
+ in = (struct yasl_input_event){.surface = surface, .kind = YASL_INPUT_KEY,
+ .key.action = YASL_KEY_RELEASE};
+ assert(input_queue_push(&q, &in));
+ assert(input_queue_pop(&q, &out) && out.kind == YASL_INPUT_RESET);
+ assert(input_queue_pop(&q, &out) && out.key.action == YASL_KEY_RELEASE);
+ input_queue_clear(&q);
+ }
+ return 0;
+}