]> git.ozlabs.org Git - ccan/blobdiff - ccan/tcon/test/run-container.c
tcon: Encode information on container members in "type" canaries
[ccan] / ccan / tcon / test / run-container.c
diff --git a/ccan/tcon/test/run-container.c b/ccan/tcon/test/run-container.c
new file mode 100644 (file)
index 0000000..88bb2a1
--- /dev/null
@@ -0,0 +1,59 @@
+#include <stdlib.h>
+
+#include <ccan/tcon/tcon.h>
+#include <ccan/build_assert/build_assert.h>
+#include <ccan/tap/tap.h>
+
+struct inner {
+       int inner_val;
+};
+
+struct outer {
+       int outer_val;
+       struct inner inner;
+};
+
+struct outer0 {
+       struct inner inner;
+       int outer0_val;
+};
+
+struct info_base {
+       char *infop;
+};
+
+struct info_tcon {
+       struct info_base base;
+       TCON(TCON_CONTAINER(fi, struct outer, inner);
+            TCON_CONTAINER(fi2, struct outer0, inner));
+};
+
+int main(int argc, char *argv[])
+{
+       struct info_tcon info;
+       TCON_WRAP(struct info_base,
+                 TCON_CONTAINER(fi, struct outer, inner);
+                 TCON_CONTAINER(fi2, struct outer0, inner)) infow;
+       struct outer ovar;
+       struct outer0 ovar2;
+
+       plan_tests(12);
+
+       ok1(tcon_container_of(&info, fi, &ovar.inner) == &ovar);
+       ok1(tcon_member_of(&info, fi, &ovar) == &ovar.inner);
+       ok1(tcon_container_of(&infow, fi, &ovar.inner) == &ovar);
+       ok1(tcon_member_of(&infow, fi, &ovar) == &ovar.inner);
+
+       ok1(tcon_container_of(&info, fi2, &ovar2.inner) == &ovar2);
+       ok1(tcon_member_of(&info, fi2, &ovar2) == &ovar2.inner);
+       ok1(tcon_container_of(&infow, fi2, &ovar2.inner) == &ovar2);
+       ok1(tcon_member_of(&infow, fi2, &ovar2) == &ovar2.inner);
+
+       /* Check handling of NULLs */
+       ok1(tcon_container_of(&info, fi, NULL) == NULL);
+       ok1(tcon_member_of(&info, fi, NULL) == NULL);
+       ok1(tcon_container_of(&infow, fi, NULL) == NULL);
+       ok1(tcon_member_of(&infow, fi, NULL) == NULL);
+
+       return 0;
+}