---@diagnostic disable: duplicate-set-field, need-check-nil, param-type-mismatch, assign-type-mismatch, redundant-parameter local layout = require 'bugabinga.pivi.layout' -- The editor size a headless test runs at is fixed, so the decision is tested -- as a decision and the windows it produces are verified in a real terminal. local at = function( columns, lines ) return layout.plan( columns, lines ) end describe( 'pivi layout', function() local original before_each( function() original = vim.g.pivi_layout end ) after_each( function() vim.g.pivi_layout = original end ) describe( 'where the transcript goes', function() it( 'puts it beside the source on a wide editor', function() local chosen = at( 192, 43 ) assert.equal( 'beside', chosen.orientation ) assert.is_number( chosen.width ) assert.is_nil( chosen.height ) end ) it( 'stacks it under the source when the source would be squeezed', function() local chosen = at( 100, 30 ) assert.equal( 'below', chosen.orientation ) assert.is_number( chosen.height ) assert.is_nil( chosen.width ) end ) it( 'stacks it on a narrow editor rather than splitting into columns', function() assert.equal( 'below', at( 80, 24 ).orientation ) assert.equal( 'below', at( 60, 20 ).orientation ) end ) it( 'switches to beside exactly where the source still fits', function() local settings = layout.settings() local edge = settings.transcript_min + settings.source_min + 1 assert.equal( 'below', at( edge - 1, 40 ).orientation ) assert.equal( 'beside', at( edge, 40 ).orientation ) end ) end ) describe( 'how wide the transcript is', function() it( 'keeps prose readable rather than proportional on a narrow editor', function() local settings = layout.settings() assert.equal( settings.transcript_min, at( 120, 40 ).width ) end ) it( 'stops growing once prose is wide enough', function() local settings = layout.settings() assert.equal( settings.transcript_max, at( 400, 60 ).width ) end ) it( 'takes a share in between', function() local chosen = at( 192, 43 ) local settings = layout.settings() assert.is_true( chosen.width > settings.transcript_min ) assert.is_true( chosen.width < settings.transcript_max ) end ) it( 'always leaves the source enough room to be code', function() local settings = layout.settings() for columns = 60, 400, 7 do local chosen = at( columns, 40 ) if chosen.orientation == 'beside' then assert.is_true( columns - chosen.width - 1 >= settings.source_min, ( 'source squeezed at %d columns' ):format( columns ) ) end end end ) end ) describe( 'how tall the prompt is', function() it( 'grows with the editor, within reason', function() local settings = layout.settings() assert.equal( settings.prompt_min, at( 200, 12 ).prompt ) assert.is_true( at( 200, 43 ).prompt > settings.prompt_min ) assert.equal( settings.prompt_max, at( 200, 200 ).prompt ) end ) it( 'never asks for more room than the editor has', function() for lines = 6, 60, 3 do local chosen = at( 200, lines ) assert.is_true( chosen.prompt < lines, ( 'prompt too tall at %d lines' ):format( lines ) ) end end ) end ) describe( 'stacked height', function() it( 'leaves the source visible', function() for lines = 10, 60, 5 do local chosen = at( 80, lines ) assert.equal( 'below', chosen.orientation ) assert.is_true( chosen.height < lines, ( 'transcript too tall at %d lines' ):format( lines ) ) end end ) end ) it( 'lets the configuration override every judgement', function() vim.g.pivi_layout = { transcript_min = 20, transcript_max = 30, source_min = 10, } local chosen = at( 100, 40 ) assert.equal( 'beside', chosen.orientation ) assert.equal( 30, chosen.width ) end ) it( 'never carves a new window out of one of its own', function() local transcript = require 'bugabinga.pivi.transcript' local working = vim.api.nvim_get_current_win() local bufnr = transcript.ensure 'hosting' local shown = transcript.show( bufnr ) assert.is_number( shown ) -- With the cursor inside the transcript, the next window still comes out -- of the window the user works in. vim.api.nvim_set_current_win( shown ) assert.equal( working, layout.host() ) vim.api.nvim_set_current_win( working ) transcript.forget_all() end ) it( 'reports the windows it owns and no others', function() vim.cmd 'enew' local ordinary = vim.api.nvim_get_current_buf() local found = layout.windows() for _, win in ipairs( found.transcript ) do assert.is_not.equal( ordinary, vim.api.nvim_win_get_buf( win ) ) end for _, win in ipairs( found.prompt ) do assert.is_not.equal( ordinary, vim.api.nvim_win_get_buf( win ) ) end end ) end )