aboutsummaryrefslogtreecommitdiff
path: root/test/functional/ex_cmds/oldfiles_spec.lua
blob: 927d7801816a430510c571e3e60c22dadba5ab44 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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 expect_exit = n.expect_exit
local api, eq, feed_command = n.api, t.eq, n.feed_command
local feed, poke_eventloop = n.feed, n.poke_eventloop
local ok = t.ok
local eval = n.eval

local shada_file = 'Xtest.shada'

local function _clear()
  clear {
    args = {
      '-i',
      shada_file, -- Need shada for these tests.
      '--cmd',
      'set noswapfile undodir=. directory=. viewdir=. backupdir=. belloff= noshowcmd noruler',
    },
    args_rm = { '-i', '--cmd' },
  }
end

describe(':oldfiles', function()
  before_each(_clear)

  after_each(function()
    expect_exit(command, 'qall!')
    os.remove(shada_file)
  end)

  local function add_padding(s)
    return s .. string.rep(' ', 96 - string.len(s))
  end

  it('shows most recently used files', function()
    local screen = Screen.new(100, 5)
    screen:attach()
    screen._default_attr_ids = nil
    feed_command('edit testfile1')
    feed_command('edit testfile2')
    feed_command('wshada')
    feed_command('rshada!')
    local oldfiles = api.nvim_get_vvar('oldfiles')
    feed_command('oldfiles')
    screen:expect([[
                                                                                                          |
      1: ]] .. add_padding(oldfiles[1]) .. [[ |
      2: ]] .. add_padding(oldfiles[2]) .. [[ |
                                                                                                          |
      Press ENTER or type command to continue^                                                             |
    ]])
    feed('<CR>')
  end)

  it('can be filtered with :filter', function()
    feed_command('edit file_one.txt')
    local file1 = api.nvim_buf_get_name(0)
    feed_command('edit file_two.txt')
    local file2 = api.nvim_buf_get_name(0)
    feed_command('edit another.txt')
    local another = api.nvim_buf_get_name(0)
    feed_command('wshada')
    feed_command('rshada!')

    local function get_oldfiles(cmd)
      local q = eval([[split(execute(']] .. cmd .. [['), "\n")]])
      for i, _ in ipairs(q) do
        q[i] = q[i]:gsub('^%d+:%s+', '')
      end
      table.sort(q)
      return q
    end

    local oldfiles = get_oldfiles('oldfiles')
    eq({ another, file1, file2 }, oldfiles)

    oldfiles = get_oldfiles('filter file_ oldfiles')
    eq({ file1, file2 }, oldfiles)

    oldfiles = get_oldfiles('filter /another/ oldfiles')
    eq({ another }, oldfiles)

    oldfiles = get_oldfiles('filter! file_ oldfiles')
    eq({ another }, oldfiles)
  end)
end)

describe(':browse oldfiles', function()
  local filename
  local filename2
  local oldfiles

  before_each(function()
    _clear()
    feed_command('edit testfile1')
    filename = api.nvim_buf_get_name(0)
    feed_command('edit testfile2')
    filename2 = api.nvim_buf_get_name(0)
    feed_command('wshada')
    poke_eventloop()
    _clear()

    -- Ensure nvim is out of "Press ENTER..." prompt.
    feed('<cr>')

    -- Ensure v:oldfiles isn't busted.  Since things happen so fast,
    -- the ordering of v:oldfiles is unstable (it uses qsort() under-the-hood).
    -- Let's verify the contents and the length of v:oldfiles before moving on.
    oldfiles = n.api.nvim_get_vvar('oldfiles')
    eq(2, #oldfiles)
    ok(filename == oldfiles[1] or filename == oldfiles[2])
    ok(filename2 == oldfiles[1] or filename2 == oldfiles[2])

    feed_command('browse oldfiles')
  end)

  after_each(function()
    expect_exit(command, 'qall!')
    os.remove(shada_file)
  end)

  it('provides a prompt and edits the chosen file', function()
    feed('2<cr>')
    eq(oldfiles[2], api.nvim_buf_get_name(0))
  end)

  it('provides a prompt and does nothing on <cr>', function()
    feed('<cr>')
    eq('', api.nvim_buf_get_name(0))
  end)

  it('provides a prompt and does nothing if choice is out-of-bounds', function()
    feed('3<cr>')
    eq('', api.nvim_buf_get_name(0))
  end)
end)