diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index 899681fee654e7f9abe9a8856dbf87d91440c55f..a7ef0fba2fbae126597e6462e53ee2bbb52ea751 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -2268,7 +2268,6 @@ struct ReferenceMultibuffer { excerpts: Vec, diffs: HashMap>, inverted_diffs: HashMap, Entity)>, - // todo!() is this the right model? expanded_diff_hunks_by_buffer: HashMap>, } @@ -2353,12 +2352,15 @@ impl ReferenceMultibuffer { path_key: PathKey, path_key_index: PathKeyIndex, buffer: Entity, - ranges: Vec>, + buffer_snapshot: &BufferSnapshot, + ranges: Vec>, ) { 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::>(); + mutate_excerpt_ranges(&mut rng, &mut ranges, &excerpt_buffer_snapshot, 1); let ranges = ranges - .into_iter() + .iter() + .cloned() .map(ExcerptRange::new) .collect::>(); + 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>, + existing_ranges: &mut Vec>, 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(