text editor inspired vim and yi
import ViE.Data.PieceTable

namespace Test.PasteReproduction

def test : IO Unit := do
  IO.println "--- Test 1: Paste below last line (no trailing newline) ---"
  let pt := ViE.PieceTable.fromString "line 1"
  IO.println s!"Initial: [{pt.toString}]"

  -- Yank line 1 (manually simulating EditorState.yankCurrentLine)
  let line1 := pt.getLine 0 |>.getD ""
  let yanked := if line1.endsWith "\n" then line1 else line1 ++ "\n"
  IO.println s!"Yanked: [{yanked}]"

  -- Paste below line 0 (simulating EditorState.pasteBelow)
  let (off, text) := match pt.getOffsetFromPoint 1 0 with
    | some o => (o, yanked)
    | none =>
        let len := pt.length
        if len > 0 then
           if !pt.endsWithNewline then (len, "\n" ++ yanked) else (len, yanked)
        else (0, yanked)

  let pt2 := pt.insert off text off
  IO.println s!"After paste:\n[{pt2.toString}]"
  IO.println s!"Line count: {pt2.lineCount}"
  for i in [:pt2.lineCount] do
    IO.println s!"Line {i}: [{pt2.getLine i |>.getD "NONE"}]"

  IO.println "\n--- Test 2: Paste below last line (with trailing newline) ---"
  let ptB := ViE.PieceTable.fromString "line 1\n"
  IO.println s!"Initial: [{ptB.toString}]"
  let line1B := ptB.getLine 0 |>.getD ""
  let yankedB := if line1B.endsWith "\n" then line1B else line1B ++ "\n"
  let (offB, textB) := match ptB.getOffsetFromPoint 1 0 with
    | some o => (o, yankedB)
    | none =>
        let len := ptB.length
        if len > 0 then
           if !ptB.endsWithNewline then (len, "\n" ++ yankedB) else (len, yankedB)
        else (0, yankedB)
  let ptB2 := ptB.insert offB textB offB
  IO.println s!"After paste:\n[{ptB2.toString}]"
  IO.println s!"Line count: {ptB2.lineCount}"
  for i in [:ptB2.lineCount] do
    IO.println s!"Line {i}: [{ptB2.getLine i |>.getD "NONE"}]"