Home | History | Annotate | Download | only in tests
      1 #include <string.h>
      2 
      3 #include <marisa.h>
      4 
      5 #include "assert.h"
      6 
      7 void TestHandle(void) {
      8   marisa_trie *trie = NULL;
      9 
     10   TEST_START();
     11 
     12   ASSERT(marisa_init(&trie) == MARISA_OK);
     13   ASSERT(marisa_init(&trie) == MARISA_HANDLE_ERROR);
     14   ASSERT(marisa_end(trie) == MARISA_OK);
     15   ASSERT(marisa_end(NULL) == MARISA_HANDLE_ERROR);
     16 
     17   ASSERT(marisa_build(NULL, NULL, 0, NULL, NULL, NULL, 0) ==
     18       MARISA_HANDLE_ERROR);
     19 
     20   ASSERT(marisa_mmap(NULL, NULL, 0, 0) == MARISA_HANDLE_ERROR);
     21   ASSERT(marisa_map(NULL, NULL, 0) == MARISA_HANDLE_ERROR);
     22 
     23   ASSERT(marisa_load(NULL, NULL, 0, 0) == MARISA_HANDLE_ERROR);
     24   ASSERT(marisa_fread(NULL, NULL) == MARISA_HANDLE_ERROR);
     25   ASSERT(marisa_read(NULL, 0) == MARISA_HANDLE_ERROR);
     26 
     27   ASSERT(marisa_save(NULL, NULL, 0, 0, 0) == MARISA_HANDLE_ERROR);
     28   ASSERT(marisa_fwrite(NULL, NULL) == MARISA_HANDLE_ERROR);
     29   ASSERT(marisa_write(NULL, 0) == MARISA_HANDLE_ERROR);
     30 
     31   ASSERT(marisa_restore(NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR);
     32 
     33   ASSERT(marisa_lookup(NULL, NULL, 0, NULL) == MARISA_HANDLE_ERROR);
     34 
     35   ASSERT(marisa_find(NULL, NULL, 0, NULL, NULL, 0, NULL) ==
     36       MARISA_HANDLE_ERROR);
     37   ASSERT(marisa_find_first(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR);
     38   ASSERT(marisa_find_last(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR);
     39   ASSERT(marisa_find_callback(NULL, NULL, 0, NULL, NULL) ==
     40       MARISA_HANDLE_ERROR);
     41 
     42   ASSERT(marisa_predict(NULL, NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR);
     43   ASSERT(marisa_predict_breadth_first(NULL, NULL, 0, NULL, 0, NULL) ==
     44       MARISA_HANDLE_ERROR);
     45   ASSERT(marisa_predict_depth_first(NULL, NULL, 0, NULL, 0, NULL) ==
     46       MARISA_HANDLE_ERROR);
     47   ASSERT(marisa_predict_callback(NULL, NULL, 0, NULL, NULL) ==
     48       MARISA_HANDLE_ERROR);
     49 
     50   ASSERT(marisa_get_num_tries(NULL) == 0);
     51   ASSERT(marisa_get_num_keys(NULL) == 0);
     52   ASSERT(marisa_get_num_nodes(NULL) == 0);
     53   ASSERT(marisa_get_total_size(NULL) == 0);
     54 
     55   ASSERT(marisa_clear(NULL) == MARISA_HANDLE_ERROR);
     56 
     57   TEST_END();
     58 }
     59 
     60 int callback_for_find(void *num_keys,
     61     marisa_uint32 key_id, size_t key_length) {
     62   ASSERT(*(size_t *)num_keys == 0);
     63   ASSERT(key_id == 1);
     64   ASSERT(key_length == 3);
     65   ++*(size_t *)num_keys;
     66   return 1;
     67 }
     68 
     69 int callback_for_predict(void *num_keys,
     70     marisa_uint32 key_id, const char *key, size_t key_length) {
     71   ASSERT(*(size_t *)num_keys < 2);
     72   switch (*(size_t *)num_keys) {
     73     case 0: {
     74       ASSERT(key_id == 0);
     75       ASSERT(key_length == 3);
     76       ASSERT(strcmp(key, "app") == 0);
     77       break;
     78     }
     79     case 1: {
     80       ASSERT(key_id == 3);
     81       ASSERT(key_length == 5);
     82       ASSERT(strcmp(key, "apple") == 0);
     83       break;
     84     }
     85   }
     86   ++*(size_t *)num_keys;
     87   return 1;
     88 }
     89 
     90 void TestTrie() {
     91   marisa_trie *trie = NULL;
     92   const char *keys[8];
     93   marisa_uint32 key_ids[8];
     94   size_t i;
     95   char key_buf[16];
     96   size_t key_length;
     97   marisa_uint32 key_id;
     98   marisa_uint32 found_key_ids[8];
     99   size_t found_key_lengths[8];
    100   size_t num_found_keys;
    101 
    102   TEST_START();
    103 
    104   ASSERT(marisa_init(&trie) == MARISA_OK);
    105 
    106   ASSERT(marisa_get_num_tries(trie) == 0);
    107   ASSERT(marisa_get_num_keys(trie) == 0);
    108   ASSERT(marisa_get_num_nodes(trie) == 0);
    109   ASSERT(marisa_get_total_size(trie) == (sizeof(marisa_uint32) * 23));
    110 
    111   ASSERT(marisa_build(trie, NULL, 0, NULL, NULL, NULL, 0) == MARISA_OK);
    112 
    113   ASSERT(marisa_get_num_tries(trie) == 1);
    114   ASSERT(marisa_get_num_keys(trie) == 0);
    115   ASSERT(marisa_get_num_nodes(trie) == 1);
    116 
    117   keys[0] = "apple";
    118   keys[1] = "and";
    119   keys[2] = "Bad";
    120   keys[3] = "apple";
    121   keys[4] = "app";
    122 
    123   ASSERT(marisa_build(trie, keys, 5, NULL, NULL, key_ids,
    124       1 | MARISA_WITHOUT_TAIL | MARISA_LABEL_ORDER) == MARISA_OK);
    125 
    126   ASSERT(marisa_get_num_tries(trie) == 1);
    127   ASSERT(marisa_get_num_keys(trie) == 4);
    128   ASSERT(marisa_get_num_nodes(trie) == 11);
    129 
    130   ASSERT(key_ids[0] == 3);
    131   ASSERT(key_ids[1] == 1);
    132   ASSERT(key_ids[2] == 0);
    133   ASSERT(key_ids[3] == 3);
    134   ASSERT(key_ids[4] == 2);
    135 
    136   for (i = 0; i < marisa_get_num_tries(trie); ++i) {
    137     ASSERT(marisa_restore(trie,
    138         key_ids[i], key_buf, sizeof(key_buf), &key_length) == MARISA_OK);
    139     ASSERT(key_length == strlen(keys[i]));
    140     ASSERT(strcmp(key_buf, keys[i]) == 0);
    141 
    142     ASSERT(marisa_lookup(trie,
    143         keys[i], MARISA_ZERO_TERMINATED, &key_id) == MARISA_OK);
    144     ASSERT(key_id == key_ids[i]);
    145 
    146     ASSERT(marisa_lookup(trie,
    147         keys[i], strlen(keys[i]), &key_id) == MARISA_OK);
    148     ASSERT(key_id == key_ids[i]);
    149   }
    150 
    151   ASSERT(marisa_clear(trie) == MARISA_OK);
    152 
    153   ASSERT(marisa_get_num_tries(trie) == 0);
    154   ASSERT(marisa_get_num_keys(trie) == 0);
    155   ASSERT(marisa_get_num_nodes(trie) == 0);
    156   ASSERT(marisa_get_total_size(trie) == (sizeof(marisa_uint32) * 23));
    157 
    158   ASSERT(marisa_build(trie, keys, 5, NULL, NULL, key_ids,
    159       1 | MARISA_WITHOUT_TAIL | MARISA_WEIGHT_ORDER) == MARISA_OK);
    160 
    161   ASSERT(marisa_get_num_tries(trie) == 1);
    162   ASSERT(marisa_get_num_keys(trie) == 4);
    163   ASSERT(marisa_get_num_nodes(trie) == 11);
    164 
    165   ASSERT(key_ids[0] == 3);
    166   ASSERT(key_ids[1] == 1);
    167   ASSERT(key_ids[2] == 2);
    168   ASSERT(key_ids[3] == 3);
    169   ASSERT(key_ids[4] == 0);
    170 
    171   ASSERT(marisa_find(trie, "ap", MARISA_ZERO_TERMINATED,
    172       found_key_ids, found_key_lengths, 8, &num_found_keys) == MARISA_OK);
    173   ASSERT(num_found_keys == 0);
    174 
    175   ASSERT(marisa_find(trie, "applex", MARISA_ZERO_TERMINATED,
    176       found_key_ids, found_key_lengths, 8, &num_found_keys) == MARISA_OK);
    177   ASSERT(num_found_keys == 2);
    178   ASSERT(found_key_ids[0] == key_ids[4]);
    179   ASSERT(found_key_lengths[0] == 3);
    180   ASSERT(found_key_ids[1] == key_ids[0]);
    181   ASSERT(found_key_lengths[1] == 5);
    182 
    183   num_found_keys = 0;
    184   ASSERT(marisa_find_callback(trie, "anderson", MARISA_ZERO_TERMINATED,
    185       callback_for_find, &num_found_keys) == MARISA_OK);
    186   ASSERT(num_found_keys == 1);
    187 
    188   ASSERT(marisa_predict(trie, "a", MARISA_ZERO_TERMINATED,
    189       found_key_ids, 8, &num_found_keys) == MARISA_OK);
    190   ASSERT(num_found_keys == 3);
    191   ASSERT(found_key_ids[0] == key_ids[4]);
    192   ASSERT(found_key_ids[1] == key_ids[1]);
    193   ASSERT(found_key_ids[2] == key_ids[0]);
    194 
    195   num_found_keys = 0;
    196   ASSERT(marisa_predict_callback(trie, "app", MARISA_ZERO_TERMINATED,
    197       callback_for_predict, &num_found_keys) == MARISA_OK);
    198 
    199   ASSERT(marisa_end(trie) == MARISA_OK);
    200 
    201   TEST_END();
    202 }
    203 
    204 int main(void) {
    205   TestHandle();
    206   TestTrie();
    207 
    208   return 0;
    209 }
    210