1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
3
4TestCase := TextInput {
5 width: 100phx;
6 height: 100phx;
7 property<string> test_text: self.text;
8 property<int> test_cursor_pos: self.cursor_position_byte_offset;
9 property<int> test_anchor_pos: self.anchor_position_byte_offset;
10 property<bool> has_selection: self.test_cursor_pos != self.test_anchor_pos;
11 property<bool> input_focused: self.has_focus;
12}
13
14/*
15```rust
16
17const UP_CODE: char = '\u{F700}';
18const DOWN_CODE: char = '\u{F701}';
19const LEFT_CODE: char = '\u{F702}';
20const RIGHT_CODE: char = '\u{F703}';
21const DEL_CODE: char = '\u{007f}';
22const BACK_CODE: char = '\u{0008}'; // backspace \b
23
24fn send_move_mod_modifier(instance: &TestCase, pressed: bool) {
25 if cfg!(not(target_os = "macos")) {
26 slint_testing::send_keyboard_char(instance, slint::private_unstable_api::re_exports::Key::Control.into(), pressed);
27 }
28
29 if cfg!(target_os = "macos") {
30 slint_testing::send_keyboard_char(instance, slint::private_unstable_api::re_exports::Key::Alt.into(), pressed);
31 }
32}
33
34fn send_move_mod_shift_modifier(instance: &TestCase, pressed: bool) {
35 slint_testing::send_keyboard_char(instance, slint::private_unstable_api::re_exports::Key::Shift.into(), pressed);
36
37 if cfg!(not(target_os = "macos")) {
38 slint_testing::send_keyboard_char(instance, slint::private_unstable_api::re_exports::Key::Control.into(), pressed);
39 }
40
41 if cfg!(target_os = "macos") {
42 slint_testing::send_keyboard_char(instance, slint::private_unstable_api::re_exports::Key::Alt.into(), pressed);
43 }
44}
45
46let instance = TestCase::new().unwrap();
47slint_testing::send_mouse_click(&instance, 50., 50.);
48assert!(instance.get_input_focused());
49assert_eq!(instance.get_test_text(), "");
50slint_testing::send_keyboard_string_sequence(&instance, "Test");
51assert_eq!(instance.get_test_text(), "Test");
52assert!(!instance.get_has_selection());
53
54slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), true);
55slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
56slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), false);
57assert!(instance.get_has_selection());
58slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
59assert!(!instance.get_has_selection());
60slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
61
62assert_eq!(instance.get_test_text(), "Te");
63
64slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
65slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
66slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
67slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
68assert_eq!(instance.get_test_cursor_pos(), 2);
69
70slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
71slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
72slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
73slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
74assert_eq!(instance.get_test_cursor_pos(), 0);
75
76send_move_mod_shift_modifier(&instance, true);
77slint_testing::send_keyboard_string_sequence(&instance, &DOWN_CODE.to_string());
78send_move_mod_shift_modifier(&instance, false);
79assert!(instance.get_has_selection());
80assert_eq!(instance.get_test_cursor_pos(), 2);
81assert_eq!(instance.get_test_anchor_pos(), 0);
82
83slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
84assert!(!instance.get_has_selection());
85assert_eq!(instance.get_test_cursor_pos(), 2);
86assert_eq!(instance.get_test_anchor_pos(), 2);
87
88send_move_mod_shift_modifier(&instance, true);
89slint_testing::send_keyboard_string_sequence(&instance, &UP_CODE.to_string());
90send_move_mod_shift_modifier(&instance, false);
91assert!(instance.get_has_selection());
92assert_eq!(instance.get_test_cursor_pos(), 0);
93assert_eq!(instance.get_test_anchor_pos(), 2);
94
95// Select all and start over
96slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Control.into(), true);
97slint_testing::send_keyboard_string_sequence(&instance, &"a");
98slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Control.into(), false);
99slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
100assert!(!instance.get_has_selection());
101assert_eq!(instance.get_test_text(), "");
102
103slint_testing::send_keyboard_string_sequence(&instance, "abcdefghi");
104assert_eq!(instance.get_test_text(), "abcdefghi");
105slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
106slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
107slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
108slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), true);
109slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
110slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
111slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), false);
112assert!(instance.get_has_selection());
113assert_eq!(instance.get_test_cursor_pos(), 4);
114assert_eq!(instance.get_test_anchor_pos(), 6);
115
116slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
117assert!(!instance.get_has_selection());
118assert_eq!(instance.get_test_cursor_pos(), 6);
119
120slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), true);
121slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
122slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
123slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), false);
124assert!(instance.get_has_selection());
125assert_eq!(instance.get_test_cursor_pos(), 4);
126assert_eq!(instance.get_test_anchor_pos(), 6);
127
128slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
129assert!(!instance.get_has_selection());
130assert_eq!(instance.get_test_cursor_pos(), 4);
131
132slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), true);
133slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
134slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
135slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), false);
136assert!(instance.get_has_selection());
137assert_eq!(instance.get_test_cursor_pos(), 6);
138assert_eq!(instance.get_test_anchor_pos(), 4);
139
140slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
141assert!(!instance.get_has_selection());
142assert_eq!(instance.get_test_cursor_pos(), 4);
143
144slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), true);
145slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
146slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
147slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), false);
148assert!(instance.get_has_selection());
149assert_eq!(instance.get_test_cursor_pos(), 6);
150assert_eq!(instance.get_test_anchor_pos(), 4);
151
152slint_testing::send_keyboard_string_sequence(&instance, &RIGHT_CODE.to_string());
153assert!(!instance.get_has_selection());
154assert_eq!(instance.get_test_cursor_pos(), 6);
155
156// Select all and start over
157slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Control.into(), true);
158slint_testing::send_keyboard_string_sequence(&instance, &"a");
159slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Control.into(), false);
160slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
161assert!(!instance.get_has_selection());
162assert_eq!(instance.get_test_text(), "");
163
164slint_testing::send_keyboard_string_sequence(&instance, "First Word Third Word Fifth");
165assert_eq!(instance.get_test_text(), "First Word Third Word Fifth");
166slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
167slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
168slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
169slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
170slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
171assert_eq!(instance.get_test_cursor_pos(), 22);
172
173// Delete word backwards when the cursor is between the 'F' of Fifth and the leading space.
174// -> Delete "Word"
175send_move_mod_modifier(&instance, true);
176slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
177send_move_mod_modifier(&instance, false);
178assert_eq!(instance.get_test_text(), "First Word Third Fifth");
179
180// Once more :-)
181send_move_mod_modifier(&instance, true);
182slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
183send_move_mod_modifier(&instance, false);
184assert_eq!(instance.get_test_text(), "First Word Fifth");
185
186// Move cursor between the "d" of "Word" and the trailing space
187slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
188slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
189slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
190slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
191slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
192slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
193
194// Delete word forwards
195send_move_mod_modifier(&instance, true);
196slint_testing::send_keyboard_string_sequence(&instance, &DEL_CODE.to_string());
197send_move_mod_modifier(&instance, false);
198assert_eq!(instance.get_test_text(), "First Fifth");
199
200// Select all and start over
201slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Control.into(), true);
202slint_testing::send_keyboard_string_sequence(&instance, &"a");
203slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Control.into(), false);
204slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
205assert!(!instance.get_has_selection());
206assert_eq!(instance.get_test_text(), "");
207
208slint_testing::send_keyboard_string_sequence(&instance, "First Second");
209assert_eq!(instance.get_test_text(), "First Second");
210
211slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
212slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
213
214slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), true);
215slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
216slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
217slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), false);
218assert!(instance.get_has_selection());
219
220// When there's an existing selection, always just delete that
221send_move_mod_modifier(&instance, true);
222slint_testing::send_keyboard_string_sequence(&instance, &BACK_CODE.to_string());
223send_move_mod_modifier(&instance, false);
224assert_eq!(instance.get_test_text(), "First Send");
225
226slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
227slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
228slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
229slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
230slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
231
232slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), true);
233slint_testing::send_keyboard_string_sequence(&instance, &LEFT_CODE.to_string());
234slint_testing::send_keyboard_char(&instance, slint::private_unstable_api::re_exports::Key::Shift.into(), false);
235assert!(instance.get_has_selection());
236
237// When there's an existing selection, always just delete that
238send_move_mod_modifier(&instance, true);
239slint_testing::send_keyboard_string_sequence(&instance, &DEL_CODE.to_string());
240send_move_mod_modifier(&instance, false);
241assert_eq!(instance.get_test_text(), "Fist Send");
242```
243*/
244