Add buffer test for autoindent with hard tabs

Max Brunsfeld created

Change summary

crates/language/src/tests.rs | 51 +++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+), 1 deletion(-)

Detailed changes

crates/language/src/tests.rs 🔗

@@ -571,7 +571,7 @@ fn test_range_for_syntax_ancestor(cx: &mut MutableAppContext) {
 }
 
 #[gpui::test]
-fn test_edit_with_autoindent(cx: &mut MutableAppContext) {
+fn test_autoindent_with_soft_tabs(cx: &mut MutableAppContext) {
     cx.add_model(|cx| {
         let text = "fn a() {}";
         let mut buffer = Buffer::new(0, text, cx).with_language(Arc::new(rust_lang()), cx);
@@ -586,6 +586,8 @@ fn test_edit_with_autoindent(cx: &mut MutableAppContext) {
         );
         assert_eq!(buffer.text(), "fn a() {\n    b()\n    \n}");
 
+        // Create a field expression on a new line, causing that line
+        // to be indented.
         buffer.edit_with_autoindent(
             [(Point::new(2, 4)..Point::new(2, 4), ".c")],
             IndentSize::spaces(4),
@@ -593,6 +595,53 @@ fn test_edit_with_autoindent(cx: &mut MutableAppContext) {
         );
         assert_eq!(buffer.text(), "fn a() {\n    b()\n        .c\n}");
 
+        // Remove the dot so that the line is no longer a field expression,
+        // causing the line to be outdented.
+        buffer.edit_with_autoindent(
+            [(Point::new(2, 8)..Point::new(2, 9), "")],
+            IndentSize::spaces(4),
+            cx,
+        );
+        assert_eq!(buffer.text(), "fn a() {\n    b()\n    c\n}");
+
+        buffer
+    });
+}
+
+#[gpui::test]
+fn test_autoindent_with_hard_tabs(cx: &mut MutableAppContext) {
+    cx.add_model(|cx| {
+        let text = "fn a() {}";
+        let mut buffer = Buffer::new(0, text, cx).with_language(Arc::new(rust_lang()), cx);
+
+        buffer.edit_with_autoindent([(8..8, "\n\n")], IndentSize::tab(), cx);
+        assert_eq!(buffer.text(), "fn a() {\n\t\n}");
+
+        buffer.edit_with_autoindent(
+            [(Point::new(1, 1)..Point::new(1, 1), "b()\n")],
+            IndentSize::tab(),
+            cx,
+        );
+        assert_eq!(buffer.text(), "fn a() {\n\tb()\n\t\n}");
+
+        // Create a field expression on a new line, causing that line
+        // to be indented.
+        buffer.edit_with_autoindent(
+            [(Point::new(2, 1)..Point::new(2, 1), ".c")],
+            IndentSize::tab(),
+            cx,
+        );
+        assert_eq!(buffer.text(), "fn a() {\n\tb()\n\t\t.c\n}");
+
+        // Remove the dot so that the line is no longer a field expression,
+        // causing the line to be outdented.
+        buffer.edit_with_autoindent(
+            [(Point::new(2, 2)..Point::new(2, 3), "")],
+            IndentSize::tab(),
+            cx,
+        );
+        assert_eq!(buffer.text(), "fn a() {\n\tb()\n\tc\n}");
+
         buffer
     });
 }