aboutsummaryrefslogtreecommitdiff
path: root/test/functional/options/belloff_spec.lua
blob: 575e79d1a9cc8d530b9ba1c3686f21e23d017be9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')

local clear = n.clear
local command = n.command
local api = n.api
local feed = n.feed
local poke_eventloop = n.poke_eventloop
local eq = t.eq
local retry = t.retry

describe("'belloff'", function()
  local screen

  before_each(function()
    clear()
    screen = Screen.new(42, 5)
    screen:expect([[
      ^                                          |
      {1:~                                         }|*3
                                                |
    ]])
  end)

  it('various flags work properly', function()
    command('set cpoptions+=E')

    local map = {
      backspace = 'i<BS><Esc>',
      cursor = 'i<Up><Esc>',
      copy = 'i<C-Y><Esc>',
      ctrlg = 'i<C-G><C-G><Esc>',
      error = 'J',
      esc = '<Esc>',
      operator = 'y0',
      register = 'i<C-R>@<Esc>',
    }

    local items = {} ---@type string[]
    local inputs = {} ---@type string[]
    for item, input in pairs(map) do
      table.insert(items, item)
      table.insert(inputs, input)
    end

    local values = {} ---@type string[]
    for i, _ in ipairs(items) do
      -- each tested 'belloff' value enables at most one item
      local parts = vim.deepcopy(items)
      table.remove(parts, i)
      local value = table.concat(parts, ',')
      table.insert(values, value)
    end
    table.insert(values, 'all')

    for i, value in ipairs(values) do
      api.nvim_set_option_value('belloff', value, {})

      for j, input in ipairs(inputs) do
        screen.bell = false
        local beep = value ~= 'all' and i == j
        -- Nvim avoids beeping more than 3 times in half a second,
        -- so retry if beeping is expected but not received.
        retry(not beep and 1 or nil, 1000, function()
          feed(input)
          poke_eventloop()
          screen:expect({
            condition = function()
              eq(beep, screen.bell, ('%s with belloff=%s'):format(items[j], value))
            end,
            unchanged = not beep,
          })
        end)
      end
    end
  end)
end)