Add more dbuf_str tests

This commit is contained in:
jun 2025-05-16 10:12:04 +02:00
parent 614a9716cc
commit 8b78803ad8

View File

@ -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); dbuf_str_try_push(&strings, &short_str, GUF_CPY_MOVE, &err);
TEST_CHECK(err == GUF_ERR_NONE); 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(str_allocator_ctx.tracker.alloc_count == 1 + (i*3));
TEST_CHECK(guf_str_is_uninit(&long_str)); 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); dbuf_str_try_push(&strings, &long_str, GUF_CPY_DEEP, &err);
TEST_CHECK(err == GUF_ERR_NONE); TEST_CHECK(err == GUF_ERR_NONE);
dbuf_str_try_push(&strings, &short_str, GUF_CPY_DEEP, &err); dbuf_str_try_push(&strings, &short_str, GUF_CPY_DEEP, &err);
TEST_CHECK(err == GUF_ERR_NONE); 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_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)); 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.free_count == n);
TEST_CHECK(str_allocator_ctx.tracker.alloc_count == 3 * 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("<END>")));
}
}
std::vector<guf_str_view> delims = {guf_str_view{.str = "<END>", .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 = "<END>", .len = 5}));
++tok_n;
}
TEST_CHECK(tok_n == 1);
}
++i;
}
dbuf_str_free(&strings, NULL); dbuf_str_free(&strings, NULL);
TEST_CHECK(!guf_alloc_tracker_found_leak(&str_allocator_ctx.tracker)); TEST_CHECK(!guf_alloc_tracker_found_leak(&str_allocator_ctx.tracker));
} }