diff options
Diffstat (limited to 'tests/domain_test.c')
| -rw-r--r-- | tests/domain_test.c | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/tests/domain_test.c b/tests/domain_test.c index d50e4bd..4553657 100644 --- a/tests/domain_test.c +++ b/tests/domain_test.c @@ -5,6 +5,8 @@ #include <stdlib.h> #include <string.h> +#include "base/allocator.h" + static int failures; #define CHECK(value) \ do \ @@ -17,6 +19,18 @@ static int failures; } \ while (0) +static char * +duplicate_string(const char *value) +{ + const size_t length = strlen(value); + char *copy = malloc(length + 1); + if (copy != NULL) + { + memcpy(copy, value, length + 1); + } + return copy; +} + int main(void) { @@ -27,32 +41,44 @@ main(void) tiny_message_t original, copy; tiny_search_index_t *search; size_t *candidates = NULL, candidate_count = 0; + size_t failure_index; + + tiny_allocator_reset(); CHECK(tiny_role_parse("user", &role) && role == TINY_ROLE_USER); + CHECK(!tiny_role_parse(NULL, &role)); + CHECK(!tiny_role_parse("user", NULL)); CHECK(!tiny_role_parse("tool", &role)); CHECK(tiny_tier_parse("discard", &tier) && tier == TINY_TIER_DISCARD); CHECK(!tiny_tier_parse("archive", &tier)); + CHECK(!tiny_tier_parse(NULL, &tier)); + CHECK(!tiny_tier_parse("short", NULL)); + CHECK(tiny_utf8_valid(NULL, 0)); + CHECK(!tiny_utf8_valid(NULL, 1)); CHECK(tiny_utf8_valid(valid_utf8, strlen(valid_utf8))); CHECK(!tiny_utf8_valid(invalid_utf8, sizeof(invalid_utf8) - 1)); CHECK(tiny_message_id_valid("01ARZ3NDEKTSV4RRFFQ69G5FAV")); CHECK(!tiny_message_id_valid("81ARZ3NDEKTSV4RRFFQ69G5FAV")); CHECK(!tiny_message_id_valid("01ARZ3NDEKTSV4RRFFQ69G5FAI")); + CHECK(!tiny_message_id_valid(NULL)); + CHECK(!tiny_message_id_valid("01ARZ3NDEKTSV4RRFFQ69G5FA")); + CHECK(!tiny_message_id_valid("01ARZ3NDEKTSV4RRFFQ69G5FAV0")); tiny_message_init(&original); tiny_message_init(©); - original.session_id = _strdup("session"); - original.content = _strdup("content"); + original.session_id = duplicate_string("session"); + original.content = duplicate_string("content"); original.role = TINY_ROLE_ASSISTANT; - strcpy_s(original.message_id, sizeof(original.message_id), "01ARZ3NDEKTSV4RRFFQ69G5FAV"); + snprintf(original.message_id, sizeof(original.message_id), "%s", "01ARZ3NDEKTSV4RRFFQ69G5FAV"); CHECK(tiny_message_copy(©, &original) == 0); CHECK(copy.session_id != original.session_id); CHECK(strcmp(copy.content, "content") == 0); search = tiny_search_index_create(); CHECK(search != NULL); free(original.content); - original.content = _strdup("Curry and coffee"); + original.content = duplicate_string("Curry and coffee"); original.metadata.tags = calloc(1, sizeof(char *)); - original.metadata.tags[0] = _strdup("設計メモ"); + original.metadata.tags[0] = duplicate_string("設計メモ"); original.metadata.tag_count = 1; CHECK(tiny_search_index_add(search, &original, 7)); CHECK(tiny_search_index_candidates(search, "CURRY", &candidates, &candidate_count)); @@ -64,8 +90,37 @@ main(void) CHECK(candidate_count == 1 && candidates[0] == 7); CHECK(tiny_search_score("設計", &original) > 0.0); free(candidates); + + CHECK(!tiny_search_index_add(NULL, &original, 0)); + CHECK(!tiny_search_index_add(search, NULL, 0)); + CHECK(!tiny_search_index_candidates(NULL, "x", &candidates, &candidate_count)); + CHECK(!tiny_search_index_candidates(search, NULL, &candidates, &candidate_count)); + CHECK(!tiny_search_index_candidates(search, "x", NULL, &candidate_count)); + CHECK(tiny_search_score(NULL, &original) == 0.0); + CHECK(tiny_search_score("x", NULL) == 0.0); + + original.metadata.tool_call_id = duplicate_string("tool"); + original.metadata.tags = realloc(original.metadata.tags, 2 * sizeof(char *)); + original.metadata.tags[1] = duplicate_string("second"); + original.metadata.tag_count = 2; + for (failure_index = 0; failure_index < 16; ++failure_index) + { + const size_t baseline = tiny_allocator_outstanding(); + tiny_message_t swept; + tiny_allocator_fail_after(failure_index); + if (tiny_message_copy(&swept, &original) == 0) + { + tiny_message_free(&swept); + CHECK(tiny_allocator_outstanding() == baseline); + break; + } + CHECK(tiny_allocator_outstanding() == baseline); + } + CHECK(failure_index < 16); + tiny_allocator_reset(); tiny_search_index_free(search); tiny_message_free(&original); tiny_message_free(©); + CHECK(tiny_allocator_outstanding() == 0); return failures == 0 ? 0 : 1; } |
