text editor inspired vim and yi
import ViE.Types
import ViE.Buffer.Content
import ViE.State.Layout
import ViE.State.Movement

namespace Test.Utils

/-- Assert condition is true, throw error if false -/
def assert (msg : String) (cond : Bool) : IO Unit := do
  if cond then
    IO.println s!"[PASS] {msg}"
  else
    IO.println s!"[FAIL] {msg}"
    throw (IO.userError s!"Assertion failed: {msg}")

/-- Assert equality with debug output -/
def assertEqual [Repr α] [BEq α] (msg : String) (expected actual : α) : IO Unit := do
  if expected == actual then
    IO.println s!"[PASS] {msg}"
  else
    IO.println s!"[FAIL] {msg}"
    IO.println s!"  Expected: {repr expected}"
    IO.println s!"  Actual:   {repr actual}"
    throw (IO.userError s!"Assertion failed: {msg}")

/-- Assert EditorState buffer content matches expected string -/
def assertBuffer (msg : String) (est : ViE.EditorState) (expected : String) : IO Unit := do
  let actual := est.getActiveBuffer.table.toString
  if actual == expected then
    IO.println s!"[PASS] {msg}"
  else
    IO.println s!"[FAIL] {msg}"
    IO.println s!"  Expected: '{expected}'"
    IO.println s!"  Actual:   '{actual}'"
    throw (IO.userError s!"Buffer content assertion failed: {msg}")

/-- Assert EditorState cursor position matches expected row/col -/
def assertCursor (msg : String) (est : ViE.EditorState) (r c : Nat) : IO Unit := do
  let cursor := est.getCursor
  if cursor.row.val == r && cursor.col.val == c then
    IO.println s!"[PASS] {msg}"
  else
    IO.println s!"[FAIL] {msg}"
    IO.println s!"  Expected: ({r}, {c})"
    IO.println s!"  Actual:   ({cursor.row.val}, {cursor.col.val})"
    throw (IO.userError s!"Cursor assertion failed: {msg}")

end Test.Utils