#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; }