From 8b78803ad81c7ec4c20e5de861de6505607f31cf Mon Sep 17 00:00:00 2001 From: jun <83899451+zeichensystem@users.noreply.github.com> Date: Fri, 16 May 2025 10:12:04 +0200 Subject: [PATCH] Add more dbuf_str tests --- src/test/test_dbuf.cpp | 52 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/test/test_dbuf.cpp b/src/test/test_dbuf.cpp index 70c06e4..2dbc896 100644 --- a/src/test/test_dbuf.cpp +++ b/src/test/test_dbuf.cpp @@ -586,6 +586,9 @@ void DbufStrTest::test_push_insert_erase(size_t n, ptrdiff_t start_cap) dbuf_str_try_push(&strings, &short_str, GUF_CPY_MOVE, &err); TEST_CHECK(err == GUF_ERR_NONE); + strings_cpp.push_back(str.substr(0, str.size())); + strings_cpp.push_back(str.substr(0, GUF_STR_SSO_BUF_CAP - 1)); + TEST_CHECK(str_allocator_ctx.tracker.alloc_count == 1 + (i*3)); TEST_CHECK(guf_str_is_uninit(&long_str)); @@ -599,12 +602,13 @@ void DbufStrTest::test_push_insert_erase(size_t n, ptrdiff_t start_cap) dbuf_str_try_push(&strings, &long_str, GUF_CPY_DEEP, &err); TEST_CHECK(err == GUF_ERR_NONE); - dbuf_str_try_push(&strings, &short_str, GUF_CPY_DEEP, &err); TEST_CHECK(err == GUF_ERR_NONE); - TEST_CHECK(str_allocator_ctx.tracker.alloc_count == 3 + (i*3)); + strings_cpp.push_back(str.substr(0, str.size())); + strings_cpp.push_back(str.substr(0, GUF_STR_SSO_BUF_CAP - 1)); + TEST_CHECK(str_allocator_ctx.tracker.alloc_count == 3 + (i*3)); TEST_CHECK(guf_str_is_valid(&long_str) && guf_str_is_valid(&short_str)); TEST_CHECK(guf_str_view_equal_val_arg(guf_str_view_from_str(&long_str), sv_long)); @@ -620,7 +624,49 @@ void DbufStrTest::test_push_insert_erase(size_t n, ptrdiff_t start_cap) TEST_CHECK(str_allocator_ctx.tracker.free_count == n); TEST_CHECK(str_allocator_ctx.tracker.alloc_count == 3 * n); + TEST_CHECK(strings.size == 4 * (ptrdiff_t)n); + TEST_CHECK(strings.size == std::ssize(strings_cpp)); + + std::string str; + for (size_t c = 0; c < 512 + GUF_STR_SSO_BUF_CAP; ++c) { + str += c % 10 + '0'; + } + const guf_str_view sv_long = guf_str_view{.str = str.data(), .len = (ptrdiff_t)str.size()}; + const guf_str_view sv_short = guf_str_view{.str = str.data(), .len = (ptrdiff_t)GUF_STR_SSO_BUF_CAP - 1}; + size_t i = 0; + GUF_CNT_FOREACH(&strings, dbuf_str, it) { + if (TEST_CHECK(it.ptr)) { + const guf_str *s = it.ptr; + TEST_CHECK(guf_str_view_equal_val_arg(guf_str_view_from_str(s), i % 2 == 0 ? sv_long : sv_short)); + const guf_str_view sv_cpp = guf_str_view {.str = strings_cpp.at(i).data(), .len = (ptrdiff_t)strings_cpp.at(i).size()}; + TEST_CHECK(guf_str_view_equal_val_arg(guf_str_view_from_str(s), sv_cpp)); + } + ++i; + } + + GUF_CNT_FOREACH(&strings, dbuf_str, it) { + if (TEST_CHECK(it.ptr)) { + guf_str *s = it.ptr; + TEST_CHECK(guf_str_append(s, GUF_CSTR_LIT_TO_VIEW_CPP(""))); + } + } + std::vector delims = {guf_str_view{.str = "", .len = 5}}; + i = 0; + GUF_CNT_FOREACH(&strings, dbuf_str, it) { + if (TEST_CHECK(it.ptr)) { + const guf_str *s = it.ptr; + guf_str_tok_state tk_state = guf_str_tok_state_new(guf_str_view_from_str(s), delims.data(), std::ssize(delims), GUF_STR_TOK_DELIM_OPT_MATCH_LONGEST); + size_t tok_n = 0; + while (guf_str_tok_next(&tk_state, true)) { + TEST_CHECK(guf_str_view_equal_val_arg(tk_state.cur_tok , i % 2 == 0 ? sv_long : sv_short)); + TEST_CHECK(guf_str_view_equal_val_arg(tk_state.cur_delim, guf_str_view{.str = "", .len = 5})); + ++tok_n; + } + TEST_CHECK(tok_n == 1); + } + ++i; + } + dbuf_str_free(&strings, NULL); TEST_CHECK(!guf_alloc_tracker_found_leak(&str_allocator_ctx.tracker)); - } \ No newline at end of file