From 5af73dc37fd93f8d8bc8df3a24b4c67e533c21ba Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Thu, 11 Dec 2025 20:28:36 -0500 Subject: [PATCH] fix some test cases Co-authored-by: cameron --- crates/buffer_diff/src/buffer_diff.rs | 2 +- crates/editor/src/display_map.rs | 2 - crates/editor/src/split.rs | 121 +++++++++++------- crates/multi_buffer/src/multi_buffer_tests.rs | 12 +- 4 files changed, 80 insertions(+), 57 deletions(-) diff --git a/crates/buffer_diff/src/buffer_diff.rs b/crates/buffer_diff/src/buffer_diff.rs index cd9daa5fa268f9a7cb380b58640452ae10dd8b00..195824101698a42dfce2fe9545b0d6f9f12dfdf9 100644 --- a/crates/buffer_diff/src/buffer_diff.rs +++ b/crates/buffer_diff/src/buffer_diff.rs @@ -1098,7 +1098,7 @@ impl BufferDiff { base_text, hunks: SumTree::new(buffer), pending_hunks: SumTree::new(buffer), - base_text_exists: false, + base_text_exists: true, }, secondary_diff: None, } diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index 081e8ec2e5c3fed341d9949689f6d8bbbb7ccf1c..7189dd9f2061b4d542c7d50ee4b90c5681a9d86e 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -181,8 +181,6 @@ impl DisplayMap { .update(cx, |map, cx| map.sync(tab_snapshot, edits, cx)); let block_snapshot = self.block_map.read(wrap_snapshot, edits).snapshot; - // todo word diff here? - DisplaySnapshot { block_snapshot, diagnostics_max_severity: self.diagnostics_max_severity, diff --git a/crates/editor/src/split.rs b/crates/editor/src/split.rs index 144b8b749f3b35a249423f30080da65580c69970..687b19a1fe661a293f1651316925205287fcacd1 100644 --- a/crates/editor/src/split.rs +++ b/crates/editor/src/split.rs @@ -1,6 +1,7 @@ use std::ops::Range; use buffer_diff::BufferDiff; +use collections::HashMap; use feature_flags::{FeatureFlag, FeatureFlagAppExt as _}; use gpui::{ Action, AppContext as _, Entity, EventEmitter, Focusable, NoAction, Subscription, WeakEntity, @@ -78,12 +79,14 @@ impl SplittableEditor { cx: &mut Context, ) -> Self { let primary_editor = cx.new(|cx| { - Editor::for_multibuffer( + let mut editor = Editor::for_multibuffer( primary_multibuffer.clone(), Some(project.clone()), window, cx, - ) + ); + editor.set_expand_all_diff_hunks(cx); + editor }); let pane = cx.new(|cx| { let mut pane = Pane::new( @@ -264,13 +267,13 @@ impl SplittableEditor { &mut self, path: PathKey, buffer: Entity, - ranges: impl IntoIterator>, + ranges: impl IntoIterator> + Clone, context_line_count: u32, diff: Entity, cx: &mut Context, ) -> (Vec>, bool) { - self.primary_editor.update(cx, |editor, cx| { - editor.buffer().update(cx, |primary_multibuffer, cx| { + self.primary_multibuffer + .update(cx, |primary_multibuffer, cx| { let (anchors, added_a_new_excerpt) = primary_multibuffer.set_excerpts_for_path( path.clone(), buffer, @@ -284,7 +287,6 @@ impl SplittableEditor { } (anchors, added_a_new_excerpt) }) - }) } /// Expands excerpts in both sides. @@ -299,30 +301,28 @@ impl SplittableEditor { direction: ExpandExcerptDirection, cx: &mut Context, ) { + let mut corresponding_paths = HashMap::default(); self.primary_multibuffer.update(cx, |multibuffer, cx| { + let snapshot = multibuffer.snapshot(cx); + if self.secondary.is_some() { + corresponding_paths = excerpt_ids + .clone() + .map(|excerpt_id| { + let path = multibuffer.path_for_excerpt(excerpt_id).cloned().unwrap(); + let buffer = snapshot.buffer_for_excerpt(excerpt_id).unwrap(); + let diff = multibuffer.diff_for(buffer.remote_id()).unwrap(); + (path, diff) + }) + .collect::>(); + } multibuffer.expand_excerpts(excerpt_ids.clone(), lines, direction, cx); }); - let paths: Vec<(ExcerptId, PathKey)> = excerpt_ids - .flat_map(|excerpt_id| { - let path = self - .primary_multibuffer - .read(cx) - .path_for_excerpt(excerpt_id) - .cloned()?; - Some((excerpt_id, path)) - }) - .collect(); if let Some(secondary) = &mut self.secondary { - self.primary_editor.update(cx, |editor, cx| { - editor.buffer().update(cx, |multibuffer, cx| { - let snapshot = multibuffer.snapshot(cx); - for (excerpt_id, path) in paths { - let buffer = snapshot.buffer_for_excerpt(excerpt_id).unwrap(); - let diff = multibuffer.diff_for(buffer.remote_id()).unwrap(); - secondary.sync_path_excerpts(path, multibuffer, diff, cx); - } - }) + self.primary_multibuffer.update(cx, |multibuffer, cx| { + for (path, diff) in corresponding_paths { + secondary.sync_path_excerpts(path, multibuffer, diff, cx); + } }) } } @@ -401,14 +401,31 @@ impl SplittableEditor { format_diff(&self.primary_multibuffer.read(cx).snapshot(cx)) ); + log::info!( + "secondary:\n\n{}", + format_diff(&secondary.multibuffer.read(cx).snapshot(cx)) + ); + let primary_excerpts = self.primary_multibuffer.read(cx).excerpt_ids(); let secondary_excerpts = secondary.multibuffer.read(cx).excerpt_ids(); + assert_eq!(primary_excerpts.len(), secondary_excerpts.len(),); + + let primary_diff_hunks = self + .primary_multibuffer + .read(cx) + .snapshot(cx) + .diff_hunks() + .collect::>(); + let secondary_diff_hunks = secondary + .multibuffer + .read(cx) + .snapshot(cx) + .diff_hunks() + .collect::>(); assert_eq!( - primary_excerpts.len(), - secondary_excerpts.len(), - "\n\nprimary:\n\n{}\n\nsecondary:\n\n{}\n", - format_diff(&self.primary_multibuffer.read(cx).snapshot(cx)), - format_diff(&secondary.multibuffer.read(cx).snapshot(cx)) + primary_diff_hunks.len(), + secondary_diff_hunks.len(), + "\n\nprimary: {primary_diff_hunks:#?}\nsecondary: {secondary_diff_hunks:#?}", ); // self.primary_multibuffer.read(cx).check_invariants(cx); @@ -454,14 +471,14 @@ impl SplittableEditor { .map(|i| i.parse().expect("invalid `MAX_EXCERPTS` variable")) .unwrap_or(5); - let paths = self - .primary_multibuffer - .read(cx) - .paths() - .collect::>(); - let excerpt_ids = self.primary_multibuffer.read(cx).excerpt_ids(); - for _ in 0..mutation_count { + let paths = self + .primary_multibuffer + .read(cx) + .paths() + .collect::>(); + let excerpt_ids = self.primary_multibuffer.read(cx).excerpt_ids(); + if rng.random_bool(0.1) && !excerpt_ids.is_empty() { let mut excerpts = HashSet::default(); for _ in 0..rng.random_range(0..excerpt_ids.len()) { @@ -482,8 +499,7 @@ impl SplittableEditor { } if excerpt_ids.is_empty() || (rng.random() && excerpt_ids.len() < max_excerpts) { - let existing_buffers = self.primary_multibuffer.read(cx).all_buffers(); - let len = rng.random_range(0..500); + let len = rng.random_range(100..500); let text = RandomCharIter::new(&mut *rng).take(len).collect::(); let buffer = cx.new(|cx| Buffer::local(text, cx)); log::info!( @@ -495,14 +511,14 @@ impl SplittableEditor { let diff = cx.new(|cx| BufferDiff::new_unchanged(&buffer_snapshot, cx)); // Create some initial diff hunks. buffer.update(cx, |buffer, cx| { - buffer.randomly_edit(rng, 2, cx); + buffer.randomly_edit(rng, 1, cx); }); let buffer_snapshot = buffer.read(cx).text_snapshot(); let ranges = diff.update(cx, |diff, cx| { diff.recalculate_diff_sync(&buffer_snapshot, cx); diff.snapshot(cx) .hunks(&buffer_snapshot) - .map(|hunk| hunk.range.clone()) + .map(|hunk| hunk.buffer_range.to_point(&buffer_snapshot)) .collect::>() }); let path = PathKey::for_buffer(&buffer, cx); @@ -566,7 +582,8 @@ impl SplittableEditor { let diff_snapshot = diff.read(cx).snapshot(cx); let ranges = diff_snapshot .hunks(&buffer_snapshot) - .map(|hunk| hunk.range.clone()); + .map(|hunk| hunk.range.clone()) + .collect::>(); let path = PathKey::for_buffer(&buffer, cx); self.set_excerpts_for_path(path, buffer, ranges, 2, diff, cx); } @@ -620,10 +637,12 @@ impl SecondaryEditor { diff: Entity, cx: &mut App, ) { - let excerpt_id = primary_multibuffer - .excerpts_for_path(&path_key) - .next() - .unwrap(); + let Some(excerpt_id) = primary_multibuffer.excerpts_for_path(&path_key).next() else { + self.multibuffer.update(cx, |multibuffer, cx| { + multibuffer.remove_excerpts_for_path(path_key, cx); + }); + return; + }; let primary_multibuffer_snapshot = primary_multibuffer.snapshot(cx); let main_buffer = primary_multibuffer_snapshot .buffer_for_excerpt(excerpt_id) @@ -645,8 +664,8 @@ impl SecondaryEditor { let primary = excerpt_range.primary.to_point(main_buffer); let context = excerpt_range.context.to_point(main_buffer); ExcerptRange { - primary: point_range_to_base_text_point_range(dbg!(primary)), - context: point_range_to_base_text_point_range(dbg!(context)), + primary: point_range_to_base_text_point_range(primary), + context: point_range_to_base_text_point_range(context), } }) .collect(); @@ -697,7 +716,11 @@ mod tests { let project = Project::test(FakeFs::new(cx.executor()), [], cx).await; let (workspace, cx) = cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx)); - let primary_multibuffer = cx.new(|_| MultiBuffer::new(Capability::ReadWrite)); + let primary_multibuffer = cx.new(|cx| { + let mut multibuffer = MultiBuffer::new(Capability::ReadWrite); + multibuffer.set_all_diff_hunks_expanded(cx); + multibuffer + }); let editor = cx.new_window_entity(|window, cx| { let mut editor = SplittableEditor::new_unsplit(primary_multibuffer, project, workspace, window, cx); diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index e1c55ed8b5e33f7fd5fc0740792d9dc58efd4997..6146bf289b36f6504c95ef2dfd2e2877f10c0b31 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -476,7 +476,7 @@ async fn test_diff_hunks_in_range(cx: &mut TestAppContext) { #[gpui::test] async fn test_inverted_diff_hunks_in_range(cx: &mut TestAppContext) { let base_text = "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\n"; - let text = "one\nTHREE\nfour\nseven\nEIGHT\nNINE\n"; + let text = "ZERO\none\nTHREE\nfour\nseven\nEIGHT\nNINE\n"; let buffer = cx.new(|cx| Buffer::local(text, cx)); let diff = cx .new(|cx| BufferDiff::new_with_base_text(base_text, &buffer.read(cx).text_snapshot(), cx)); @@ -488,7 +488,6 @@ async fn test_inverted_diff_hunks_in_range(cx: &mut TestAppContext) { multibuffer.update(cx, |multibuffer, cx| { multibuffer.add_inverted_diff(diff, buffer.clone(), cx); - multibuffer.expand_diff_hunks(vec![Anchor::min()..Anchor::max()], cx); }); assert_new_snapshot( @@ -511,13 +510,16 @@ async fn test_inverted_diff_hunks_in_range(cx: &mut TestAppContext) { assert_eq!( snapshot - .diff_hunks_in_range(Point::new(1, 0)..Point::MAX) + .diff_hunks_in_range(Point::new(0, 0)..Point::MAX) .map(|hunk| hunk.row_range.start.0..hunk.row_range.end.0) .collect::>(), - vec![1..3, 4..6, 7..8] + vec![0..0, 1..3, 4..6, 7..8] ); - assert_eq!(snapshot.diff_hunk_before(Point::new(1, 1)), None,); + assert_eq!( + snapshot.diff_hunk_before(Point::new(1, 1)), + Some(MultiBufferRow(0)) + ); assert_eq!( snapshot.diff_hunk_before(Point::new(7, 0)), Some(MultiBufferRow(4))