Files
qingjian/apps/windows/server/tests/engine_loop/click.rs
T
LING 31f3da0c97 feat(windows): 整句候选显示云端译文 (#510)
本地整句候选旁异步显示一条学习语言译文,设置「云服务」页开关,缺省关;不加候选、不改顺序,空格仍上屏原首选。
翻译与组句联想分开请求、各自返回,清空输入时撤掉还没发出的请求。

Closes #452
Closes #32
2026-10-15 10:59:27 +08:00

92 lines
3.1 KiB
Rust

//! 鼠标点候选窗口:上屏的字挂到焦点会话上,下一拍轮询(或抢先来的键)带给 DLL;老协议的 DLL 不收点击。
use qingjian_render::HitTarget;
use crate::composing::SentenceTranslator;
use crate::support::*;
fn poll(router: &mut Router, session: SessionId) -> (Frame, Option<String>) {
match router.handle(ClientMessage::Poll { session }) {
Some(ServerMessage::Update { frame, commit, .. }) => (frame, commit),
other => panic!("expected Update, got {other:?}"),
}
}
#[test]
fn clicking_a_candidate_commits_it_on_the_next_poll() {
let mut router = router();
let (_, _, frame) = type_letters(&mut router, "nihao");
let slot = slot_of(&frame, "你好");
router.handle_click(HitTarget::Candidate(slot as usize - 1));
let (after, commit) = poll(&mut router, SESSION);
assert_eq!(commit.as_deref(), Some("你好"));
assert!(after.is_empty());
// 交出去一次就没了
assert_eq!(poll(&mut router, SESSION).1, None);
}
#[test]
fn clicking_a_translation_commits_that_sense() {
let mut router = router();
let (_, _, frame) = type_letters(&mut router, "nihao");
let slot = slot_of(&frame, "你好");
router.handle_click(HitTarget::Translation {
candidate: slot as usize - 1,
sense: 0,
});
assert_eq!(poll(&mut router, SESSION).1.as_deref(), Some("hello"));
}
#[test]
fn clicking_a_sentence_translation_commits_it() {
let submitted = Arc::new(Mutex::new(Vec::new()));
let mut router = router_with(RouterConfig {
sentence_translation: true,
..RouterConfig::default()
});
router
.engine_mut()
.set_predictor(Box::new(SentenceTranslator::new(submitted)));
let (_, _, frame) = type_letters(&mut router, "xiangkaifa");
let slot = slot_of(&frame, "想开发");
router.handle_click(HitTarget::Translation {
candidate: slot as usize - 1,
sense: 0,
});
assert_eq!(
poll(&mut router, SESSION).1.as_deref(),
Some("It seems not to work.")
);
}
#[test]
fn a_key_before_the_poll_carries_the_clicked_text() {
let mut router = router();
let (_, _, frame) = type_letters(&mut router, "nihao");
let slot = slot_of(&frame, "你好");
router.handle_click(HitTarget::Candidate(slot as usize - 1));
let (_, commit, frame) = press(&mut router, letter('w'));
assert_eq!(commit.as_deref(), Some("你好"));
assert_eq!(preedit(&frame), "w");
assert_eq!(poll(&mut router, SESSION).1, None);
}
#[test]
fn old_dlls_do_not_take_clicks() {
let mut router = router();
let old = SessionId(2);
router.handle(ClientMessage::OpenSession {
session: old,
app: None,
// 点击上屏从协议 8 起(`CLICK_SINCE`),7 是最后一版不认 `Update.commit` 的 DLL
protocol: 7,
});
for c in "nihao".chars() {
press_in(&mut router, old, letter(c));
}
router.handle_click(HitTarget::Candidate(0));
let (frame, commit) = poll(&mut router, old);
assert_eq!(commit, None);
assert_eq!(preedit(&frame), "ni'hao");
}