helpers.h (4975B)
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_kernel_root(arb_ctx_t* ctx) { 70 arb_handle_t out; 71 arb_status_t status = arb_kernel_root(ctx, &out); 72 if (status != ARB_OK) abort(); 73 return out; 74 } 75 static inline arb_handle_t checked_arb_load_bundle(arb_ctx_t* ctx, const uint8_t* bytes, size_t len, const char* name) { 76 arb_handle_t out; 77 arb_status_t status = arb_load_bundle(ctx, bytes, len, name, &out); 78 if (status != ARB_OK) abort(); 79 return out; 80 } 81 static inline arb_handle_t checked_arb_load_bundle_default(arb_ctx_t* ctx, const uint8_t* bytes, size_t len) { 82 arb_handle_t out; 83 arb_status_t status = arb_load_bundle_default(ctx, bytes, len, &out); 84 if (status != ARB_OK) abort(); 85 return out; 86 } 87 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; } 88 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; } 89 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; } 90 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; } 91 static inline int same_value(arb_ctx_t* ctx, arb_handle_t a, arb_handle_t b) { 92 if (checked_arb_is_leaf(ctx, a)) return checked_arb_is_leaf(ctx, b); 93 arb_handle_t al, ar, bl, br; 94 if (checked_arb_is_stem(ctx, a)) { 95 if (!checked_arb_is_stem(ctx, b)) return 0; 96 assert(arb_get_stem_child(ctx, a, &al) == ARB_OK); 97 assert(arb_get_stem_child(ctx, b, &bl) == ARB_OK); 98 int same = same_value(ctx, al, bl); 99 assert(arb_release(ctx, al) == ARB_OK); assert(arb_release(ctx, bl) == ARB_OK); 100 return same; 101 } 102 int fork = checked_arb_is_fork(ctx, a); 103 if (fork != checked_arb_is_fork(ctx, b)) return 0; 104 assert((fork ? arb_get_fork_children(ctx, a, &al, &ar) : arb_get_app_func_arg(ctx, a, &al, &ar)) == ARB_OK); 105 assert((fork ? arb_get_fork_children(ctx, b, &bl, &br) : arb_get_app_func_arg(ctx, b, &bl, &br)) == ARB_OK); 106 int same = same_value(ctx, al, bl) && same_value(ctx, ar, br); 107 assert(arb_release(ctx, al) == ARB_OK); assert(arb_release(ctx, ar) == ARB_OK); 108 assert(arb_release(ctx, bl) == ARB_OK); assert(arb_release(ctx, br) == ARB_OK); 109 return same; 110 } 111 #endif