#include <string.h> #include <marisa.h> #include "assert.h" void TestHandle(void) { marisa_trie *trie = NULL; TEST_START(); ASSERT(marisa_init(&trie) == MARISA_OK); ASSERT(marisa_init(&trie) == MARISA_HANDLE_ERROR); ASSERT(marisa_end(trie) == MARISA_OK); ASSERT(marisa_end(NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_build(NULL, NULL, 0, NULL, NULL, NULL, 0) == MARISA_HANDLE_ERROR); ASSERT(marisa_mmap(NULL, NULL, 0, 0) == MARISA_HANDLE_ERROR); ASSERT(marisa_map(NULL, NULL, 0) == MARISA_HANDLE_ERROR); ASSERT(marisa_load(NULL, NULL, 0, 0) == MARISA_HANDLE_ERROR); ASSERT(marisa_fread(NULL, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_read(NULL, 0) == MARISA_HANDLE_ERROR); ASSERT(marisa_save(NULL, NULL, 0, 0, 0) == MARISA_HANDLE_ERROR); ASSERT(marisa_fwrite(NULL, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_write(NULL, 0) == MARISA_HANDLE_ERROR); ASSERT(marisa_restore(NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_lookup(NULL, NULL, 0, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_find(NULL, NULL, 0, NULL, NULL, 0, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_find_first(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_find_last(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_find_callback(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_predict(NULL, NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_predict_breadth_first(NULL, NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_predict_depth_first(NULL, NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_predict_callback(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR); ASSERT(marisa_get_num_tries(NULL) == 0); ASSERT(marisa_get_num_keys(NULL) == 0); ASSERT(marisa_get_num_nodes(NULL) == 0); ASSERT(marisa_get_total_size(NULL) == 0); ASSERT(marisa_clear(NULL) == MARISA_HANDLE_ERROR); TEST_END(); } int callback_for_find(void *num_keys, marisa_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_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_trie *trie = NULL; const char *keys[8]; marisa_uint32 key_ids[8]; size_t i; char key_buf[16]; size_t key_length; marisa_uint32 key_id; marisa_uint32 found_key_ids[8]; size_t found_key_lengths[8]; size_t num_found_keys; TEST_START(); ASSERT(marisa_init(&trie) == MARISA_OK); ASSERT(marisa_get_num_tries(trie) == 0); ASSERT(marisa_get_num_keys(trie) == 0); ASSERT(marisa_get_num_nodes(trie) == 0); ASSERT(marisa_get_total_size(trie) == (sizeof(marisa_uint32) * 23)); ASSERT(marisa_build(trie, NULL, 0, NULL, NULL, NULL, 0) == MARISA_OK); ASSERT(marisa_get_num_tries(trie) == 1); ASSERT(marisa_get_num_keys(trie) == 0); ASSERT(marisa_get_num_nodes(trie) == 1); keys[0] = "apple"; keys[1] = "and"; keys[2] = "Bad"; keys[3] = "apple"; keys[4] = "app"; ASSERT(marisa_build(trie, keys, 5, NULL, NULL, key_ids, 1 | MARISA_WITHOUT_TAIL | MARISA_LABEL_ORDER) == MARISA_OK); ASSERT(marisa_get_num_tries(trie) == 1); ASSERT(marisa_get_num_keys(trie) == 4); ASSERT(marisa_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_get_num_tries(trie); ++i) { ASSERT(marisa_restore(trie, key_ids[i], key_buf, sizeof(key_buf), &key_length) == MARISA_OK); ASSERT(key_length == strlen(keys[i])); ASSERT(strcmp(key_buf, keys[i]) == 0); ASSERT(marisa_lookup(trie, keys[i], MARISA_ZERO_TERMINATED, &key_id) == MARISA_OK); ASSERT(key_id == key_ids[i]); ASSERT(marisa_lookup(trie, keys[i], strlen(keys[i]), &key_id) == MARISA_OK); ASSERT(key_id == key_ids[i]); } ASSERT(marisa_clear(trie) == MARISA_OK); ASSERT(marisa_get_num_tries(trie) == 0); ASSERT(marisa_get_num_keys(trie) == 0); ASSERT(marisa_get_num_nodes(trie) == 0); ASSERT(marisa_get_total_size(trie) == (sizeof(marisa_uint32) * 23)); ASSERT(marisa_build(trie, keys, 5, NULL, NULL, key_ids, 1 | MARISA_WITHOUT_TAIL | MARISA_WEIGHT_ORDER) == MARISA_OK); ASSERT(marisa_get_num_tries(trie) == 1); ASSERT(marisa_get_num_keys(trie) == 4); ASSERT(marisa_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_find(trie, "ap", MARISA_ZERO_TERMINATED, found_key_ids, found_key_lengths, 8, &num_found_keys) == MARISA_OK); ASSERT(num_found_keys == 0); ASSERT(marisa_find(trie, "applex", MARISA_ZERO_TERMINATED, found_key_ids, found_key_lengths, 8, &num_found_keys) == MARISA_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_find_callback(trie, "anderson", MARISA_ZERO_TERMINATED, callback_for_find, &num_found_keys) == MARISA_OK); ASSERT(num_found_keys == 1); ASSERT(marisa_predict(trie, "a", MARISA_ZERO_TERMINATED, found_key_ids, 8, &num_found_keys) == MARISA_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_predict_callback(trie, "app", MARISA_ZERO_TERMINATED, callback_for_predict, &num_found_keys) == MARISA_OK); ASSERT(marisa_end(trie) == MARISA_OK); TEST_END(); } int main(void) { TestHandle(); TestTrie(); return 0; }