From 1b1755240db1ca01cbe1371a5b4ac58b68615382 Mon Sep 17 00:00:00 2001
From: Gabriel Dinner-David <82682503+gabydd@users.noreply.github.com>
Date: Sat, 31 Dec 2022 07:23:55 -0700
Subject: [PATCH] fix(commands): extend_line to proper line when count and
 current line selected (#5288)

---
 helix-term/src/commands.rs        | 19 ++++++--------
 helix-term/tests/test/commands.rs | 43 +++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 11 deletions(-)

diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 7ee1d77c..09c2e5df 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -2053,16 +2053,10 @@ fn extend_line_impl(cx: &mut Context, extend: Extend) {
     let selection = doc.selection(view.id).clone().transform(|range| {
         let (start_line, end_line) = range.line_range(text.slice(..));
 
-        let start = text.line_to_char(match extend {
-            Extend::Above => start_line.saturating_sub(count - 1),
-            Extend::Below => start_line,
-        });
+        let start = text.line_to_char(start_line);
         let end = text.line_to_char(
-            match extend {
-                Extend::Above => end_line + 1, // the start of next line
-                Extend::Below => end_line + count,
-            }
-            .min(text.len_lines()),
+            (end_line + 1) // newline of end_line
+                .min(text.len_lines()),
         );
 
         // extend to previous/next line if current line is selected
@@ -2076,8 +2070,11 @@ fn extend_line_impl(cx: &mut Context, extend: Extend) {
             }
         } else {
             match extend {
-                Extend::Above => (end, start),
-                Extend::Below => (start, end),
+                Extend::Above => (end, text.line_to_char(start_line.saturating_sub(count - 1))),
+                Extend::Below => (
+                    start,
+                    text.line_to_char((end_line + count).min(text.len_lines())),
+                ),
             }
         };
 
diff --git a/helix-term/tests/test/commands.rs b/helix-term/tests/test/commands.rs
index 95bd95b7..6e7275f5 100644
--- a/helix-term/tests/test/commands.rs
+++ b/helix-term/tests/test/commands.rs
@@ -311,3 +311,46 @@ async fn test_undo_redo() -> anyhow::Result<()> {
 
     Ok(())
 }
+
+#[tokio::test(flavor = "multi_thread")]
+async fn test_extend_line() -> anyhow::Result<()> {
+    // extend with line selected then count
+    test((
+        platform_line(indoc! {"\
+            #[l|]#orem
+            ipsum
+            dolor
+            
+            "})
+        .as_str(),
+        "x2x",
+        platform_line(indoc! {"\
+            #[lorem
+            ipsum
+            dolor
+            |]#
+            "})
+        .as_str(),
+    ))
+    .await?;
+
+    // extend with count on partial selection
+    test((
+        platform_line(indoc! {"\
+            #[l|]#orem
+            ipsum
+            
+            "})
+        .as_str(),
+        "2x",
+        platform_line(indoc! {"\
+            #[lorem
+            ipsum
+            |]#
+            "})
+        .as_str(),
+    ))
+    .await?;
+
+    Ok(())
+}