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)