diff --git a/tests/text_edit.rs b/tests/text_edit.rs new file mode 100644 index 0000000..68b092a --- /dev/null +++ b/tests/text_edit.rs @@ -0,0 +1,67 @@ +use iris::prelude::*; + +fn editor(text: &str, mode: EditMode) -> (TextEdit, TextData) { + let view = TextView::new(TextBuffer::new(text), TextAttrs::default(), None); + (TextEdit::new(view, mode), TextData::default()) +} + +fn press(edit: &mut TextEditCtx<'_>, x: f32) { + edit.select(vec2(x, 10.0), vec2(400.0, 200.0), false, false); +} + +#[test] +fn pressing_an_empty_field_places_input() { + let (mut text, mut data) = editor("", EditMode::SingleLine); + let mut edit = TextEditCtx { + text: &mut text, + data: &mut data, + }; + + press(&mut edit, 40.0); + edit.insert("hello"); + + assert_eq!(edit.text.content(), "hello"); +} + +#[test] +fn preedit_replaces_the_previous_composition() { + let (mut text, mut data) = editor("", EditMode::SingleLine); + let mut edit = TextEditCtx { + text: &mut text, + data: &mut data, + }; + + press(&mut edit, 0.0); + edit.replace(0, "に"); + edit.replace(1, "日本"); + + assert_eq!(edit.text.content(), "日本"); +} + +#[test] +fn backspace_respects_utf8_boundaries() { + let (mut text, mut data) = editor("aé", EditMode::SingleLine); + let mut edit = TextEditCtx { + text: &mut text, + data: &mut data, + }; + + press(&mut edit, f32::MAX); + edit.backspace(false); + + assert_eq!(edit.text.content(), "a"); +} + +#[test] +fn typing_replaces_the_selection() { + let (mut text, mut data) = editor("hello", EditMode::SingleLine); + let mut edit = TextEditCtx { + text: &mut text, + data: &mut data, + }; + + edit.select_all(); + edit.insert("goodbye"); + + assert_eq!(edit.text.content(), "goodbye"); +}