1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#include "domain/message.h"
#include "domain/search.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}
|