diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-03 06:56:10 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-03 06:56:10 -0500 |
| commit | 6936f5b60b61dcf41cbda75813d7f259733eedf2 (patch) | |
| tree | f058960d56232d8629c6833607a0df287a44063d /tests/test-custom-line-paragraph-join-paragraph.el | |
| parent | e2f373ff05116d4b2ed48d4ddcaea8c47846f105 (diff) | |
| download | dotemacs-6936f5b60b61dcf41cbda75813d7f259733eedf2.tar.gz dotemacs-6936f5b60b61dcf41cbda75813d7f259733eedf2.zip | |
fix(line-paragraph): join-line-or-region strands space on next line
The region branch's `(while (< (point) end) (join-line 1))` ran one iteration too many. After the final in-region join, point sat just before the end marker, so the loop fired once more. That extra `join-line 1` consumed the next line's preceding newline and replaced it with a space. Then `(goto-char end)` + `(newline)` reinserted a newline at the original end position, before the inserted space, so the space ended up stranded at BOL of the next line.
I replaced the position-based loop with `count-lines` + `dotimes` to do exactly the right number of joins. I also swapped the trailing `(newline)` for `(forward-line 1)`. The bullet-list use case now lands directly on the next existing line with no blank gap.
The trailing-newline change ripples to `cj/join-paragraph` (which delegates here), so paragraphs now also stop adding a trailing newline when the input lacks one. `require-final-newline` handles file-end discipline on save anyway.
I added 3 new tests that fail against the old loop and pass against the fix. I also updated 11 existing tests whose assertions baked in the old trailing-newline behavior. While in there I wrapped the `cj/custom-keymap` defvar stub in `eval-and-compile` in both test files. The bare defvar wasn't evaluated at byte-compile time, so the `require` of `custom-line-paragraph` would hit a void symbol when the validate-el hook ran.
Diffstat (limited to 'tests/test-custom-line-paragraph-join-paragraph.el')
| -rw-r--r-- | tests/test-custom-line-paragraph-join-paragraph.el | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/tests/test-custom-line-paragraph-join-paragraph.el b/tests/test-custom-line-paragraph-join-paragraph.el index a84adc6c..9f68b3b1 100644 --- a/tests/test-custom-line-paragraph-join-paragraph.el +++ b/tests/test-custom-line-paragraph-join-paragraph.el @@ -40,9 +40,14 @@ ;; Add expand-region to load path explicitly (add-to-list 'load-path (expand-file-name "elpa/expand-region-1.0.0" user-emacs-directory)) -;; Stub dependencies before loading the module -(defvar cj/custom-keymap (make-sparse-keymap) - "Stub keymap for testing.") +;; Stub dependencies before loading the module. `eval-and-compile` is required +;; because the byte-compile pass `require`s custom-line-paragraph, which runs +;; the module's top-level `(keymap-set cj/custom-keymap ...)` form at load +;; time. A bare `defvar` here would only declare the symbol at compile time; +;; the keymap-set then sees a void value. +(eval-and-compile + (defvar cj/custom-keymap (make-sparse-keymap) + "Stub keymap for testing.")) ;; Load expand-region for real (needed by cj/join-paragraph) (require 'expand-region) @@ -73,7 +78,7 @@ (goto-char (point-min)) (cj/join-paragraph) (should (string= (buffer-substring-no-properties (point-min) (point-max)) - "line one line two line three\n"))) + "line one line two line three"))) (test-join-paragraph-teardown))) (ert-deftest test-join-paragraph-simple-multiline-cursor-in-middle () @@ -87,7 +92,7 @@ (forward-line 1) (cj/join-paragraph) (should (string= (buffer-substring-no-properties (point-min) (point-max)) - "line one line two line three\n"))) + "line one line two line three"))) (test-join-paragraph-teardown))) (ert-deftest test-join-paragraph-simple-multiline-cursor-at-end () @@ -100,7 +105,7 @@ (goto-char (point-max)) (cj/join-paragraph) (should (string= (buffer-substring-no-properties (point-min) (point-max)) - "line one line two line three\n"))) + "line one line two line three"))) (test-join-paragraph-teardown))) (ert-deftest test-join-paragraph-surrounded-by-other-paragraphs () @@ -134,7 +139,7 @@ (goto-char (point-min)) (cj/join-paragraph) (should (string= (buffer-substring-no-properties (point-min) (point-max)) - " indented line one indented line two indented line three\n"))) + " indented line one indented line two indented line three"))) (test-join-paragraph-teardown))) (ert-deftest test-join-paragraph-cursor-position-after () @@ -206,7 +211,7 @@ (cj/join-paragraph) ;; Should still work, even if nothing to join (should (string= (buffer-substring-no-properties (point-min) (point-max)) - "single line paragraph\n"))) + "single line paragraph"))) (test-join-paragraph-teardown))) (ert-deftest test-join-paragraph-at-buffer-start () @@ -230,7 +235,7 @@ (insert "other paragraph\n\nfirst line\nsecond line\nthird line") (goto-char (point-max)) (cj/join-paragraph) - (should (string-match-p "first line second line third line\n$" (buffer-string)))) + (should (string-match-p "first line second line third line\\'" (buffer-string)))) (test-join-paragraph-teardown))) (ert-deftest test-join-paragraph-very-long () @@ -288,7 +293,7 @@ (goto-char (point-min)) (cj/join-paragraph) (should (string= (buffer-substring-no-properties (point-min) (point-max)) - "line one line two line three\n"))) + "line one line two line three"))) (test-join-paragraph-teardown))) (ert-deftest test-join-paragraph-only-whitespace-lines () @@ -314,7 +319,7 @@ (goto-char (point-min)) (cj/join-paragraph) (should (string= (buffer-substring-no-properties (point-min) (point-max)) - "Hello π world γγγ«γ‘γ― δΈη π celebration π\n"))) + "Hello π world γγγ«γ‘γ― δΈη π celebration π"))) (test-join-paragraph-teardown))) ;; ---------------------------- Error Cases ------------------------------------ @@ -353,7 +358,7 @@ (goto-char (point-min)) (cj/join-paragraph) (should (string= (buffer-substring-no-properties (point-min) (point-max)) - "x\n"))) + "x"))) (test-join-paragraph-teardown))) (provide 'test-custom-line-paragraph-join-paragraph) |
