fix: tighten emoji lookup contracts
This commit is contained in:
@@ -89,3 +89,28 @@ dictionary_misses_clear_result(struct ct *t)
|
||||
hmapfree(lang->dict);
|
||||
lang->dict = saved;
|
||||
}
|
||||
|
||||
void
|
||||
dictionary_emoji_identity(struct ct *t)
|
||||
{
|
||||
Dictreq req;
|
||||
Dictres res;
|
||||
Hmap *saved;
|
||||
Lang *lang;
|
||||
Str key;
|
||||
|
||||
lang = getlang(LangEMOJI);
|
||||
saved = lang->dict;
|
||||
lang->dict = hmapalloc(2);
|
||||
key = mkstr("é");
|
||||
hmapset(&lang->dict, &key, "é", strlen("é"));
|
||||
memset(&req, 0, sizeof req);
|
||||
req.key = key;
|
||||
req.pre = key;
|
||||
req.lang = LangEMOJI;
|
||||
dictlookup(&req, &res);
|
||||
if(CT_EQ_INT(t, 1, res.nkouho))
|
||||
checkstr(t, "emoji identity candidate", "é", &res.kouho[0]);
|
||||
hmapfree(lang->dict);
|
||||
lang->dict = saved;
|
||||
}
|
||||
|
||||
@@ -404,6 +404,10 @@ emojibegin(Emojifix *f, int showpre)
|
||||
setemoji(&l->dict, "smil", "😀 😄");
|
||||
setemoji(&l->dict, "smile", "😀 😄");
|
||||
setemoji(&l->dict, "웃음", "😀 😄 😂");
|
||||
setemoji(&l->dict, "えがお", "😀 😄 😊");
|
||||
setemoji(&l->dict, "エガオ", "😀 😄 😊");
|
||||
setemoji(&l->dict, "heart", "❤️");
|
||||
setemoji(&l->dict, "coffee", "☕️");
|
||||
setemoji(&l->dict, "^", "¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁽");
|
||||
setemoji(&l->dict, "^0", "⁰");
|
||||
setemoji(&l->dict, "_", "₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₍");
|
||||
@@ -698,6 +702,53 @@ engine_emoji_queries(struct ct *t)
|
||||
emojiend(&f);
|
||||
}
|
||||
|
||||
void
|
||||
engine_emoji_japanese_and_multirune(struct ct *t)
|
||||
{
|
||||
Emojifix f;
|
||||
Str com;
|
||||
|
||||
emojibegin(&f, 0);
|
||||
init();
|
||||
im.l = getlang(LangJP);
|
||||
sclear(&com);
|
||||
CT_CHECK(t, keystroke('e', Mctrl, &com));
|
||||
if(typekeys(t, "egao", &com)){
|
||||
checkstr(t, "localized Hiragana query", "えがお", &search.text);
|
||||
CT_EQ_INT(t, 3, im.nkouho);
|
||||
CT_CHECK(t, keystroke(Kesc, 0, &com));
|
||||
}
|
||||
|
||||
init();
|
||||
im.l = getlang(LangJPK);
|
||||
sclear(&com);
|
||||
CT_CHECK(t, keystroke('e', Mctrl, &com));
|
||||
if(typekeys(t, "egao", &com)){
|
||||
checkstr(t, "localized Katakana query", "エガオ", &search.text);
|
||||
CT_EQ_INT(t, 3, im.nkouho);
|
||||
CT_CHECK(t, keystroke(Kesc, 0, &com));
|
||||
}
|
||||
|
||||
init();
|
||||
im.l = getlang(LangEN);
|
||||
sclear(&com);
|
||||
CT_CHECK(t, keystroke('e', Mctrl, &com));
|
||||
if(typekeys(t, "heart", &com)){
|
||||
CT_EQ_INT(t, 1, im.nkouho);
|
||||
CT_CHECK(t, keystroke(Kret, 0, &com));
|
||||
checkstr(t, "variation-selector emoji", "❤️", &com);
|
||||
}
|
||||
|
||||
sclear(&com);
|
||||
CT_CHECK(t, keystroke('e', Mctrl, &com));
|
||||
if(typekeys(t, "coffee", &com)){
|
||||
CT_EQ_INT(t, 1, im.nkouho);
|
||||
CT_CHECK(t, keystroke(Kret, 0, &com));
|
||||
checkstr(t, "multi-codepoint emoji", "☕️", &com);
|
||||
}
|
||||
emojiend(&f);
|
||||
}
|
||||
|
||||
void
|
||||
engine_emoji_digit_aliases(struct ct *t)
|
||||
{
|
||||
|
||||
@@ -66,6 +66,7 @@ class MkemojiTest(unittest.TestCase):
|
||||
"x\t a\n",
|
||||
"\0\ta\n",
|
||||
"x\ta\0b\n",
|
||||
"x\t;hidden\n",
|
||||
"x" * 65 + "\ta\n",
|
||||
"x\t" + "a" * 65 + "\n",
|
||||
]
|
||||
|
||||
@@ -43,6 +43,7 @@ void engine_japanese_backspace_and_boundaries(struct ct*);
|
||||
void engine_katakana_sequences(struct ct*);
|
||||
void engine_emoji_single_candidate(struct ct*);
|
||||
void engine_emoji_queries(struct ct*);
|
||||
void engine_emoji_japanese_and_multirune(struct ct*);
|
||||
void engine_emoji_digit_aliases(struct ct*);
|
||||
void engine_emoji_navigation(struct ct*);
|
||||
void engine_emoji_preedit_languages(struct ct*);
|
||||
@@ -50,6 +51,7 @@ void engine_emoji_start_and_unknown(struct ct*);
|
||||
void engine_emoji_dictionary_identity(struct ct*);
|
||||
void dictionary_candidates(struct ct*);
|
||||
void dictionary_misses_clear_result(struct ct*);
|
||||
void dictionary_emoji_identity(struct ct*);
|
||||
void ipc_masks_modifiers(struct ct*);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -92,6 +92,7 @@ static const struct ct_test tests[] = {
|
||||
{ "engine/katakana-sequences", engine_katakana_sequences },
|
||||
{ "engine/emoji-single-candidate", engine_emoji_single_candidate },
|
||||
{ "engine/emoji-queries", engine_emoji_queries },
|
||||
{ "engine/emoji-japanese-multirune", engine_emoji_japanese_and_multirune },
|
||||
{ "engine/emoji-digit-aliases", engine_emoji_digit_aliases },
|
||||
{ "engine/emoji-navigation", engine_emoji_navigation },
|
||||
{ "engine/emoji-preedit-languages", engine_emoji_preedit_languages },
|
||||
@@ -99,6 +100,7 @@ static const struct ct_test tests[] = {
|
||||
{ "engine/emoji-dictionary-identity", engine_emoji_dictionary_identity },
|
||||
{ "dict/candidates", dictionary_candidates },
|
||||
{ "dict/misses-clear-result", dictionary_misses_clear_result },
|
||||
{ "dict/emoji-identity", dictionary_emoji_identity },
|
||||
{ "ipc/masks-modifiers", ipc_masks_modifiers },
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user