feat: edit working-checkout comparisons with normal editor actions

This commit is contained in:
2026-10-11 02:13:16 +02:00
parent 704dce2539
commit 9a34669c08
16 changed files with 2277 additions and 647 deletions
+35 -16
View File
@@ -76,7 +76,7 @@ fn type_query(session: &mut EditorSession, text: &str) {
}
#[test]
fn typed_diff_compares_disk_not_unsaved_buffers_and_preserves_undo() {
fn typed_diff_edits_unsaved_working_after_and_preserves_undo_on_explicit_close() {
let fixture = Fixture::new();
fixture.git(&["init", "-q"]);
let source = fixture.0.join("repo/buffer.rs");
@@ -128,7 +128,12 @@ fn typed_diff_compares_disk_not_unsaved_buffers_and_preserves_undo() {
let file = &comparison.files[0];
assert_eq!(file.path, Path::new("buffer.rs"));
assert_eq!(file.before, ["before"]);
assert_eq!(file.after, ["after"]);
assert_eq!(file.after, ["uafter", ""]);
session.handle(Input::Char('\t'));
assert_eq!(
session.editor().diff().unwrap().focus,
vamp::diff::Focus::Before
);
for input in [
Input::Char('i'),
Input::Char('x'),
@@ -137,27 +142,41 @@ fn typed_diff_compares_disk_not_unsaved_buffers_and_preserves_undo() {
session.handle(input);
}
session.handle(Input::Escape);
assert!(
!session
.editor()
.diff()
.unwrap()
.files
.as_ref()
.unwrap()
.searching
);
session.handle(Input::Escape);
assert!(session.editor().diff().is_none());
assert!(session.editor().diff().is_some());
assert_eq!(session.editor().context().text, "uafter\n");
assert!(session.editor().dirty());
assert_eq!(session.editor().cursor(), cursor);
assert_eq!(fs::read_to_string(&source).unwrap(), "after\n");
session.handle(Input::Char('\t'));
assert_eq!(
session.editor().diff().unwrap().focus,
vamp::diff::Focus::After
);
for input in [Input::Char('i'), Input::Char('x'), Input::Escape] {
session.handle(input);
}
assert_eq!(session.editor().context().text, "xuafter\n");
assert!(session.editor().diff().is_some());
session.handle(Input::Char('u'));
assert_eq!(session.editor().context().text, "uafter\n");
session.handle(Input::Char('U'));
assert_eq!(session.editor().context().text, "xuafter\n");
session.execute("w");
assert_eq!(fs::read_to_string(&source).unwrap(), "xuafter\n");
assert!(!session.editor().dirty());
session.handle(Input::Char('u'));
assert_eq!(session.editor().context().text, "uafter\n");
assert!(session.editor().dirty());
session.execute("diff.close");
assert!(session.editor().diff().is_none());
assert_eq!(session.editor().context().text, "uafter\n");
session.handle(Input::Char('u'));
assert_eq!(session.editor().context().text, "after\n");
assert_eq!(fs::read_to_string(&source).unwrap(), "xuafter\n");
session.execute(":diff");
assert!(session.editor().diff().is_some());
session.handle(Input::Escape);
session.execute("diff.close");
session.poll();
assert!(session.editor().diff().is_none());
assert_eq!(fixture.git(&["rev-parse", "HEAD"]), base);