Re-enable multi-byte random character generation

Antonio Scandurra and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

crates/editor/src/multi_buffer.rs   | 191 ++++++++++++++++--------------
crates/text/src/random_char_iter.rs |   8 
2 files changed, 106 insertions(+), 93 deletions(-)

Detailed changes

crates/editor/src/multi_buffer.rs 🔗

@@ -2276,6 +2276,7 @@ mod tests {
             }
 
             assert_eq!(snapshot.text(), expected_text);
+            log::info!("MultiBuffer text: {:?}", expected_text);
 
             let mut excerpt_starts = excerpt_starts.into_iter();
             for (buffer, range, _) in &expected_excerpts {
@@ -2293,99 +2294,111 @@ mod tests {
                 let mut buffer_point = buffer_start_point;
                 let mut point_utf16 = excerpt_start.lines_utf16;
                 let mut buffer_point_utf16 = buffer_start_point_utf16;
-                for byte in buffer.bytes_in_range(buffer_range.clone()).flatten() {
-                    let left_offset = snapshot.clip_offset(offset, Bias::Left);
-                    let right_offset = snapshot.clip_offset(offset, Bias::Right);
-                    let buffer_left_offset = buffer.clip_offset(buffer_offset, Bias::Left);
-                    let buffer_right_offset = buffer.clip_offset(buffer_offset, Bias::Right);
-                    assert_eq!(
-                        left_offset,
-                        excerpt_start.bytes + (buffer_left_offset - buffer_range.start),
-                        "clip_offset({:?}, Left). buffer: {:?}, buffer offset: {:?}",
-                        offset,
-                        buffer_id,
-                        buffer_offset,
-                    );
-                    assert_eq!(
-                        right_offset,
-                        excerpt_start.bytes + (buffer_right_offset - buffer_range.start),
-                        "clip_offset({:?}, Right). buffer: {:?}, buffer offset: {:?}",
-                        offset,
-                        buffer_id,
-                        buffer_offset,
-                    );
+                for ch in buffer
+                    .snapshot()
+                    .chunks(buffer_range.clone(), None)
+                    .flat_map(|c| c.text.chars())
+                {
+                    for _ in 0..ch.len_utf8() {
+                        let left_offset = snapshot.clip_offset(offset, Bias::Left);
+                        let right_offset = snapshot.clip_offset(offset, Bias::Right);
+                        let buffer_left_offset = buffer.clip_offset(buffer_offset, Bias::Left);
+                        let buffer_right_offset = buffer.clip_offset(buffer_offset, Bias::Right);
+                        assert_eq!(
+                            left_offset,
+                            excerpt_start.bytes + (buffer_left_offset - buffer_range.start),
+                            "clip_offset({:?}, Left). buffer: {:?}, buffer offset: {:?}",
+                            offset,
+                            buffer_id,
+                            buffer_offset,
+                        );
+                        assert_eq!(
+                            right_offset,
+                            excerpt_start.bytes + (buffer_right_offset - buffer_range.start),
+                            "clip_offset({:?}, Right). buffer: {:?}, buffer offset: {:?}",
+                            offset,
+                            buffer_id,
+                            buffer_offset,
+                        );
 
-                    let left_point = snapshot.clip_point(point, Bias::Left);
-                    let right_point = snapshot.clip_point(point, Bias::Right);
-                    let buffer_left_point = buffer.clip_point(buffer_point, Bias::Left);
-                    let buffer_right_point = buffer.clip_point(buffer_point, Bias::Right);
-                    assert_eq!(
-                        left_point,
-                        excerpt_start.lines + (buffer_left_point - buffer_start_point),
-                        "clip_point({:?}, Left). buffer: {:?}, buffer point: {:?}",
-                        point,
-                        buffer_id,
-                        buffer_point,
-                    );
-                    assert_eq!(
-                        right_point,
-                        excerpt_start.lines + (buffer_right_point - buffer_start_point),
-                        "clip_point({:?}, Right). buffer: {:?}, buffer point: {:?}",
-                        point,
-                        buffer_id,
-                        buffer_point,
-                    );
+                        let left_point = snapshot.clip_point(point, Bias::Left);
+                        let right_point = snapshot.clip_point(point, Bias::Right);
+                        let buffer_left_point = buffer.clip_point(buffer_point, Bias::Left);
+                        let buffer_right_point = buffer.clip_point(buffer_point, Bias::Right);
+                        assert_eq!(
+                            left_point,
+                            excerpt_start.lines + (buffer_left_point - buffer_start_point),
+                            "clip_point({:?}, Left). buffer: {:?}, buffer point: {:?}",
+                            point,
+                            buffer_id,
+                            buffer_point,
+                        );
+                        assert_eq!(
+                            right_point,
+                            excerpt_start.lines + (buffer_right_point - buffer_start_point),
+                            "clip_point({:?}, Right). buffer: {:?}, buffer point: {:?}",
+                            point,
+                            buffer_id,
+                            buffer_point,
+                        );
 
-                    let left_point_utf16 = snapshot.clip_point_utf16(point_utf16, Bias::Left);
-                    let right_point_utf16 = snapshot.clip_point_utf16(point_utf16, Bias::Right);
-                    let buffer_left_point_utf16 =
-                        buffer.clip_point_utf16(buffer_point_utf16, Bias::Left);
-                    let buffer_right_point_utf16 =
-                        buffer.clip_point_utf16(buffer_point_utf16, Bias::Right);
-                    assert_eq!(
-                        left_point_utf16,
-                        excerpt_start.lines_utf16
-                            + (buffer_left_point_utf16 - buffer_start_point_utf16),
-                        "clip_point_utf16({:?}, Left). buffer: {:?}, buffer point_utf16: {:?}",
-                        point_utf16,
-                        buffer_id,
-                        buffer_point_utf16,
-                    );
-                    assert_eq!(
-                        right_point_utf16,
-                        excerpt_start.lines_utf16
-                            + (buffer_right_point_utf16 - buffer_start_point_utf16),
-                        "clip_point_utf16({:?}, Right). buffer: {:?}, buffer point_utf16: {:?}",
-                        point_utf16,
-                        buffer_id,
-                        buffer_point_utf16,
-                    );
+                        assert_eq!(
+                            snapshot.point_to_offset(left_point),
+                            left_offset,
+                            "point_to_offset({:?})",
+                            left_point,
+                        );
+                        assert_eq!(
+                            snapshot.offset_to_point(left_offset),
+                            left_point,
+                            "offset_to_point({:?})",
+                            left_offset,
+                        );
 
-                    assert_eq!(
-                        snapshot.point_to_offset(left_point),
-                        left_offset,
-                        "point_to_offset({:?})",
-                        left_point,
-                    );
-                    assert_eq!(
-                        snapshot.offset_to_point(left_offset),
-                        left_point,
-                        "offset_to_point({:?})",
-                        left_offset,
-                    );
+                        offset += 1;
+                        buffer_offset += 1;
+                        if ch == '\n' {
+                            point += Point::new(1, 0);
+                            buffer_point += Point::new(1, 0);
+                        } else {
+                            point += Point::new(0, 1);
+                            buffer_point += Point::new(0, 1);
+                        }
+                    }
 
-                    offset += 1;
-                    buffer_offset += 1;
-                    if *byte == b'\n' {
-                        point += Point::new(1, 0);
-                        point_utf16 += PointUtf16::new(1, 0);
-                        buffer_point += Point::new(1, 0);
-                        buffer_point_utf16 += PointUtf16::new(1, 0);
-                    } else {
-                        point += Point::new(0, 1);
-                        point_utf16 += PointUtf16::new(0, 1);
-                        buffer_point += Point::new(0, 1);
-                        buffer_point_utf16 += PointUtf16::new(0, 1);
+                    for _ in 0..ch.len_utf16() {
+                        let left_point_utf16 = snapshot.clip_point_utf16(point_utf16, Bias::Left);
+                        let right_point_utf16 = snapshot.clip_point_utf16(point_utf16, Bias::Right);
+                        let buffer_left_point_utf16 =
+                            buffer.clip_point_utf16(buffer_point_utf16, Bias::Left);
+                        let buffer_right_point_utf16 =
+                            buffer.clip_point_utf16(buffer_point_utf16, Bias::Right);
+                        assert_eq!(
+                            left_point_utf16,
+                            excerpt_start.lines_utf16
+                                + (buffer_left_point_utf16 - buffer_start_point_utf16),
+                            "clip_point_utf16({:?}, Left). buffer: {:?}, buffer point_utf16: {:?}",
+                            point_utf16,
+                            buffer_id,
+                            buffer_point_utf16,
+                        );
+                        assert_eq!(
+                            right_point_utf16,
+                            excerpt_start.lines_utf16
+                                + (buffer_right_point_utf16 - buffer_start_point_utf16),
+                            "clip_point_utf16({:?}, Right). buffer: {:?}, buffer point_utf16: {:?}",
+                            point_utf16,
+                            buffer_id,
+                            buffer_point_utf16,
+                        );
+
+                        if ch == '\n' {
+                            point_utf16 += PointUtf16::new(1, 0);
+                            buffer_point_utf16 += PointUtf16::new(1, 0);
+                        } else {
+                            point_utf16 += PointUtf16::new(0, 1);
+                            buffer_point_utf16 += PointUtf16::new(0, 1);
+                        }
                     }
                 }
             }

crates/text/src/random_char_iter.rs 🔗

@@ -22,13 +22,13 @@ impl<T: Rng> Iterator for RandomCharIter<T> {
 
         match self.0.gen_range(0..100) {
             // whitespace
-            0..=5 => ['\n'].choose(&mut self.0).copied(),
+            0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(),
             // two-byte greek letters
-            // 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
+            20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
             // // three-byte characters
-            // 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
+            33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
             // // four-byte characters
-            // 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
+            46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
             // ascii letters
             _ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
         }