neovim/test/functional/legacy/match_conceal_spec.lua
2016-02-11 15:08:31 +09:00

229 lines
8.5 KiB
Lua

-- Test for matchadd() and conceal feature
local helpers = require('test.functional.helpers')
local clear = helpers.clear
local expect = helpers.expect
local source = helpers.source
describe('match_conceal', function()
before_each(function()
clear()
source([[
set wildchar=^E
10new
vsp
vert resize 20
put =\"\#\ This\ is\ a\ Test\"
norm! mazt
fu! ScreenChar(width, lines)
let c=''
for j in range(1,a:lines)
for i in range(1,a:width)
let c.=nr2char(screenchar(j, i))
endfor
let c.="\n"
endfor
return c
endfu
fu! ScreenAttr(line, pos, eval)
let g:attr=[]
for col in a:pos
call add(g:attr, screenattr(a:line,col))
endfor
" In case all values are zero, probably the terminal
" isn't set correctly, so catch that case
let null = (eval(join(g:attr, '+')) == 0)
let str=substitute(a:eval, '\d\+', 'g:attr[&]', 'g')
if null || eval(str)
let g:attr_test="OK: ". str
else
let g:attr_test="FAILED: ".str
let g:attr_test.="\n". join(g:attr, ' ')
let g:attr_test.="\n TERM: ". &term
endif
endfu
fu! DoRecordScreen()
wincmd l
$put =printf(\"\n%s\", g:test)
$put =g:line
$put =g:attr_test
wincmd p
endfu
]])
end)
it('is working', function()
source([=[
let g:test ="Test 1: simple addmatch()"
call matchadd('Conceal', '\%2l ')
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
let g:test ="Test 2: simple addmatch() and conceal (should be: #XThisXisXaXTest)"
norm! 'azt
call clearmatches()
syntax on
set concealcursor=n conceallevel=1
call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
let g:test ="Test 3: addmatch() and conceallevel=3 (should be: #ThisisaTest)"
norm! 'azt
set conceallevel=3
call clearmatches()
call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'})
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 1==2 && 1==3 && 1==4 && 0!=5")
call DoRecordScreen()
let g:test ="Test 4: more match() (should be: #Thisisa Test)"
norm! 'azt
call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'})
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 1==2 && 0!=3 && 3==4 && 0!=5 && 3!=5")
call DoRecordScreen()
let g:test ="Test 5/1: default conceal char (should be: # This is a Test)"
norm! 'azt
call clearmatches()
set conceallevel=1
call matchadd('Conceal', '\%2l ', 10, -1, {})
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
let g:test ="Test 5/2: default conceal char (should be: #+This+is+a+Test)"
norm! 'azt
set listchars=conceal:+
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
set listchars&vi
let g:test ="Test 6/1: syn and match conceal (should be: #ZThisZisZaZTest)"
norm! 'azt
call clearmatches()
set conceallevel=1
call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'})
syn match MyConceal /\%2l / conceal containedin=ALL cchar=*
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
let g:test ="Test 6/2: syn and match conceal (should be: #*This*is*a*Test)"
norm! 'azt
call clearmatches()
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
let g:test ="Test 7/1: clear matches"
norm! 'azt
syn on
call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'})
let a=getmatches()
call clearmatches()
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0==1 && 0==2 && 0==3 && 0==4 && 0==5")
call DoRecordScreen()
$put =a
call setmatches(a)
norm! 'azt
let g:test ="Test 7/2: reset match using setmatches()"
norm! 'azt
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
let g:test ="Test 8: using matchaddpos() (should be #Pis a Test"
norm! 'azt
call clearmatches()
call matchaddpos('Conceal', [[2,2,6]], 10, -1, {'conceal': 'P'})
let a=getmatches()
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1!=2 && 0==2 && 0==3 && 0!=4 && 0!=5 && 4==5")
call DoRecordScreen()
$put =a
let g:test ="Test 9: match using multibyte conceal char (should be: #ˑThisˑisˑaˑTest)"
norm! 'azt
call clearmatches()
call matchadd('Conceal', '\%2l ', 20, -1, {'conceal': "\u02d1"})
redraw!
let line=ScreenChar(winwidth(0),1)
call ScreenAttr(1,[1,2,7,10,12,16], "0!=1 && 1==2 && 1==3 && 1==4 && 0==5")
call DoRecordScreen()
]=])
expect([=[
# This is a Test
Test 1: simple addmatch()
# This is a Test
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
Test 2: simple addmatch() and conceal (should be: #XThisXisXaXTest)
#XThisXisXaXTest
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
Test 3: addmatch() and conceallevel=3 (should be: #ThisisaTest)
#ThisisaTest
OK: g:attr[0]==g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]!=g:attr[5]
Test 4: more match() (should be: #Thisisa Test)
#Thisisa Test
OK: g:attr[0]==g:attr[1] && g:attr[1]==g:attr[2] && g:attr[0]!=g:attr[3] && g:attr[3]==g:attr[4] && g:attr[0]!=g:attr[5] && g:attr[3]!=g:attr[5]
Test 5/1: default conceal char (should be: # This is a Test)
# This is a Test
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
Test 5/2: default conceal char (should be: #+This+is+a+Test)
#+This+is+a+Test
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
Test 6/1: syn and match conceal (should be: #ZThisZisZaZTest)
#ZThisZisZaZTest
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
Test 6/2: syn and match conceal (should be: #*This*is*a*Test)
#*This*is*a*Test
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
Test 7/1: clear matches
# This is a Test
OK: g:attr[0]==g:attr[1] && g:attr[0]==g:attr[2] && g:attr[0]==g:attr[3] && g:attr[0]==g:attr[4] && g:attr[0]==g:attr[5]
{'group': 'Conceal', 'pattern': '\%2l ', 'priority': 10, 'id': 10, 'conceal': 'Z'}
Test 7/2: reset match using setmatches()
#ZThisZisZaZTest
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]
Test 8: using matchaddpos() (should be #Pis a Test
#Pis a Test
OK: g:attr[0]!=g:attr[1] && g:attr[1]!=g:attr[2] && g:attr[0]==g:attr[2] && g:attr[0]==g:attr[3] && g:attr[0]!=g:attr[4] && g:attr[0]!=g:attr[5] && g:attr[4]==g:attr[5]
{'group': 'Conceal', 'id': 11, 'priority': 10, 'pos1': [2, 2, 6], 'conceal': 'P'}
Test 9: match using multibyte conceal char (should be: #ˑThisˑisˑaˑTest)
#ˑThisˑisˑaˑTest
OK: g:attr[0]!=g:attr[1] && g:attr[1]==g:attr[2] && g:attr[1]==g:attr[3] && g:attr[1]==g:attr[4] && g:attr[0]==g:attr[5]]=])
end)
end)