diff --git a/zed/src/editor.rs b/zed/src/editor.rs index c36d0dad6c3e7df601ece37abdad5bf64cf992c2..d659ead94852dcb83dad02e5a9d4e6df95c38cd9 100644 --- a/zed/src/editor.rs +++ b/zed/src/editor.rs @@ -3373,6 +3373,61 @@ mod tests { }); } + #[gpui::test] + fn test_prev_next_word_bounds_with_soft_wrap(cx: &mut gpui::MutableAppContext) { + let buffer = + cx.add_model(|cx| Buffer::new(0, "use one::{\n two::three::four::five\n};", cx)); + let settings = settings::channel(&cx.font_cache()).unwrap().1; + let (_, view) = cx.add_window(|cx| Editor::for_buffer(buffer, settings, cx)); + + view.update(cx, |view, cx| { + view.set_wrap_width(140., cx); + assert_eq!( + view.text(cx), + "use one::{\n two::three::\n four::five\n};" + ); + + view.select_display_ranges(&[DisplayPoint::new(1, 7)..DisplayPoint::new(1, 7)], cx) + .unwrap(); + + view.move_to_next_word_boundary(&(), cx); + assert_eq!( + view.selection_ranges(cx), + &[DisplayPoint::new(1, 9)..DisplayPoint::new(1, 9)] + ); + + view.move_to_next_word_boundary(&(), cx); + assert_eq!( + view.selection_ranges(cx), + &[DisplayPoint::new(1, 14)..DisplayPoint::new(1, 14)] + ); + + view.move_to_next_word_boundary(&(), cx); + assert_eq!( + view.selection_ranges(cx), + &[DisplayPoint::new(2, 4)..DisplayPoint::new(2, 4)] + ); + + view.move_to_next_word_boundary(&(), cx); + assert_eq!( + view.selection_ranges(cx), + &[DisplayPoint::new(2, 8)..DisplayPoint::new(2, 8)] + ); + + view.move_to_previous_word_boundary(&(), cx); + assert_eq!( + view.selection_ranges(cx), + &[DisplayPoint::new(2, 4)..DisplayPoint::new(2, 4)] + ); + + view.move_to_previous_word_boundary(&(), cx); + assert_eq!( + view.selection_ranges(cx), + &[DisplayPoint::new(1, 14)..DisplayPoint::new(1, 14)] + ); + }); + } + #[gpui::test] fn test_backspace(cx: &mut gpui::MutableAppContext) { let buffer = cx.add_model(|cx| {