sort out randomized test

Cole Miller created

Change summary

crates/multi_buffer/src/multi_buffer_tests.rs | 103 +++++++-------------
1 file changed, 35 insertions(+), 68 deletions(-)

Detailed changes

crates/multi_buffer/src/multi_buffer_tests.rs 🔗

@@ -2268,7 +2268,6 @@ struct ReferenceMultibuffer {
     excerpts: Vec<ReferenceExcerpt>,
     diffs: HashMap<BufferId, Entity<BufferDiff>>,
     inverted_diffs: HashMap<BufferId, (Entity<BufferDiff>, Entity<language::Buffer>)>,
-    // todo!() is this the right model?
     expanded_diff_hunks_by_buffer: HashMap<BufferId, Vec<text::Anchor>>,
 }
 
@@ -2353,12 +2352,15 @@ impl ReferenceMultibuffer {
         path_key: PathKey,
         path_key_index: PathKeyIndex,
         buffer: Entity<Buffer>,
-        ranges: Vec<Range<text::Anchor>>,
+        buffer_snapshot: &BufferSnapshot,
+        ranges: Vec<ExcerptRange<Point>>,
     ) {
         self.excerpts.retain(|excerpt| {
             excerpt.path_key != path_key && excerpt.buffer.entity_id() != buffer.entity_id()
         });
 
+        let ranges = MultiBuffer::merge_excerpt_ranges(&ranges);
+
         let (Ok(ix) | Err(ix)) = self
             .excerpts
             .binary_search_by(|probe| probe.path_key.cmp(&path_key));
@@ -2368,7 +2370,7 @@ impl ReferenceMultibuffer {
                 path_key: path_key.clone(),
                 path_key_index,
                 buffer: buffer.clone(),
-                range,
+                range: buffer_snapshot.anchor_range_around(range.context),
             }),
         );
     }
@@ -2863,7 +2865,7 @@ async fn test_random_multibuffer(cx: &mut TestAppContext, mut rng: StdRng) {
                 });
                 cx.update(|cx| reference.diffs_updated(cx));
             }
