summaryrefslogtreecommitdiff
path: root/tests/domain_test.c
blob: 455365721b8f95619d43fab4a45f8ae2b8659bd7 (plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "domain/message.h"
#include "domain/search.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "base/allocator.h"

static int failures;
#define CHECK(value)                                                                               \
  do                                                                                               \
    {                                                                                              \
      if (!(value))                                                                                \
        {                                                                                          \
          fprintf(stderr, "CHECK failed at line %d: %s\n", __LINE__, #value);                      \
          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)
{
  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;
  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 = duplicate_string("session");
  original.content = duplicate_string("content");
  original.role = TINY_ROLE_ASSISTANT;
  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 = duplicate_string("Curry and coffee");
  original.metadata.tags = calloc(1, sizeof(char *));
  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));
  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);

  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;
}