test: separate quick, live, and stress checks
This commit is contained in:
@@ -8,31 +8,17 @@ typedef struct Log Log;
|
||||
struct Log
|
||||
{
|
||||
GMainLoop *loop;
|
||||
int want;
|
||||
int legacy;
|
||||
int modern;
|
||||
int commit;
|
||||
int invalid;
|
||||
int sawtext;
|
||||
int sawempty;
|
||||
int sawpreedit;
|
||||
int sawcommit;
|
||||
};
|
||||
|
||||
static void
|
||||
legacy(IBusInputContext *ctx, IBusText *text, guint cursor,
|
||||
gboolean visible, void *arg)
|
||||
{
|
||||
Log *log;
|
||||
|
||||
(void)ctx;
|
||||
(void)text;
|
||||
(void)cursor;
|
||||
(void)visible;
|
||||
log = arg;
|
||||
log->legacy++;
|
||||
}
|
||||
|
||||
static void
|
||||
modern(IBusInputContext *ctx, IBusText *text, guint cursor,
|
||||
gboolean visible, guint mode, void *arg)
|
||||
{
|
||||
IBusAttrList *attrs;
|
||||
IBusAttribute *a;
|
||||
@@ -41,28 +27,60 @@ modern(IBusInputContext *ctx, IBusText *text, guint cursor,
|
||||
|
||||
(void)ctx;
|
||||
log = arg;
|
||||
log->modern++;
|
||||
log->legacy++;
|
||||
s = ibus_text_get_text(text);
|
||||
attrs = ibus_text_get_attributes(text);
|
||||
a = ibus_attr_list_get(attrs, 0);
|
||||
if(s[0] != '\0'){
|
||||
if(strcmp(s, "k") != 0 || cursor != 1 || !visible ||
|
||||
mode != IBUS_ENGINE_PREEDIT_CLEAR || a == NULL ||
|
||||
if(strcmp(s, "k") == 0){
|
||||
attrs = ibus_text_get_attributes(text);
|
||||
a = attrs == NULL ? NULL : ibus_attr_list_get(attrs, 0);
|
||||
if(cursor != 1 || !visible || attrs == NULL || a == NULL ||
|
||||
a->type != IBUS_ATTR_TYPE_UNDERLINE ||
|
||||
a->value != IBUS_ATTR_UNDERLINE_SINGLE ||
|
||||
a->start_index != 0 || a->end_index != 1 ||
|
||||
ibus_attr_list_get(attrs, 1) != NULL)
|
||||
log->invalid = 1;
|
||||
else
|
||||
log->sawtext = 1;
|
||||
}else{
|
||||
if(cursor != 0 || visible || mode != IBUS_ENGINE_PREEDIT_CLEAR ||
|
||||
a != NULL)
|
||||
log->invalid = 1;
|
||||
else
|
||||
log->sawempty = 1;
|
||||
log->sawpreedit = 1;
|
||||
}
|
||||
if(log->loop != NULL && log->modern >= log->want)
|
||||
if(log->loop != NULL && log->sawpreedit && log->sawcommit)
|
||||
g_main_loop_quit(log->loop);
|
||||
}
|
||||
|
||||
static void
|
||||
modern(IBusInputContext *ctx, IBusText *text, guint cursor,
|
||||
gboolean visible, guint mode, void *arg)
|
||||
{
|
||||
Log *log;
|
||||
|
||||
(void)ctx;
|
||||
(void)text;
|
||||
(void)cursor;
|
||||
(void)visible;
|
||||
(void)mode;
|
||||
log = arg;
|
||||
log->modern++;
|
||||
log->invalid = 1;
|
||||
if(log->loop != NULL)
|
||||
g_main_loop_quit(log->loop);
|
||||
}
|
||||
|
||||
static void
|
||||
commit(IBusInputContext *ctx, IBusText *text, void *arg)
|
||||
{
|
||||
IBusAttrList *attrs;
|
||||
Log *log;
|
||||
const char *s;
|
||||
|
||||
(void)ctx;
|
||||
log = arg;
|
||||
log->commit++;
|
||||
s = ibus_text_get_text(text);
|
||||
attrs = ibus_text_get_attributes(text);
|
||||
if(strcmp(s, "か") != 0 || attrs == NULL ||
|
||||
ibus_attr_list_get(attrs, 0) != NULL)
|
||||
log->invalid = 1;
|
||||
else
|
||||
log->sawcommit = 1;
|
||||
if(log->loop != NULL && log->sawpreedit && log->sawcommit)
|
||||
g_main_loop_quit(log->loop);
|
||||
}
|
||||
|
||||
@@ -74,12 +92,11 @@ timeout(void *arg)
|
||||
}
|
||||
|
||||
static int
|
||||
waitmodern(Log *log, int want)
|
||||
waitdone(Log *log)
|
||||
{
|
||||
guint timer;
|
||||
|
||||
log->want = want;
|
||||
if(log->modern >= want)
|
||||
if(log->sawpreedit && log->sawcommit)
|
||||
return 1;
|
||||
log->loop = g_main_loop_new(NULL, FALSE);
|
||||
timer = g_timeout_add_seconds(4, timeout, log->loop);
|
||||
@@ -88,7 +105,7 @@ waitmodern(Log *log, int want)
|
||||
g_source_remove(timer);
|
||||
g_main_loop_unref(log->loop);
|
||||
log->loop = NULL;
|
||||
return log->modern >= want;
|
||||
return log->sawpreedit && log->sawcommit;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -104,6 +121,7 @@ main(int argc, char **argv)
|
||||
return 2;
|
||||
}
|
||||
if(setenv("IBUS_ADDRESS", argv[1], 1) < 0 ||
|
||||
unsetenv("IBUS_ADDRESS_FILE") < 0 ||
|
||||
unsetenv("DBUS_SESSION_BUS_ADDRESS") < 0 || unsetenv("DISPLAY") < 0){
|
||||
perror("ibus_client_smoke: environment");
|
||||
return 1;
|
||||
@@ -125,30 +143,27 @@ main(int argc, char **argv)
|
||||
g_signal_connect(ctx, "update-preedit-text", G_CALLBACK(legacy), &log);
|
||||
g_signal_connect(ctx, "update-preedit-text-with-mode", G_CALLBACK(modern),
|
||||
&log);
|
||||
g_signal_connect(ctx, "commit-text", G_CALLBACK(commit), &log);
|
||||
ibus_input_context_set_capabilities(ctx, IBUS_CAP_PREEDIT_TEXT);
|
||||
ibus_input_context_set_client_commit_preedit(ctx, TRUE);
|
||||
ibus_input_context_focus_in(ctx);
|
||||
ok = ibus_input_context_process_key_event(ctx, 'n', 0,
|
||||
IBUS_CONTROL_MASK) && waitmodern(&log, 1) &&
|
||||
ok = ibus_input_context_process_key_event(ctx, 'n', 0, IBUS_CONTROL_MASK) &&
|
||||
ibus_input_context_process_key_event(ctx, 'k', 0, 0) &&
|
||||
waitmodern(&log, 2);
|
||||
ibus_input_context_reset(ctx);
|
||||
if(ok)
|
||||
ok = waitmodern(&log, 3);
|
||||
ibus_input_context_process_key_event(ctx, 'a', 0, 0) &&
|
||||
ibus_input_context_process_key_event(ctx, '0', 0, 0) &&
|
||||
waitdone(&log);
|
||||
ibus_input_context_focus_out(ctx);
|
||||
if(ok)
|
||||
ok = waitmodern(&log, 4);
|
||||
if(log.legacy != 0 || log.modern != 4 || log.invalid ||
|
||||
!log.sawtext || !log.sawempty)
|
||||
if(log.legacy == 0 || log.modern != 0 || log.commit != 1 ||
|
||||
log.invalid || !log.sawpreedit || !log.sawcommit)
|
||||
ok = 0;
|
||||
g_object_unref(ctx);
|
||||
g_object_unref(bus);
|
||||
if(!ok){
|
||||
fprintf(stderr,
|
||||
"ibus_client_smoke: legacy=%d modern=%d invalid=%d text=%d empty=%d\n",
|
||||
log.legacy, log.modern, log.invalid, log.sawtext, log.sawempty);
|
||||
"ibus_client_smoke: legacy=%d modern=%d commit=%d invalid=%d preedit=%d committed=%d\n",
|
||||
log.legacy, log.modern, log.commit, log.invalid,
|
||||
log.sawpreedit, log.sawcommit);
|
||||
return 1;
|
||||
}
|
||||
printf("official libibus client preedit: ok\n");
|
||||
printf("official libibus client preedit and commit: ok\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user