Add `FoldMap::chars_at` to randomized test

Antonio Scandurra created

Change summary

zed/src/editor/display_map/fold_map.rs | 38 ++++++++++++++++-----------
1 file changed, 23 insertions(+), 15 deletions(-)

Detailed changes

zed/src/editor/display_map/fold_map.rs 🔗

@@ -487,8 +487,6 @@ impl<'a> Dimension<'a, TransformSummary> for usize {
 
 #[cfg(test)]
 mod tests {
-    use std::cmp::Reverse;
-
     use super::*;
     use crate::test::sample_text;
     use buffer::ToPoint;
@@ -775,6 +773,25 @@ mod tests {
                         display_offset.0 += 1;
                     }
 
+                    for _ in 0..5 {
+                        let row = rng.gen_range(0..=map.max_point().row());
+                        let column = rng.gen_range(0..=map.line_len(row, app.as_ref()).unwrap());
+                        let point = DisplayPoint::new(row, column);
+                        let offset = map.to_display_offset(point, app.as_ref()).unwrap().0;
+                        let len = rng.gen_range(0..=map.len() - offset);
+                        assert_eq!(
+                            map.chars_at(point, app.as_ref())
+                                .unwrap()
+                                .take(len)
+                                .collect::<String>(),
+                            expected_text
+                                .chars()
+                                .skip(offset)
+                                .take(len)
+                                .collect::<String>()
+                        );
+                    }
+
                     for (idx, buffer_row) in expected_buffer_rows.iter().enumerate() {
                         let display_row = map.to_display_point(Point::new(*buffer_row, 0)).row();
                         assert_eq!(
@@ -828,8 +845,10 @@ mod tests {
 
         fn merged_fold_ranges(&self, app: &AppContext) -> Vec<Range<usize>> {
             let buffer = self.buffer.read(app);
-            let mut fold_ranges = self
-                .folds
+            let mut folds = self.folds.clone();
+            // Ensure sorting doesn't change how folds get merged and displayed.
+            folds.sort_by(|a, b| a.cmp(b, buffer).unwrap());
+            let mut fold_ranges = folds
                 .iter()
                 .map(|fold| {
                     fold.start.to_offset(buffer).unwrap()..fold.end.to_offset(buffer).unwrap()
@@ -862,17 +881,6 @@ mod tests {
                 buffer.len(),
                 "transform tree does not match buffer's length"
             );
-
-            let mut fold_ranges = Vec::new();
-            let mut sorted_fold_ranges = Vec::new();
-            for fold in &self.folds {
-                let start = fold.start.to_offset(buffer).unwrap();
-                let end = fold.end.to_offset(buffer).unwrap();
-                fold_ranges.push(start..end);
-                sorted_fold_ranges.push(start..end);
-            }
-            sorted_fold_ranges.sort_by_key(|fold| (fold.start, Reverse(fold.end)));
-            assert_eq!(fold_ranges, sorted_fold_ranges);
         }
     }
 }