#include "test.h" void dictionary_candidates(struct ct *t) { char many[512], item[8]; char *p; Dictreq req; Dictres res; Hmap *saved; Lang *lang; Str key; int i; lang = getlang(LangJP); saved = lang->dict; lang->dict = hmapalloc(1); key = mkstr("かな"); hmapset(&lang->dict, &key, " 候補1 かな 候補2 ", strlen(" 候補1 かな 候補2 ")); memset(&req, 0, sizeof req); req.key = key; req.pre = mkstr("preedit-one"); req.lang = LangJP; dictlookup(&req, &res); if(!CT_EQ_INT(t, 2, res.nkouho)) goto cleanup; CT_EQ_INT(t, LangJP, res.lang); CT_EQ_INT(t, 0, scmp(&req.pre, &res.key)); checkstr(t, "candidate 1", "候補1", &res.kouho[0]); checkstr(t, "candidate 2", "候補2", &res.kouho[1]); key = mkstr("key"); p = many; for(i = 0; i < Maxkouho+1; i++){ snprint(item, sizeof item, "c%02d", i); if(i > 0) *p++ = ' '; memmove(p, item, strlen(item)); p += strlen(item); } *p = '\0'; hmapset(&lang->dict, &key, many, strlen(many)); req.key = key; req.pre = mkstr("preedit-two"); dictlookup(&req, &res); if(!CT_EQ_INT(t, Maxkouho, res.nkouho)) goto cleanup; CT_EQ_INT(t, LangJP, res.lang); CT_EQ_INT(t, 0, scmp(&req.pre, &res.key)); checkstr(t, "first capped candidate", "c00", &res.kouho[0]); checkstr(t, "last capped candidate", "c31", &res.kouho[31]); cleanup: hmapfree(lang->dict); lang->dict = saved; } void dictionary_misses_clear_result(struct ct *t) { static const struct { char *name; char *key; char *pre; } cases[] = { { "empty key", "", "empty-preedit" }, { "missing key", "missing", "missing-preedit" }, }; Dictreq req; Dictres res; Hmap *saved; Lang *lang; int i; lang = getlang(LangJP); saved = lang->dict; lang->dict = hmapalloc(1); for(i = 0; i < nelem(cases); i++){ memset(&res, 0xa5, sizeof res); req.key = mkstr(cases[i].key); req.pre = mkstr(cases[i].pre); req.lang = LangJP; dictlookup(&req, &res); if(res.nkouho != 0) CT_ERRORF(t, "%s: want 0 candidates, got %d", cases[i].name, res.nkouho); CT_EQ_INT(t, LangJP, res.lang); checkstr(t, cases[i].name, cases[i].pre, &res.key); } hmapfree(lang->dict); lang->dict = saved; }