mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			148 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Tests for adjusting window and contents
 | |
| 
 | |
| local helpers = require('test.functional.helpers')(after_each)
 | |
| local Screen = require('test.functional.ui.screen')
 | |
| 
 | |
| local eval, clear, command = helpers.eval, helpers.clear, helpers.command
 | |
| local eq, neq = helpers.eq, helpers.neq
 | |
| local insert = helpers.insert
 | |
| local redir_exec = helpers.redir_exec
 | |
| 
 | |
| describe('063: Test for ":match", "matchadd()" and related functions', function()
 | |
|   setup(clear)
 | |
| 
 | |
|   it('is working', function()
 | |
|     local screen = Screen.new(40, 5)
 | |
|     screen:attach()
 | |
| 
 | |
|     -- Check that "matcharg()" returns the correct group and pattern if a match
 | |
|     -- is defined.
 | |
|     command("highlight MyGroup1 term=bold ctermbg=red guibg=red")
 | |
|     command("highlight MyGroup2 term=italic ctermbg=green guibg=green")
 | |
|     command("highlight MyGroup3 term=underline ctermbg=blue guibg=blue")
 | |
|     command("match MyGroup1 /TODO/")
 | |
|     command("2match MyGroup2 /FIXME/")
 | |
|     command("3match MyGroup3 /XXX/")
 | |
|     eq({'MyGroup1', 'TODO'}, eval('matcharg(1)'))
 | |
|     eq({'MyGroup2', 'FIXME'}, eval('matcharg(2)'))
 | |
|     eq({'MyGroup3', 'XXX'}, eval('matcharg(3)'))
 | |
| 
 | |
|     -- Check that "matcharg()" returns an empty list if the argument is not 1,
 | |
|     -- 2 or 3 (only 0 and 4 are tested).
 | |
|     eq({}, eval('matcharg(0)'))
 | |
|     eq({}, eval('matcharg(4)'))
 | |
| 
 | |
|     -- Check that "matcharg()" returns ['', ''] if a match is not defined.
 | |
|     command("match")
 | |
|     command("2match")
 | |
|     command("3match")
 | |
|     eq({'', ''}, eval('matcharg(1)'))
 | |
|     eq({'', ''}, eval('matcharg(2)'))
 | |
|     eq({'', ''}, eval('matcharg(3)'))
 | |
| 
 | |
|     -- Check that "matchadd()" and "getmatches()" agree on added matches and
 | |
|     -- that default values apply.
 | |
|     command("let m1 = matchadd('MyGroup1', 'TODO')")
 | |
|     command("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
 | |
|     command("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
 | |
|     eq({{group = 'MyGroup1', pattern = 'TODO', priority = 10, id = 4},
 | |
|         {group = 'MyGroup2', pattern = 'FIXME', priority = 42, id = 5},
 | |
|         {group = 'MyGroup3', pattern = 'XXX', priority = 60, id = 17}},
 | |
|       eval('getmatches()'))
 | |
| 
 | |
|     -- Check that "matchdelete()" deletes the matches defined in the previous
 | |
|     -- test correctly.
 | |
|     command("call matchdelete(m1)")
 | |
|     command("call matchdelete(m2)")
 | |
|     command("call matchdelete(m3)")
 | |
|     eq({}, eval('getmatches()'))
 | |
| 
 | |
|     --- Check that "matchdelete()" returns 0 if successful and otherwise -1.
 | |
|     command("let m = matchadd('MyGroup1', 'TODO')")
 | |
|     eq(0, eval('matchdelete(m)'))
 | |
| 
 | |
|     -- matchdelete throws error and returns -1 on failure
 | |
|     neq(true, pcall(function() eval('matchdelete(42)') end))
 | |
|     eq('\nE803: ID not found: 42',
 | |
|        redir_exec("let r2 = matchdelete(42)"))
 | |
|     eq(-1, eval('r2'))
 | |
| 
 | |
|     -- Check that "clearmatches()" clears all matches defined by ":match" and
 | |
|     -- "matchadd()".
 | |
|     command("let m1 = matchadd('MyGroup1', 'TODO')")
 | |
|     command("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
 | |
|     command("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
 | |
|     command("match MyGroup1 /COFFEE/")
 | |
|     command("2match MyGroup2 /HUMPPA/")
 | |
|     command("3match MyGroup3 /VIM/")
 | |
|     command("call clearmatches()")
 | |
|     eq({}, eval('getmatches()'))
 | |
| 
 | |
|     -- Check that "setmatches()" restores a list of matches saved by
 | |
|     -- "getmatches()" without changes. (Matches with equal priority must also
 | |
|     -- remain in the same order.)
 | |
|     command("let m1 = matchadd('MyGroup1', 'TODO')")
 | |
|     command("let m2 = matchadd('MyGroup2', 'FIXME', 42)")
 | |
|     command("let m3 = matchadd('MyGroup3', 'XXX', 60, 17)")
 | |
|     command("match MyGroup1 /COFFEE/")
 | |
|     command("2match MyGroup2 /HUMPPA/")
 | |
|     command("3match MyGroup3 /VIM/")
 | |
|     command("let ml = getmatches()")
 | |
|     local ml = eval("ml")
 | |
|     command("call clearmatches()")
 | |
|     command("call setmatches(ml)")
 | |
|     eq(ml, eval('getmatches()'))
 | |
| 
 | |
|     -- Check that "setmatches()" can correctly restore the matches from matchaddpos()
 | |
|     command("call clearmatches()")
 | |
|     command("call setmatches(ml)")
 | |
|     eq(ml, eval('getmatches()'))
 | |
| 
 | |
|     -- Check that "setmatches()" will not add two matches with the same ID. The
 | |
|     -- expected behaviour (for now) is to add the first match but not the
 | |
|     -- second and to return -1.
 | |
|     eq('\nE801: ID already taken: 1',
 | |
|        redir_exec("let r1 = setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}, {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 10, 'id': 1}])"))
 | |
|     eq(-1, eval("r1"))
 | |
|     eq({{group = 'MyGroup1', pattern = 'TODO', priority = 10, id = 1}}, eval('getmatches()'))
 | |
| 
 | |
|     -- Check that "setmatches()" returns 0 if successful and otherwise -1.
 | |
|     -- (A range of valid and invalid input values are tried out to generate the
 | |
|     -- return values.)
 | |
|     eq(0,eval("setmatches([])"))
 | |
|     eq(0,eval("setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}])"))
 | |
|     command("call clearmatches()")
 | |
|     eq('\nE714: List required', redir_exec("let rf1 = setmatches(0)"))
 | |
|     eq(-1, eval('rf1'))
 | |
|     eq('\nE474: List item 0 is either not a dictionary or an empty one',
 | |
|        redir_exec("let rf2 = setmatches([0])"))
 | |
|     eq(-1, eval('rf2'))
 | |
|     eq('\nE474: List item 0 is missing one of the required keys',
 | |
|        redir_exec("let rf3 = setmatches([{'wrong key': 'wrong value'}])"))
 | |
|     eq(-1, eval('rf3'))
 | |
| 
 | |
|     -- Check that "matchaddpos()" positions matches correctly
 | |
|     insert('abcdefghijklmnopq')
 | |
|     command("call matchaddpos('MyGroup1', [[1, 5], [1, 8, 3]], 10, 3)")
 | |
|     screen:expect([[
 | |
|       abcd{1:e}fg{1:hij}klmnop^q                       |
 | |
|       ~                                       |
 | |
|       ~                                       |
 | |
|       ~                                       |
 | |
|                                               |
 | |
|     ]], {[1] = {background = Screen.colors.Red}}, {{bold = true, foreground = Screen.colors.Blue}})
 | |
| 
 | |
|     command("call clearmatches()")
 | |
|     command("call setline(1, 'abcdΣabcdef')")
 | |
|     command("call matchaddpos('MyGroup1', [[1, 4, 2], [1, 9, 2]])")
 | |
|     screen:expect([[
 | |
|       abc{1:dΣ}ab{1:cd}e^f                             |
 | |
|       ~                                       |
 | |
|       ~                                       |
 | |
|       ~                                       |
 | |
|                                               |
 | |
|     ]],{[1] = {background = Screen.colors.Red}}, {{bold = true, foreground = Screen.colors.Blue}})
 | |
|   end)
 | |
| end)
 | |
| 
 | 