-            15..=19 if !reference.excerpts.is_empty() => {
+            15..=24 if !reference.excerpts.is_empty() => {
                 multibuffer.update(cx, |multibuffer, cx| {
                     let snapshot = multibuffer.snapshot(cx);
                     let infos = snapshot
@@ -2900,29 +2902,7 @@ async fn test_random_multibuffer(cx: &mut TestAppContext, mut rng: StdRng) {
                     reference.expand_excerpts(&excerpts, line_count, cx);
                 });
             }
-            20..=29 if !reference.excerpts.is_empty() => {
-                let mut excerpts_to_remove = vec![];
-                for _ in 0..rng.random_range(1..=3) {
-                    let Some(excerpt) = reference.excerpts.choose(&mut rng) else {
-                        break;
-                    };
-                    let info = cx.update(|cx| excerpt.info(cx));
-                    cx.update(|cx| reference.remove_excerpt(info, cx));
-                    excerpts_to_remove.push(info);
-                }
-                let snapshot =
-                    multibuffer.read_with(cx, |multibuffer, cx| multibuffer.snapshot(cx));
-                excerpts_to_remove.sort_unstable_by(|a, b| {
-                    let a_anchor = Anchor::in_buffer(a.path_key_index, a.range.context.start);
-                    let b_anchor = Anchor::in_buffer(b.path_key_index, b.range.context.start);
-                    a_anchor.cmp(&b_anchor, &snapshot)
-                });
-                drop(snapshot);
-                multibuffer.update(cx, |multibuffer, cx| {
-                    multibuffer.remove_excerpts(excerpts_to_remove, cx)
-                });
-            }
-            30..=39 if !reference.excerpts.is_empty() => {
+            25..=34 if !reference.excerpts.is_empty() => {
                 let multibuffer =
                     multibuffer.read_with(cx, |multibuffer, cx| multibuffer.snapshot(cx));
                 let offset = multibuffer.clip_offset(
@@ -2938,8 +2918,7 @@ async fn test_random_multibuffer(cx: &mut TestAppContext, mut rng: StdRng) {
                 anchors.push(multibuffer.anchor_at(offset, bias));
                 anchors.sort_by(|a, b| a.cmp(b, &multibuffer));
             }
-            40..=44 => todo!("refresh anchors was here"),
-            45..=55 if !reference.excerpts.is_empty() => {
+            35..=45 if !reference.excerpts.is_empty() => {
                 multibuffer.update(cx, |multibuffer, cx| {
                     let snapshot = multibuffer.snapshot(cx);
                     let excerpt_ix = rng.random_range(0..reference.excerpts.len());
@@ -2965,7 +2944,7 @@ async fn test_random_multibuffer(cx: &mut TestAppContext, mut rng: StdRng) {
                     multibuffer.expand_diff_hunks(vec![range], cx);
                 });
             }
-            56..=85 if needs_diff_calculation => {
+            46..=75 if needs_diff_calculation => {
                 multibuffer.update(cx, |multibuffer, cx| {
                     for buffer in multibuffer.all_buffers() {
                         let snapshot = buffer.read(cx).snapshot();
@@ -3073,32 +3052,39 @@ async fn test_random_multibuffer(cx: &mut TestAppContext, mut rng: StdRng) {
                     }
                 };
 
+                let excerpt_buffer_snapshot =
+                    excerpt_buffer.read_with(cx, |excerpt_buffer, _| excerpt_buffer.snapshot());
                 let mut ranges = reference
                     .excerpts
                     .iter()
-                    .map(|excerpt| excerpt.range.clone());
-                excerpt_buffer.read_with(cx, |buffer, cx| {
-                    mutate_excerpt_ranges(&mut rng, &mut ranges, &buffer.snapshot(), 1);
-                });
-
+                    .filter(|excerpt| excerpt.buffer == excerpt_buffer)
+                    .map(|excerpt| excerpt.range.to_point(&excerpt_buffer_snapshot))
+                    .collect::<Vec<_>>();
+                mutate_excerpt_ranges(&mut rng, &mut ranges, &excerpt_buffer_snapshot, 1);
                 let ranges = ranges
-                    .into_iter()
+                    .iter()
+                    .cloned()
                     .map(ExcerptRange::new)
                     .collect::<Vec<_>>();
+                let path = cx.update(|cx| PathKey::for_buffer(&excerpt_buffer, cx));
 
                 let (_, path_key_index, _) = multibuffer.update(cx, |multibuffer, cx| {
-                    let excerpt_buffer_snapshot = excerpt_buffer.read(cx).snapshot();
                     multibuffer.set_excerpt_ranges_for_path(
-                        path,
-                        excerpt_buffer,
+                        path.clone(),
+                        excerpt_buffer.clone(),
                         &excerpt_buffer_snapshot,
-                        ranges,
+                        ranges.clone(),
                         cx,
                     )
                 });
 
-                let path_key_index =
-                    reference.set_excerpts(path, path_key_index, excerpt_buffer, ranges);
+                reference.set_excerpts(
+                    path,
+                    path_key_index,
+                    excerpt_buffer.clone(),
+                    &excerpt_buffer_snapshot,
+                    ranges,
+                );
 
                 let excerpt_buffer_id =
                     excerpt_buffer.read_with(cx, |buffer, _| buffer.remote_id());
@@ -3134,50 +3120,31 @@ async fn test_random_multibuffer(cx: &mut TestAppContext, mut rng: StdRng) {
 
 fn mutate_excerpt_ranges(
     rng: &mut StdRng,
-    existing_ranges: &mut Vec<Range<text::Anchor>>,
+    existing_ranges: &mut Vec<Range<Point>>,
     buffer: &BufferSnapshot,
     operations: u32,
 ) {
-    let mut indices_to_remove = HashSet::default();
     let mut ranges_to_add = Vec::new();
 
     for _ in 0..operations {
+        // todo!() logging
         match rng.random_range(0..5) {
             0..=1 if !existing_ranges.is_empty() => {
-                log::info!(
-                    "Removing excerpt at {} of {} for buffer {}: {:?}[{:?}] = {:?}",
-                    excerpt_ix,
-                    reference.excerpts.len(),
-                    buffer.remote_id(),
-                    buffer.text(),
-                    start_ix..end_ix,
-                    &buffer.text()[start_ix..end_ix]
-                );
-                let index = existing_ranges.choose(rng).unwrap();
+                log::info!("Removing excerpt",);
+                let index = rng.random_range(0..existing_ranges.len());
                 existing_ranges.remove(index);
             }
             _ => {
-                log::info!(
-                    "Inserting excerpt at {} of {} for buffer {}: {:?}[{:?}] = {:?}",
-                    excerpt_ix,
-                    reference.excerpts.len(),
-                    buffer.remote_id(),
-                    buffer.text(),
-                    start_ix..end_ix,
-                    &buffer.text()[start_ix..end_ix]
-                );
+                log::info!("Inserting excerpt",);
                 let end_row = rng.random_range(0..=buffer.max_point().row);
                 let start_row = rng.random_range(0..=end_row);
-                let end_ix = buffer.point_to_offset(Point::new(end_row, 0));
-                let start_ix = buffer.point_to_offset(Point::new(start_row, 0));
-                let anchor_range = buffer.anchor_before(start_ix)..buffer.anchor_after(end_ix);
-                ranges_to_add.push(anchor_range);
+                ranges_to_add.push(Point::new(start_row, 0)..Point::new(end_row, 0));
             }
         }
     }
 
     existing_ranges.extend(ranges_to_add);
-    existing_ranges.sort_by(|l, r| l.start.cmp(&r.start, buffer));
+    existing_ranges.sort_by(|l, r| l.start.cmp(&r.start));
 }
 
 fn check_multibuffer(