mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	 052498ed42
			
		
	
	052498ed42
	
	
	
		
			
			Specifically, functions that are run in the context of the test runner are put in module `test/testutil.lua` while the functions that are run in the context of the test session are put in `test/functional/testnvim.lua`. Closes https://github.com/neovim/neovim/issues/27004.
		
			
				
	
	
		
			646 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			646 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local t = require('test.testutil')
 | |
| local n = require('test.functional.testnvim')()
 | |
| 
 | |
| local clear, command = n.clear, n.command
 | |
| local expect, feed = n.expect, n.feed
 | |
| local eq, eval = t.eq, n.eval
 | |
| local fn = n.fn
 | |
| 
 | |
| describe(':emenu', function()
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     command('nnoremenu Test.Test inormal<ESC>')
 | |
|     command('inoremenu Test.Test insert')
 | |
|     command('vnoremenu Test.Test x')
 | |
|     command('cnoremenu Test.Test cmdmode')
 | |
| 
 | |
|     command('nnoremenu Edit.Paste p')
 | |
|     command('cnoremenu Edit.Paste <C-R>"')
 | |
|   end)
 | |
| 
 | |
|   it('executes correct bindings in normal mode without using API', function()
 | |
|     command('emenu Test.Test')
 | |
|     expect('normal')
 | |
|   end)
 | |
| 
 | |
|   it('executes correct bindings in normal mode', function()
 | |
|     command('emenu Test.Test')
 | |
|     expect('normal')
 | |
|   end)
 | |
| 
 | |
|   it('executes correct bindings in insert mode', function()
 | |
|     feed('i')
 | |
|     command('emenu Test.Test')
 | |
|     expect('insert')
 | |
|   end)
 | |
| 
 | |
|   it('executes correct bindings in visual mode', function()
 | |
|     feed('iabcde<ESC>0lvll')
 | |
|     command('emenu Test.Test')
 | |
|     expect('ae')
 | |
|   end)
 | |
| 
 | |
|   it('executes correct bindings in command mode', function()
 | |
|     feed('ithis is a sentence<esc>^yiwo<esc>')
 | |
| 
 | |
|     -- Invoke "Edit.Paste" in normal-mode.
 | |
|     command('emenu Edit.Paste')
 | |
| 
 | |
|     -- Invoke "Edit.Paste" and "Test.Test" in command-mode.
 | |
|     feed(':')
 | |
|     command('emenu Edit.Paste')
 | |
|     command('emenu Test.Test')
 | |
| 
 | |
|     expect([[
 | |
|         this is a sentence
 | |
|         this]])
 | |
|     -- Assert that Edit.Paste pasted @" into the commandline.
 | |
|     eq('thiscmdmode', eval('getcmdline()'))
 | |
|   end)
 | |
| end)
 | |
| 
 | |
| describe('menu_get', function()
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     command([=[
 | |
|       aunmenu *
 | |
| 
 | |
|       nnoremenu &Test.Test inormal<ESC>
 | |
|       inoremenu Test.Test insert
 | |
|       vnoremenu Test.Test x
 | |
|       cnoremenu Test.Test cmdmode
 | |
|       menu Test.Nested.test level1
 | |
|       menu Test.Nested.Nested2 level2
 | |
| 
 | |
|       nnoremenu <script> Export.Script p
 | |
|       tmenu Export.Script This is the tooltip
 | |
|       menu ]Export.hidden thisoneshouldbehidden
 | |
| 
 | |
|       nnoremenu Edit.Paste p
 | |
|       cnoremenu Edit.Paste <C-R>"
 | |
|     ]=])
 | |
|   end)
 | |
| 
 | |
