From 9cd5486484653dd8cc42b43bcde45379982c3177 Mon Sep 17 00:00:00 2001
From: "Luke T. Shumaker" <lukeshu@lukeshu.com>
Date: Sun, 26 Jan 2025 12:53:37 -0700
Subject: Add libobj, a replacement for libmisc/vcall.h that internally is more
 like Go

---
 libobj/tests/test_obj.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)
 create mode 100644 libobj/tests/test_obj.c

(limited to 'libobj/tests/test_obj.c')

diff --git a/libobj/tests/test_obj.c b/libobj/tests/test_obj.c
new file mode 100644
index 0000000..89fff68
--- /dev/null
+++ b/libobj/tests/test_obj.c
@@ -0,0 +1,61 @@
+/* libobj/tests/test_obj.c - Tests for <libobj/obj.h>
+ *
+ * Copyright (C) 2024-2025  Luke T. Shumaker <lukeshu@lukeshu.com>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#include <libobj/obj.h>
+
+#include "test.h"
+
+/* `lo_inteface frobber` header ***********************************************/
+
+#define frobber_LO_IFACE                        \
+	/** Basic function.  */                 \
+	LO_FUNC(int, frob)                      \
+	/** Function that takes 1 argument.  */ \
+	LO_FUNC(int, frob1, int)                \
+	/** Function that returns nothing.  */  \
+	LO_FUNC(void, frob0)
+LO_INTERFACE(frobber)
+
+/* `struct myclass` header ****************************************************/
+
+struct myclass {
+	int a;
+};
+LO_IMPLEMENTATION_H(frobber, struct myclass, myclass)
+
+/* `struct myclass` implementation ********************************************/
+
+LO_IMPLEMENTATION_C(frobber, struct myclass, myclass, static)
+
+static int myclass_frob(struct myclass *self) {
+	test_assert(self);
+	return self->a;
+}
+
+static int myclass_frob1(struct myclass *self, int arg) {
+	test_assert(self);
+	return arg;
+}
+
+static void myclass_frob0(struct myclass *self) {
+	test_assert(self);
+}
+
+/* main test body *************************************************************/
+
+#define MAGIC1 909837
+#define MAGIC2 657441
+
+int main() {
+	struct myclass obj = {
+		.a = MAGIC1,
+	};
+	lo_interface frobber iface = lo_box_myclass_as_frobber(&obj);
+	test_assert(LO_CALL(iface, frob) == MAGIC1);
+	test_assert(LO_CALL(iface, frob1, MAGIC2) == MAGIC2);
+	LO_CALL(iface, frob0);
+	return 0;
+}
-- 
cgit v1.2.3-2-g168b