Add table-driven dictionary miss and language-switch state coverage, regress stale candidates after backspace, and clear them before dictionary refresh. Keep IPC and runtime-created file checks outside the unit runner.
258 lines
5.8 KiB
C
258 lines
5.8 KiB
C
#define STRANS_TEST_ENGINE
|
|
#include "../strans.c"
|
|
#include "test.h"
|
|
|
|
void
|
|
vietnamese_state_lifetime(struct ct *t)
|
|
{
|
|
Str com;
|
|
|
|
init();
|
|
im.l = &testvi;
|
|
im.pre = mkstr("as");
|
|
im.raw = mkstr("as");
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke(Kret, 0, &com));
|
|
checkstr(t, "committed Telex", "á", &com);
|
|
CT_EQ_INT(t, 0, im.pre.n);
|
|
CT_EQ_INT(t, 0, im.raw.n);
|
|
|
|
init();
|
|
im.l = &testvi;
|
|
im.pre = mkstr("as");
|
|
im.raw = mkstr("as");
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke(Kesc, 0, &com));
|
|
CT_EQ_INT(t, 0, com.n);
|
|
CT_EQ_INT(t, 0, im.pre.n);
|
|
CT_EQ_INT(t, 0, im.raw.n);
|
|
|
|
init();
|
|
im.l = &testvi;
|
|
im.pre = mkstr("as");
|
|
im.raw = mkstr("as");
|
|
sclear(&com);
|
|
CT_CHECK(t, dotrans('q', &com));
|
|
checkstr(t, "completed Telex", "á", &com);
|
|
checkstr(t, "next preedit", "q", &im.pre);
|
|
checkstr(t, "next raw input", "q", &im.raw);
|
|
}
|
|
|
|
void
|
|
engine_clears_candidates(struct ct *t)
|
|
{
|
|
Str com;
|
|
|
|
init();
|
|
im.l = getlang(LangKO);
|
|
im.pre = mkstr("ㄱ");
|
|
im.nkouho = 2;
|
|
im.sel = 1;
|
|
sclear(&com);
|
|
dotrans('k', &com);
|
|
CT_EQ_INT(t, 0, im.nkouho);
|
|
CT_EQ_INT(t, -1, im.sel);
|
|
}
|
|
|
|
void
|
|
engine_backspace_clears_candidates(struct ct *t)
|
|
{
|
|
Lang *lang;
|
|
Str com, shown;
|
|
|
|
lang = getlang(LangJP);
|
|
init();
|
|
im.l = lang;
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke('n', 0, &com));
|
|
CT_CHECK(t, keystroke('a', 0, &com));
|
|
shown = shownpre(&im);
|
|
checkstr(t, "before backspace", "な", &shown);
|
|
im.kouho[0] = mkstr("stale-candidate");
|
|
im.nkouho = 1;
|
|
im.sel = 0;
|
|
CT_CHECK(t, keystroke(Kback, 0, &com));
|
|
checkstr(t, "backspace commit", "", &com);
|
|
checkstr(t, "raw preedit after backspace", "n", &im.pre);
|
|
shown = shownpre(&im);
|
|
checkstr(t, "shown preedit after backspace", "ん", &shown);
|
|
CT_EQ_INT(t, 0, im.nkouho);
|
|
CT_EQ_INT(t, -1, im.sel);
|
|
}
|
|
|
|
void
|
|
engine_selects_visible_candidate(struct ct *t)
|
|
{
|
|
static const struct { int n, sel; Rune key; char *want; } cases[] = {
|
|
{ Maxdisp, -1, '9', "c9" },
|
|
{ Maxdisp+3, Maxdisp+1, '1', "c3" },
|
|
};
|
|
char name[8];
|
|
Str com;
|
|
int i, j;
|
|
|
|
for(i = 0; i < nelem(cases); i++){
|
|
init();
|
|
for(j = 0; j < cases[i].n; j++){
|
|
snprint(name, sizeof name, "c%d", j+1);
|
|
im.kouho[j] = mkstr(name);
|
|
}
|
|
im.nkouho = cases[i].n;
|
|
im.sel = cases[i].sel;
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke(cases[i].key, 0, &com));
|
|
checkstr(t, cases[i].want, cases[i].want, &com);
|
|
CT_EQ_INT(t, 0, im.nkouho);
|
|
}
|
|
}
|
|
|
|
void
|
|
engine_commit_contract(struct ct *t)
|
|
{
|
|
Str com;
|
|
|
|
init();
|
|
im.l = getlang(LangJP);
|
|
im.pre = mkstr("ka");
|
|
im.nkouho = 1;
|
|
im.sel = -1;
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke(Kret, 0, &com));
|
|
checkstr(t, "return commit", "か", &com);
|
|
CT_EQ_INT(t, 0, im.pre.n);
|
|
CT_EQ_INT(t, 0, im.raw.n);
|
|
CT_EQ_INT(t, 0, im.nkouho);
|
|
CT_EQ_INT(t, -1, im.sel);
|
|
|
|
init();
|
|
im.l = getlang(LangJP);
|
|
im.pre = mkstr("ka");
|
|
im.kouho[0] = mkstr("c1");
|
|
im.kouho[1] = mkstr("c2");
|
|
im.nkouho = 2;
|
|
im.sel = 1;
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke(Kret, 0, &com));
|
|
checkstr(t, "selected candidate", "c2", &com);
|
|
CT_EQ_INT(t, 0, im.pre.n);
|
|
CT_EQ_INT(t, 0, im.nkouho);
|
|
CT_EQ_INT(t, -1, im.sel);
|
|
|
|
init();
|
|
im.l = getlang(LangJP);
|
|
im.pre = mkstr("ka");
|
|
im.nkouho = 1;
|
|
im.sel = -1;
|
|
sclear(&com);
|
|
CT_CHECK(t, !keystroke('q', 0, &com));
|
|
checkstr(t, "uneaten-key commit", "か", &com);
|
|
CT_EQ_INT(t, 0, im.pre.n);
|
|
CT_EQ_INT(t, 0, im.raw.n);
|
|
CT_EQ_INT(t, 0, im.nkouho);
|
|
CT_EQ_INT(t, -1, im.sel);
|
|
|
|
init();
|
|
im.l = getlang(LangJP);
|
|
im.pre = mkstr("ka");
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke(0xf008, 0, &com));
|
|
CT_EQ_INT(t, 2, com.n);
|
|
CT_EQ_UINT(t, 0x304b, com.r[0]);
|
|
CT_EQ_UINT(t, 0xf008, com.r[1]);
|
|
CT_EQ_INT(t, 0, im.pre.n);
|
|
}
|
|
|
|
void
|
|
engine_telex_history_bound(struct ct *t)
|
|
{
|
|
Str com;
|
|
Rune tone;
|
|
int i;
|
|
|
|
init();
|
|
im.l = &testvi;
|
|
sclear(&com);
|
|
CT_CHECK(t, keystroke('a', 0, &com));
|
|
for(i = 0; i < Maxrunes; i++){
|
|
tone = i % 2 == 0 ? 's' : 'f';
|
|
if(!CT_CHECK(t, keystroke(tone, 0, &com)))
|
|
break;
|
|
}
|
|
checkstr(t, "bounded Telex commit", "à", &com);
|
|
CT_EQ_INT(t, 0, im.pre.n);
|
|
CT_EQ_INT(t, 0, im.raw.n);
|
|
}
|
|
|
|
void
|
|
engine_language_switch_state(struct ct *t)
|
|
{
|
|
static const struct {
|
|
char *name;
|
|
Rune key;
|
|
int mod;
|
|
int lang;
|
|
char *pre;
|
|
char *raw;
|
|
char *commit;
|
|
int stale;
|
|
} steps[] = {
|
|
{ "select Vietnamese", 'v', Mctrl, LangVI, "", "", "", 0 },
|
|
{ "Vietnamese a", 'a', 0, LangVI, "a", "a", "", 0 },
|
|
{ "Vietnamese tone", 's', 0, LangVI, "as", "as", "", 0 },
|
|
{ "switch to Korean", 's', Mctrl, LangKO, "", "", "", 1 },
|
|
{ "Korean initial", 'r', 0, LangKO, "ㄱ", "", "", 0 },
|
|
{ "Korean syllable", 'k', 0, LangKO, "가", "", "", 0 },
|
|
{ "switch to Vietnamese", 'v', Mctrl, LangVI, "", "", "", 0 },
|
|
{ "Vietnamese a again", 'a', 0, LangVI, "a", "a", "", 0 },
|
|
{ "Vietnamese tone again", 's', 0, LangVI, "as", "as", "", 0 },
|
|
{ "commit Vietnamese", Kret, 0, LangVI, "", "", "á", 0 },
|
|
};
|
|
char where[80];
|
|
Lang *vi;
|
|
Trie *saved;
|
|
Str com;
|
|
int eaten, i;
|
|
|
|
vi = getlang(LangVI);
|
|
if(!CT_CHECK(t, vi != nil))
|
|
return;
|
|
saved = vi->map;
|
|
vi->map = testvi.map;
|
|
init();
|
|
for(i = 0; i < nelem(steps); i++){
|
|
if(steps[i].stale){
|
|
im.kouho[0] = mkstr("stale");
|
|
im.nkouho = 1;
|
|
im.sel = 0;
|
|
}
|
|
sclear(&com);
|
|
eaten = keystroke(steps[i].key, steps[i].mod, &com);
|
|
if(eaten != 1){
|
|
CT_ERRORF(t, "%s: want eaten 1, got %d",
|
|
steps[i].name, eaten);
|
|
break;
|
|
}
|
|
if(im.l == nil || im.l->lang != steps[i].lang){
|
|
CT_ERRORF(t, "%s: want language %d, got %d",
|
|
steps[i].name, steps[i].lang,
|
|
im.l == nil ? -1 : im.l->lang);
|
|
break;
|
|
}
|
|
snprint(where, sizeof where, "%s preedit", steps[i].name);
|
|
if(!checkstr(t, where, steps[i].pre, &im.pre))
|
|
break;
|
|
snprint(where, sizeof where, "%s raw", steps[i].name);
|
|
if(!checkstr(t, where, steps[i].raw, &im.raw))
|
|
break;
|
|
snprint(where, sizeof where, "%s commit", steps[i].name);
|
|
if(!checkstr(t, where, steps[i].commit, &com))
|
|
break;
|
|
if(im.nkouho != 0 || im.sel != -1){
|
|
CT_ERRORF(t, "%s: want candidates 0 and selection -1, got %d and %d",
|
|
steps[i].name, im.nkouho, im.sel);
|
|
break;
|
|
}
|
|
}
|
|
vi->map = saved;
|
|
}
|