tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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