1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
|
-- 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)
|