use super::TestWindowExt;
use crate::{App, InputHandler, UTF16Selection, Window};
use std::ops::Range;
pub struct TestInput<'a> {
handler: Box<dyn InputHandler>,
window: &'a mut Window,
}
impl<'a> TestInput<'a> {
pub fn new(handler: impl InputHandler, window: &'a mut Window) -> Self {
Self {
handler: Box::new(handler),
window,
}
}
pub fn commit_text(&mut self, text: &str, cx: &mut App) {
self.handler
.replace_text_in_range(None, text, self.window, cx);
self.window.render_frame(cx);
}
pub fn compose_text(
&mut self,
replacement: Option<Range<usize>>,
text: &str,
selection: Option<Range<usize>>,
cx: &mut App,
) {
if let Some(range) = &replacement {
assert!(range.start <= range.end, "replacement range is reversed");
}
if let Some(range) = &selection {
let length = text.encode_utf16().count();
assert!(
range.start <= range.end && range.end <= length,
"composition selection must lie inside the UTF-16 preedit"
);
}
self.handler
.replace_and_mark_text_in_range(replacement, text, selection, self.window, cx);
self.window.render_frame(cx);
}
pub fn unmark_text(&mut self, cx: &mut App) {
self.handler.unmark_text(self.window, cx);
self.window.render_frame(cx);
}
pub fn marked_text_range(&mut self, cx: &mut App) -> Option<Range<usize>> {
self.handler.marked_text_range(self.window, cx)
}
pub fn selected_text_range(&mut self, cx: &mut App) -> Option<UTF16Selection> {
self.handler.selected_text_range(false, self.window, cx)
}
}