#include "domain/message.h" #include "domain/search.h" #include #include #include static int failures; #define CHECK(value) \ do \ { \ if (!(value)) \ { \ fprintf(stderr, "CHECK failed at line %d: %s\n", __LINE__, #value); \ failures++; \ } \ } \ while (0) int main(void) { tiny_role_t role; tiny_memory_tier_t tier; const char valid_utf8[] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; const char invalid_utf8[] = "\xc0\xaf"; tiny_message_t original, copy; tiny_search_index_t *search; size_t *candidates = NULL, candidate_count = 0; CHECK(tiny_role_parse("user", &role) && role == TINY_ROLE_USER); CHECK(!tiny_role_parse("tool", &role)); CHECK(tiny_tier_parse("discard", &tier) && tier == TINY_TIER_DISCARD); CHECK(!tiny_tier_parse("archive", &tier)); 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")); tiny_message_init(&original); tiny_message_init(©); original.session_id = _strdup("session"); original.content = _strdup("content"); original.role = TINY_ROLE_ASSISTANT; strcpy_s(original.message_id, sizeof(original.message_id), "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.metadata.tags = calloc(1, sizeof(char *)); original.metadata.tags[0] = _strdup("設計メモ"); original.metadata.tag_count = 1; CHECK(tiny_search_index_add(search, &original, 7)); CHECK(tiny_search_index_candidates(search, "CURRY", &candidates, &candidate_count)); CHECK(candidate_count == 1 && candidates[0] == 7); CHECK(tiny_search_score("curry", &original) > 1.0); free(candidates); candidates = NULL; CHECK(tiny_search_index_candidates(search, "設計", &candidates, &candidate_count)); CHECK(candidate_count == 1 && candidates[0] == 7); CHECK(tiny_search_score("設計", &original) > 0.0); free(candidates); tiny_search_index_free(search); tiny_message_free(&original); tiny_message_free(©); return failures == 0 ? 0 : 1; }