Test for matchadd() and conceal feature

STARTTEST
:so small.vim
:if !has("conceal") | e! test.ok | w! test.out | qa! | endif
:set term=ansi
:so mbyte.vim
:if &enc !=? 'utf-8'|:e! test.ok|:w! test.out|qa!|endif
: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
: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:+
: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&vim
:
: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()
: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
: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()
:
:"sleep 10
:%w! test.out
:qa!
ENDTEST
dummy text
