repositories / dotfiles
dotfiles
bugabingas dorkfiles
owned by admin
neovim/tests/bugabinga/pivi/editor/render_spec.lua
Raw---@diagnostic disable: duplicate-set-field, need-check-nil, param-type-mismatch, assign-type-mismatch, redundant-parameter
local render = require 'bugabinga.pivi.render'
local entry = require 'bugabinga.pivi.entry'
local transcript = require 'bugabinga.pivi.transcript'
local tool = require 'bugabinga.pivi.tool'
local fake = dofile 'tests/helpers/pivi_fake.lua'
describe( 'pivi render', function()
local bufnr
before_each( function()
bufnr = transcript.ensure 'rendering'
transcript.clear( bufnr )
end )
after_each( function()
transcript.forget_all()
fake.close_extra_windows()
end )
it( 'renders message formatting instead of showing markup', function()
assert.is_true( render.highlighted( bufnr ) )
end )
it( 'conceals markup in its own windows only', function()
local working = vim.api.nvim_get_current_win()
local before = vim.wo[working].conceallevel
local win = transcript.show( bufnr )
assert.equal( 2, vim.wo[win].conceallevel )
assert.equal( before, vim.wo[working].conceallevel )
vim.api.nvim_win_close( win, true )
end )
it( 'presents embedded code in its own language', function()
local id = entry.open( bufnr, 'answer' )
for _, text in ipairs { 'text', '', '```lua', 'local value = 1', '```', } do
entry.line( bufnr, id, text )
end
entry.close( bufnr, id )
local parser = vim.treesitter.get_parser( bufnr, 'markdown' )
parser:parse( true )
local languages = {}
parser:for_each_tree( function( _, tree ) languages[tree:lang()] = true end )
assert.is_true( languages.markdown )
assert.is_true( languages.lua )
end )
it( 'degrades to plain readable text when a format cannot be rendered', function()
local plain = vim.api.nvim_create_buf( false, true )
vim.api.nvim_buf_set_lines( plain, 0, -1, false, { 'still readable', } )
assert.is_false( render.highlight( plain, 'definitely-not-a-language' ) or false )
assert.same( { 'still readable', }, vim.api.nvim_buf_get_lines( plain, 0, -1, false ) )
vim.api.nvim_buf_delete( plain, { force = true, } )
end )
it( 'stays responsive while a long answer streams', function()
local id = entry.open( bufnr, 'answer' )
local started = vim.uv.hrtime()
for index = 1, 400 do
entry.write( bufnr, id, 'word ' .. index .. ' ' )
if index % 20 == 0 then entry.write( bufnr, id, '\n' ) end
end
local spent = ( vim.uv.hrtime() - started ) / 1e6
entry.close( bufnr, id )
-- Forcing a parse per delta costs hundreds of times this budget.
assert.is_true( spent < 400, ( '400 deltas took %.1f ms' ):format( spent ) )
end )
it( 'frames an entry without writing anything into the buffer', function()
local id = entry.open( bufnr, 'prompt', { text = 'ask', } )
entry.line( bufnr, id, 'ask' )
entry.close( bufnr, id )
local before = transcript.lines( bufnr )
render.decorate( bufnr, id )
assert.same( before, transcript.lines( bufnr ) )
assert.is_true( #render.marks( bufnr ) > 0 )
end )
it( 'shows a reported change with added and removed lines distinguished', function()
local id = entry.open( bufnr, 'tool', {
tool = 'edit',
args = { path = 'a.lua', },
result = { details = { diff = ' 1 keep\n-2 old\n+2 new\n', }, },
} )
for _, text in ipairs { 'edit a.lua', ' 1 keep', '-2 old', '+2 new', } do
entry.line( bufnr, id, text )
end
entry.close( bufnr, id )
local before = transcript.lines( bufnr )
render.decorate( bufnr, id )
local groups = {}
for _, mark in ipairs( render.marks( bufnr ) ) do
local details = mark[4] or {}
if details.line_hl_group then groups[mark[2] + 1] = details.line_hl_group end
end
local first = select( 1, entry.range( bufnr, id ) )
assert.equal( 'PiviTool', groups[first] )
assert.equal( 'PiviTool', groups[first + 1] )
assert.equal( 'DiffDelete', groups[first + 2] )
assert.equal( 'DiffAdd', groups[first + 3] )
-- The change is decoration over reported text, so the text is untouched.
assert.same( before, transcript.lines( bufnr ) )
end )
it( 'leaves a tool that reported no change entirely dimmed', function()
local id = entry.open( bufnr, 'tool', { tool = 'read', args = { path = 'a.lua', }, } )
for _, text in ipairs { 'read a.lua', '+ not a diff', } do
entry.line( bufnr, id, text )
end
entry.close( bufnr, id )
render.decorate( bufnr, id )
for _, mark in ipairs( render.marks( bufnr ) ) do
assert.is_not.equal( 'DiffAdd', ( mark[4] or {} ).line_hl_group )
end
end )
it( 'presents tool output in the language it came from', function()
local id = entry.open( bufnr, 'tool', {
tool = 'read',
args = { path = '/work/greet.lua', },
cwd = '/work',
result = { content = { { type = 'text', text = 'local value = 1', }, }, },
} )
entry.line( bufnr, id, 'read greet.lua' )
entry.line( bufnr, id, 'local value = 1' )
entry.close( bufnr, id )
local before = transcript.lines( bufnr )
render.decorate( bufnr, id )
local groups = {}
for _, mark in ipairs( render.marks( bufnr ) ) do
local group = ( mark[4] or {} ).hl_group
if group then groups[group] = true end
end
assert.is_true( groups['@keyword.lua'] or groups['@variable.lua'] or false,
'no lua highlight was applied: ' .. vim.inspect( vim.tbl_keys( groups ) ) )
assert.same( before, transcript.lines( bufnr ) )
end )
it( 'leaves output alone when no language can be claimed', function()
for _, meta in ipairs {
{ tool = 'bash', args = { command = 'ls', }, },
{ tool = 'read', args = { path = '/work/notes.unknownext', }, },
{ tool = 'read', args = {}, },
{ tool = 'edit', args = { path = '/work/a.lua', }, result = { details = { diff = '+1 x', }, }, },
} do
assert.is_nil( tool.language( meta ) )
end
assert.equal( 'lua', tool.language {
tool = 'read',
args = { path = '/work/a.lua', },
result = { content = {}, },
} )
end )
it( 'decorates each kind with its own framing', function()
for kind in pairs( entry.kinds ) do
assert.is_table( render.frames[kind] )
end
end )
end )