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