aboutsummaryrefslogtreecommitdiff
path: root/test/functional/legacy/match_conceal_spec.lua
blob: 0ffa3cae7a7434318e05bc249a4cde6915d240cb (plain) (blame)
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)