summaryrefslogtreecommitdiff
path: root/tests/domain_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/domain_test.c')
-rw-r--r--tests/domain_test.c65
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(&copy);
- 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(&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(&copy);
+ CHECK(tiny_allocator_outstanding() == 0);
return failures == 0 ? 0 : 1;
}