From 153d9b600a11025fe653a45cb4f845c0dff0b145 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Thu, 20 Mar 2025 13:59:29 -0400 Subject: pkarr: add c++ template + bump version to 0.4.2 --- test/pkarr.cpp | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 102 insertions(+), 11 deletions(-) (limited to 'test') diff --git a/test/pkarr.cpp b/test/pkarr.cpp index caed839..bc8e3be 100644 --- a/test/pkarr.cpp +++ b/test/pkarr.cpp @@ -1,53 +1,144 @@ #include +#include #include "../pkarr.h" +// TODO might be able to define a "test" class that inherits from a given +// `pk_arr_t` to make some of this testing more streamlined. +// Spinup in ctor, check bkt in dtor, log fn calls, etc. + void -test_spinup(struct pk_arr *arr, struct pk_membucket **bkt) +test_spinup(struct pk_membucket **bkt) { - memset(arr, 0, sizeof(struct pk_arr)); *bkt = pk_bucket_create("test", 1024 * 1024, false); - arr->bkt = *bkt; } void -test_teardown(struct pk_arr *arr, struct pk_membucket **bkt) +test_teardown(struct pk_membucket **bkt) { pk_bucket_destroy(*bkt); *bkt = NULL; - arr->data = NULL; } int main(int argc, char *argv[]) { (void)argc; (void)argv; - struct pk_arr arr = {}; struct pk_membucket *bkt = {}; + uint8_t val1 = 69; + uint8_t val2 = 117; /* template { - test_spinup(&arr, &bkt); + test_spinup(&bkt); test_teardown(&arr, &bkt); } */ + fprintf(stdout, "[%s] Begin\n\n", __FILE__); + + fprintf(stdout, "[%s] Starting append test\n", __FILE__); + test_spinup(&bkt); { - test_spinup(&arr, &bkt); - arr.stride = sizeof(uint8_t); + pk_arr_t arr(bkt); uint8_t c = 255; - pk_arr_append(&arr, &c); + pk_arr_append_t(&arr, c); if (arr.bkt == NULL) exit(1); if (arr.data == NULL) exit(1); if (arr.reserved == 0) exit(1); + if (arr.stride != sizeof(uint8_t)) exit(1); + if (arr.alignment != alignof(uint8_t)) exit(1); if (arr.next != 1) exit(1); + if (arr[0] != c) exit(1); - test_teardown(&arr, &bkt); + fprintf(stdout, "[%s] parameterized bkt ctor + operator[]\n", __FILE__); + } + if (bkt->allocs != 0) exit(1); + fprintf(stdout, "[%s] dtor called.\n", __FILE__); + fprintf(stdout, "[%s] Ending append test\n\n", __FILE__); + test_teardown(&bkt); + + // copy ctor + fprintf(stdout, "[%s] Starting copy ctor test\n", __FILE__); + test_spinup(&bkt); + { + pk_arr_t arr1(bkt); + pk_arr_append_t(&arr1, val1); + + // copy + pk_arr_t arr2{arr1}; + + if (arr1[0] != val1) exit(1); + if (arr2[0] != val1) exit(1); + } + if (bkt->allocs != 0) exit(1); + fprintf(stdout, "[%s] dtor called.\n", __FILE__); + fprintf(stdout, "[%s] Ending copy ctor test\n\n", __FILE__); + test_teardown(&bkt); + + // move ctor + fprintf(stdout, "[%s] Starting move ctor test\n", __FILE__); + test_spinup(&bkt); + { + pk_arr_t arr1(bkt); + pk_arr_append_t(&arr1, val1); + + // move + pk_arr_t arr2{std::move(arr1)}; + + // if (arr1[0] == val1) exit(1); + if (arr2[0] != val1) exit(1); + } + if (bkt->allocs != 0) exit(1); + fprintf(stdout, "[%s] dtor called.\n", __FILE__); + fprintf(stdout, "[%s] Ending move ctor test\n\n", __FILE__); + test_teardown(&bkt); + + // copy assignment + fprintf(stdout, "[%s] Starting copy assignment test\n", __FILE__); + test_spinup(&bkt); + { + pk_arr_t arr1(bkt); + pk_arr_append_t(&arr1, val1); + pk_arr_t arr2(bkt); + pk_arr_append_t(&arr2, val2); + + // copy + arr1 = arr2; + + if (arr1[0] != val2) exit(1); + if (arr2[0] != val2) exit(1); } + if (bkt->allocs != 0) exit(1); + fprintf(stdout, "[%s] dtor called.\n", __FILE__); + fprintf(stdout, "[%s] Ending copy assignment test\n\n", __FILE__); + test_teardown(&bkt); + + // move assignment + fprintf(stdout, "[%s] Starting move assignment test\n", __FILE__); + test_spinup(&bkt); + { + pk_arr_t arr1(bkt); + pk_arr_append_t(&arr1, val1); + pk_arr_t arr2(bkt); + pk_arr_append_t(&arr2, val2); + + // move + arr1 = std::move(arr2); + + if (arr1[0] != val2) exit(1); + // if (arr2[0] != val1) exit(1); + } + if (bkt->allocs != 0) exit(1); + fprintf(stdout, "[%s] dtor called.\n", __FILE__); + fprintf(stdout, "[%s] Ending move assignment test\n\n", __FILE__); + test_teardown(&bkt); + + fprintf(stdout, "[%s] End\n", __FILE__); return 0; } -- cgit v1.2.3