#include #include "runtime/runtime.h" /* Check basic relative pointer behaviour */ static rt_result RelPtrTest(void) { char buf[sizeof(rt_relptr) + sizeof(unsigned int)]; rt_relptr *ptr = (rt_relptr *)buf; unsigned int *target = (unsigned int *)&buf[sizeof(rt_relptr)]; *target = 42; rtSetRelptr(ptr, target); void *resolved = rtResolveRelptr(ptr); if ((uintptr_t)resolved != (uintptr_t)target) return 1; if (*(unsigned int *)resolved != *target) return 2; return RT_SUCCESS; } static rt_result NegRelPtrTest(void) { char buf[sizeof(unsigned int) + sizeof(rt_relptr)]; unsigned int *target = (unsigned int *)buf; rt_relptr *ptr = (rt_relptr *)&buf[sizeof(unsigned int)]; *target = 42; rtSetRelptr(ptr, target); void *resolved = rtResolveRelptr(ptr); if ((uintptr_t)resolved != (uintptr_t)target) return 1; if (*(unsigned int *)resolved != *target) return 2; return RT_SUCCESS; } /* Scaffolding * * Run all the test cases, output if they passed or failed. */ typedef rt_result rt_test_fnc(void); typedef struct { const char *name; rt_test_fnc *fnc; } rt_test_case; #define TEST_CASE(fn) { .name = #fn, .fnc = fn, } static rt_test_case _test_cases[] = {TEST_CASE(RelPtrTest), TEST_CASE(NegRelPtrTest)}; int main() { int out = 0; for (size_t i = 0; i < RT_ARRAY_COUNT(_test_cases); ++i) { printf("[%s] ... ", _test_cases[i].name); rt_result res = _test_cases[i].fnc(); if (res == RT_SUCCESS) { printf("OK\n"); } else { printf("FAILED (%u)\n", res); ++out; } } return out; }