223 lines
6.9 KiB
C
223 lines
6.9 KiB
C
#include <string.h>
|
|
|
|
#include <marisa_alpha.h>
|
|
|
|
#include "assert.h"
|
|
|
|
void TestHandle(void) {
|
|
marisa_alpha_trie *trie = NULL;
|
|
|
|
TEST_START();
|
|
|
|
ASSERT(marisa_alpha_init(&trie) == MARISA_ALPHA_OK);
|
|
ASSERT(marisa_alpha_init(&trie) == MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_end(trie) == MARISA_ALPHA_OK);
|
|
ASSERT(marisa_alpha_end(NULL) == MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_build(NULL, NULL, 0, NULL, NULL, NULL, 0) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_mmap(NULL, NULL, 0, 0) == MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_map(NULL, NULL, 0) == MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_load(NULL, NULL, 0, 0) == MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_fread(NULL, NULL) == MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_read(NULL, 0) == MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_save(NULL, NULL, 0, 0, 0) == MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_fwrite(NULL, NULL) == MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_write(NULL, 0) == MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_restore(NULL, 0, NULL, 0, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_lookup(NULL, NULL, 0, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_find(NULL, NULL, 0, NULL, NULL, 0, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_find_first(NULL, NULL, 0, NULL, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_find_last(NULL, NULL, 0, NULL, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_find_callback(NULL, NULL, 0, NULL, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_predict(NULL, NULL, 0, NULL, 0, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_predict_breadth_first(NULL, NULL, 0, NULL, 0, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_predict_depth_first(NULL, NULL, 0, NULL, 0, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
ASSERT(marisa_alpha_predict_callback(NULL, NULL, 0, NULL, NULL) ==
|
|
MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
ASSERT(marisa_alpha_get_num_tries(NULL) == 0);
|
|
ASSERT(marisa_alpha_get_num_keys(NULL) == 0);
|
|
ASSERT(marisa_alpha_get_num_nodes(NULL) == 0);
|
|
ASSERT(marisa_alpha_get_total_size(NULL) == 0);
|
|
|
|
ASSERT(marisa_alpha_clear(NULL) == MARISA_ALPHA_HANDLE_ERROR);
|
|
|
|
TEST_END();
|
|
}
|
|
|
|
int callback_for_find(void *num_keys,
|
|
marisa_alpha_uint32 key_id, size_t key_length) {
|
|
ASSERT(*(size_t *)num_keys == 0);
|
|
ASSERT(key_id == 1);
|
|
ASSERT(key_length == 3);
|
|
++*(size_t *)num_keys;
|
|
return 1;
|
|
}
|
|
|
|
int callback_for_predict(void *num_keys,
|
|
marisa_alpha_uint32 key_id, const char *key, size_t key_length) {
|
|
ASSERT(*(size_t *)num_keys < 2);
|
|
switch (*(size_t *)num_keys) {
|
|
case 0: {
|
|
ASSERT(key_id == 0);
|
|
ASSERT(key_length == 3);
|
|
ASSERT(strcmp(key, "app") == 0);
|
|
break;
|
|
}
|
|
case 1: {
|
|
ASSERT(key_id == 3);
|
|
ASSERT(key_length == 5);
|
|
ASSERT(strcmp(key, "apple") == 0);
|
|
break;
|
|
}
|
|
}
|
|
++*(size_t *)num_keys;
|
|
return 1;
|
|
}
|
|
|
|
void TestTrie() {
|
|
marisa_alpha_trie *trie = NULL;
|
|
const char *keys[8];
|
|
marisa_alpha_uint32 key_ids[8];
|
|
size_t i;
|
|
char key_buf[16];
|
|
size_t key_length;
|
|
marisa_alpha_uint32 key_id;
|
|
marisa_alpha_uint32 found_key_ids[8];
|
|
size_t found_key_lengths[8];
|
|
size_t num_found_keys;
|
|
|
|
TEST_START();
|
|
|
|
ASSERT(marisa_alpha_init(&trie) == MARISA_ALPHA_OK);
|
|
|
|
ASSERT(marisa_alpha_get_num_tries(trie) == 0);
|
|
ASSERT(marisa_alpha_get_num_keys(trie) == 0);
|
|
ASSERT(marisa_alpha_get_num_nodes(trie) == 0);
|
|
ASSERT(marisa_alpha_get_total_size(trie) ==
|
|
(sizeof(marisa_alpha_uint32) * 23));
|
|
|
|
ASSERT(marisa_alpha_build(trie, NULL, 0, NULL, NULL, NULL, 0) ==
|
|
MARISA_ALPHA_OK);
|
|
|
|
ASSERT(marisa_alpha_get_num_tries(trie) == 1);
|
|
ASSERT(marisa_alpha_get_num_keys(trie) == 0);
|
|
ASSERT(marisa_alpha_get_num_nodes(trie) == 1);
|
|
|
|
keys[0] = "apple";
|
|
keys[1] = "and";
|
|
keys[2] = "Bad";
|
|
keys[3] = "apple";
|
|
keys[4] = "app";
|
|
|
|
ASSERT(marisa_alpha_build(trie, keys, 5, NULL, NULL, key_ids,
|
|
1 | MARISA_ALPHA_WITHOUT_TAIL | MARISA_ALPHA_LABEL_ORDER) ==
|
|
MARISA_ALPHA_OK);
|
|
|
|
ASSERT(marisa_alpha_get_num_tries(trie) == 1);
|
|
ASSERT(marisa_alpha_get_num_keys(trie) == 4);
|
|
ASSERT(marisa_alpha_get_num_nodes(trie) == 11);
|
|
|
|
ASSERT(key_ids[0] == 3);
|
|
ASSERT(key_ids[1] == 1);
|
|
ASSERT(key_ids[2] == 0);
|
|
ASSERT(key_ids[3] == 3);
|
|
ASSERT(key_ids[4] == 2);
|
|
|
|
for (i = 0; i < marisa_alpha_get_num_tries(trie); ++i) {
|
|
ASSERT(marisa_alpha_restore(trie,
|
|
key_ids[i], key_buf, sizeof(key_buf), &key_length) == MARISA_ALPHA_OK);
|
|
ASSERT(key_length == strlen(keys[i]));
|
|
ASSERT(strcmp(key_buf, keys[i]) == 0);
|
|
|
|
ASSERT(marisa_alpha_lookup(trie,
|
|
keys[i], MARISA_ALPHA_ZERO_TERMINATED, &key_id) == MARISA_ALPHA_OK);
|
|
ASSERT(key_id == key_ids[i]);
|
|
|
|
ASSERT(marisa_alpha_lookup(trie,
|
|
keys[i], strlen(keys[i]), &key_id) == MARISA_ALPHA_OK);
|
|
ASSERT(key_id == key_ids[i]);
|
|
}
|
|
|
|
ASSERT(marisa_alpha_clear(trie) == MARISA_ALPHA_OK);
|
|
|
|
ASSERT(marisa_alpha_get_num_tries(trie) == 0);
|
|
ASSERT(marisa_alpha_get_num_keys(trie) == 0);
|
|
ASSERT(marisa_alpha_get_num_nodes(trie) == 0);
|
|
ASSERT(marisa_alpha_get_total_size(trie) ==
|
|
(sizeof(marisa_alpha_uint32) * 23));
|
|
|
|
ASSERT(marisa_alpha_build(trie, keys, 5, NULL, NULL, key_ids,
|
|
1 | MARISA_ALPHA_WITHOUT_TAIL | MARISA_ALPHA_WEIGHT_ORDER) ==
|
|
MARISA_ALPHA_OK);
|
|
|
|
ASSERT(marisa_alpha_get_num_tries(trie) == 1);
|
|
ASSERT(marisa_alpha_get_num_keys(trie) == 4);
|
|
ASSERT(marisa_alpha_get_num_nodes(trie) == 11);
|
|
|
|
ASSERT(key_ids[0] == 3);
|
|
ASSERT(key_ids[1] == 1);
|
|
ASSERT(key_ids[2] == 2);
|
|
ASSERT(key_ids[3] == 3);
|
|
ASSERT(key_ids[4] == 0);
|
|
|
|
ASSERT(marisa_alpha_find(trie, "ap", MARISA_ALPHA_ZERO_TERMINATED,
|
|
found_key_ids, found_key_lengths, 8, &num_found_keys) ==
|
|
MARISA_ALPHA_OK);
|
|
ASSERT(num_found_keys == 0);
|
|
|
|
ASSERT(marisa_alpha_find(trie, "applex", MARISA_ALPHA_ZERO_TERMINATED,
|
|
found_key_ids, found_key_lengths, 8, &num_found_keys) ==
|
|
MARISA_ALPHA_OK);
|
|
ASSERT(num_found_keys == 2);
|
|
ASSERT(found_key_ids[0] == key_ids[4]);
|
|
ASSERT(found_key_lengths[0] == 3);
|
|
ASSERT(found_key_ids[1] == key_ids[0]);
|
|
ASSERT(found_key_lengths[1] == 5);
|
|
|
|
num_found_keys = 0;
|
|
ASSERT(marisa_alpha_find_callback(trie, "anderson",
|
|
MARISA_ALPHA_ZERO_TERMINATED,
|
|
callback_for_find, &num_found_keys) == MARISA_ALPHA_OK);
|
|
ASSERT(num_found_keys == 1);
|
|
|
|
ASSERT(marisa_alpha_predict(trie, "a", MARISA_ALPHA_ZERO_TERMINATED,
|
|
found_key_ids, 8, &num_found_keys) == MARISA_ALPHA_OK);
|
|
ASSERT(num_found_keys == 3);
|
|
ASSERT(found_key_ids[0] == key_ids[4]);
|
|
ASSERT(found_key_ids[1] == key_ids[1]);
|
|
ASSERT(found_key_ids[2] == key_ids[0]);
|
|
|
|
num_found_keys = 0;
|
|
ASSERT(marisa_alpha_predict_callback(trie, "app",
|
|
MARISA_ALPHA_ZERO_TERMINATED,
|
|
callback_for_predict, &num_found_keys) == MARISA_ALPHA_OK);
|
|
|
|
ASSERT(marisa_alpha_end(trie) == MARISA_ALPHA_OK);
|
|
|
|
TEST_END();
|
|
}
|
|
|
|
int main(void) {
|
|
TestHandle();
|
|
TestTrie();
|
|
|
|
return 0;
|
|
}
|