/ scripts / test / render_integration.lua
render_integration.lua
  1  package.path = table.concat({
  2    "./lua/?.lua",
  3    "./lua/?/init.lua",
  4    "./?.lua",
  5    package.path,
  6  }, ";")
  7  
  8  local report = {
  9    suite = "render_integration",
 10    tests = {},
 11  }
 12  
 13  local function add_result(name, ok, detail)
 14    report.tests[#report.tests + 1] = {
 15      name = name,
 16      ok = ok,
 17      detail = detail,
 18    }
 19  end
 20  
 21  local function fail(message)
 22    error(message, 2)
 23  end
 24  
 25  local function assert_true(condition, message)
 26    if not condition then
 27      fail(message)
 28    end
 29  end
 30  
 31  local function run_test(name, fn)
 32    local ok, err = pcall(fn)
 33    if ok then
 34      add_result(name, true, "ok")
 35      return
 36    end
 37    add_result(name, false, tostring(err))
 38  end
 39  
 40  local function wait_for(predicate, timeout_ms)
 41    local ok = vim.wait(timeout_ms, predicate, 10)
 42    return ok == true
 43  end
 44  
 45  local function has_extmark_with(bufnr, ns, predicate)
 46    local extmarks = vim.api.nvim_buf_get_extmarks(bufnr, ns, { 0, 0 }, { -1, -1 }, { details = true })
 47    for i = 1, #extmarks do
 48      local details = extmarks[i][4] or {}
 49      if predicate(details) then
 50        return true
 51      end
 52    end
 53    return false
 54  end
 55  
 56  local function run_suite()
 57    local cellmode = require("cellmode")
 58    local session_store = require("cellmode.runtime.session_store")
 59    local cell_layout = require("cellmode.view.cell_layout")
 60    local overlay = require("cellmode.view.overlay")
 61  
 62    cellmode.setup({})
 63  
 64    local tmpfile = vim.fn.tempname() .. ".csv"
 65    vim.fn.writefile({
 66      "name,age",
 67      "alice,7",
 68      "bob,10",
 69    }, tmpfile)
 70  
 71    vim.cmd("edit " .. vim.fn.fnameescape(tmpfile))
 72  
 73    local bufnr = vim.api.nvim_get_current_buf()
 74    local ns = overlay.namespace()
 75  
 76    run_test("session_opened", function()
 77      assert_true(session_store.get(bufnr) ~= nil, "session missing after open")
 78      local session = session_store.get(bufnr)
 79      assert_true(session.format == "csv", "format not detected")
 80    end)
 81  
 82    run_test("buffer_is_raw_csv", function()
 83      local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
 84      assert_true(#lines == 3, "unexpected line count")
 85      assert_true(lines[1] == "name,age", "row 1 not raw CSV")
 86      assert_true(lines[2] == "alice,7", "row 2 not raw CSV")
 87    end)
 88  
 89    run_test("layout_built", function()
 90      local layout = cell_layout.get(bufnr)
 91      assert_true(layout ~= nil, "layout missing")
 92      assert_true(#layout.records == 3, "expected 3 records")
 93      assert_true(#layout.records[1].fields == 2, "expected 2 fields in row 1")
 94      assert_true(layout.records[2].fields[1].value == "alice", "field value mismatch")
 95    end)
 96  
 97    run_test("overlay_extmarks_placed", function()
 98      local has_pipe = has_extmark_with(bufnr, ns, function(d)
 99        if not d.virt_text then return false end
100        for i = 1, #d.virt_text do
101          if d.virt_text[i][2] == "CellmodePipe" then
102            return true
103          end
104        end
105        return false
106      end)
107      assert_true(has_pipe, "no CellmodePipe extmark placed")
108    end)
109  
110    run_test("set_cell_updates_buffer", function()
111      vim.cmd("Cellmode op set-cell 2 1 charlie")
112      local line = vim.api.nvim_buf_get_lines(bufnr, 1, 2, false)[1]
113      assert_true(line == "charlie,7", "set-cell did not update raw csv: got " .. line)
114    end)
115  
116    run_test("edit_triggers_relayout", function()
117      vim.api.nvim_buf_set_lines(bufnr, 2, 3, false, { "z,100" })
118      local relaid = wait_for(function()
119        local layout = cell_layout.get(bufnr)
120        return layout and layout.records[3] and layout.records[3].fields[1].value == "z"
121      end, 1200)
122      assert_true(relaid, "layout did not refresh after edit")
123    end)
124  
125    run_test("toggle_overlay", function()
126      vim.cmd("Cellmode toggle")
127      local marks_after_off = vim.api.nvim_buf_get_extmarks(bufnr, ns, { 0, 0 }, { -1, -1 }, {})
128      assert_true(#marks_after_off == 0, "extmarks remained after toggle off")
129      vim.cmd("Cellmode toggle")
130      local marks_after_on = vim.api.nvim_buf_get_extmarks(bufnr, ns, { 0, 0 }, { -1, -1 }, {})
131      assert_true(#marks_after_on > 0, "extmarks not restored after toggle on")
132    end)
133  
134    run_test("save_writes_raw_csv", function()
135      vim.cmd("write")
136      local lines = vim.fn.readfile(tmpfile)
137      assert_true(lines[1] == "name,age", "saved header mismatch")
138      assert_true(lines[2] == "charlie,7", "saved row 2 mismatch: " .. (lines[2] or ""))
139      assert_true(lines[3] == "z,100", "saved row 3 mismatch: " .. (lines[3] or ""))
140    end)
141  
142    pcall(vim.fn.delete, tmpfile)
143  end
144  
145  run_suite()
146  
147  local failed = false
148  for i = 1, #report.tests do
149    if not report.tests[i].ok then
150      failed = true
151      break
152    end
153  end
154  
155  report.ok = not failed
156  print(vim.json.encode(report))
157  
158  if failed then
159    vim.cmd("cq")
160  else
161    vim.cmd("qa!")
162  end