Luigit
repositories / dotfiles

dotfiles

bugabingas dorkfiles

owned by admin

neovim/tests/bugabinga/pivi/editor/fold_spec.lua

Raw
---@diagnostic disable: duplicate-set-field, need-check-nil, param-type-mismatch, assign-type-mismatch
local fold = require 'bugabinga.pivi.fold'
local entry = require 'bugabinga.pivi.entry'
local transcript = require 'bugabinga.pivi.transcript'
local fake = dofile 'tests/helpers/pivi_fake.lua'

local block = function( bufnr, kind, meta, lines )
  local id = entry.open( bufnr, kind, meta )
  for _, text in ipairs( lines ) do entry.line( bufnr, id, text ) end
  entry.close( bufnr, id )
  return id
end

describe( 'pivi fold', function()
  local bufnr

  before_each( function()
    bufnr = transcript.ensure 'folding'
    transcript.clear( bufnr )
  end )

  after_each( function()
    transcript.forget_all()
    fake.close_extra_windows()
  end )

  it( 'gives every multi-line entry its own fold', function()
    local tool = block( bufnr, 'tool', { tool = 'read', }, { 'read a.lua', 'one', 'two', } )
    local first, last = entry.range( bufnr, tool )

    local win = transcript.show( bufnr )
    local rows = vim.api.nvim_win_call( win, function()
      local found = {}
      for row = first, last do
        vim.v.lnum = row
        table.insert( found, fold.expr() )
      end
      return found
    end )

    assert.same( { '>1', '1', '1', }, rows )
  end )

  it( 'leaves a single-line entry unfolded', function()
    block( bufnr, 'tool', { tool = 'read', }, { 'read a.lua', } )
    local win = transcript.show( bufnr )

    local level = vim.api.nvim_win_call( win, function()
      vim.v.lnum = 1
      return fold.expr()
    end )

    assert.equal( '0', level )
  end )

  it( 'treats only voluminous tool entries as collapsible on arrival', function()
    assert.is_true( fold.voluminous { kind = 'tool', first = 1, last = 4, } )
    assert.is_false( fold.voluminous { kind = 'tool', first = 1, last = 1, } )
    assert.is_false( fold.voluminous { kind = 'answer', first = 1, last = 9, } )
    assert.is_false( fold.voluminous { kind = 'error', first = 1, last = 4, } )
  end )

  it( 'collapses a tool result on arrival and keeps the answer open', function()
    local tool = block( bufnr, 'tool', { tool = 'read', }, { 'read a.lua', 'one', 'two', } )
    local answer = block( bufnr, 'answer', {}, { 'first', 'second', 'third', } )

    local win = transcript.show( bufnr )
    fold.apply( bufnr )

    local tool_first = select( 1, entry.range( bufnr, tool ) )
    local answer_first = select( 1, entry.range( bufnr, answer ) )

    vim.api.nvim_win_call( win, function()
      assert.is_true( fold.closed( tool_first ) )
      assert.is_false( fold.closed( answer_first ) )
    end )
  end )

  it( 'stands in for a collapsed entry with one readable line', function()
    local tool = block( bufnr, 'tool', { tool = 'read', }, { 'read a.lua', 'one', 'two', } )
    local first, last = entry.range( bufnr, tool )
    local win = transcript.show( bufnr )

    local shown = vim.api.nvim_win_call( win, function()
      vim.v.foldstart = first
      vim.v.foldend = last
      return fold.text()
    end )

    assert.is_true( shown:find( 'read a.lua', 1, true ) ~= nil )
    assert.is_true( shown:find( '2 more lines', 1, true ) ~= nil )
  end )

  it( 'expands a collapsed entry and never collapses it again by itself', function()
    local tool = block( bufnr, 'tool', { tool = 'read', }, { 'read a.lua', 'one', 'two', } )
    local win = transcript.show( bufnr )
    fold.apply( bufnr )

    local first = select( 1, entry.range( bufnr, tool ) )

    vim.api.nvim_win_call( win, function()
      assert.is_true( fold.toggle( bufnr, first ) )
      assert.is_false( fold.closed( first ) )
    end )

    fold.apply( bufnr )
    vim.api.nvim_win_call( win, function()
      assert.is_false( fold.closed( first ) )
    end )
  end )

  it( 'never alters transcript text when an entry is toggled', function()
    local tool = block( bufnr, 'tool', { tool = 'read', }, { 'read a.lua', 'one', 'two', } )
    local win = transcript.show( bufnr )
    local before = transcript.lines( bufnr )
    local first = select( 1, entry.range( bufnr, tool ) )

    vim.api.nvim_win_call( win, function()
      fold.toggle( bufnr, first )
      fold.toggle( bufnr, first )
    end )

    assert.same( before, transcript.lines( bufnr ) )
    assert.equal( 'tool', entry.at( bufnr, first ).kind )
  end )

  it( 'publishes collapsing as an intent and claims no key for it', function()
    local published
    for _, mapping in ipairs( vim.api.nvim_buf_get_keymap( bufnr, 'n' ) ) do
      if mapping.lhs == '<Plug>(pivi-toggle-entry)' then published = mapping end
    end

    assert.is_table( published )
  end )
end )