|   it("path='', modes='a'", function()
 | |
|     local m = fn.menu_get('', 'a')
 | |
|     -- HINT: To print the expected table and regenerate the tests:
 | |
|     -- print(require('vim.inspect')(m))
 | |
|     local expected = {
 | |
|       {
 | |
|         shortcut = 'T',
 | |
|         hidden = 0,
 | |
|         submenus = {
 | |
|           {
 | |
|             mappings = {
 | |
|               i = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'insert',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               s = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'x',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'inormal<Esc>',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               v = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'x',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               c = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'cmdmode',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             priority = 500,
 | |
|             name = 'Test',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             name = 'Nested',
 | |
|             submenus = {
 | |
|               {
 | |
|                 mappings = {
 | |
|                   o = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level1',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                   v = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level1',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                   s = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level1',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                   n = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level1',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                 },
 | |
|                 priority = 500,
 | |
|                 name = 'test',
 | |
|                 hidden = 0,
 | |
|               },
 | |
|               {
 | |
|                 mappings = {
 | |
|                   o = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level2',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                   v = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level2',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                   s = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level2',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                   n = {
 | |
|                     sid = 0,
 | |
|                     noremap = 0,
 | |
|                     enabled = 1,
 | |
|                     rhs = 'level2',
 | |
|                     silent = 0,
 | |
|                   },
 | |
|                 },
 | |
|                 priority = 500,
 | |
|                 name = 'Nested2',
 | |
|                 hidden = 0,
 | |
|               },
 | |
|             },
 | |
|             hidden = 0,
 | |
|           },
 | |
|         },
 | |
|         priority = 500,
 | |
|         name = 'Test',
 | |
|       },
 | |
|       {
 | |
|         priority = 500,
 | |
|         name = 'Export',
 | |
|         submenus = {
 | |
|           {
 | |
|             tooltip = 'This is the tooltip',
 | |
|             hidden = 0,
 | |
|             name = 'Script',
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'p',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|         hidden = 0,
 | |
|       },
 | |
|       {
 | |
|         priority = 500,
 | |
|         name = 'Edit',
 | |
|         submenus = {
 | |
|           {
 | |
|             mappings = {
 | |
|               c = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '<C-R>"',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'p',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             priority = 500,
 | |
|             name = 'Paste',
 | |
|             hidden = 0,
 | |
|           },
 | |
|         },
 | |
|         hidden = 0,
 | |
|       },
 | |
|       {
 | |
|         priority = 500,
 | |
|         name = ']Export',
 | |
|         submenus = {
 | |
|           {
 | |
|             mappings = {
 | |
|               o = {
 | |
|                 sid = 0,
 | |
|                 noremap = 0,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'thisoneshouldbehidden',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               v = {
 | |
|                 sid = 0,
 | |
|                 noremap = 0,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'thisoneshouldbehidden',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               s = {
 | |
|                 sid = 0,
 | |
|                 noremap = 0,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'thisoneshouldbehidden',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               n = {
 | |
|                 sid = 0,
 | |
|                 noremap = 0,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'thisoneshouldbehidden',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             priority = 500,
 | |
|             name = 'hidden',
 | |
|             hidden = 0,
 | |
|           },
 | |
|         },
 | |
|         hidden = 1,
 | |
|       },
 | |
|     }
 | |
|     eq(expected, m)
 | |
|   end)
 | |
| 
 | |
|   it('matching path, all modes', function()
 | |
|     local m = fn.menu_get('Export', 'a')
 | |
|     local expected = {
 | |
|       {
 | |
|         hidden = 0,
 | |
|         name = 'Export',
 | |
|         priority = 500,
 | |
|         submenus = {
 | |
|           {
 | |
|             tooltip = 'This is the tooltip',
 | |
|             hidden = 0,
 | |
|             name = 'Script',
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'p',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|           },
 | |
|         },
 | |
|       },
 | |
|     }
 | |
|     eq(expected, m)
 | |
|   end)
 | |
| 
 | |
|   it('no path, matching modes', function()
 | |
|     local m = fn.menu_get('', 'i')
 | |
|     local expected = {
 | |
|       {
 | |
|         shortcut = 'T',
 | |
|         hidden = 0,
 | |
|         submenus = {
 | |
|           {
 | |
|             mappings = {
 | |
|               i = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'insert',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             priority = 500,
 | |
|             name = 'Test',
 | |
|             hidden = 0,
 | |
|           },
 | |
|         },
 | |
|         priority = 500,
 | |
|         name = 'Test',
 | |
|       },
 | |
|     }
 | |
|     eq(expected, m)
 | |
|   end)
 | |
| 
 | |
|   it('matching path and modes', function()
 | |
|     local m = fn.menu_get('Test', 'i')
 | |
|     local expected = {
 | |
|       {
 | |
|         shortcut = 'T',
 | |
|         submenus = {
 | |
|           {
 | |
|             mappings = {
 | |
|               i = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'insert',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             priority = 500,
 | |
|             name = 'Test',
 | |
|             hidden = 0,
 | |
|           },
 | |
|         },
 | |
|         priority = 500,
 | |
|         name = 'Test',
 | |
|         hidden = 0,
 | |
|       },
 | |
|     }
 | |
|     eq(expected, m)
 | |
|   end)
 | |
| end)
 | |
| 
 | |
| describe('menu_get', function()
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     command('aunmenu *')
 | |
|   end)
 | |
| 
 | |
|   it('returns <keycode> representation of special keys', function()
 | |
|     command('nnoremenu &Test.Test inormal<ESC>')
 | |
|     command('inoremenu &Test.Test2 <Tab><Esc>')
 | |
|     command('vnoremenu &Test.Test3 yA<C-R>0<Tab>xyz<Esc>')
 | |
|     command('inoremenu &Test.Test4 <c-r>*')
 | |
|     command('inoremenu &Test.Test5 <c-R>+')
 | |
|     command('nnoremenu &Test.Test6 <Nop>')
 | |
|     command('nnoremenu &Test.Test7 <NOP>')
 | |
|     command('nnoremenu &Test.Test8 <NoP>')
 | |
|     command('nnoremenu &Test.Test9 ""')
 | |
| 
 | |
|     local m = fn.menu_get('')
 | |
|     local expected = {
 | |
|       {
 | |
|         shortcut = 'T',
 | |
|         hidden = 0,
 | |
|         submenus = {
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'inormal<Esc>',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               i = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '<Tab><Esc>',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test2',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               s = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'yA<C-R>0<Tab>xyz<Esc>',
 | |
|                 silent = 0,
 | |
|               },
 | |
|               v = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'yA<C-R>0<Tab>xyz<Esc>',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test3',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               i = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '<C-R>*',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test4',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               i = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '<C-R>+',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test5',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test6',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test7',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test8',
 | |
|             hidden = 0,
 | |
|           },
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = '""',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test9',
 | |
|             hidden = 0,
 | |
|           },
 | |
|         },
 | |
|         priority = 500,
 | |
|         name = 'Test',
 | |
|       },
 | |
|     }
 | |
| 
 | |
|     eq(m, expected)
 | |
|   end)
 | |
| 
 | |
|   it('works with right-aligned text and spaces', function()
 | |
|     command('nnoremenu &Test<Tab>Y.Test<Tab>X\\ x inormal<Alt-j>')
 | |
|     command('nnoremenu &Test\\ 1.Test\\ 2 Wargl')
 | |
|     command('nnoremenu &Test4.Test<Tab>3 i space<Esc>')
 | |
| 
 | |
|     local m = fn.menu_get('')
 | |
|     local expected = {
 | |
|       {
 | |
|         shortcut = 'T',
 | |
|         hidden = 0,
 | |
|         actext = 'Y',
 | |
|         submenus = {
 | |
|           {
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'inormal<Alt-j>',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             hidden = 0,
 | |
|             actext = 'X x',
 | |
|             priority = 500,
 | |
|             name = 'Test',
 | |
|           },
 | |
|         },
 | |
|         priority = 500,
 | |
|         name = 'Test',
 | |
|       },
 | |
|       {
 | |
|         shortcut = 'T',
 | |
|         hidden = 0,
 | |
|         submenus = {
 | |
|           {
 | |
|             priority = 500,
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'Wargl',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             name = 'Test 2',
 | |
|             hidden = 0,
 | |
|           },
 | |
|         },
 | |
|         priority = 500,
 | |
|         name = 'Test 1',
 | |
|       },
 | |
|       {
 | |
|         shortcut = 'T',
 | |
|         hidden = 0,
 | |
|         submenus = {
 | |
|           {
 | |
|             mappings = {
 | |
|               n = {
 | |
|                 sid = 1,
 | |
|                 noremap = 1,
 | |
|                 enabled = 1,
 | |
|                 rhs = 'i space<Esc>',
 | |
|                 silent = 0,
 | |
|               },
 | |
|             },
 | |
|             hidden = 0,
 | |
|             actext = '3',
 | |
|             priority = 500,
 | |
|             name = 'Test',
 | |
|           },
 | |
|         },
 | |
|         priority = 500,
 | |
|         name = 'Test4',
 | |
|       },
 | |
|     }
 | |
| 
 | |
|     eq(m, expected)
 | |
|   end)
 | |
| end)
 |