T21a round 3 fix, after the cap

- TextInput records the selection each edit replaces, where every edit passes;
  the block editor's undo goes back to it, for typing, delete, cut and paste
- TextInput's layout geometry moves to forms/text/geometry.rs
- Reviews: T21a done, fixed after the cap, no fourth review
This commit is contained in:
ZacharyZhang-NY committed 2026-09-26 04:03:43 -04:00
1 parent 187f54253e
commit 14a8990793
7 files changed
+109 -74

No files matched your search

+27
View File
@@ -344,3 +344,30 @@ fn up_into_a_table_skips_its_hidden_cells(cx: &mut TestAppContext) {
"up lands on the cell that shows in the last row"
);
}
#[gpui::test]
fn undo_of_a_delete_or_a_paste_restores_the_selection(cx: &mut TestAppContext) {
let (editor, cx) = open(vec![BlockData::new(BlockKind::Paragraph, ["abcdef"])], cx);
let selection = |cx: &mut VisualTestContext| {
cx.update(|_, cx| editor.read(cx).blocks[0].fields[0].read(cx).selection())
};
select(&editor, 0, 0, 2..4, cx);
cx.simulate_keystrokes("backspace");
settle(cx);
assert_eq!(blocks(&editor, cx), [text(BlockKind::Paragraph, "abef")]);
cx.simulate_keystrokes("cmd-z");
settle(cx);
assert_eq!(selection(cx), 2..4, "undo of a delete selects what it took");
cx.update(|_, cx| cx.write_to_clipboard(gpui::ClipboardItem::new_string("xy".into())));
select(&editor, 0, 0, 2..4, cx);
cx.simulate_keystrokes("cmd-v");
settle(cx);
assert_eq!(blocks(&editor, cx), [text(BlockKind::Paragraph, "abxyef")]);
cx.simulate_keystrokes("cmd-z");
settle(cx);
assert_eq!(
selection(cx),
2..4,
"undo of a paste selects what it replaced"
);
}