diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index ee7dc2acf63ed713671a45aaf0f710bd2e6e1448..10e27309d5a595c72fbfaa838b4952ebe7d7bedd 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -493,9 +493,9 @@ impl ToDisplayPoint for Anchor { mod tests { use super::*; use crate::{movement, test::*}; - use gpui::{color::Color, MutableAppContext}; + use gpui::{color::Color, elements::*, MutableAppContext}; use language::{Buffer, Language, LanguageConfig, RandomCharIter, SelectionGoal}; - use rand::{prelude::StdRng, Rng}; + use rand::{prelude::*, Rng}; use std::{env, sync::Arc}; use theme::SyntaxTheme; use util::test::sample_text; @@ -541,6 +541,15 @@ mod tests { }); let (_observer, notifications) = Observer::new(&map, &mut cx); let mut fold_count = 0; + let mut blocks = Vec::new(); + + let snapshot = map.update(&mut cx, |map, cx| map.snapshot(cx)); + log::info!("buffer text: {:?}", snapshot.buffer_snapshot.text()); + log::info!("fold text: {:?}", snapshot.folds_snapshot.text()); + log::info!("tab text: {:?}", snapshot.tabs_snapshot.text()); + log::info!("wrap text: {:?}", snapshot.wraps_snapshot.text()); + log::info!("block text: {:?}", snapshot.blocks_snapshot.text()); + log::info!("display text: {:?}", snapshot.text()); for _i in 0..operations { match rng.gen_range(0..100) { @@ -553,7 +562,51 @@ mod tests { log::info!("setting wrap width to {:?}", wrap_width); map.update(&mut cx, |map, cx| map.set_wrap_width(wrap_width, cx)); } - 20..=80 => { + 20..=44 => { + map.update(&mut cx, |map, cx| { + if rng.gen() || blocks.is_empty() { + let buffer = map.snapshot(cx).buffer_snapshot; + let block_properties = (0..rng.gen_range(1..=1)) + .map(|_| { + let position = + buffer.anchor_after(buffer.clip_offset( + rng.gen_range(0..=buffer.len()), + Bias::Left, + )); + + let disposition = if rng.gen() { + BlockDisposition::Above + } else { + BlockDisposition::Below + }; + let height = rng.gen_range(1..5); + log::info!( + "inserting block {:?} {:?} with height {}", + disposition, + position.to_point(&buffer), + height + ); + BlockProperties { + position, + height, + disposition, + render: Arc::new(|_| Empty::new().boxed()), + } + }) + .collect::>(); + blocks.extend(map.insert_blocks(block_properties, cx)); + } else { + blocks.shuffle(&mut rng); + let remove_count = rng.gen_range(1..=4.min(blocks.len())); + let block_ids_to_remove = (0..remove_count) + .map(|_| blocks.remove(rng.gen_range(0..blocks.len()))) + .collect(); + log::info!("removing block ids {:?}", block_ids_to_remove); + map.remove_blocks(block_ids_to_remove, cx); + } + }); + } + 45..=79 => { let mut ranges = Vec::new(); for _ in 0..rng.gen_range(1..=3) { buffer.read_with(&cx, |buffer, cx| { @@ -588,6 +641,10 @@ mod tests { let snapshot = map.update(&mut cx, |map, cx| map.snapshot(cx)); fold_count = snapshot.fold_count(); log::info!("buffer text: {:?}", snapshot.buffer_snapshot.text()); + log::info!("fold text: {:?}", snapshot.folds_snapshot.text()); + log::info!("tab text: {:?}", snapshot.tabs_snapshot.text()); + log::info!("wrap text: {:?}", snapshot.wraps_snapshot.text()); + log::info!("block text: {:?}", snapshot.blocks_snapshot.text()); log::info!("display text: {:?}", snapshot.text()); // Line boundaries @@ -603,7 +660,7 @@ mod tests { assert!(next_display_bound >= point); assert_eq!(prev_buffer_bound.column, 0); assert_eq!(prev_display_bound.column(), 0); - if next_display_bound < snapshot.max_point() { + if next_buffer_bound < snapshot.buffer_snapshot.max_point() { assert_eq!( snapshot.buffer_snapshot.chars_at(next_buffer_bound).next(), Some('\n')