From b73117d075c4ae317bfa3c6c74611ce4df5de3e3 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Thu, 25 Sep 2025 06:11:36 +0100 Subject: [PATCH] add failing test for 'dj' motion, and progress reimplementing 'MakeNormalDelete.deleteLine' --- fcore/normal-mode/make-normal-delete.sml | 7 +++++-- test/normal-delete.sml | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/fcore/normal-mode/make-normal-delete.sml b/fcore/normal-mode/make-normal-delete.sml index 558e124..5e4f0a2 100644 --- a/fcore/normal-mode/make-normal-delete.sml +++ b/fcore/normal-mode/make-normal-delete.sml @@ -361,14 +361,17 @@ struct else endLineIdx val buffer = LineGap.goToIdx (endLineIdx, buffer) in - if Cursor.isOnNewlineAfterChr (buffer, endLineIdx) then + if Cursor.isCursorAtStartOfLine (buffer, endLineIdx) then let - val endLineIdx = endLineIdx + 1 + val endLineIdx = + if endLineIdx = #textLength buffer - 1 then endLineIdx - 1 + else endLineIdx + 1 val length = endLineIdx - startIdx val initialMsg = Fn.initMsgs (startIdx, length, buffer) val buffer = LineGap.delete (startIdx, length, buffer) + (* just need to reposition the cursor *) val ss = LineGap.toString buffer val ss = String.toCString ss ^ "\n" val () = print ss diff --git a/test/normal-delete.sml b/test/normal-delete.sml index 00bfccc..d2c5896 100644 --- a/test/normal-delete.sml +++ b/test/normal-delete.sml @@ -436,6 +436,28 @@ struct in Expect.isTrue (stringIsExpected andalso cursorIdxIsExpected) end) + , test "deletes two lines when cursor is on a newline" (fn _ => + let + (* arrange *) + val originalString = "\nhello\nworld\ntrello\brillo\n" + val originalIdx = 0 + + val app = TestUtils.init originalString + val app = AppWith.idx (app, originalIdx) + + (* act *) + val {cursorIdx, buffer, ...} = TestUtils.updateMany (app, "dj") + + (* assert *) + val expectedString = "world\ntrello\nbrillo\n" + val actualString = LineGap.toString buffer + val stringIsExpected = expectedString = actualString + + val expectedCursorIdx = 0 + val cursorIdxIsExpected = expectedCursorIdx = cursorIdx + in + Expect.isTrue (stringIsExpected andalso cursorIdxIsExpected) + end) ] val tests = [dhDelete, dlDelete, djDelete]