neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

runtime_spec.lua (16279B)


      1 local t = require('test.testutil')
      2 local n = require('test.functional.testnvim')()
      3 
      4 local clear = n.clear
      5 local eq = t.eq
      6 local eval = n.eval
      7 local exec = n.exec
      8 local api = n.api
      9 local fn = n.fn
     10 local mkdir_p = n.mkdir_p
     11 local rmdir = n.rmdir
     12 local write_file = t.write_file
     13 
     14 describe('runtime:', function()
     15  local plug_dir = 'Test_Plugin'
     16  local sep = n.get_pathsep()
     17  local init = 'dummy_init.lua'
     18 
     19  -- All test cases below use the same Nvim instance.
     20  setup(function()
     21    io.open(init, 'w'):close() --  touch init file
     22    clear({ args = { '-u', init } })
     23    exec('set rtp+=' .. plug_dir)
     24    exec([[
     25      set shell=doesnotexist
     26      if exists('+completeslash')
     27        set completeslash=slash
     28      endif
     29      set isfname+=(,)
     30    ]])
     31  end)
     32 
     33  teardown(function()
     34    os.remove(init)
     35  end)
     36 
     37  before_each(function()
     38    mkdir_p(plug_dir)
     39  end)
     40 
     41  after_each(function()
     42    rmdir(plug_dir)
     43    exec('bwipe!')
     44    exec('set rtp& pp&')
     45    exec('set rtp+=' .. plug_dir)
     46  end)
     47 
     48  describe('colors', function()
     49    local colorscheme_folder = plug_dir .. sep .. 'colors'
     50    before_each(function()
     51      mkdir_p(colorscheme_folder)
     52    end)
     53 
     54    it('Lua colorschemes work and are included in cmdline completion', function()
     55      local colorscheme_file = table.concat({ colorscheme_folder, 'new_colorscheme.lua' }, sep)
     56      write_file(colorscheme_file, [[vim.g.lua_colorscheme = 1]])
     57 
     58      eq({ 'new_colorscheme' }, fn.getcompletion('new_c', 'color'))
     59      eq({ 'colors/new_colorscheme.lua' }, fn.getcompletion('colors/new_c', 'runtime'))
     60 
     61      exec('colorscheme new_colorscheme')
     62 
     63      eq(1, eval('g:lua_colorscheme'))
     64    end)
     65 
     66    it("'rtp'/'pp' order is respected", function()
     67      local pack_dir = 'Test_Pack'
     68      mkdir_p(pack_dir)
     69      finally(function()
     70        rmdir(pack_dir)
     71      end)
     72      exec('set pp+=' .. pack_dir)
     73 
     74      local pack_opt_dir = table.concat({ pack_dir, 'pack', 'some_name', 'opt' }, sep)
     75      local colors_opt_dir = table.concat({ pack_opt_dir, 'some_pack', 'colors' }, sep)
     76      mkdir_p(colors_opt_dir)
     77 
     78      local after_colorscheme_folder = table.concat({ plug_dir, 'after', 'colors' }, sep)
     79      mkdir_p(after_colorscheme_folder)
     80      exec('set rtp+=' .. plug_dir .. '/after')
     81 
     82      write_file(
     83        table.concat({ colors_opt_dir, 'new_colorscheme.lua' }, sep),
     84        [[vim.g.colorscheme = 'lua_pp']]
     85      )
     86      exec('colorscheme new_colorscheme')
     87      eq('lua_pp', eval('g:colorscheme'))
     88 
     89      write_file(
     90        table.concat({ colors_opt_dir, 'new_colorscheme.vim' }, sep),
     91        [[let g:colorscheme = 'vim_pp']]
     92      )
     93      exec('colorscheme new_colorscheme')
     94      eq('vim_pp', eval('g:colorscheme'))
     95 
     96      write_file(
     97        table.concat({ after_colorscheme_folder, 'new_colorscheme.lua' }, sep),
     98        [[vim.g.colorscheme = 'lua_rtp_after']]
     99      )
    100      exec('colorscheme new_colorscheme')
    101      eq('lua_rtp_after', eval('g:colorscheme'))
    102 
    103      write_file(
    104        table.concat({ after_colorscheme_folder, 'new_colorscheme.vim' }, sep),
    105        [[let g:colorscheme = 'vim_rtp_after']]
    106      )
    107      exec('colorscheme new_colorscheme')
    108      eq('vim_rtp_after', eval('g:colorscheme'))
    109 
    110      write_file(
    111        table.concat({ colorscheme_folder, 'new_colorscheme.lua' }, sep),
    112        [[vim.g.colorscheme = 'lua_rtp']]
    113      )
    114      exec('colorscheme new_colorscheme')
    115      eq('lua_rtp', eval('g:colorscheme'))
    116 
    117      write_file(
    118        table.concat({ colorscheme_folder, 'new_colorscheme.vim' }, sep),
    119        [[let g:colorscheme = 'vim_rtp']]
    120      )
    121      exec('colorscheme new_colorscheme')
    122      eq('vim_rtp', eval('g:colorscheme'))
    123    end)
    124  end)
    125 
    126  describe('compiler', function()
    127    local compiler_folder = table.concat({ plug_dir, 'compiler' }, sep)
    128    before_each(function()
    129      mkdir_p(compiler_folder)
    130    end)
    131 
    132    it('Lua compilers work and are included in cmdline completion', function()
    133      local compiler_file = compiler_folder .. sep .. 'new_compiler.lua'
    134      write_file(compiler_file, [[vim.b.lua_compiler = 1]])
    135 
    136      eq({ 'new_compiler' }, fn.getcompletion('new_c', 'compiler'))
    137      eq({ 'compiler/new_compiler.lua' }, fn.getcompletion('compiler/new_c', 'runtime'))
    138 
    139      exec('compiler new_compiler')
    140 
    141      eq(1, eval('b:lua_compiler'))
    142    end)
    143 
    144    it("'rtp' order is respected", function()
    145      local after_compiler_folder = table.concat({ plug_dir, 'after', 'compiler' }, sep)
    146      mkdir_p(table.concat({ compiler_folder, 'new_compiler' }, sep))
    147      mkdir_p(table.concat({ after_compiler_folder, 'new_compiler' }, sep))
    148      exec('set rtp+=' .. plug_dir .. '/after')
    149      exec('let g:seq = ""')
    150      -- A .lua file is loaded after a .vim file if they only differ in extension.
    151      -- All files in after/compiler/ are loaded after all files in compiler/.
    152      write_file(table.concat({ compiler_folder, 'new_compiler.vim' }, sep), [[let g:seq ..= 'A']])
    153      write_file(
    154        table.concat({ compiler_folder, 'new_compiler.lua' }, sep),
    155        [[vim.g.seq = vim.g.seq .. 'B']]
    156      )
    157      write_file(
    158        table.concat({ after_compiler_folder, 'new_compiler.vim' }, sep),
    159        [[let g:seq ..= 'a']]
    160      )
    161      write_file(
    162        table.concat({ after_compiler_folder, 'new_compiler.lua' }, sep),
    163        [[vim.g.seq = vim.g.seq .. 'b']]
    164      )
    165      exec('compiler new_compiler')
    166      eq('ABab', eval('g:seq'))
    167    end)
    168  end)
    169 
    170  describe('ftplugin', function()
    171    local ftplugin_folder = table.concat({ plug_dir, 'ftplugin' }, sep)
    172 
    173    it('Lua ftplugins work and are included in cmdline completion', function()
    174      mkdir_p(ftplugin_folder)
    175      local ftplugin_file = table.concat({ ftplugin_folder, 'new-ft.lua' }, sep)
    176      write_file(ftplugin_file, [[vim.b.lua_ftplugin = 1]])
    177 
    178      eq({ 'new-ft' }, fn.getcompletion('new-f', 'filetype'))
    179      eq({ 'ftplugin/new-ft.lua' }, fn.getcompletion('ftplugin/new-f', 'runtime'))
    180 
    181      exec [[set filetype=new-ft]]
    182      eq(1, eval('b:lua_ftplugin'))
    183    end)
    184 
    185    it("'rtp' order is respected", function()
    186      local after_ftplugin_folder = table.concat({ plug_dir, 'after', 'ftplugin' }, sep)
    187      mkdir_p(table.concat({ ftplugin_folder, 'new-ft' }, sep))
    188      mkdir_p(table.concat({ after_ftplugin_folder, 'new-ft' }, sep))
    189      exec('set rtp+=' .. plug_dir .. '/after')
    190      exec('let g:seq = ""')
    191      -- A .lua file is loaded after a .vim file if they only differ in extension.
    192      -- All files in after/ftplugin/ are loaded after all files in ftplugin/.
    193      write_file(table.concat({ ftplugin_folder, 'new-ft.vim' }, sep), [[let g:seq ..= 'A']])
    194      write_file(
    195        table.concat({ ftplugin_folder, 'new-ft.lua' }, sep),
    196        [[vim.g.seq = vim.g.seq .. 'B']]
    197      )
    198      write_file(table.concat({ ftplugin_folder, 'new-ft_a.vim' }, sep), [[let g:seq ..= 'C']])
    199      write_file(
    200        table.concat({ ftplugin_folder, 'new-ft_a.lua' }, sep),
    201        [[vim.g.seq = vim.g.seq .. 'D']]
    202      )
    203      write_file(table.concat({ ftplugin_folder, 'new-ft', 'a.vim' }, sep), [[let g:seq ..= 'E']])
    204      write_file(
    205        table.concat({ ftplugin_folder, 'new-ft', 'a.lua' }, sep),
    206        [[vim.g.seq = vim.g.seq .. 'F']]
    207      )
    208      write_file(table.concat({ after_ftplugin_folder, 'new-ft.vim' }, sep), [[let g:seq ..= 'a']])
    209      write_file(
    210        table.concat({ after_ftplugin_folder, 'new-ft.lua' }, sep),
    211        [[vim.g.seq = vim.g.seq .. 'b']]
    212      )
    213      write_file(
    214        table.concat({ after_ftplugin_folder, 'new-ft_a.vim' }, sep),
    215        [[let g:seq ..= 'c']]
    216      )
    217      write_file(
    218        table.concat({ after_ftplugin_folder, 'new-ft_a.lua' }, sep),
    219        [[vim.g.seq = vim.g.seq .. 'd']]
    220      )
    221      write_file(
    222        table.concat({ after_ftplugin_folder, 'new-ft', 'a.vim' }, sep),
    223        [[let g:seq ..= 'e']]
    224      )
    225      write_file(
    226        table.concat({ after_ftplugin_folder, 'new-ft', 'a.lua' }, sep),
    227        [[vim.g.seq = vim.g.seq .. 'f']]
    228      )
    229      exec('setfiletype new-ft')
    230      eq('ABCDEFabcdef', eval('g:seq'))
    231    end)
    232 
    233    it("'rtp' order is respected with 'fileignorecase'", function()
    234      exec('set fileignorecase')
    235      local after_ftplugin_folder = table.concat({ plug_dir, 'after', 'ftplugin' }, sep)
    236      mkdir_p(table.concat({ ftplugin_folder, 'new-ft' }, sep))
    237      mkdir_p(table.concat({ after_ftplugin_folder, 'new-ft' }, sep))
    238      exec('set rtp+=' .. plug_dir .. '/after')
    239      exec('let g:seq = ""')
    240      -- A .lua file is loaded after a .vim file if they only differ in extension.
    241      -- All files in after/ftplugin/ are loaded after all files in ftplugin/.
    242      write_file(table.concat({ ftplugin_folder, 'new-ft.VIM' }, sep), [[let g:seq ..= 'A']])
    243      write_file(
    244        table.concat({ ftplugin_folder, 'new-ft.LUA' }, sep),
    245        [[vim.g.seq = vim.g.seq .. 'B']]
    246      )
    247      write_file(table.concat({ ftplugin_folder, 'new-ft_a.vim' }, sep), [[let g:seq ..= 'C']])
    248      write_file(
    249        table.concat({ ftplugin_folder, 'new-ft_a.lua' }, sep),
    250        [[vim.g.seq = vim.g.seq .. 'D']]
    251      )
    252      write_file(table.concat({ ftplugin_folder, 'new-ft', 'a.VIM' }, sep), [[let g:seq ..= 'E']])
    253      write_file(
    254        table.concat({ ftplugin_folder, 'new-ft', 'a.LUA' }, sep),
    255        [[vim.g.seq = vim.g.seq .. 'F']]
    256      )
    257      write_file(table.concat({ after_ftplugin_folder, 'new-ft.vim' }, sep), [[let g:seq ..= 'a']])
    258      write_file(
    259        table.concat({ after_ftplugin_folder, 'new-ft.lua' }, sep),
    260        [[vim.g.seq = vim.g.seq .. 'b']]
    261      )
    262      write_file(
    263        table.concat({ after_ftplugin_folder, 'new-ft_a.VIM' }, sep),
    264        [[let g:seq ..= 'c']]
    265      )
    266      write_file(
    267        table.concat({ after_ftplugin_folder, 'new-ft_a.LUA' }, sep),
    268        [[vim.g.seq = vim.g.seq .. 'd']]
    269      )
    270      write_file(
    271        table.concat({ after_ftplugin_folder, 'new-ft', 'a.vim' }, sep),
    272        [[let g:seq ..= 'e']]
    273      )
    274      write_file(
    275        table.concat({ after_ftplugin_folder, 'new-ft', 'a.lua' }, sep),
    276        [[vim.g.seq = vim.g.seq .. 'f']]
    277      )
    278      exec('setfiletype new-ft')
    279      eq('ABCDEFabcdef', eval('g:seq'))
    280    end)
    281  end)
    282 
    283  describe('indent', function()
    284    local indent_folder = table.concat({ plug_dir, 'indent' }, sep)
    285 
    286    it('Lua indents work and are included in cmdline completion', function()
    287      mkdir_p(indent_folder)
    288      local indent_file = table.concat({ indent_folder, 'new-ft.lua' }, sep)
    289      write_file(indent_file, [[vim.b.lua_indent = 1]])
    290 
    291      eq({ 'new-ft' }, fn.getcompletion('new-f', 'filetype'))
    292      eq({ 'indent/new-ft.lua' }, fn.getcompletion('indent/new-f', 'runtime'))
    293 
    294      exec [[set filetype=new-ft]]
    295      eq(1, eval('b:lua_indent'))
    296    end)
    297 
    298    it("'rtp' order is respected", function()
    299      local after_indent_folder = table.concat({ plug_dir, 'after', 'indent' }, sep)
    300      mkdir_p(table.concat({ indent_folder, 'new-ft' }, sep))
    301      mkdir_p(table.concat({ after_indent_folder, 'new-ft' }, sep))
    302      exec('set rtp+=' .. plug_dir .. '/after')
    303      exec('let g:seq = ""')
    304      -- A .lua file is loaded after a .vim file if they only differ in extension.
    305      -- All files in after/indent/ are loaded after all files in indent/.
    306      write_file(table.concat({ indent_folder, 'new-ft.vim' }, sep), [[let g:seq ..= 'A']])
    307      write_file(
    308        table.concat({ indent_folder, 'new-ft.lua' }, sep),
    309        [[vim.g.seq = vim.g.seq .. 'B']]
    310      )
    311      write_file(table.concat({ after_indent_folder, 'new-ft.vim' }, sep), [[let g:seq ..= 'a']])
    312      write_file(
    313        table.concat({ after_indent_folder, 'new-ft.lua' }, sep),
    314        [[vim.g.seq = vim.g.seq .. 'b']]
    315      )
    316      exec('setfiletype new-ft')
    317      eq('ABab', eval('g:seq'))
    318    end)
    319  end)
    320 
    321  describe('syntax', function()
    322    local syntax_folder = table.concat({ plug_dir, 'syntax' }, sep)
    323 
    324    before_each(function()
    325      mkdir_p(syntax_folder)
    326      local syntax_file = table.concat({ syntax_folder, 'my-lang.lua' }, sep)
    327      write_file(syntax_file, [[vim.b.current_syntax = 'my-lang']])
    328      exec([[let b:current_syntax = '']])
    329    end)
    330 
    331    it('loads Lua syntaxes on filetype change', function()
    332      exec('set filetype=my-lang')
    333      eq('my-lang', eval('b:current_syntax'))
    334    end)
    335 
    336    it('loads Lua syntaxes on syntax change', function()
    337      exec('set syntax=my-lang')
    338      eq('my-lang', eval('b:current_syntax'))
    339    end)
    340 
    341    it('loads Lua syntaxes for :ownsyntax', function()
    342      exec('ownsyntax my-lang')
    343      eq('my-lang', eval('w:current_syntax'))
    344      eq('', eval('b:current_syntax'))
    345    end)
    346 
    347    it('Lua syntaxes are included in cmdline completion', function()
    348      eq({ 'my-lang' }, fn.getcompletion('my-l', 'filetype'))
    349      eq({ 'my-lang' }, fn.getcompletion('my-l', 'syntax'))
    350      eq({ 'syntax/my-lang.lua' }, fn.getcompletion('syntax/my-l', 'runtime'))
    351    end)
    352 
    353    it("'rtp' order is respected", function()
    354      local after_syntax_folder = table.concat({ plug_dir, 'after', 'syntax' }, sep)
    355      mkdir_p(table.concat({ syntax_folder, 'my-lang' }, sep))
    356      mkdir_p(table.concat({ after_syntax_folder, 'my-lang' }, sep))
    357      exec('set rtp+=' .. plug_dir .. '/after')
    358      exec('let g:seq = ""')
    359      -- A .lua file is loaded after a .vim file if they only differ in extension.
    360      -- All files in after/syntax/ are loaded after all files in syntax/.
    361      write_file(table.concat({ syntax_folder, 'my-lang.vim' }, sep), [[let g:seq ..= 'A']])
    362      write_file(
    363        table.concat({ syntax_folder, 'my-lang.lua' }, sep),
    364        [[vim.g.seq = vim.g.seq .. 'B']]
    365      )
    366      write_file(table.concat({ syntax_folder, 'my-lang', 'a.vim' }, sep), [[let g:seq ..= 'C']])
    367      write_file(
    368        table.concat({ syntax_folder, 'my-lang', 'a.lua' }, sep),
    369        [[vim.g.seq = vim.g.seq .. 'D']]
    370      )
    371      write_file(table.concat({ after_syntax_folder, 'my-lang.vim' }, sep), [[let g:seq ..= 'a']])
    372      write_file(
    373        table.concat({ after_syntax_folder, 'my-lang.lua' }, sep),
    374        [[vim.g.seq = vim.g.seq .. 'b']]
    375      )
    376      write_file(
    377        table.concat({ after_syntax_folder, 'my-lang', 'a.vim' }, sep),
    378        [[let g:seq ..= 'c']]
    379      )
    380      write_file(
    381        table.concat({ after_syntax_folder, 'my-lang', 'a.lua' }, sep),
    382        [[vim.g.seq = vim.g.seq .. 'd']]
    383      )
    384      exec('setfiletype my-lang')
    385      eq('ABCDabcd', eval('g:seq'))
    386    end)
    387  end)
    388 
    389  describe('spell', function()
    390    it("loads spell/LANG.{vim,lua} respecting 'rtp' order", function()
    391      local spell_folder = table.concat({ plug_dir, 'spell' }, sep)
    392      local after_spell_folder = table.concat({ plug_dir, 'after', 'spell' }, sep)
    393      mkdir_p(table.concat({ spell_folder, 'Xtest' }, sep))
    394      mkdir_p(table.concat({ after_spell_folder, 'Xtest' }, sep))
    395      exec('set rtp+=' .. plug_dir .. '/after')
    396      exec('let g:seq = ""')
    397      -- A .lua file is loaded after a .vim file if they only differ in extension.
    398      -- All files in after/spell/ are loaded after all files in spell/.
    399      write_file(table.concat({ spell_folder, 'Xtest.vim' }, sep), [[let g:seq ..= 'A']])
    400      write_file(table.concat({ spell_folder, 'Xtest.lua' }, sep), [[vim.g.seq = vim.g.seq .. 'B']])
    401      write_file(table.concat({ after_spell_folder, 'Xtest.vim' }, sep), [[let g:seq ..= 'a']])
    402      write_file(
    403        table.concat({ after_spell_folder, 'Xtest.lua' }, sep),
    404        [[vim.g.seq = vim.g.seq .. 'b']]
    405      )
    406      exec('set spelllang=Xtest')
    407      eq('ABab', eval('g:seq'))
    408    end)
    409  end)
    410 
    411  it('Lua file loaded by :runtime has proper script ID #32598', function()
    412    local test_file = 'Xtest_runtime_cmd.lua'
    413    write_file(
    414      table.concat({ plug_dir, test_file }, sep),
    415      [[
    416      vim.g.script_id = tonumber(vim.fn.expand('<SID>'):match('<SNR>(%d+)_'))
    417      vim.o.mouse = 'nv'
    418    ]]
    419    )
    420    exec('runtime ' .. test_file)
    421    local expected_sid = fn.getscriptinfo({ name = test_file })[1].sid
    422    local sid = api.nvim_get_var('script_id')
    423    eq(expected_sid, sid)
    424    eq(sid, api.nvim_get_option_info2('mouse', {}).last_set_sid)
    425  end)
    426 
    427  it('cpp ftplugin loads c ftplugin #29053', function()
    428    eq('', eval('&commentstring'))
    429    eq('', eval('&omnifunc'))
    430    exec('edit file.cpp')
    431    eq('// %s', eval('&commentstring'))
    432    eq('ccomplete#Complete', eval('&omnifunc'))
    433  end)
    434 end)