helpers.h (5230B)
1 /* Test-only checked constructors. Each returned handle is owned until released 2 * or context teardown. Production callers use the status/out-parameter API. */ 3 #ifndef ARBORICX_TEST_HELPERS_H 4 #define ARBORICX_TEST_HELPERS_H 5 #include "arboricx.h" 6 #include <assert.h> 7 #include <stdlib.h> 8 #include <inttypes.h> 9 static inline arb_handle_t checked_arb_leaf(arb_ctx_t* ctx) { 10 arb_handle_t out; 11 arb_status_t status = arb_leaf(ctx, &out); 12 if (status != ARB_OK) abort(); 13 return out; 14 } 15 static inline arb_handle_t checked_arb_stem(arb_ctx_t* ctx, arb_handle_t child) { 16 arb_handle_t out; 17 arb_status_t status = arb_stem(ctx, child, &out); 18 if (status != ARB_OK) abort(); 19 return out; 20 } 21 static inline arb_handle_t checked_arb_fork(arb_ctx_t* ctx, arb_handle_t left, arb_handle_t right) { 22 arb_handle_t out; 23 arb_status_t status = arb_fork(ctx, left, right, &out); 24 if (status != ARB_OK) abort(); 25 return out; 26 } 27 static inline arb_handle_t checked_arb_app(arb_ctx_t* ctx, arb_handle_t func, arb_handle_t arg) { 28 arb_handle_t out; 29 arb_status_t status = arb_app(ctx, func, arg, &out); 30 if (status != ARB_OK) abort(); 31 return out; 32 } 33 static inline arb_handle_t checked_arb_reduce(arb_ctx_t* ctx, arb_handle_t root, uint64_t fuel) { 34 arb_handle_t out; 35 arb_status_t status = arb_reduce(ctx, root, fuel, &out); 36 if (status != ARB_OK) abort(); 37 return out; 38 } 39 static inline arb_handle_t checked_arb_of_number(arb_ctx_t* ctx, uint64_t n) { 40 arb_handle_t out; 41 arb_status_t status = arb_of_number(ctx, n, &out); 42 if (status != ARB_OK) abort(); 43 return out; 44 } 45 static inline arb_handle_t checked_arb_of_string(arb_ctx_t* ctx, const char* s) { 46 arb_handle_t out; 47 arb_status_t status = arb_of_string(ctx, s, &out); 48 if (status != ARB_OK) abort(); 49 return out; 50 } 51 static inline arb_handle_t checked_arb_of_bytes(arb_ctx_t* ctx, const uint8_t* bytes, size_t len) { 52 arb_handle_t out; 53 arb_status_t status = arb_of_bytes(ctx, bytes, len, &out); 54 if (status != ARB_OK) abort(); 55 return out; 56 } 57 static inline arb_handle_t checked_arb_of_list(arb_ctx_t* ctx, const arb_handle_t* items, size_t len) { 58 arb_handle_t out; 59 arb_status_t status = arb_of_list(ctx, items, len, &out); 60 if (status != ARB_OK) abort(); 61 return out; 62 } 63 static inline arb_handle_t checked_arb_get_stem_child(arb_ctx_t* ctx, arb_handle_t root) { 64 arb_handle_t out; 65 arb_status_t status = arb_get_stem_child(ctx, root, &out); 66 if (status != ARB_OK) abort(); 67 return out; 68 } 69 static inline arb_handle_t checked_arb_run_io(arb_ctx_t* ctx, arb_handle_t program, const arb_io_perms_t* perms) { 70 arb_handle_t out; 71 arb_status_t status = arb_run_io(ctx, program, perms, &out); 72 if (status != ARB_OK) abort(); 73 return out; 74 } 75 static inline arb_handle_t checked_arb_kernel_root(arb_ctx_t* ctx) { 76 arb_handle_t out; 77 arb_status_t status = arb_kernel_root(ctx, &out); 78 if (status != ARB_OK) abort(); 79 return out; 80 } 81 static inline arb_handle_t checked_arb_load_bundle(arb_ctx_t* ctx, const uint8_t* bytes, size_t len, const char* name) { 82 arb_handle_t out; 83 arb_status_t status = arb_load_bundle(ctx, bytes, len, name, &out); 84 if (status != ARB_OK) abort(); 85 return out; 86 } 87 static inline arb_handle_t checked_arb_load_bundle_default(arb_ctx_t* ctx, const uint8_t* bytes, size_t len) { 88 arb_handle_t out; 89 arb_status_t status = arb_load_bundle_default(ctx, bytes, len, &out); 90 if (status != ARB_OK) abort(); 91 return out; 92 } 93 static inline int checked_arb_is_leaf(arb_ctx_t* ctx, arb_handle_t h) { int out; if (arb_is_leaf(ctx, h, &out) != ARB_OK) abort(); return out; } 94 static inline int checked_arb_is_stem(arb_ctx_t* ctx, arb_handle_t h) { int out; if (arb_is_stem(ctx, h, &out) != ARB_OK) abort(); return out; } 95 static inline int checked_arb_is_fork(arb_ctx_t* ctx, arb_handle_t h) { int out; if (arb_is_fork(ctx, h, &out) != ARB_OK) abort(); return out; } 96 static inline int checked_arb_is_app(arb_ctx_t* ctx, arb_handle_t h) { int out; if (arb_is_app(ctx, h, &out) != ARB_OK) abort(); return out; } 97 static inline int same_value(arb_ctx_t* ctx, arb_handle_t a, arb_handle_t b) { 98 if (checked_arb_is_leaf(ctx, a)) return checked_arb_is_leaf(ctx, b); 99 arb_handle_t al, ar, bl, br; 100 if (checked_arb_is_stem(ctx, a)) { 101 if (!checked_arb_is_stem(ctx, b)) return 0; 102 assert(arb_get_stem_child(ctx, a, &al) == ARB_OK); 103 assert(arb_get_stem_child(ctx, b, &bl) == ARB_OK); 104 int same = same_value(ctx, al, bl); 105 assert(arb_release(ctx, al) == ARB_OK); assert(arb_release(ctx, bl) == ARB_OK); 106 return same; 107 } 108 int fork = checked_arb_is_fork(ctx, a); 109 if (fork != checked_arb_is_fork(ctx, b)) return 0; 110 assert((fork ? arb_get_fork_children(ctx, a, &al, &ar) : arb_get_app_func_arg(ctx, a, &al, &ar)) == ARB_OK); 111 assert((fork ? arb_get_fork_children(ctx, b, &bl, &br) : arb_get_app_func_arg(ctx, b, &bl, &br)) == ARB_OK); 112 int same = same_value(ctx, al, bl) && same_value(ctx, ar, br); 113 assert(arb_release(ctx, al) == ARB_OK); assert(arb_release(ctx, ar) == ARB_OK); 114 assert(arb_release(ctx, bl) == ARB_OK); assert(arb_release(ctx, br) == ARB_OK); 115 return same; 116 } 117 #endif