blob: 8511708ace7c48f5faf58196da1f41811ef73d07 [file] [log] [blame]
Bram Moolenaar09de1752016-08-08 22:26:48 +02001" Test for signs
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
4CheckFeature signs
Bram Moolenaar09de1752016-08-08 22:26:48 +02005
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02006source screendump.vim
7
Bram Moolenaar09de1752016-08-08 22:26:48 +02008func Test_sign()
9 new
10 call setline(1, ['a', 'b', 'c', 'd'])
11
Bram Moolenaar446a9732016-08-10 21:36:23 +020012 " Define some signs.
13 " We can specify icons even if not all versions of vim support icons as
14 " icon is ignored when not supported. "(not supported)" is shown after
15 " the icon name when listing signs.
Bram Moolenaar09de1752016-08-08 22:26:48 +020016 sign define Sign1 text=x
Bram Moolenaard933c822019-08-21 13:45:16 +020017
Bram Moolenaare413ea02021-11-24 16:20:13 +000018 call Sign_command_ignore_error('sign define Sign2 text=xy texthl=Title linehl=Error culhl=Search icon=../../pixmaps/stock_vim_find_help.png')
Bram Moolenaar09de1752016-08-08 22:26:48 +020019
20 " Test listing signs.
21 let a=execute('sign list')
Bram Moolenaarb328cca2019-01-06 16:24:01 +010022 call assert_match('^\nsign Sign1 text=x \nsign Sign2 ' .
23 \ 'icon=../../pixmaps/stock_vim_find_help.png .*text=xy ' .
Bram Moolenaare413ea02021-11-24 16:20:13 +000024 \ 'linehl=Error texthl=Title culhl=Search$', a)
Bram Moolenaar09de1752016-08-08 22:26:48 +020025
26 let a=execute('sign list Sign1')
27 call assert_equal("\nsign Sign1 text=x ", a)
28
Bram Moolenaar7d83bf42018-12-29 18:53:55 +010029 " Split the window to the bottom to verify sign jump will stay in the
30 " current window if the buffer is displayed there.
Bram Moolenaar446a9732016-08-10 21:36:23 +020031 let bn = bufnr('%')
32 let wn = winnr()
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +010033 exe 'sign place 41 line=3 name=Sign1 buffer=' . bn
Bram Moolenaar09de1752016-08-08 22:26:48 +020034 1
Bram Moolenaar446a9732016-08-10 21:36:23 +020035 bot split
36 exe 'sign jump 41 buffer=' . bufnr('%')
37 call assert_equal('c', getline('.'))
38 call assert_equal(3, winnr())
39 call assert_equal(bn, bufnr('%'))
40 call assert_notequal(wn, winnr())
41
42 " Create a new buffer and check that ":sign jump" switches to the old buffer.
43 1
44 new foo
45 call assert_notequal(bn, bufnr('%'))
46 exe 'sign jump 41 buffer=' . bn
47 call assert_equal(bn, bufnr('%'))
Bram Moolenaar09de1752016-08-08 22:26:48 +020048 call assert_equal('c', getline('.'))
49
Bram Moolenaar446a9732016-08-10 21:36:23 +020050 " Redraw to make sure that screen redraw with sign gets exercised,
51 " with and without 'rightleft'.
52 if has('rightleft')
53 set rightleft
54 redraw
55 set norightleft
56 endif
57 redraw
Bram Moolenaar09de1752016-08-08 22:26:48 +020058
Bram Moolenaar446a9732016-08-10 21:36:23 +020059 " Check that we can't change sign.
Bram Moolenaar7a2d9892018-12-24 20:23:49 +010060 call assert_fails("sign place 40 name=Sign1 buffer=" . bufnr('%'), 'E885:')
Bram Moolenaar446a9732016-08-10 21:36:23 +020061
62 " Check placed signs
Bram Moolenaar09de1752016-08-08 22:26:48 +020063 let a=execute('sign place')
Bram Moolenaarb328cca2019-01-06 16:24:01 +010064 call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +010065 \ " line=3 id=41 name=Sign1 priority=10\n", a)
Bram Moolenaar09de1752016-08-08 22:26:48 +020066
Bram Moolenaar446a9732016-08-10 21:36:23 +020067 " Unplace the sign and try jumping to it again should fail.
68 sign unplace 41
Bram Moolenaar09de1752016-08-08 22:26:48 +020069 1
Bram Moolenaar7a2d9892018-12-24 20:23:49 +010070 call assert_fails("sign jump 41 buffer=" . bufnr('%'), 'E157:')
Bram Moolenaar09de1752016-08-08 22:26:48 +020071 call assert_equal('a', getline('.'))
72
73 " Unplace sign on current line.
Bram Moolenaar446a9732016-08-10 21:36:23 +020074 exe 'sign place 42 line=4 name=Sign2 buffer=' . bufnr('%')
Bram Moolenaar09de1752016-08-08 22:26:48 +020075 4
76 sign unplace
77 let a=execute('sign place')
78 call assert_equal("\n--- Signs ---\n", a)
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +010079
Bram Moolenaar09de1752016-08-08 22:26:48 +020080 " Try again to unplace sign on current line, it should fail this time.
81 call assert_fails('sign unplace', 'E159:')
82
83 " Unplace all signs.
Bram Moolenaar446a9732016-08-10 21:36:23 +020084 exe 'sign place 41 line=3 name=Sign1 buffer=' . bufnr('%')
Bram Moolenaar09de1752016-08-08 22:26:48 +020085 sign unplace *
86 let a=execute('sign place')
87 call assert_equal("\n--- Signs ---\n", a)
88
Bram Moolenaarb328cca2019-01-06 16:24:01 +010089 " Place a sign without specifying the filename or buffer
90 sign place 77 line=9 name=Sign2
91 let a=execute('sign place')
92 call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +010093 \ " line=9 id=77 name=Sign2 priority=10\n", a)
Bram Moolenaarb328cca2019-01-06 16:24:01 +010094 sign unplace *
95
Bram Moolenaar446a9732016-08-10 21:36:23 +020096 " Check :jump with file=...
97 edit foo
98 call setline(1, ['A', 'B', 'C', 'D'])
99
Bram Moolenaard933c822019-08-21 13:45:16 +0200100 call Sign_command_ignore_error('sign define Sign3 text=y texthl=DoesNotExist linehl=DoesNotExist icon=doesnotexist.xpm')
Bram Moolenaar446a9732016-08-10 21:36:23 +0200101
102 let fn = expand('%:p')
103 exe 'sign place 43 line=2 name=Sign3 file=' . fn
104 edit bar
105 call assert_notequal(fn, expand('%:p'))
106 exe 'sign jump 43 file=' . fn
107 call assert_equal('B', getline('.'))
108
Bram Moolenaara3556522018-12-31 22:02:29 +0100109 " Check for jumping to a sign in a hidden buffer
110 enew! | only!
111 edit foo
112 call setline(1, ['A', 'B', 'C', 'D'])
113 let fn = expand('%:p')
114 exe 'sign place 21 line=3 name=Sign3 file=' . fn
115 hide edit bar
116 exe 'sign jump 21 file=' . fn
117 call assert_equal('C', getline('.'))
118
Bram Moolenaar06b056e2018-12-14 19:37:08 +0100119 " can't define a sign with a non-printable character as text
120 call assert_fails("sign define Sign4 text=\e linehl=Comment", 'E239:')
121 call assert_fails("sign define Sign4 text=a\e linehl=Comment", 'E239:')
122 call assert_fails("sign define Sign4 text=\ea linehl=Comment", 'E239:')
123
124 " Only 1 or 2 character text is allowed
125 call assert_fails("sign define Sign4 text=abc linehl=Comment", 'E239:')
126 call assert_fails("sign define Sign4 text= linehl=Comment", 'E239:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100127 call assert_fails("sign define Sign4 text=\\ ab linehl=Comment", 'E239:')
Bram Moolenaar06b056e2018-12-14 19:37:08 +0100128
Bram Moolenaar0bac5fc2021-12-05 17:45:49 +0000129 " an empty highlight argument for a new sign is an error
130 call assert_fails("sign define SignX linehl=", 'E1249: Group name missing for linehl')
131 call assert_fails("sign define SignX culhl=", 'E1249: Group name missing for culhl')
132 call assert_fails("sign define SignX texthl=", 'E1249: Group name missing for texthl')
133
134 " an empty highlight argument for an existing sign clears it
135 sign define SignY texthl=TextHl culhl=CulHl linehl=LineHl
136 let sl = sign_getdefined('SignY')[0]
137 call assert_equal('TextHl', sl.texthl)
138 call assert_equal('CulHl', sl.culhl)
139 call assert_equal('LineHl', sl.linehl)
140
141 sign define SignY texthl= culhl=CulHl linehl=LineHl
142 let sl = sign_getdefined('SignY')[0]
143 call assert_false(has_key(sl, 'texthl'))
144 call assert_equal('CulHl', sl.culhl)
145 call assert_equal('LineHl', sl.linehl)
146
147 sign define SignY linehl=
148 let sl = sign_getdefined('SignY')[0]
149 call assert_false(has_key(sl, 'linehl'))
150 call assert_equal('CulHl', sl.culhl)
151
152 sign define SignY culhl=
153 let sl = sign_getdefined('SignY')[0]
154 call assert_false(has_key(sl, 'culhl'))
155
156 sign undefine SignY
Bram Moolenaar5e18ccc2021-12-05 13:02:50 +0000157
Bram Moolenaar06b056e2018-12-14 19:37:08 +0100158 " define sign with whitespace
159 sign define Sign4 text=\ X linehl=Comment
160 sign undefine Sign4
161 sign define Sign4 linehl=Comment text=\ X
162 sign undefine Sign4
163
164 sign define Sign5 text=X\ linehl=Comment
165 sign undefine Sign5
166 sign define Sign5 linehl=Comment text=X\
167 sign undefine Sign5
168
169 " define sign with backslash
170 sign define Sign4 text=\\\\ linehl=Comment
171 sign undefine Sign4
172 sign define Sign4 text=\\ linehl=Comment
173 sign undefine Sign4
174
Bram Moolenaara3556522018-12-31 22:02:29 +0100175 " define a sign with a leading 0 in the name
176 sign unplace *
177 sign define 004 text=#> linehl=Comment
178 let a = execute('sign list 4')
179 call assert_equal("\nsign 4 text=#> linehl=Comment", a)
180 exe 'sign place 20 line=3 name=004 buffer=' . bufnr('')
181 let a = execute('sign place')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100182 call assert_equal("\n--- Signs ---\nSigns for foo:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100183 \ " line=3 id=20 name=4 priority=10\n", a)
Bram Moolenaara3556522018-12-31 22:02:29 +0100184 exe 'sign unplace 20 buffer=' . bufnr('')
185 sign undefine 004
186 call assert_fails('sign list 4', 'E155:')
187
Bram Moolenaar09de1752016-08-08 22:26:48 +0200188 " After undefining the sign, we should no longer be able to place it.
189 sign undefine Sign1
190 sign undefine Sign2
Bram Moolenaar446a9732016-08-10 21:36:23 +0200191 sign undefine Sign3
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100192 call assert_fails("sign place 41 line=3 name=Sign1 buffer=" .
193 \ bufnr('%'), 'E155:')
Bram Moolenaar446a9732016-08-10 21:36:23 +0200194endfunc
Bram Moolenaar09de1752016-08-08 22:26:48 +0200195
Bram Moolenaar446a9732016-08-10 21:36:23 +0200196" Undefining placed sign is not recommended.
197" Quoting :help sign
198"
199" :sign undefine {name}
200" Deletes a previously defined sign. If signs with this {name}
201" are still placed this will cause trouble.
202func Test_sign_undefine_still_placed()
203 new foobar
204 sign define Sign text=x
205 exe 'sign place 41 line=1 name=Sign buffer=' . bufnr('%')
206 sign undefine Sign
207
208 " Listing placed sign should show that sign is deleted.
209 let a=execute('sign place')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100210 call assert_equal("\n--- Signs ---\nSigns for foobar:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100211 \ " line=1 id=41 name=[Deleted] priority=10\n", a)
Bram Moolenaar446a9732016-08-10 21:36:23 +0200212
213 sign unplace 41
214 let a=execute('sign place')
215 call assert_equal("\n--- Signs ---\n", a)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200216endfunc
217
218func Test_sign_completion()
219 sign define Sign1 text=x
220 sign define Sign2 text=y
221
222 call feedkeys(":sign \<C-A>\<C-B>\"\<CR>", 'tx')
223 call assert_equal('"sign define jump list place undefine unplace', @:)
224
225 call feedkeys(":sign define Sign \<C-A>\<C-B>\"\<CR>", 'tx')
226 call assert_equal('"sign define Sign icon= linehl= text= texthl=', @:)
227
228 call feedkeys(":sign define Sign linehl=Spell\<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100229 call assert_equal('"sign define Sign linehl=SpellBad SpellCap ' .
230 \ 'SpellLocal SpellRare', @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200231
Bram Moolenaar3678f652019-02-17 14:50:25 +0100232 call feedkeys(":sign define Sign texthl=Spell\<C-A>\<C-B>\"\<CR>", 'tx')
233 call assert_equal('"sign define Sign texthl=SpellBad SpellCap ' .
234 \ 'SpellLocal SpellRare', @:)
235
236 call writefile(repeat(["Sun is shining"], 30), "XsignOne")
237 call writefile(repeat(["Sky is blue"], 30), "XsignTwo")
Bram Moolenaar64cefed2016-08-29 23:06:28 +0200238 call feedkeys(":sign define Sign icon=Xsig\<C-A>\<C-B>\"\<CR>", 'tx')
239 call assert_equal('"sign define Sign icon=XsignOne XsignTwo', @:)
Bram Moolenaar446a9732016-08-10 21:36:23 +0200240
Bram Moolenaar3678f652019-02-17 14:50:25 +0100241 " Test for completion of arguments to ':sign undefine'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200242 call feedkeys(":sign undefine \<C-A>\<C-B>\"\<CR>", 'tx')
243 call assert_equal('"sign undefine Sign1 Sign2', @:)
244
245 call feedkeys(":sign place 1 \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100246 call assert_equal('"sign place 1 buffer= file= group= line= name= priority=',
247 \ @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200248
249 call feedkeys(":sign place 1 name=\<C-A>\<C-B>\"\<CR>", 'tx')
250 call assert_equal('"sign place 1 name=Sign1 Sign2', @:)
251
Bram Moolenaar3678f652019-02-17 14:50:25 +0100252 edit XsignOne
253 sign place 1 name=Sign1 line=5
254 sign place 1 name=Sign1 group=g1 line=10
255 edit XsignTwo
256 sign place 1 name=Sign2 group=g2 line=15
257
258 " Test for completion of group= and file= arguments to ':sign place'
259 call feedkeys(":sign place 1 name=Sign1 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
260 call assert_equal('"sign place 1 name=Sign1 file=XsignOne XsignTwo', @:)
261 call feedkeys(":sign place 1 name=Sign1 group=\<C-A>\<C-B>\"\<CR>", 'tx')
262 call assert_equal('"sign place 1 name=Sign1 group=g1 g2', @:)
263
264 " Test for completion of arguments to 'sign place' without sign identifier
265 call feedkeys(":sign place \<C-A>\<C-B>\"\<CR>", 'tx')
266 call assert_equal('"sign place buffer= file= group=', @:)
267 call feedkeys(":sign place file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
268 call assert_equal('"sign place file=XsignOne XsignTwo', @:)
269 call feedkeys(":sign place group=\<C-A>\<C-B>\"\<CR>", 'tx')
270 call assert_equal('"sign place group=g1 g2', @:)
271 call feedkeys(":sign place group=g1 file=\<C-A>\<C-B>\"\<CR>", 'tx')
272 call assert_equal('"sign place group=g1 file=XsignOne XsignTwo', @:)
273
274 " Test for completion of arguments to ':sign unplace'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200275 call feedkeys(":sign unplace 1 \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100276 call assert_equal('"sign unplace 1 buffer= file= group=', @:)
Bram Moolenaar3678f652019-02-17 14:50:25 +0100277 call feedkeys(":sign unplace 1 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
278 call assert_equal('"sign unplace 1 file=XsignOne XsignTwo', @:)
279 call feedkeys(":sign unplace 1 group=\<C-A>\<C-B>\"\<CR>", 'tx')
280 call assert_equal('"sign unplace 1 group=g1 g2', @:)
281 call feedkeys(":sign unplace 1 group=g2 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
282 call assert_equal('"sign unplace 1 group=g2 file=XsignOne XsignTwo', @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200283
Bram Moolenaar3678f652019-02-17 14:50:25 +0100284 " Test for completion of arguments to ':sign list'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200285 call feedkeys(":sign list \<C-A>\<C-B>\"\<CR>", 'tx')
286 call assert_equal('"sign list Sign1 Sign2', @:)
287
Bram Moolenaar3678f652019-02-17 14:50:25 +0100288 " Test for completion of arguments to ':sign jump'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200289 call feedkeys(":sign jump 1 \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100290 call assert_equal('"sign jump 1 buffer= file= group=', @:)
Bram Moolenaar3678f652019-02-17 14:50:25 +0100291 call feedkeys(":sign jump 1 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
292 call assert_equal('"sign jump 1 file=XsignOne XsignTwo', @:)
293 call feedkeys(":sign jump 1 group=\<C-A>\<C-B>\"\<CR>", 'tx')
294 call assert_equal('"sign jump 1 group=g1 g2', @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200295
Bram Moolenaar3678f652019-02-17 14:50:25 +0100296 " Error cases
297 call feedkeys(":sign here\<C-A>\<C-B>\"\<CR>", 'tx')
298 call assert_equal('"sign here', @:)
299 call feedkeys(":sign define Sign here=\<C-A>\<C-B>\"\<CR>", 'tx')
300 call assert_equal("\"sign define Sign here=\<C-A>", @:)
301 call feedkeys(":sign place 1 here=\<C-A>\<C-B>\"\<CR>", 'tx')
302 call assert_equal("\"sign place 1 here=\<C-A>", @:)
303 call feedkeys(":sign jump 1 here=\<C-A>\<C-B>\"\<CR>", 'tx')
304 call assert_equal("\"sign jump 1 here=\<C-A>", @:)
305 call feedkeys(":sign here there\<C-A>\<C-B>\"\<CR>", 'tx')
306 call assert_equal("\"sign here there\<C-A>", @:)
307 call feedkeys(":sign here there=\<C-A>\<C-B>\"\<CR>", 'tx')
308 call assert_equal("\"sign here there=\<C-A>", @:)
309
310 sign unplace * group=*
Bram Moolenaar09de1752016-08-08 22:26:48 +0200311 sign undefine Sign1
312 sign undefine Sign2
Bram Moolenaar3678f652019-02-17 14:50:25 +0100313 enew
314 call delete('XsignOne')
315 call delete('XsignTwo')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200316endfunc
317
318func Test_sign_invalid_commands()
Bram Moolenaar162b7142018-12-21 15:17:36 +0100319 sign define Sign1 text=x
320
Bram Moolenaar09de1752016-08-08 22:26:48 +0200321 call assert_fails('sign', 'E471:')
Bram Moolenaar446a9732016-08-10 21:36:23 +0200322 call assert_fails('sign jump', 'E471:')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200323 call assert_fails('sign xxx', 'E160:')
324 call assert_fails('sign define', 'E156:')
Bram Moolenaar446a9732016-08-10 21:36:23 +0200325 call assert_fails('sign define Sign1 xxx', 'E475:')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200326 call assert_fails('sign undefine', 'E156:')
327 call assert_fails('sign list xxx', 'E155:')
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200328 call assert_fails('sign place 1 buffer=999', 'E158:')
Bram Moolenaara3556522018-12-31 22:02:29 +0100329 call assert_fails('sign place 1 name=Sign1 buffer=999', 'E158:')
330 call assert_fails('sign place buffer=999', 'E158:')
331 call assert_fails('sign jump buffer=999', 'E158:')
332 call assert_fails('sign jump 1 file=', 'E158:')
333 call assert_fails('sign jump 1 group=', 'E474:')
334 call assert_fails('sign jump 1 name=', 'E474:')
335 call assert_fails('sign jump 1 name=Sign1', 'E474:')
336 call assert_fails('sign jump 1 line=100', '474:')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200337 call assert_fails('sign define Sign2 text=', 'E239:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100338 " Non-numeric identifier for :sign place
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100339 call assert_fails("sign place abc line=3 name=Sign1 buffer=" . bufnr(''),
340 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100341 " Non-numeric identifier for :sign unplace
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100342 call assert_fails("sign unplace abc name=Sign1 buffer=" . bufnr(''),
343 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100344 " Number followed by an alphabet as sign identifier for :sign place
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100345 call assert_fails("sign place 1abc line=3 name=Sign1 buffer=" . bufnr(''),
346 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100347 " Number followed by an alphabet as sign identifier for :sign unplace
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100348 call assert_fails("sign unplace 2abc name=Sign1 buffer=" . bufnr(''),
349 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100350 " Sign identifier and '*' for :sign unplace
351 call assert_fails("sign unplace 2 *", 'E474:')
352 " Trailing characters after buffer number for :sign place
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100353 call assert_fails("sign place 1 line=3 name=Sign1 buffer=" .
354 \ bufnr('%') . 'xxx', 'E488:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100355 " Trailing characters after buffer number for :sign unplace
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100356 call assert_fails("sign unplace 1 buffer=" . bufnr('%') . 'xxx', 'E488:')
357 call assert_fails("sign unplace * buffer=" . bufnr('%') . 'xxx', 'E488:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100358 call assert_fails("sign unplace 1 xxx", 'E474:')
359 call assert_fails("sign unplace * xxx", 'E474:')
360 call assert_fails("sign unplace xxx", 'E474:')
361 " Placing a sign without line number
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100362 call assert_fails("sign place name=Sign1 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100363 " Placing a sign without sign name
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100364 call assert_fails("sign place line=10 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100365 " Unplacing a sign with line number
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100366 call assert_fails("sign unplace 2 line=10 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100367 " Unplacing a sign with sign name
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100368 call assert_fails("sign unplace 2 name=Sign1 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100369 " Placing a sign without sign name
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100370 call assert_fails("sign place 2 line=3 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100371 " Placing a sign with only sign identifier
372 call assert_fails("sign place 2", 'E474:')
373 " Placing a sign with only a name
374 call assert_fails("sign place abc", 'E474:')
375 " Placing a sign with only line number
376 call assert_fails("sign place 5 line=3", 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100377 " Placing a sign with only sign group
378 call assert_fails("sign place 5 group=g1", 'E474:')
379 call assert_fails("sign place 5 group=*", 'E474:')
380 " Placing a sign with only sign priority
381 call assert_fails("sign place 5 priority=10", 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100382
383 sign undefine Sign1
Bram Moolenaar09de1752016-08-08 22:26:48 +0200384endfunc
Bram Moolenaarbfd096d2016-08-17 22:29:09 +0200385
386func Test_sign_delete_buffer()
387 new
388 sign define Sign text=x
389 let bufnr = bufnr('%')
390 new
391 exe 'bd ' . bufnr
392 exe 'sign place 61 line=3 name=Sign buffer=' . bufnr
393 call assert_fails('sign jump 61 buffer=' . bufnr, 'E934:')
394 sign unplace 61
395 sign undefine Sign
396endfunc
Bram Moolenaar162b7142018-12-21 15:17:36 +0100397
Bram Moolenaard933c822019-08-21 13:45:16 +0200398" Ignore error: E255: Couldn't read in sign data!
399" This error can happen when running in the GUI.
400" Some gui like Motif do not support the png icon format.
401func Sign_command_ignore_error(cmd)
402 try
403 exe a:cmd
404 catch /E255:/
405 endtry
406endfunc
407
408" ignore error: E255: Couldn't read in sign data!
409" This error can happen when running in gui.
410func Sign_define_ignore_error(name, attr)
411 try
412 call sign_define(a:name, a:attr)
413 catch /E255:/
414 endtry
415endfunc
416
Bram Moolenaar6436cd82018-12-27 00:28:33 +0100417" Test for Vim script functions for managing signs
Bram Moolenaar162b7142018-12-21 15:17:36 +0100418func Test_sign_funcs()
419 " Remove all the signs
420 call sign_unplace('*')
421 call sign_undefine()
422
423 " Tests for sign_define()
Bram Moolenaare413ea02021-11-24 16:20:13 +0000424 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error',
425 \ 'culhl': 'Visual'}
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200426 call assert_equal(0, "sign1"->sign_define(attr))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100427 call assert_equal([{'name' : 'sign1', 'texthl' : 'Error',
Bram Moolenaare413ea02021-11-24 16:20:13 +0000428 \ 'linehl' : 'Search', 'culhl' : 'Visual', 'text' : '=>'}],
429 \ sign_getdefined())
Bram Moolenaar162b7142018-12-21 15:17:36 +0100430
431 " Define a new sign without attributes and then update it
432 call sign_define("sign2")
433 let attr = {'text' : '!!', 'linehl' : 'DiffAdd', 'texthl' : 'DiffChange',
Bram Moolenaare413ea02021-11-24 16:20:13 +0000434 \ 'culhl': 'DiffDelete', 'icon' : 'sign2.ico'}
Bram Moolenaard933c822019-08-21 13:45:16 +0200435 call Sign_define_ignore_error("sign2", attr)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100436 call assert_equal([{'name' : 'sign2', 'texthl' : 'DiffChange',
Bram Moolenaare413ea02021-11-24 16:20:13 +0000437 \ 'linehl' : 'DiffAdd', 'culhl' : 'DiffDelete', 'text' : '!!',
438 \ 'icon' : 'sign2.ico'}], "sign2"->sign_getdefined())
Bram Moolenaar162b7142018-12-21 15:17:36 +0100439
440 " Test for a sign name with digits
441 call assert_equal(0, sign_define(0002, {'linehl' : 'StatusLine'}))
442 call assert_equal([{'name' : '2', 'linehl' : 'StatusLine'}],
443 \ sign_getdefined(0002))
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200444 eval 0002->sign_undefine()
Bram Moolenaar162b7142018-12-21 15:17:36 +0100445
446 " Tests for invalid arguments to sign_define()
447 call assert_fails('call sign_define("sign4", {"text" : "===>"})', 'E239:')
448 call assert_fails('call sign_define("sign5", {"text" : ""})', 'E239:')
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200449 call assert_fails('call sign_define({})', 'E731:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100450 call assert_fails('call sign_define("sign6", [])', 'E715:')
451
452 " Tests for sign_getdefined()
453 call assert_equal([], sign_getdefined("none"))
454 call assert_fails('call sign_getdefined({})', 'E731:')
455
456 " Tests for sign_place()
457 call writefile(repeat(["Sun is shining"], 30), "Xsign")
458 edit Xsign
459
460 call assert_equal(10, sign_place(10, '', 'sign1', 'Xsign',
461 \ {'lnum' : 20}))
462 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
463 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
464 \ 'priority' : 10}]}], sign_getplaced('Xsign'))
465 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
466 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
467 \ 'priority' : 10}]}],
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200468 \ '%'->sign_getplaced({'lnum' : 20}))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100469 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
470 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
471 \ 'priority' : 10}]}],
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100472 \ sign_getplaced('', {'id' : 10}))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100473
474 " Tests for invalid arguments to sign_place()
475 call assert_fails('call sign_place([], "", "mySign", 1)', 'E745:')
476 call assert_fails('call sign_place(5, "", "mySign", -1)', 'E158:')
477 call assert_fails('call sign_place(-1, "", "sign1", "Xsign", [])',
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200478 \ 'E715:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100479 call assert_fails('call sign_place(-1, "", "sign1", "Xsign",
480 \ {"lnum" : 30})', 'E474:')
481 call assert_fails('call sign_place(10, "", "xsign1x", "Xsign",
482 \ {"lnum" : 30})', 'E155:')
483 call assert_fails('call sign_place(10, "", "", "Xsign",
484 \ {"lnum" : 30})', 'E155:')
485 call assert_fails('call sign_place(10, "", [], "Xsign",
486 \ {"lnum" : 30})', 'E730:')
487 call assert_fails('call sign_place(5, "", "sign1", "abcxyz.xxx",
488 \ {"lnum" : 10})', 'E158:')
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100489 call assert_fails('call sign_place(5, "", "sign1", "@", {"lnum" : 10})',
Bram Moolenaar162b7142018-12-21 15:17:36 +0100490 \ 'E158:')
491 call assert_fails('call sign_place(5, "", "sign1", [], {"lnum" : 10})',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200492 \ 'E730:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100493 call assert_fails('call sign_place(21, "", "sign1", "Xsign",
Bram Moolenaar42aff462019-08-21 13:20:29 +0200494 \ {"lnum" : -1})', 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100495 call assert_fails('call sign_place(22, "", "sign1", "Xsign",
Bram Moolenaar42aff462019-08-21 13:20:29 +0200496 \ {"lnum" : 0})', 'E474:')
Bram Moolenaar1ea88a32018-12-29 21:00:27 +0100497 call assert_fails('call sign_place(22, "", "sign1", "Xsign",
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200498 \ {"lnum" : []})', 'E745:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100499 call assert_equal(-1, sign_place(1, "*", "sign1", "Xsign", {"lnum" : 10}))
500
501 " Tests for sign_getplaced()
502 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
503 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
504 \ 'priority' : 10}]}],
505 \ sign_getplaced(bufnr('Xsign')))
506 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
507 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
508 \ 'priority' : 10}]}],
509 \ sign_getplaced())
510 call assert_fails("call sign_getplaced('dummy.sign')", 'E158:')
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100511 call assert_fails('call sign_getplaced("&")', 'E158:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100512 call assert_fails('call sign_getplaced(-1)', 'E158:')
513 call assert_fails('call sign_getplaced("Xsign", [])', 'E715:')
514 call assert_equal([{'bufnr' : bufnr(''), 'signs' : []}],
515 \ sign_getplaced('Xsign', {'lnum' : 1000000}))
516 call assert_fails("call sign_getplaced('Xsign', {'lnum' : []})",
517 \ 'E745:')
518 call assert_equal([{'bufnr' : bufnr(''), 'signs' : []}],
519 \ sign_getplaced('Xsign', {'id' : 44}))
520 call assert_fails("call sign_getplaced('Xsign', {'id' : []})",
521 \ 'E745:')
522
523 " Tests for sign_unplace()
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200524 eval 20->sign_place('', 'sign2', 'Xsign', {"lnum" : 30})
Bram Moolenaar162b7142018-12-21 15:17:36 +0100525 call assert_equal(0, sign_unplace('',
526 \ {'id' : 20, 'buffer' : 'Xsign'}))
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200527 call assert_equal(-1, ''->sign_unplace(
Bram Moolenaar162b7142018-12-21 15:17:36 +0100528 \ {'id' : 30, 'buffer' : 'Xsign'}))
529 call sign_place(20, '', 'sign2', 'Xsign', {"lnum" : 30})
530 call assert_fails("call sign_unplace('',
531 \ {'id' : 20, 'buffer' : 'buffer.c'})", 'E158:')
532 call assert_fails("call sign_unplace('',
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100533 \ {'id' : 20, 'buffer' : '&'})", 'E158:')
Bram Moolenaar1ea88a32018-12-29 21:00:27 +0100534 call assert_fails("call sign_unplace('g1',
Bram Moolenaar162b7142018-12-21 15:17:36 +0100535 \ {'id' : 20, 'buffer' : 200})", 'E158:')
Bram Moolenaar1ea88a32018-12-29 21:00:27 +0100536 call assert_fails("call sign_unplace('g1', 'mySign')", 'E715:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100537
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200538 call sign_unplace('*')
539
540 " Test for modifying a placed sign
541 call assert_equal(15, sign_place(15, '', 'sign1', 'Xsign', {'lnum' : 20}))
542 call assert_equal(15, sign_place(15, '', 'sign2', 'Xsign'))
543 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
544 \ [{'id' : 15, 'group' : '', 'lnum' : 20, 'name' : 'sign2',
545 \ 'priority' : 10}]}],
546 \ sign_getplaced())
547
Bram Moolenaar162b7142018-12-21 15:17:36 +0100548 " Tests for sign_undefine()
549 call assert_equal(0, sign_undefine("sign1"))
550 call assert_equal([], sign_getdefined("sign1"))
551 call assert_fails('call sign_undefine("none")', 'E155:')
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200552 call assert_fails('call sign_undefine({})', 'E731:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100553
Bram Moolenaar42aff462019-08-21 13:20:29 +0200554 " Test for using '.' as the line number for sign_place()
Bram Moolenaard933c822019-08-21 13:45:16 +0200555 call Sign_define_ignore_error("sign1", attr)
Bram Moolenaar42aff462019-08-21 13:20:29 +0200556 call cursor(22, 1)
557 call assert_equal(15, sign_place(15, '', 'sign1', 'Xsign',
558 \ {'lnum' : '.'}))
559 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
560 \ [{'id' : 15, 'group' : '', 'lnum' : 22, 'name' : 'sign1',
561 \ 'priority' : 10}]}],
562 \ sign_getplaced('%', {'lnum' : 22}))
563
Bram Moolenaar162b7142018-12-21 15:17:36 +0100564 call delete("Xsign")
565 call sign_unplace('*')
566 call sign_undefine()
567 enew | only
568endfunc
569
570" Tests for sign groups
571func Test_sign_group()
572 enew | only
573 " Remove all the signs
574 call sign_unplace('*')
575 call sign_undefine()
576
577 call writefile(repeat(["Sun is shining"], 30), "Xsign")
578
579 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
580 call assert_equal(0, sign_define("sign1", attr))
581
582 edit Xsign
583 let bnum = bufnr('%')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100584
585 " Error case
586 call assert_fails("call sign_place(5, [], 'sign1', 'Xsign',
587 \ {'lnum' : 30})", 'E730:')
588
589 " place three signs with the same identifier. One in the global group and
590 " others in the named groups
591 call assert_equal(5, sign_place(5, '', 'sign1', 'Xsign',
592 \ {'lnum' : 10}))
593 call assert_equal(5, sign_place(5, 'g1', 'sign1', bnum, {'lnum' : 20}))
594 call assert_equal(5, sign_place(5, 'g2', 'sign1', bnum, {'lnum' : 30}))
595
596 " Test for sign_getplaced() with group
597 let s = sign_getplaced('Xsign')
598 call assert_equal(1, len(s[0].signs))
599 call assert_equal(s[0].signs[0].group, '')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100600 let s = sign_getplaced(bnum, {'group' : ''})
601 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
602 \ 'priority' : 10}], s[0].signs)
603 call assert_equal(1, len(s[0].signs))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100604 let s = sign_getplaced(bnum, {'group' : 'g2'})
605 call assert_equal('g2', s[0].signs[0].group)
606 let s = sign_getplaced(bnum, {'group' : 'g3'})
607 call assert_equal([], s[0].signs)
608 let s = sign_getplaced(bnum, {'group' : '*'})
609 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
610 \ 'priority' : 10},
611 \ {'id' : 5, 'group' : 'g1', 'name' : 'sign1', 'lnum' : 20,
612 \ 'priority' : 10},
613 \ {'id' : 5, 'group' : 'g2', 'name' : 'sign1', 'lnum' : 30,
614 \ 'priority' : 10}],
615 \ s[0].signs)
616
617 " Test for sign_getplaced() with id
618 let s = sign_getplaced(bnum, {'id' : 5})
619 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
620 \ 'priority' : 10}],
621 \ s[0].signs)
622 let s = sign_getplaced(bnum, {'id' : 5, 'group' : 'g2'})
623 call assert_equal(
624 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
625 \ 'priority' : 10}],
626 \ s[0].signs)
627 let s = sign_getplaced(bnum, {'id' : 5, 'group' : '*'})
628 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
629 \ 'priority' : 10},
630 \ {'id' : 5, 'group' : 'g1', 'name' : 'sign1', 'lnum' : 20,
631 \ 'priority' : 10},
632 \ {'id' : 5, 'group' : 'g2', 'name' : 'sign1', 'lnum' : 30,
633 \ 'priority' : 10}],
634 \ s[0].signs)
635 let s = sign_getplaced(bnum, {'id' : 5, 'group' : 'g3'})
636 call assert_equal([], s[0].signs)
637
638 " Test for sign_getplaced() with lnum
639 let s = sign_getplaced(bnum, {'lnum' : 20})
640 call assert_equal([], s[0].signs)
641 let s = sign_getplaced(bnum, {'lnum' : 20, 'group' : 'g1'})
642 call assert_equal(
643 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : 'g1',
644 \ 'priority' : 10}],
645 \ s[0].signs)
646 let s = sign_getplaced(bnum, {'lnum' : 30, 'group' : '*'})
647 call assert_equal(
648 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
649 \ 'priority' : 10}],
650 \ s[0].signs)
651 let s = sign_getplaced(bnum, {'lnum' : 40, 'group' : '*'})
652 call assert_equal([], s[0].signs)
653
654 " Error case
655 call assert_fails("call sign_getplaced(bnum, {'group' : []})",
656 \ 'E730:')
657
658 " Clear the sign in global group
659 call sign_unplace('', {'id' : 5, 'buffer' : bnum})
660 let s = sign_getplaced(bnum, {'group' : '*'})
661 call assert_equal([
662 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : 'g1',
663 \ 'priority' : 10},
664 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
665 \ 'priority' : 10}],
666 \ s[0].signs)
667
668 " Clear the sign in one of the groups
669 call sign_unplace('g1', {'buffer' : 'Xsign'})
670 let s = sign_getplaced(bnum, {'group' : '*'})
671 call assert_equal([
672 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
673 \ 'priority' : 10}],
674 \ s[0].signs)
675
676 " Clear all the signs from the buffer
677 call sign_unplace('*', {'buffer' : bnum})
678 call assert_equal([], sign_getplaced(bnum, {'group' : '*'})[0].signs)
679
680 " Clear sign across groups using an identifier
681 call sign_place(25, '', 'sign1', bnum, {'lnum' : 10})
682 call sign_place(25, 'g1', 'sign1', bnum, {'lnum' : 11})
683 call sign_place(25, 'g2', 'sign1', bnum, {'lnum' : 12})
684 call assert_equal(0, sign_unplace('*', {'id' : 25}))
685 call assert_equal([], sign_getplaced(bnum, {'group' : '*'})[0].signs)
686
687 " Error case
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200688 call assert_fails("call sign_unplace({})", 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100689
690 " Place a sign in the global group and try to delete it using a group
691 call assert_equal(5, sign_place(5, '', 'sign1', bnum, {'lnum' : 10}))
692 call assert_equal(-1, sign_unplace('g1', {'id' : 5}))
693
694 " Place signs in multiple groups and delete all the signs in one of the
695 " group
696 call assert_equal(5, sign_place(5, '', 'sign1', bnum, {'lnum' : 10}))
697 call assert_equal(6, sign_place(6, '', 'sign1', bnum, {'lnum' : 11}))
698 call assert_equal(5, sign_place(5, 'g1', 'sign1', bnum, {'lnum' : 10}))
699 call assert_equal(5, sign_place(5, 'g2', 'sign1', bnum, {'lnum' : 10}))
700 call assert_equal(6, sign_place(6, 'g1', 'sign1', bnum, {'lnum' : 11}))
701 call assert_equal(6, sign_place(6, 'g2', 'sign1', bnum, {'lnum' : 11}))
702 call assert_equal(0, sign_unplace('g1'))
703 let s = sign_getplaced(bnum, {'group' : 'g1'})
704 call assert_equal([], s[0].signs)
705 let s = sign_getplaced(bnum)
706 call assert_equal(2, len(s[0].signs))
707 let s = sign_getplaced(bnum, {'group' : 'g2'})
708 call assert_equal('g2', s[0].signs[0].group)
709 call assert_equal(0, sign_unplace('', {'id' : 5}))
710 call assert_equal(0, sign_unplace('', {'id' : 6}))
711 let s = sign_getplaced(bnum, {'group' : 'g2'})
712 call assert_equal('g2', s[0].signs[0].group)
713 call assert_equal(0, sign_unplace('', {'buffer' : bnum}))
714
715 call sign_unplace('*')
716
717 " Test for :sign command and groups
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100718 sign place 5 line=10 name=sign1 file=Xsign
719 sign place 5 group=g1 line=10 name=sign1 file=Xsign
720 sign place 5 group=g2 line=10 name=sign1 file=Xsign
Bram Moolenaar162b7142018-12-21 15:17:36 +0100721
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100722 " Tests for the ':sign place' command
723
724 " :sign place file={fname}
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100725 let a = execute('sign place file=Xsign')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100726 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100727 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100728
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100729 " :sign place group={group} file={fname}
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100730 let a = execute('sign place group=g2 file=Xsign')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100731 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100732 \ " line=10 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100733
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100734 " :sign place group=* file={fname}
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100735 let a = execute('sign place group=* file=Xsign')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100736 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100737 \ " line=10 id=5 group=g2 name=sign1 priority=10\n" .
738 \ " line=10 id=5 group=g1 name=sign1 priority=10\n" .
739 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100740
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100741 " Error case: non-existing group
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100742 let a = execute('sign place group=xyz file=Xsign')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100743 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
744
745 call sign_unplace('*')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100746 let bnum = bufnr('Xsign')
747 exe 'sign place 5 line=10 name=sign1 buffer=' . bnum
748 exe 'sign place 5 group=g1 line=11 name=sign1 buffer=' . bnum
749 exe 'sign place 5 group=g2 line=12 name=sign1 buffer=' . bnum
750
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100751 " :sign place buffer={fname}
Bram Moolenaar162b7142018-12-21 15:17:36 +0100752 let a = execute('sign place buffer=' . bnum)
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100753 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100754 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100755
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100756 " :sign place group={group} buffer={fname}
Bram Moolenaar162b7142018-12-21 15:17:36 +0100757 let a = execute('sign place group=g2 buffer=' . bnum)
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100758 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100759 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100760
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100761 " :sign place group=* buffer={fname}
Bram Moolenaar162b7142018-12-21 15:17:36 +0100762 let a = execute('sign place group=* buffer=' . bnum)
763 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100764 \ " line=10 id=5 name=sign1 priority=10\n" .
765 \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
766 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100767
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100768 " Error case: non-existing group
Bram Moolenaar162b7142018-12-21 15:17:36 +0100769 let a = execute('sign place group=xyz buffer=' . bnum)
770 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
771
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100772 " :sign place
773 let a = execute('sign place')
774 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100775 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100776
Bram Moolenaarb589f952019-01-07 22:10:00 +0100777 " Place signs in more than one buffer and list the signs
778 split foo
779 set buftype=nofile
780 sign place 25 line=76 name=sign1 priority=99 file=foo
781 let a = execute('sign place')
782 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
783 \ " line=10 id=5 name=sign1 priority=10\n" .
784 \ "Signs for foo:\n" .
785 \ " line=76 id=25 name=sign1 priority=99\n", a)
786 close
787 bwipe foo
788
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100789 " :sign place group={group}
790 let a = execute('sign place group=g1')
791 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100792 \ " line=11 id=5 group=g1 name=sign1 priority=10\n", a)
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100793
794 " :sign place group=*
Bram Moolenaar162b7142018-12-21 15:17:36 +0100795 let a = execute('sign place group=*')
796 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100797 \ " line=10 id=5 name=sign1 priority=10\n" .
798 \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
799 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100800
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100801 " Test for ':sign jump' command with groups
802 sign jump 5 group=g1 file=Xsign
803 call assert_equal(11, line('.'))
804 call assert_equal('Xsign', bufname(''))
805 sign jump 5 group=g2 file=Xsign
806 call assert_equal(12, line('.'))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100807
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100808 " Test for :sign jump command without the filename or buffer
809 sign jump 5
810 call assert_equal(10, line('.'))
811 sign jump 5 group=g1
812 call assert_equal(11, line('.'))
813
Bram Moolenaar162b7142018-12-21 15:17:36 +0100814 " Error cases
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100815 call assert_fails("sign place 3 group= name=sign1 buffer=" . bnum, 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100816
817 call delete("Xsign")
818 call sign_unplace('*')
819 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +0100820 enew | only
Bram Moolenaar162b7142018-12-21 15:17:36 +0100821endfunc
822
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100823" Place signs used for ":sign unplace" command test
824func Place_signs_for_test()
825 call sign_unplace('*')
826
827 sign place 3 line=10 name=sign1 file=Xsign1
828 sign place 3 group=g1 line=11 name=sign1 file=Xsign1
829 sign place 3 group=g2 line=12 name=sign1 file=Xsign1
830 sign place 4 line=15 name=sign1 file=Xsign1
831 sign place 4 group=g1 line=16 name=sign1 file=Xsign1
832 sign place 4 group=g2 line=17 name=sign1 file=Xsign1
833 sign place 5 line=20 name=sign1 file=Xsign2
834 sign place 5 group=g1 line=21 name=sign1 file=Xsign2
835 sign place 5 group=g2 line=22 name=sign1 file=Xsign2
836 sign place 6 line=25 name=sign1 file=Xsign2
837 sign place 6 group=g1 line=26 name=sign1 file=Xsign2
838 sign place 6 group=g2 line=27 name=sign1 file=Xsign2
839endfunc
840
841" Place multiple signs in a single line for test
842func Place_signs_at_line_for_test()
843 call sign_unplace('*')
844 sign place 3 line=13 name=sign1 file=Xsign1
845 sign place 3 group=g1 line=13 name=sign1 file=Xsign1
846 sign place 3 group=g2 line=13 name=sign1 file=Xsign1
847 sign place 4 line=13 name=sign1 file=Xsign1
848 sign place 4 group=g1 line=13 name=sign1 file=Xsign1
849 sign place 4 group=g2 line=13 name=sign1 file=Xsign1
850endfunc
851
852" Tests for the ':sign unplace' command
853func Test_sign_unplace()
854 enew | only
855 " Remove all the signs
856 call sign_unplace('*')
857 call sign_undefine()
858
859 " Create two files and define signs
860 call writefile(repeat(["Sun is shining"], 30), "Xsign1")
861 call writefile(repeat(["It is beautiful"], 30), "Xsign2")
862
863 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
864 call sign_define("sign1", attr)
865
866 edit Xsign1
867 let bnum1 = bufnr('%')
868 split Xsign2
869 let bnum2 = bufnr('%')
870
871 let signs1 = [{'id' : 3, 'name' : 'sign1', 'lnum' : 10, 'group' : '',
872 \ 'priority' : 10},
873 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 11, 'group' : 'g1',
874 \ 'priority' : 10},
875 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 12, 'group' : 'g2',
876 \ 'priority' : 10},
877 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 15, 'group' : '',
878 \ 'priority' : 10},
879 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 16, 'group' : 'g1',
880 \ 'priority' : 10},
881 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 17, 'group' : 'g2',
882 \ 'priority' : 10},]
883 let signs2 = [{'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : '',
884 \ 'priority' : 10},
885 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 21, 'group' : 'g1',
886 \ 'priority' : 10},
887 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 22, 'group' : 'g2',
888 \ 'priority' : 10},
889 \ {'id' : 6, 'name' : 'sign1', 'lnum' : 25, 'group' : '',
890 \ 'priority' : 10},
891 \ {'id' : 6, 'name' : 'sign1', 'lnum' : 26, 'group' : 'g1',
892 \ 'priority' : 10},
893 \ {'id' : 6, 'name' : 'sign1', 'lnum' : 27, 'group' : 'g2',
894 \ 'priority' : 10},]
895
896 " Test for :sign unplace {id} file={fname}
897 call Place_signs_for_test()
898 sign unplace 3 file=Xsign1
899 sign unplace 6 file=Xsign2
900 call assert_equal(
901 \ filter(copy(signs1),
902 \ {idx, val -> val.id != 3 || val.group != ''}),
903 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
904 call assert_equal(
905 \ filter(copy(signs2),
906 \ {idx, val -> val.id != 6 || val.group != ''}),
907 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
908
909 " Test for :sign unplace {id} group={group} file={fname}
910 call Place_signs_for_test()
911 sign unplace 4 group=g1 file=Xsign1
912 sign unplace 5 group=g2 file=Xsign2
913 call assert_equal(
914 \ filter(copy(signs1),
915 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
916 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
917 call assert_equal(
918 \ filter(copy(signs2),
919 \ {idx, val -> val.id != 5 || val.group != 'g2'}),
920 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
921
922 " Test for :sign unplace {id} group=* file={fname}
923 call Place_signs_for_test()
924 sign unplace 3 group=* file=Xsign1
925 sign unplace 6 group=* file=Xsign2
926 call assert_equal(
927 \ filter(copy(signs1),
928 \ {idx, val -> val.id != 3}),
929 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
930 call assert_equal(
931 \ filter(copy(signs2),
932 \ {idx, val -> val.id != 6}),
933 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
934
935 " Test for :sign unplace * file={fname}
936 call Place_signs_for_test()
937 sign unplace * file=Xsign1
938 call assert_equal(
939 \ filter(copy(signs1),
940 \ {idx, val -> val.group != ''}),
941 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
942 call assert_equal(signs2, sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
943
944 " Test for :sign unplace * group={group} file={fname}
945 call Place_signs_for_test()
946 sign unplace * group=g1 file=Xsign1
947 sign unplace * group=g2 file=Xsign2
948 call assert_equal(
949 \ filter(copy(signs1),
950 \ {idx, val -> val.group != 'g1'}),
951 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
952 call assert_equal(
953 \ filter(copy(signs2),
954 \ {idx, val -> val.group != 'g2'}),
955 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
956
957 " Test for :sign unplace * group=* file={fname}
958 call Place_signs_for_test()
959 sign unplace * group=* file=Xsign2
960 call assert_equal(signs1, sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
961 call assert_equal([], sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
962
963 " Test for :sign unplace {id} buffer={nr}
964 call Place_signs_for_test()
965 exe 'sign unplace 3 buffer=' . bnum1
966 exe 'sign unplace 6 buffer=' . bnum2
967 call assert_equal(
968 \ filter(copy(signs1),
969 \ {idx, val -> val.id != 3 || val.group != ''}),
970 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
971 call assert_equal(
972 \ filter(copy(signs2),
973 \ {idx, val -> val.id != 6 || val.group != ''}),
974 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
975
976 " Test for :sign unplace {id} group={group} buffer={nr}
977 call Place_signs_for_test()
978 exe 'sign unplace 4 group=g1 buffer=' . bnum1
979 exe 'sign unplace 5 group=g2 buffer=' . bnum2
980 call assert_equal(
981 \ filter(copy(signs1),
982 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
983 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
984 call assert_equal(
985 \ filter(copy(signs2),
986 \ {idx, val -> val.id != 5 || val.group != 'g2'}),
987 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
988
989 " Test for :sign unplace {id} group=* buffer={nr}
990 call Place_signs_for_test()
991 exe 'sign unplace 3 group=* buffer=' . bnum1
992 exe 'sign unplace 6 group=* buffer=' . bnum2
993 call assert_equal(
994 \ filter(copy(signs1),
995 \ {idx, val -> val.id != 3}),
996 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
997 call assert_equal(
998 \ filter(copy(signs2),
999 \ {idx, val -> val.id != 6}),
1000 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1001
1002 " Test for :sign unplace * buffer={nr}
1003 call Place_signs_for_test()
1004 exe 'sign unplace * buffer=' . bnum1
1005 call assert_equal(
1006 \ filter(copy(signs1),
1007 \ {idx, val -> val.group != ''}),
1008 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
1009 call assert_equal(signs2, sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1010
1011 " Test for :sign unplace * group={group} buffer={nr}
1012 call Place_signs_for_test()
1013 exe 'sign unplace * group=g1 buffer=' . bnum1
1014 exe 'sign unplace * group=g2 buffer=' . bnum2
1015 call assert_equal(
1016 \ filter(copy(signs1),
1017 \ {idx, val -> val.group != 'g1'}),
1018 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
1019 call assert_equal(
1020 \ filter(copy(signs2),
1021 \ {idx, val -> val.group != 'g2'}),
1022 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1023
1024 " Test for :sign unplace * group=* buffer={nr}
1025 call Place_signs_for_test()
1026 exe 'sign unplace * group=* buffer=' . bnum2
1027 call assert_equal(signs1, sign_getplaced(bnum1, {'group' : '*'})[0].signs)
1028 call assert_equal([], sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1029
1030 " Test for :sign unplace {id}
1031 call Place_signs_for_test()
1032 sign unplace 4
1033 sign unplace 6
1034 call assert_equal(
1035 \ filter(copy(signs1),
1036 \ {idx, val -> val.id != 4 || val.group != ''}),
1037 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1038 call assert_equal(
1039 \ filter(copy(signs2),
1040 \ {idx, val -> val.id != 6 || val.group != ''}),
1041 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1042
1043 " Test for :sign unplace {id} group={group}
1044 call Place_signs_for_test()
1045 sign unplace 4 group=g1
1046 sign unplace 6 group=g2
1047 call assert_equal(
1048 \ filter(copy(signs1),
1049 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
1050 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1051 call assert_equal(
1052 \ filter(copy(signs2),
1053 \ {idx, val -> val.id != 6 || val.group != 'g2'}),
1054 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1055
1056 " Test for :sign unplace {id} group=*
1057 call Place_signs_for_test()
1058 sign unplace 3 group=*
1059 sign unplace 5 group=*
1060 call assert_equal(
1061 \ filter(copy(signs1),
1062 \ {idx, val -> val.id != 3}),
1063 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1064 call assert_equal(
1065 \ filter(copy(signs2),
1066 \ {idx, val -> val.id != 5}),
1067 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1068
1069 " Test for :sign unplace *
1070 call Place_signs_for_test()
1071 sign unplace *
1072 call assert_equal(
1073 \ filter(copy(signs1),
1074 \ {idx, val -> val.group != ''}),
1075 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1076 call assert_equal(
1077 \ filter(copy(signs2),
1078 \ {idx, val -> val.group != ''}),
1079 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1080
1081 " Test for :sign unplace * group={group}
1082 call Place_signs_for_test()
1083 sign unplace * group=g1
1084 call assert_equal(
1085 \ filter(copy(signs1),
1086 \ {idx, val -> val.group != 'g1'}),
1087 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1088 call assert_equal(
1089 \ filter(copy(signs2),
1090 \ {idx, val -> val.group != 'g1'}),
1091 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1092
1093 " Test for :sign unplace * group=*
1094 call Place_signs_for_test()
1095 sign unplace * group=*
1096 call assert_equal([], sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1097 call assert_equal([], sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1098
1099 " Negative test cases
1100 call Place_signs_for_test()
1101 sign unplace 3 group=xy file=Xsign1
1102 sign unplace * group=xy file=Xsign1
1103 silent! sign unplace * group=* file=FileNotPresent
1104 call assert_equal(signs1, sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1105 call assert_equal(signs2, sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1106
1107 " Tests for removing sign at the current cursor position
1108
1109 " Test for ':sign unplace'
1110 let signs1 = [{'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g2',
1111 \ 'priority' : 10},
1112 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g1',
1113 \ 'priority' : 10},
1114 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : '',
1115 \ 'priority' : 10},
1116 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g2',
1117 \ 'priority' : 10},
1118 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g1',
1119 \ 'priority' : 10},
1120 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : '',
1121 \ 'priority' : 10},]
1122 exe bufwinnr('Xsign1') . 'wincmd w'
1123 call cursor(13, 1)
1124
1125 " Should remove only one sign in the global group
1126 call Place_signs_at_line_for_test()
1127 sign unplace
1128 call assert_equal(
1129 \ filter(copy(signs1),
1130 \ {idx, val -> val.id != 4 || val.group != ''}),
1131 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1132 " Should remove the second sign in the global group
1133 sign unplace
1134 call assert_equal(
1135 \ filter(copy(signs1),
1136 \ {idx, val -> val.group != ''}),
1137 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1138
1139 " Test for ':sign unplace group={group}'
1140 call Place_signs_at_line_for_test()
1141 " Should remove only one sign in group g1
1142 sign unplace group=g1
1143 call assert_equal(
1144 \ filter(copy(signs1),
1145 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
1146 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1147 sign unplace group=g2
1148 call assert_equal(
1149 \ filter(copy(signs1),
1150 \ {idx, val -> val.id != 4 || val.group == ''}),
1151 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1152
1153 " Test for ':sign unplace group=*'
1154 call Place_signs_at_line_for_test()
1155 sign unplace group=*
1156 sign unplace group=*
1157 sign unplace group=*
1158 call assert_equal(
1159 \ filter(copy(signs1),
1160 \ {idx, val -> val.id != 4}),
1161 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1162 sign unplace group=*
1163 sign unplace group=*
1164 sign unplace group=*
1165 call assert_equal([], sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1166
1167 call sign_unplace('*')
1168 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001169 enew | only
Bram Moolenaar7d83bf42018-12-29 18:53:55 +01001170 call delete("Xsign1")
1171 call delete("Xsign2")
1172endfunc
1173
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001174" Tests for auto-generating the sign identifier.
1175func Test_aaa_sign_id_autogen()
Bram Moolenaar162b7142018-12-21 15:17:36 +01001176 enew | only
1177 call sign_unplace('*')
1178 call sign_undefine()
1179
1180 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
1181 call assert_equal(0, sign_define("sign1", attr))
1182
1183 call writefile(repeat(["Sun is shining"], 30), "Xsign")
1184 edit Xsign
1185
1186 call assert_equal(1, sign_place(0, '', 'sign1', 'Xsign',
1187 \ {'lnum' : 10}))
1188 call assert_equal(2, sign_place(2, '', 'sign1', 'Xsign',
1189 \ {'lnum' : 12}))
1190 call assert_equal(3, sign_place(0, '', 'sign1', 'Xsign',
1191 \ {'lnum' : 14}))
1192 call sign_unplace('', {'buffer' : 'Xsign', 'id' : 2})
Bram Moolenaar6436cd82018-12-27 00:28:33 +01001193 call assert_equal(4, sign_place(0, '', 'sign1', 'Xsign',
Bram Moolenaar162b7142018-12-21 15:17:36 +01001194 \ {'lnum' : 12}))
1195
1196 call assert_equal(1, sign_place(0, 'g1', 'sign1', 'Xsign',
1197 \ {'lnum' : 11}))
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001198 " Check for the next generated sign id in this group
1199 call assert_equal(2, sign_place(0, 'g1', 'sign1', 'Xsign',
1200 \ {'lnum' : 12}))
Bram Moolenaar162b7142018-12-21 15:17:36 +01001201 call assert_equal(0, sign_unplace('g1', {'id' : 1}))
1202 call assert_equal(10,
1203 \ sign_getplaced('Xsign', {'id' : 1})[0].signs[0].lnum)
1204
1205 call delete("Xsign")
1206 call sign_unplace('*')
1207 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001208 enew | only
Bram Moolenaar162b7142018-12-21 15:17:36 +01001209endfunc
1210
1211" Test for sign priority
1212func Test_sign_priority()
1213 enew | only
1214 call sign_unplace('*')
1215 call sign_undefine()
1216
1217 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Search'}
1218 call sign_define("sign1", attr)
1219 call sign_define("sign2", attr)
1220 call sign_define("sign3", attr)
1221
1222 " Place three signs with different priority in the same line
1223 call writefile(repeat(["Sun is shining"], 30), "Xsign")
1224 edit Xsign
Bram Moolenaar162b7142018-12-21 15:17:36 +01001225
1226 call sign_place(1, 'g1', 'sign1', 'Xsign',
1227 \ {'lnum' : 11, 'priority' : 50})
1228 call sign_place(2, 'g2', 'sign2', 'Xsign',
1229 \ {'lnum' : 11, 'priority' : 100})
1230 call sign_place(3, '', 'sign3', 'Xsign', {'lnum' : 11})
1231 let s = sign_getplaced('Xsign', {'group' : '*'})
1232 call assert_equal([
1233 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 11, 'group' : 'g2',
1234 \ 'priority' : 100},
1235 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11, 'group' : 'g1',
1236 \ 'priority' : 50},
1237 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 11, 'group' : '',
1238 \ 'priority' : 10}],
1239 \ s[0].signs)
1240
Bram Moolenaar64416122019-06-07 21:37:13 +02001241 call sign_unplace('*')
1242
1243 " Three signs on different lines with changing priorities
1244 call sign_place(1, '', 'sign1', 'Xsign',
1245 \ {'lnum' : 11, 'priority' : 50})
1246 call sign_place(2, '', 'sign2', 'Xsign',
1247 \ {'lnum' : 12, 'priority' : 60})
1248 call sign_place(3, '', 'sign3', 'Xsign',
1249 \ {'lnum' : 13, 'priority' : 70})
1250 call sign_place(2, '', 'sign2', 'Xsign',
1251 \ {'lnum' : 12, 'priority' : 40})
1252 call sign_place(3, '', 'sign3', 'Xsign',
1253 \ {'lnum' : 13, 'priority' : 30})
1254 call sign_place(1, '', 'sign1', 'Xsign',
1255 \ {'lnum' : 11, 'priority' : 50})
1256 let s = sign_getplaced('Xsign', {'group' : '*'})
1257 call assert_equal([
1258 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11, 'group' : '',
1259 \ 'priority' : 50},
1260 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 12, 'group' : '',
1261 \ 'priority' : 40},
1262 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 13, 'group' : '',
1263 \ 'priority' : 30}],
1264 \ s[0].signs)
1265
1266 call sign_unplace('*')
1267
1268 " Two signs on the same line with changing priorities
1269 call sign_place(1, '', 'sign1', 'Xsign',
1270 \ {'lnum' : 4, 'priority' : 20})
1271 call sign_place(2, '', 'sign2', 'Xsign',
1272 \ {'lnum' : 4, 'priority' : 30})
1273 let s = sign_getplaced('Xsign', {'group' : '*'})
1274 call assert_equal([
1275 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1276 \ 'priority' : 30},
1277 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1278 \ 'priority' : 20}],
1279 \ s[0].signs)
1280 " Change the priority of the last sign to highest
1281 call sign_place(1, '', 'sign1', 'Xsign',
1282 \ {'lnum' : 4, 'priority' : 40})
1283 let s = sign_getplaced('Xsign', {'group' : '*'})
1284 call assert_equal([
1285 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1286 \ 'priority' : 40},
1287 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1288 \ 'priority' : 30}],
1289 \ s[0].signs)
1290 " Change the priority of the first sign to lowest
1291 call sign_place(1, '', 'sign1', 'Xsign',
1292 \ {'lnum' : 4, 'priority' : 25})
1293 let s = sign_getplaced('Xsign', {'group' : '*'})
1294 call assert_equal([
1295 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1296 \ 'priority' : 30},
1297 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1298 \ 'priority' : 25}],
1299 \ s[0].signs)
1300 call sign_place(1, '', 'sign1', 'Xsign',
1301 \ {'lnum' : 4, 'priority' : 45})
1302 call sign_place(2, '', 'sign2', 'Xsign',
1303 \ {'lnum' : 4, 'priority' : 55})
1304 let s = sign_getplaced('Xsign', {'group' : '*'})
1305 call assert_equal([
1306 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1307 \ 'priority' : 55},
1308 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1309 \ 'priority' : 45}],
1310 \ s[0].signs)
1311
1312 call sign_unplace('*')
1313
1314 " Three signs on the same line with changing priorities
1315 call sign_place(1, '', 'sign1', 'Xsign',
1316 \ {'lnum' : 4, 'priority' : 40})
1317 call sign_place(2, '', 'sign2', 'Xsign',
1318 \ {'lnum' : 4, 'priority' : 30})
1319 call sign_place(3, '', 'sign3', 'Xsign',
1320 \ {'lnum' : 4, 'priority' : 20})
1321 let s = sign_getplaced('Xsign', {'group' : '*'})
1322 call assert_equal([
1323 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1324 \ 'priority' : 40},
1325 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1326 \ 'priority' : 30},
1327 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1328 \ 'priority' : 20}],
1329 \ s[0].signs)
1330
1331 " Change the priority of the middle sign to the highest
1332 call sign_place(2, '', 'sign2', 'Xsign',
1333 \ {'lnum' : 4, 'priority' : 50})
1334 let s = sign_getplaced('Xsign', {'group' : '*'})
1335 call assert_equal([
1336 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1337 \ 'priority' : 50},
1338 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1339 \ 'priority' : 40},
1340 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1341 \ 'priority' : 20}],
1342 \ s[0].signs)
1343
1344 " Change the priority of the middle sign to the lowest
1345 call sign_place(1, '', 'sign1', 'Xsign',
1346 \ {'lnum' : 4, 'priority' : 15})
1347 let s = sign_getplaced('Xsign', {'group' : '*'})
1348 call assert_equal([
1349 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1350 \ 'priority' : 50},
1351 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1352 \ 'priority' : 20},
1353 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1354 \ 'priority' : 15}],
1355 \ s[0].signs)
1356
1357 " Change the priority of the last sign to the highest
1358 call sign_place(1, '', 'sign1', 'Xsign',
1359 \ {'lnum' : 4, 'priority' : 55})
1360 let s = sign_getplaced('Xsign', {'group' : '*'})
1361 call assert_equal([
1362 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1363 \ 'priority' : 55},
1364 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1365 \ 'priority' : 50},
1366 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1367 \ 'priority' : 20}],
1368 \ s[0].signs)
1369
1370 " Change the priority of the first sign to the lowest
1371 call sign_place(1, '', 'sign1', 'Xsign',
1372 \ {'lnum' : 4, 'priority' : 15})
1373 let s = sign_getplaced('Xsign', {'group' : '*'})
1374 call assert_equal([
1375 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1376 \ 'priority' : 50},
1377 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1378 \ 'priority' : 20},
1379 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1380 \ 'priority' : 15}],
1381 \ s[0].signs)
1382
1383 call sign_unplace('*')
1384
1385 " Three signs on the same line with changing priorities along with other
1386 " signs
1387 call sign_place(1, '', 'sign1', 'Xsign',
1388 \ {'lnum' : 2, 'priority' : 10})
1389 call sign_place(2, '', 'sign1', 'Xsign',
1390 \ {'lnum' : 4, 'priority' : 30})
1391 call sign_place(3, '', 'sign2', 'Xsign',
1392 \ {'lnum' : 4, 'priority' : 20})
1393 call sign_place(4, '', 'sign3', 'Xsign',
1394 \ {'lnum' : 4, 'priority' : 25})
1395 call sign_place(5, '', 'sign2', 'Xsign',
1396 \ {'lnum' : 6, 'priority' : 80})
1397 let s = sign_getplaced('Xsign', {'group' : '*'})
1398 call assert_equal([
1399 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1400 \ 'priority' : 10},
1401 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1402 \ 'priority' : 30},
1403 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1404 \ 'priority' : 25},
1405 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1406 \ 'priority' : 20},
1407 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1408 \ 'priority' : 80}],
1409 \ s[0].signs)
1410
1411 " Change the priority of the first sign to lowest
1412 call sign_place(2, '', 'sign1', 'Xsign',
1413 \ {'lnum' : 4, 'priority' : 15})
1414 let s = sign_getplaced('Xsign', {'group' : '*'})
1415 call assert_equal([
1416 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1417 \ 'priority' : 10},
1418 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1419 \ 'priority' : 25},
1420 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1421 \ 'priority' : 20},
1422 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1423 \ 'priority' : 15},
1424 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1425 \ 'priority' : 80}],
1426 \ s[0].signs)
1427
1428 " Change the priority of the last sign to highest
1429 call sign_place(2, '', 'sign1', 'Xsign',
1430 \ {'lnum' : 4, 'priority' : 30})
1431 let s = sign_getplaced('Xsign', {'group' : '*'})
1432 call assert_equal([
1433 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1434 \ 'priority' : 10},
1435 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1436 \ 'priority' : 30},
1437 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1438 \ 'priority' : 25},
1439 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1440 \ 'priority' : 20},
1441 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1442 \ 'priority' : 80}],
1443 \ s[0].signs)
1444
1445 " Change the priority of the middle sign to lowest
1446 call sign_place(4, '', 'sign3', 'Xsign',
1447 \ {'lnum' : 4, 'priority' : 15})
1448 let s = sign_getplaced('Xsign', {'group' : '*'})
1449 call assert_equal([
1450 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1451 \ 'priority' : 10},
1452 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1453 \ 'priority' : 30},
1454 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1455 \ 'priority' : 20},
1456 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1457 \ 'priority' : 15},
1458 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1459 \ 'priority' : 80}],
1460 \ s[0].signs)
1461
1462 " Change the priority of the middle sign to highest
1463 call sign_place(3, '', 'sign2', 'Xsign',
1464 \ {'lnum' : 4, 'priority' : 35})
1465 let s = sign_getplaced('Xsign', {'group' : '*'})
1466 call assert_equal([
1467 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1468 \ 'priority' : 10},
1469 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1470 \ 'priority' : 35},
1471 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1472 \ 'priority' : 30},
1473 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1474 \ 'priority' : 15},
1475 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1476 \ 'priority' : 80}],
1477 \ s[0].signs)
1478
1479 call sign_unplace('*')
1480
1481 " Multiple signs with the same priority on the same line
1482 call sign_place(1, '', 'sign1', 'Xsign',
1483 \ {'lnum' : 4, 'priority' : 20})
1484 call sign_place(2, '', 'sign2', 'Xsign',
1485 \ {'lnum' : 4, 'priority' : 20})
1486 call sign_place(3, '', 'sign3', 'Xsign',
1487 \ {'lnum' : 4, 'priority' : 20})
1488 let s = sign_getplaced('Xsign', {'group' : '*'})
1489 call assert_equal([
1490 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1491 \ 'priority' : 20},
1492 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1493 \ 'priority' : 20},
1494 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1495 \ 'priority' : 20}],
1496 \ s[0].signs)
1497 " Place the last sign again with the same priority
1498 call sign_place(1, '', 'sign1', 'Xsign',
1499 \ {'lnum' : 4, 'priority' : 20})
1500 let s = sign_getplaced('Xsign', {'group' : '*'})
1501 call assert_equal([
1502 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1503 \ 'priority' : 20},
1504 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1505 \ 'priority' : 20},
1506 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1507 \ 'priority' : 20}],
1508 \ s[0].signs)
1509 " Place the first sign again with the same priority
1510 call sign_place(1, '', 'sign1', 'Xsign',
1511 \ {'lnum' : 4, 'priority' : 20})
1512 let s = sign_getplaced('Xsign', {'group' : '*'})
1513 call assert_equal([
1514 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1515 \ 'priority' : 20},
1516 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1517 \ 'priority' : 20},
1518 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1519 \ 'priority' : 20}],
1520 \ s[0].signs)
1521 " Place the middle sign again with the same priority
1522 call sign_place(3, '', 'sign3', 'Xsign',
1523 \ {'lnum' : 4, 'priority' : 20})
1524 let s = sign_getplaced('Xsign', {'group' : '*'})
1525 call assert_equal([
1526 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1527 \ 'priority' : 20},
1528 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1529 \ 'priority' : 20},
1530 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1531 \ 'priority' : 20}],
1532 \ s[0].signs)
1533
1534 call sign_unplace('*')
1535
Bram Moolenaar58a7f872019-06-04 22:48:15 +02001536 " Place multiple signs with same id on a line with different priority
1537 call sign_place(1, '', 'sign1', 'Xsign',
1538 \ {'lnum' : 5, 'priority' : 20})
1539 call sign_place(1, '', 'sign2', 'Xsign',
1540 \ {'lnum' : 5, 'priority' : 10})
1541 let s = sign_getplaced('Xsign', {'lnum' : 5})
1542 call assert_equal([
1543 \ {'id' : 1, 'name' : 'sign2', 'lnum' : 5, 'group' : '',
1544 \ 'priority' : 10}],
1545 \ s[0].signs)
1546 call sign_place(1, '', 'sign2', 'Xsign',
1547 \ {'lnum' : 5, 'priority' : 5})
1548 let s = sign_getplaced('Xsign', {'lnum' : 5})
1549 call assert_equal([
1550 \ {'id' : 1, 'name' : 'sign2', 'lnum' : 5, 'group' : '',
1551 \ 'priority' : 5}],
1552 \ s[0].signs)
1553
Bram Moolenaar162b7142018-12-21 15:17:36 +01001554 " Error case
1555 call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign',
1556 \ [])", 'E715:')
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001557 call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign',
1558 \ {'priority' : []})", 'E745:')
Bram Moolenaar162b7142018-12-21 15:17:36 +01001559 call sign_unplace('*')
1560
1561 " Tests for the :sign place command with priority
1562 sign place 5 line=10 name=sign1 priority=30 file=Xsign
1563 sign place 5 group=g1 line=10 name=sign1 priority=20 file=Xsign
1564 sign place 5 group=g2 line=10 name=sign1 priority=25 file=Xsign
1565 let a = execute('sign place group=*')
1566 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +01001567 \ " line=10 id=5 name=sign1 priority=30\n" .
1568 \ " line=10 id=5 group=g2 name=sign1 priority=25\n" .
1569 \ " line=10 id=5 group=g1 name=sign1 priority=20\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +01001570
1571 " Test for :sign place group={group}
1572 let a = execute('sign place group=g1')
1573 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +01001574 \ " line=10 id=5 group=g1 name=sign1 priority=20\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +01001575
1576 call sign_unplace('*')
1577 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001578 enew | only
Bram Moolenaar162b7142018-12-21 15:17:36 +01001579 call delete("Xsign")
1580endfunc
1581
1582" Tests for memory allocation failures in sign functions
1583func Test_sign_memfailures()
1584 call writefile(repeat(["Sun is shining"], 30), "Xsign")
1585 edit Xsign
1586
1587 call test_alloc_fail(GetAllocId('sign_getdefined'), 0, 0)
1588 call assert_fails('call sign_getdefined("sign1")', 'E342:')
1589 call test_alloc_fail(GetAllocId('sign_getplaced'), 0, 0)
1590 call assert_fails('call sign_getplaced("Xsign")', 'E342:')
1591 call test_alloc_fail(GetAllocId('sign_define_by_name'), 0, 0)
1592 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
1593 call assert_fails('call sign_define("sign1", attr)', 'E342:')
1594
1595 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
1596 call sign_define("sign1", attr)
1597 call test_alloc_fail(GetAllocId('sign_getlist'), 0, 0)
1598 call assert_fails('call sign_getdefined("sign1")', 'E342:')
1599
1600 call sign_place(3, 'g1', 'sign1', 'Xsign', {'lnum' : 10})
1601 call test_alloc_fail(GetAllocId('sign_getplaced_dict'), 0, 0)
1602 call assert_fails('call sign_getplaced("Xsign")', 'E342:')
1603 call test_alloc_fail(GetAllocId('sign_getplaced_list'), 0, 0)
1604 call assert_fails('call sign_getplaced("Xsign")', 'E342:')
1605
1606 call test_alloc_fail(GetAllocId('insert_sign'), 0, 0)
1607 call assert_fails('call sign_place(4, "g1", "sign1", "Xsign", {"lnum" : 11})',
1608 \ 'E342:')
1609
1610 call test_alloc_fail(GetAllocId('sign_getinfo'), 0, 0)
1611 call assert_fails('call getbufinfo()', 'E342:')
1612 call sign_place(4, 'g1', 'sign1', 'Xsign', {'lnum' : 11})
1613 call test_alloc_fail(GetAllocId('sign_getinfo'), 0, 0)
1614 call assert_fails('let binfo=getbufinfo("Xsign")', 'E342:')
1615 call assert_equal([{'lnum': 11, 'id': 4, 'name': 'sign1',
1616 \ 'priority': 10, 'group': 'g1'}], binfo[0].signs)
1617
1618 call sign_unplace('*')
1619 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001620 enew | only
Bram Moolenaar162b7142018-12-21 15:17:36 +01001621 call delete("Xsign")
1622endfunc
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +01001623
1624" Test for auto-adjusting the line number of a placed sign.
1625func Test_sign_lnum_adjust()
1626 enew! | only!
1627
1628 sign define sign1 text=#> linehl=Comment
Bram Moolenaarc771bf92019-01-17 17:36:45 +01001629 call setline(1, ['A', 'B', 'C', 'D', 'E'])
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +01001630 exe 'sign place 5 line=3 name=sign1 buffer=' . bufnr('')
1631 let l = sign_getplaced(bufnr(''))
1632 call assert_equal(3, l[0].signs[0].lnum)
1633
1634 " Add some lines before the sign and check the sign line number
Bram Moolenaarc771bf92019-01-17 17:36:45 +01001635 call append(2, ['BA', 'BB', 'BC'])
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +01001636 let l = sign_getplaced(bufnr(''))
1637 call assert_equal(6, l[0].signs[0].lnum)
1638
1639 " Delete some lines before the sign and check the sign line number
1640 call deletebufline('%', 1, 2)
1641 let l = sign_getplaced(bufnr(''))
1642 call assert_equal(4, l[0].signs[0].lnum)
1643
Bram Moolenaarc771bf92019-01-17 17:36:45 +01001644 " Insert some lines after the sign and check the sign line number
1645 call append(5, ['DA', 'DB'])
1646 let l = sign_getplaced(bufnr(''))
1647 call assert_equal(4, l[0].signs[0].lnum)
1648
1649 " Delete some lines after the sign and check the sign line number
1650 call deletebufline('', 6, 7)
1651 let l = sign_getplaced(bufnr(''))
1652 call assert_equal(4, l[0].signs[0].lnum)
1653
1654 " Break the undo. Otherwise the undo operation below will undo all the
1655 " changes made by this function.
1656 let &undolevels=&undolevels
1657
1658 " Delete the line with the sign
1659 call deletebufline('', 4)
1660 let l = sign_getplaced(bufnr(''))
1661 call assert_equal(4, l[0].signs[0].lnum)
1662
1663 " Undo the delete operation
1664 undo
1665 let l = sign_getplaced(bufnr(''))
1666 call assert_equal(5, l[0].signs[0].lnum)
1667
1668 " Break the undo
1669 let &undolevels=&undolevels
1670
1671 " Delete few lines at the end of the buffer including the line with the sign
1672 " Sign line number should not change (as it is placed outside of the buffer)
1673 call deletebufline('', 3, 6)
1674 let l = sign_getplaced(bufnr(''))
1675 call assert_equal(5, l[0].signs[0].lnum)
1676
1677 " Undo the delete operation. Sign should be restored to the previous line
1678 undo
1679 let l = sign_getplaced(bufnr(''))
1680 call assert_equal(5, l[0].signs[0].lnum)
1681
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +01001682 sign unplace * group=*
1683 sign undefine sign1
1684 enew!
1685endfunc
1686
1687" Test for changing the type of a placed sign
1688func Test_sign_change_type()
1689 enew! | only!
1690
1691 sign define sign1 text=#> linehl=Comment
1692 sign define sign2 text=@@ linehl=Comment
1693
1694 call setline(1, ['A', 'B', 'C', 'D'])
1695 exe 'sign place 4 line=3 name=sign1 buffer=' . bufnr('')
1696 let l = sign_getplaced(bufnr(''))
1697 call assert_equal('sign1', l[0].signs[0].name)
1698 exe 'sign place 4 name=sign2 buffer=' . bufnr('')
1699 let l = sign_getplaced(bufnr(''))
1700 call assert_equal('sign2', l[0].signs[0].name)
1701 call sign_place(4, '', 'sign1', '')
1702 let l = sign_getplaced(bufnr(''))
1703 call assert_equal('sign1', l[0].signs[0].name)
1704
1705 exe 'sign place 4 group=g1 line=4 name=sign1 buffer=' . bufnr('')
1706 let l = sign_getplaced(bufnr(''), {'group' : 'g1'})
1707 call assert_equal('sign1', l[0].signs[0].name)
1708 exe 'sign place 4 group=g1 name=sign2 buffer=' . bufnr('')
1709 let l = sign_getplaced(bufnr(''), {'group' : 'g1'})
1710 call assert_equal('sign2', l[0].signs[0].name)
1711 call sign_place(4, 'g1', 'sign1', '')
1712 let l = sign_getplaced(bufnr(''), {'group' : 'g1'})
1713 call assert_equal('sign1', l[0].signs[0].name)
1714
1715 sign unplace * group=*
1716 sign undefine sign1
1717 sign undefine sign2
1718 enew!
1719endfunc
Bram Moolenaar6b7b7192019-01-11 13:42:41 +01001720
1721" Test for the sign_jump() function
1722func Test_sign_jump_func()
1723 enew! | only!
1724
1725 sign define sign1 text=#> linehl=Comment
1726
1727 edit foo
1728 set buftype=nofile
1729 call setline(1, ['A', 'B', 'C', 'D', 'E'])
1730 call sign_place(5, '', 'sign1', '', {'lnum' : 2})
1731 call sign_place(5, 'g1', 'sign1', '', {'lnum' : 3})
1732 call sign_place(6, '', 'sign1', '', {'lnum' : 4})
1733 call sign_place(6, 'g1', 'sign1', '', {'lnum' : 5})
1734 split bar
1735 set buftype=nofile
1736 call setline(1, ['P', 'Q', 'R', 'S', 'T'])
1737 call sign_place(5, '', 'sign1', '', {'lnum' : 2})
1738 call sign_place(5, 'g1', 'sign1', '', {'lnum' : 3})
1739 call sign_place(6, '', 'sign1', '', {'lnum' : 4})
1740 call sign_place(6, 'g1', 'sign1', '', {'lnum' : 5})
1741
1742 let r = sign_jump(5, '', 'foo')
1743 call assert_equal(2, r)
1744 call assert_equal(2, line('.'))
Bram Moolenaar93476fd2019-09-06 22:00:54 +02001745 let r = 6->sign_jump('g1', 'foo')
Bram Moolenaar6b7b7192019-01-11 13:42:41 +01001746 call assert_equal(5, r)
1747 call assert_equal(5, line('.'))
1748 let r = sign_jump(5, '', 'bar')
1749 call assert_equal(2, r)
1750 call assert_equal(2, line('.'))
1751
1752 " Error cases
1753 call assert_fails("call sign_jump(99, '', 'bar')", 'E157:')
1754 call assert_fails("call sign_jump(0, '', 'foo')", 'E474:')
1755 call assert_fails("call sign_jump(5, 'g5', 'foo')", 'E157:')
1756 call assert_fails('call sign_jump([], "", "foo")', 'E745:')
1757 call assert_fails('call sign_jump(2, [], "foo")', 'E730:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001758 call assert_fails('call sign_jump(2, "", {})', 'E731:')
Bram Moolenaar6b7b7192019-01-11 13:42:41 +01001759 call assert_fails('call sign_jump(2, "", "baz")', 'E158:')
1760
1761 sign unplace * group=*
1762 sign undefine sign1
1763 enew! | only!
1764endfunc
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02001765
1766" Test for correct cursor position after the sign column appears or disappears.
1767func Test_sign_cursor_position()
Bram Moolenaar494e9062020-05-31 21:28:02 +02001768 CheckRunVimInTerminal
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02001769
1770 let lines =<< trim END
1771 call setline(1, [repeat('x', 75), 'mmmm', 'yyyy'])
1772 call cursor(2,1)
1773 sign define s1 texthl=Search text==>
Bram Moolenaara2f6e422020-02-19 17:13:04 +01001774 sign define s2 linehl=Pmenu
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02001775 redraw
1776 sign place 10 line=2 name=s1
1777 END
1778 call writefile(lines, 'XtestSigncolumn')
1779 let buf = RunVimInTerminal('-S XtestSigncolumn', {'rows': 6})
Bram Moolenaarbf0acff2020-01-09 21:01:59 +01001780 call VerifyScreenDump(buf, 'Test_sign_cursor_1', {})
1781
1782 " Change the sign text
1783 call term_sendkeys(buf, ":sign define s1 text=-)\<CR>")
1784 call VerifyScreenDump(buf, 'Test_sign_cursor_2', {})
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02001785
Bram Moolenaara2f6e422020-02-19 17:13:04 +01001786 " Also place a line HL sign
1787 call term_sendkeys(buf, ":sign place 11 line=2 name=s2\<CR>")
Bram Moolenaarbf0acff2020-01-09 21:01:59 +01001788 call VerifyScreenDump(buf, 'Test_sign_cursor_3', {})
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02001789
Bram Moolenaara2f6e422020-02-19 17:13:04 +01001790 " update cursor position calculation
1791 call term_sendkeys(buf, "lh")
1792 call term_sendkeys(buf, ":sign unplace 11\<CR>")
1793 call term_sendkeys(buf, ":sign unplace 10\<CR>")
1794 call VerifyScreenDump(buf, 'Test_sign_cursor_4', {})
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02001795
Bram Moolenaar39f7aa32020-08-31 22:00:05 +02001796 " 'cursorline' highlighting overrules sign
1797 call term_sendkeys(buf, ":sign place 12 line=2 name=s2\<CR>")
1798 call term_sendkeys(buf, ":set cursorline\<CR>")
1799 call term_sendkeys(buf, ":hi CursorLine ctermbg=Green\<CR>")
1800 call term_sendkeys(buf, "2G")
1801 call term_sendkeys(buf, ":\<CR>")
1802 call VerifyScreenDump(buf, 'Test_sign_cursor_5', {})
1803
1804 " sign highlighting overrules 'cursorline'
1805 call term_sendkeys(buf, ":sign unplace 12\<CR>")
1806 call term_sendkeys(buf, ":sign place 13 line=2 priority=100 name=s2\<CR>")
1807 call term_sendkeys(buf, ":\<CR>")
1808 call VerifyScreenDump(buf, 'Test_sign_cursor_6', {})
1809
Bram Moolenaarf85e40a2019-06-16 13:55:40 +02001810 " clean up
1811 call StopVimInTerminal(buf)
1812 call delete('XtestSigncolumn')
1813endfunc
Bram Moolenaar394c5d82019-06-17 21:48:05 +02001814
1815" Return the 'len' characters in screen starting from (row,col)
1816func s:ScreenLine(row, col, len)
1817 let s = ''
1818 for i in range(a:len)
1819 let s .= nr2char(screenchar(a:row, a:col + i))
1820 endfor
1821 return s
1822endfunc
1823
1824" Test for 'signcolumn' set to 'number'.
1825func Test_sign_numcol()
1826 new
1827 call append(0, "01234")
1828 " With 'signcolumn' set to 'number', make sure sign is displayed in the
1829 " number column and line number is not displayed.
1830 set numberwidth=2
1831 set number
1832 set signcolumn=number
1833 sign define sign1 text==>
Bram Moolenaard6bcff42019-07-18 12:48:16 +02001834 sign define sign2 text=V
Bram Moolenaar394c5d82019-06-17 21:48:05 +02001835 sign place 10 line=1 name=sign1
1836 redraw!
1837 call assert_equal("=> 01234", s:ScreenLine(1, 1, 8))
1838
1839 " With 'signcolumn' set to 'number', when there is no sign, make sure line
1840 " number is displayed in the number column
1841 sign unplace 10
1842 redraw!
1843 call assert_equal("1 01234", s:ScreenLine(1, 1, 7))
1844
1845 " Disable number column. Check whether sign is displayed in the sign column
1846 set numberwidth=4
1847 set nonumber
1848 sign place 10 line=1 name=sign1
1849 redraw!
1850 call assert_equal("=>01234", s:ScreenLine(1, 1, 7))
1851
1852 " Enable number column. Check whether sign is displayed in the number column
1853 set number
1854 redraw!
Bram Moolenaar4dff4ae2019-06-19 16:31:28 +02001855 call assert_equal(" => 01234", s:ScreenLine(1, 1, 9))
Bram Moolenaar394c5d82019-06-17 21:48:05 +02001856
1857 " Disable sign column. Make sure line number is displayed
1858 set signcolumn=no
1859 redraw!
1860 call assert_equal(" 1 01234", s:ScreenLine(1, 1, 9))
1861
1862 " Enable auto sign column. Make sure both sign and line number are displayed
1863 set signcolumn=auto
1864 redraw!
1865 call assert_equal("=> 1 01234", s:ScreenLine(1, 1, 11))
1866
Bram Moolenaare4b407f2019-07-04 11:59:28 +02001867 " Test displaying signs in the number column with width 1
1868 call sign_unplace('*')
1869 call append(1, "abcde")
1870 call append(2, "01234")
1871 " Enable number column with width 1
1872 set number numberwidth=1 signcolumn=auto
1873 redraw!
1874 call assert_equal("3 01234", s:ScreenLine(3, 1, 7))
1875 " Place a sign and make sure number column width remains the same
1876 sign place 20 line=2 name=sign1
1877 redraw!
1878 call assert_equal("=>2 abcde", s:ScreenLine(2, 1, 9))
1879 call assert_equal(" 3 01234", s:ScreenLine(3, 1, 9))
1880 " Set 'signcolumn' to 'number', make sure the number column width increases
1881 set signcolumn=number
1882 redraw!
1883 call assert_equal("=> abcde", s:ScreenLine(2, 1, 8))
1884 call assert_equal(" 3 01234", s:ScreenLine(3, 1, 8))
1885 " Set 'signcolumn' to 'auto', make sure the number column width is 1.
1886 set signcolumn=auto
1887 redraw!
1888 call assert_equal("=>2 abcde", s:ScreenLine(2, 1, 9))
1889 call assert_equal(" 3 01234", s:ScreenLine(3, 1, 9))
1890 " Set 'signcolumn' to 'number', make sure the number column width is 2.
1891 set signcolumn=number
1892 redraw!
1893 call assert_equal("=> abcde", s:ScreenLine(2, 1, 8))
1894 call assert_equal(" 3 01234", s:ScreenLine(3, 1, 8))
1895 " Disable 'number' column
1896 set nonumber
1897 redraw!
1898 call assert_equal("=>abcde", s:ScreenLine(2, 1, 7))
1899 call assert_equal(" 01234", s:ScreenLine(3, 1, 7))
1900 " Enable 'number' column
1901 set number
1902 redraw!
1903 call assert_equal("=> abcde", s:ScreenLine(2, 1, 8))
1904 call assert_equal(" 3 01234", s:ScreenLine(3, 1, 8))
1905 " Remove the sign and make sure the width of the number column is 1.
1906 call sign_unplace('', {'id' : 20})
1907 redraw!
1908 call assert_equal("3 01234", s:ScreenLine(3, 1, 7))
1909 " When the first sign is placed with 'signcolumn' set to number, verify that
1910 " the number column width increases
1911 sign place 30 line=1 name=sign1
1912 redraw!
1913 call assert_equal("=> 01234", s:ScreenLine(1, 1, 8))
1914 call assert_equal(" 2 abcde", s:ScreenLine(2, 1, 8))
Bram Moolenaard6bcff42019-07-18 12:48:16 +02001915 " Add sign with multi-byte text
1916 set numberwidth=4
1917 sign place 40 line=2 name=sign2
1918 redraw!
1919 call assert_equal(" => 01234", s:ScreenLine(1, 1, 9))
1920 call assert_equal(" V abcde", s:ScreenLine(2, 1, 9))
Bram Moolenaare4b407f2019-07-04 11:59:28 +02001921
1922 sign unplace * group=*
Bram Moolenaar394c5d82019-06-17 21:48:05 +02001923 sign undefine sign1
1924 set signcolumn&
1925 set number&
1926 enew! | close
1927endfunc
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001928
1929" Test for managing multiple signs using the sign functions
1930func Test_sign_funcs_multi()
1931 call writefile(repeat(["Sun is shining"], 30), "Xsign")
1932 edit Xsign
1933 let bnum = bufnr('')
1934
1935 " Define multiple signs at once
1936 call assert_equal([0, 0, 0, 0], sign_define([
1937 \ {'name' : 'sign1', 'text' : '=>', 'linehl' : 'Search',
1938 \ 'texthl' : 'Search'},
1939 \ {'name' : 'sign2', 'text' : '=>', 'linehl' : 'Search',
1940 \ 'texthl' : 'Search'},
1941 \ {'name' : 'sign3', 'text' : '=>', 'linehl' : 'Search',
1942 \ 'texthl' : 'Search'},
1943 \ {'name' : 'sign4', 'text' : '=>', 'linehl' : 'Search',
1944 \ 'texthl' : 'Search'}]))
1945
1946 " Negative cases for sign_define()
1947 call assert_equal([], sign_define([]))
1948 call assert_equal([-1], sign_define([{}]))
1949 call assert_fails('call sign_define([6])', 'E715:')
1950 call assert_fails('call sign_define(["abc"])', 'E715:')
1951 call assert_fails('call sign_define([[]])', 'E715:')
1952
1953 " Place multiple signs at once with specific sign identifier
1954 let l = sign_placelist([{'id' : 1, 'group' : 'g1', 'name' : 'sign1',
1955 \ 'buffer' : 'Xsign', 'lnum' : 11, 'priority' : 50},
1956 \ {'id' : 2, 'group' : 'g2', 'name' : 'sign2',
1957 \ 'buffer' : 'Xsign', 'lnum' : 11, 'priority' : 100},
1958 \ {'id' : 3, 'group' : '', 'name' : 'sign3',
1959 \ 'buffer' : 'Xsign', 'lnum' : 11}])
1960 call assert_equal([1, 2, 3], l)
1961 let s = sign_getplaced('Xsign', {'group' : '*'})
1962 call assert_equal([
1963 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 11,
1964 \ 'group' : 'g2', 'priority' : 100},
1965 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11,
1966 \ 'group' : 'g1', 'priority' : 50},
1967 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 11,
1968 \ 'group' : '', 'priority' : 10}], s[0].signs)
1969
1970 call sign_unplace('*')
1971
1972 " Place multiple signs at once with auto-generated sign identifier
1973 call assert_equal([1, 1, 5], sign_placelist([
1974 \ {'group' : 'g1', 'name' : 'sign1',
1975 \ 'buffer' : 'Xsign', 'lnum' : 11},
1976 \ {'group' : 'g2', 'name' : 'sign2',
1977 \ 'buffer' : 'Xsign', 'lnum' : 11},
1978 \ {'group' : '', 'name' : 'sign3',
1979 \ 'buffer' : 'Xsign', 'lnum' : 11}]))
1980 let s = sign_getplaced('Xsign', {'group' : '*'})
1981 call assert_equal([
1982 \ {'id' : 5, 'name' : 'sign3', 'lnum' : 11,
1983 \ 'group' : '', 'priority' : 10},
1984 \ {'id' : 1, 'name' : 'sign2', 'lnum' : 11,
1985 \ 'group' : 'g2', 'priority' : 10},
1986 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11,
1987 \ 'group' : 'g1', 'priority' : 10}], s[0].signs)
1988
1989 " Change an existing sign without specifying the group
Bram Moolenaar93476fd2019-09-06 22:00:54 +02001990 call assert_equal([5], [{'id' : 5, 'name' : 'sign1', 'buffer' : 'Xsign'}]->sign_placelist())
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001991 let s = sign_getplaced('Xsign', {'id' : 5, 'group' : ''})
1992 call assert_equal([{'id' : 5, 'name' : 'sign1', 'lnum' : 11,
1993 \ 'group' : '', 'priority' : 10}], s[0].signs)
1994
Bram Moolenaar42aff462019-08-21 13:20:29 +02001995 " Place a sign using '.' as the line number
1996 call cursor(23, 1)
1997 call assert_equal([7], sign_placelist([
1998 \ {'id' : 7, 'name' : 'sign1', 'buffer' : '%', 'lnum' : '.'}]))
1999 let s = sign_getplaced('%', {'lnum' : '.'})
2000 call assert_equal([{'id' : 7, 'name' : 'sign1', 'lnum' : 23,
2001 \ 'group' : '', 'priority' : 10}], s[0].signs)
2002
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02002003 " Place sign without a sign name
2004 call assert_equal([-1], sign_placelist([{'id' : 10, 'buffer' : 'Xsign',
2005 \ 'lnum' : 12, 'group' : ''}]))
2006
2007 " Place sign without a buffer
2008 call assert_equal([-1], sign_placelist([{'id' : 10, 'name' : 'sign1',
2009 \ 'lnum' : 12, 'group' : ''}]))
2010
2011 " Invalid arguments
2012 call assert_equal([], sign_placelist([]))
2013 call assert_fails('call sign_placelist({})', "E714:")
2014 call assert_fails('call sign_placelist([[]])', "E715:")
2015 call assert_fails('call sign_placelist(["abc"])', "E715:")
2016 call assert_fails('call sign_placelist([100])', "E715:")
2017
2018 " Unplace multiple signs
2019 call assert_equal([0, 0, 0], sign_unplacelist([{'id' : 5},
2020 \ {'id' : 1, 'group' : 'g1'}, {'id' : 1, 'group' : 'g2'}]))
2021
2022 " Invalid arguments
Bram Moolenaar93476fd2019-09-06 22:00:54 +02002023 call assert_equal([], []->sign_unplacelist())
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02002024 call assert_fails('call sign_unplacelist({})', "E714:")
2025 call assert_fails('call sign_unplacelist([[]])', "E715:")
2026 call assert_fails('call sign_unplacelist(["abc"])', "E715:")
2027 call assert_fails('call sign_unplacelist([100])', "E715:")
Bram Moolenaare2e40752020-09-04 21:18:46 +02002028 call assert_fails("call sign_unplacelist([{'id' : -1}])", 'E474:')
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02002029
2030 call assert_equal([0, 0, 0, 0],
2031 \ sign_undefine(['sign1', 'sign2', 'sign3', 'sign4']))
2032 call assert_equal([], sign_getdefined())
2033
2034 " Invalid arguments
2035 call assert_equal([], sign_undefine([]))
2036 call assert_fails('call sign_undefine([[]])', 'E730:')
2037 call assert_fails('call sign_undefine([{}])', 'E731:')
2038 call assert_fails('call sign_undefine(["1abc2"])', 'E155:')
2039
2040 call sign_unplace('*')
2041 call sign_undefine()
2042 enew!
2043 call delete("Xsign")
2044endfunc
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +02002045
Bram Moolenaar5c56da42021-08-28 14:42:25 +02002046func Test_sign_null_list()
2047 eval test_null_list()->sign_define()
2048 eval test_null_list()->sign_placelist()
2049 eval test_null_list()->sign_undefine()
2050 eval test_null_list()->sign_unplacelist()
2051endfunc
2052
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +02002053" vim: shiftwidth=2 sts=2 expandtab