Mercurial > vim
comparison src/testdir/test_signs.vim @ 15209:3a99b2e6d136 v8.1.0614
patch 8.1.0614: placing signs can be complicated
commit https://github.com/vim/vim/commit/162b71479bd4dcdb3a2ef9198a1444f6f99e6843
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Dec 21 15:17:36 2018 +0100
patch 8.1.0614: placing signs can be complicated
Problem: Placing signs can be complicated.
Solution: Add functions for defining and placing signs. Introduce a group
name to avoid different plugins using the same signs. (Yegappan
Lakshmanan, closes #3652)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 21 Dec 2018 15:30:07 +0100 |
parents | b63787182765 |
children | 336728a577f5 |
comparison
equal
deleted
inserted
replaced
15208:acf68008ca43 | 15209:3a99b2e6d136 |
---|---|
14 " the icon name when listing signs. | 14 " the icon name when listing signs. |
15 sign define Sign1 text=x | 15 sign define Sign1 text=x |
16 try | 16 try |
17 sign define Sign2 text=xy texthl=Title linehl=Error icon=../../pixmaps/stock_vim_find_help.png | 17 sign define Sign2 text=xy texthl=Title linehl=Error icon=../../pixmaps/stock_vim_find_help.png |
18 catch /E255:/ | 18 catch /E255:/ |
19 " ignore error: E255: Couldn't read in sign data! | 19 " Ignore error: E255: Couldn't read in sign data! |
20 " This error can happen when running in gui. | 20 " This error can happen when running in the GUI. |
21 " Some gui like Motif do not support the png icon format. | 21 " Some gui like Motif do not support the png icon format. |
22 endtry | 22 endtry |
23 | 23 |
24 " Test listing signs. | 24 " Test listing signs. |
25 let a=execute('sign list') | 25 let a=execute('sign list') |
61 " Check that we can't change sign. | 61 " Check that we can't change sign. |
62 call assert_fails("exe 'sign place 40 name=Sign1 buffer=' . bufnr('%')", 'E885:') | 62 call assert_fails("exe 'sign place 40 name=Sign1 buffer=' . bufnr('%')", 'E885:') |
63 | 63 |
64 " Check placed signs | 64 " Check placed signs |
65 let a=execute('sign place') | 65 let a=execute('sign place') |
66 call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n line=3 id=41 name=Sign1\n", a) | 66 call assert_equal("\n--- Signs ---\nSigns for [NULL]:\n line=3 id=41 name=Sign1 priority=10\n", a) |
67 | 67 |
68 " Unplace the sign and try jumping to it again should fail. | 68 " Unplace the sign and try jumping to it again should fail. |
69 sign unplace 41 | 69 sign unplace 41 |
70 1 | 70 1 |
71 call assert_fails("exe 'sign jump 41 buffer=' . bufnr('%')", 'E157:') | 71 call assert_fails("exe 'sign jump 41 buffer=' . bufnr('%')", 'E157:') |
110 call assert_fails("sign define Sign4 text=\ea linehl=Comment", 'E239:') | 110 call assert_fails("sign define Sign4 text=\ea linehl=Comment", 'E239:') |
111 | 111 |
112 " Only 1 or 2 character text is allowed | 112 " Only 1 or 2 character text is allowed |
113 call assert_fails("sign define Sign4 text=abc linehl=Comment", 'E239:') | 113 call assert_fails("sign define Sign4 text=abc linehl=Comment", 'E239:') |
114 call assert_fails("sign define Sign4 text= linehl=Comment", 'E239:') | 114 call assert_fails("sign define Sign4 text= linehl=Comment", 'E239:') |
115 call assert_fails("sign define Sign4 text=\ ab linehl=Comment", 'E239:') | 115 call assert_fails("sign define Sign4 text=\\ ab linehl=Comment", 'E239:') |
116 | 116 |
117 " define sign with whitespace | 117 " define sign with whitespace |
118 sign define Sign4 text=\ X linehl=Comment | 118 sign define Sign4 text=\ X linehl=Comment |
119 sign undefine Sign4 | 119 sign undefine Sign4 |
120 sign define Sign4 linehl=Comment text=\ X | 120 sign define Sign4 linehl=Comment text=\ X |
128 " define sign with backslash | 128 " define sign with backslash |
129 sign define Sign4 text=\\\\ linehl=Comment | 129 sign define Sign4 text=\\\\ linehl=Comment |
130 sign undefine Sign4 | 130 sign undefine Sign4 |
131 sign define Sign4 text=\\ linehl=Comment | 131 sign define Sign4 text=\\ linehl=Comment |
132 sign undefine Sign4 | 132 sign undefine Sign4 |
133 | |
134 " Error cases | |
135 call assert_fails("exe 'sign place abc line=3 name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
136 call assert_fails("exe 'sign unplace abc name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
137 call assert_fails("exe 'sign place 1abc line=3 name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
138 call assert_fails("exe 'sign unplace 2abc name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
139 call assert_fails("sign unplace 2 *", 'E474:') | |
140 call assert_fails("exe 'sign place 1 line=3 name=Sign1 buffer=' . bufnr('%') a", 'E488:') | |
141 call assert_fails("exe 'sign place name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
142 call assert_fails("exe 'sign place line=10 buffer=' . bufnr('%')", 'E474:') | |
143 call assert_fails("exe 'sign unplace 2 line=10 buffer=' . bufnr('%')", 'E474:') | |
144 call assert_fails("exe 'sign unplace 2 name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
145 call assert_fails("exe 'sign place 2 line=3 buffer=' . bufnr('%')", 'E474:') | |
146 call assert_fails("sign place 2", 'E474:') | |
147 call assert_fails("sign place abc", 'E474:') | |
148 call assert_fails("sign place 5 line=3", 'E474:') | |
149 call assert_fails("sign place 5 name=Sign1", 'E474:') | |
150 call assert_fails("sign place 5 group=g1", 'E474:') | |
151 call assert_fails("sign place 5 group=*", 'E474:') | |
152 call assert_fails("sign place 5 priority=10", 'E474:') | |
153 call assert_fails("sign place 5 line=3 name=Sign1", 'E474:') | |
154 call assert_fails("sign place 5 group=g1 line=3 name=Sign1", 'E474:') | |
133 | 155 |
134 " After undefining the sign, we should no longer be able to place it. | 156 " After undefining the sign, we should no longer be able to place it. |
135 sign undefine Sign1 | 157 sign undefine Sign1 |
136 sign undefine Sign2 | 158 sign undefine Sign2 |
137 sign undefine Sign3 | 159 sign undefine Sign3 |
150 exe 'sign place 41 line=1 name=Sign buffer=' . bufnr('%') | 172 exe 'sign place 41 line=1 name=Sign buffer=' . bufnr('%') |
151 sign undefine Sign | 173 sign undefine Sign |
152 | 174 |
153 " Listing placed sign should show that sign is deleted. | 175 " Listing placed sign should show that sign is deleted. |
154 let a=execute('sign place') | 176 let a=execute('sign place') |
155 call assert_equal("\n--- Signs ---\nSigns for foobar:\n line=1 id=41 name=[Deleted]\n", a) | 177 call assert_equal("\n--- Signs ---\nSigns for foobar:\n line=1 id=41 name=[Deleted] priority=10\n", a) |
156 | 178 |
157 sign unplace 41 | 179 sign unplace 41 |
158 let a=execute('sign place') | 180 let a=execute('sign place') |
159 call assert_equal("\n--- Signs ---\n", a) | 181 call assert_equal("\n--- Signs ---\n", a) |
160 endfunc | 182 endfunc |
200 sign undefine Sign1 | 222 sign undefine Sign1 |
201 sign undefine Sign2 | 223 sign undefine Sign2 |
202 endfunc | 224 endfunc |
203 | 225 |
204 func Test_sign_invalid_commands() | 226 func Test_sign_invalid_commands() |
227 sign define Sign1 text=x | |
228 | |
205 call assert_fails('sign', 'E471:') | 229 call assert_fails('sign', 'E471:') |
206 call assert_fails('sign jump', 'E471:') | 230 call assert_fails('sign jump', 'E471:') |
207 call assert_fails('sign xxx', 'E160:') | 231 call assert_fails('sign xxx', 'E160:') |
208 call assert_fails('sign define', 'E156:') | 232 call assert_fails('sign define', 'E156:') |
209 call assert_fails('sign define Sign1 xxx', 'E475:') | 233 call assert_fails('sign define Sign1 xxx', 'E475:') |
210 call assert_fails('sign undefine', 'E156:') | 234 call assert_fails('sign undefine', 'E156:') |
211 call assert_fails('sign list xxx', 'E155:') | 235 call assert_fails('sign list xxx', 'E155:') |
212 call assert_fails('sign place 1 buffer=999', 'E158:') | 236 call assert_fails('sign place 1 buffer=999', 'E158:') |
213 call assert_fails('sign define Sign2 text=', 'E239:') | 237 call assert_fails('sign define Sign2 text=', 'E239:') |
238 " Non-numeric identifier for :sign place | |
239 call assert_fails("exe 'sign place abc line=3 name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
240 " Non-numeric identifier for :sign unplace | |
241 call assert_fails("exe 'sign unplace abc name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
242 " Number followed by an alphabet as sign identifier for :sign place | |
243 call assert_fails("exe 'sign place 1abc line=3 name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
244 " Number followed by an alphabet as sign identifier for :sign unplace | |
245 call assert_fails("exe 'sign unplace 2abc name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
246 " Sign identifier and '*' for :sign unplace | |
247 call assert_fails("sign unplace 2 *", 'E474:') | |
248 " Trailing characters after buffer number for :sign place | |
249 call assert_fails("exe 'sign place 1 line=3 name=Sign1 buffer=' . bufnr('%') . 'xxx'", 'E488:') | |
250 " Trailing characters after buffer number for :sign unplace | |
251 call assert_fails("exe 'sign unplace 1 buffer=' . bufnr('%') . 'xxx'", 'E488:') | |
252 call assert_fails("exe 'sign unplace * buffer=' . bufnr('%') . 'xxx'", 'E488:') | |
253 call assert_fails("sign unplace 1 xxx", 'E474:') | |
254 call assert_fails("sign unplace * xxx", 'E474:') | |
255 call assert_fails("sign unplace xxx", 'E474:') | |
256 " Placing a sign without line number | |
257 call assert_fails("exe 'sign place name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
258 " Placing a sign without sign name | |
259 call assert_fails("exe 'sign place line=10 buffer=' . bufnr('%')", 'E474:') | |
260 " Unplacing a sign with line number | |
261 call assert_fails("exe 'sign unplace 2 line=10 buffer=' . bufnr('%')", 'E474:') | |
262 " Unplacing a sign with sign name | |
263 call assert_fails("exe 'sign unplace 2 name=Sign1 buffer=' . bufnr('%')", 'E474:') | |
264 " Placing a sign without sign name | |
265 call assert_fails("exe 'sign place 2 line=3 buffer=' . bufnr('%')", 'E474:') | |
266 " Placing a sign with only sign identifier | |
267 call assert_fails("sign place 2", 'E474:') | |
268 " Placing a sign with only a name | |
269 call assert_fails("sign place abc", 'E474:') | |
270 " Placing a sign with only line number | |
271 call assert_fails("sign place 5 line=3", 'E474:') | |
272 " Placing a sign with only sign name | |
273 call assert_fails("sign place 5 name=Sign1", 'E474:') | |
274 " Placing a sign with only sign group | |
275 call assert_fails("sign place 5 group=g1", 'E474:') | |
276 call assert_fails("sign place 5 group=*", 'E474:') | |
277 " Placing a sign with only sign priority | |
278 call assert_fails("sign place 5 priority=10", 'E474:') | |
279 " Placing a sign without buffer number or file name | |
280 call assert_fails("sign place 5 line=3 name=Sign1", 'E474:') | |
281 call assert_fails("sign place 5 group=g1 line=3 name=Sign1", 'E474:') | |
282 | |
283 sign undefine Sign1 | |
214 endfunc | 284 endfunc |
215 | 285 |
216 func Test_sign_delete_buffer() | 286 func Test_sign_delete_buffer() |
217 new | 287 new |
218 sign define Sign text=x | 288 sign define Sign text=x |
222 exe 'sign place 61 line=3 name=Sign buffer=' . bufnr | 292 exe 'sign place 61 line=3 name=Sign buffer=' . bufnr |
223 call assert_fails('sign jump 61 buffer=' . bufnr, 'E934:') | 293 call assert_fails('sign jump 61 buffer=' . bufnr, 'E934:') |
224 sign unplace 61 | 294 sign unplace 61 |
225 sign undefine Sign | 295 sign undefine Sign |
226 endfunc | 296 endfunc |
297 | |
298 " Test for VimL functions for managing signs | |
299 func Test_sign_funcs() | |
300 " Remove all the signs | |
301 call sign_unplace('*') | |
302 call sign_undefine() | |
303 | |
304 " Tests for sign_define() | |
305 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'} | |
306 call assert_equal(0, sign_define("sign1", attr)) | |
307 call assert_equal([{'name' : 'sign1', 'texthl' : 'Error', | |
308 \ 'linehl' : 'Search', 'text' : '=>'}], sign_getdefined()) | |
309 | |
310 " Define a new sign without attributes and then update it | |
311 call sign_define("sign2") | |
312 let attr = {'text' : '!!', 'linehl' : 'DiffAdd', 'texthl' : 'DiffChange', | |
313 \ 'icon' : 'sign2.ico'} | |
314 try | |
315 call sign_define("sign2", attr) | |
316 catch /E255:/ | |
317 " ignore error: E255: Couldn't read in sign data! | |
318 " This error can happen when running in gui. | |
319 endtry | |
320 call assert_equal([{'name' : 'sign2', 'texthl' : 'DiffChange', | |
321 \ 'linehl' : 'DiffAdd', 'text' : '!!', 'icon' : 'sign2.ico'}], | |
322 \ sign_getdefined("sign2")) | |
323 | |
324 " Test for a sign name with digits | |
325 call assert_equal(0, sign_define(0002, {'linehl' : 'StatusLine'})) | |
326 call assert_equal([{'name' : '2', 'linehl' : 'StatusLine'}], | |
327 \ sign_getdefined(0002)) | |
328 call sign_undefine(0002) | |
329 | |
330 " Tests for invalid arguments to sign_define() | |
331 call assert_fails('call sign_define("sign4", {"text" : "===>"})', 'E239:') | |
332 call assert_fails('call sign_define("sign5", {"text" : ""})', 'E239:') | |
333 call assert_fails('call sign_define([])', 'E730:') | |
334 call assert_fails('call sign_define("sign6", [])', 'E715:') | |
335 | |
336 " Tests for sign_getdefined() | |
337 call assert_equal([], sign_getdefined("none")) | |
338 call assert_fails('call sign_getdefined({})', 'E731:') | |
339 | |
340 " Tests for sign_place() | |
341 call writefile(repeat(["Sun is shining"], 30), "Xsign") | |
342 edit Xsign | |
343 | |
344 call assert_equal(10, sign_place(10, '', 'sign1', 'Xsign', | |
345 \ {'lnum' : 20})) | |
346 call assert_equal([{'bufnr' : bufnr(''), 'signs' : | |
347 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1', | |
348 \ 'priority' : 10}]}], sign_getplaced('Xsign')) | |
349 call assert_equal([{'bufnr' : bufnr(''), 'signs' : | |
350 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1', | |
351 \ 'priority' : 10}]}], | |
352 \ sign_getplaced('Xsign', {'lnum' : 20})) | |
353 call assert_equal([{'bufnr' : bufnr(''), 'signs' : | |
354 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1', | |
355 \ 'priority' : 10}]}], | |
356 \ sign_getplaced('Xsign', {'id' : 10})) | |
357 | |
358 " Tests for invalid arguments to sign_place() | |
359 call assert_fails('call sign_place([], "", "mySign", 1)', 'E745:') | |
360 call assert_fails('call sign_place(5, "", "mySign", -1)', 'E158:') | |
361 call assert_fails('call sign_place(-1, "", "sign1", "Xsign", [])', | |
362 \ 'E474:') | |
363 call assert_fails('call sign_place(-1, "", "sign1", "Xsign", | |
364 \ {"lnum" : 30})', 'E474:') | |
365 call assert_fails('call sign_place(10, "", "xsign1x", "Xsign", | |
366 \ {"lnum" : 30})', 'E155:') | |
367 call assert_fails('call sign_place(10, "", "", "Xsign", | |
368 \ {"lnum" : 30})', 'E155:') | |
369 call assert_fails('call sign_place(10, "", [], "Xsign", | |
370 \ {"lnum" : 30})', 'E730:') | |
371 call assert_fails('call sign_place(5, "", "sign1", "abcxyz.xxx", | |
372 \ {"lnum" : 10})', 'E158:') | |
373 call assert_fails('call sign_place(5, "", "sign1", "", {"lnum" : 10})', | |
374 \ 'E158:') | |
375 call assert_fails('call sign_place(5, "", "sign1", [], {"lnum" : 10})', | |
376 \ 'E158:') | |
377 call assert_fails('call sign_place(21, "", "sign1", "Xsign", | |
378 \ {"lnum" : -1})', 'E885:') | |
379 call assert_fails('call sign_place(22, "", "sign1", "Xsign", | |
380 \ {"lnum" : 0})', 'E885:') | |
381 call assert_equal(-1, sign_place(1, "*", "sign1", "Xsign", {"lnum" : 10})) | |
382 | |
383 " Tests for sign_getplaced() | |
384 call assert_equal([{'bufnr' : bufnr(''), 'signs' : | |
385 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1', | |
386 \ 'priority' : 10}]}], | |
387 \ sign_getplaced(bufnr('Xsign'))) | |
388 call assert_equal([{'bufnr' : bufnr(''), 'signs' : | |
389 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1', | |
390 \ 'priority' : 10}]}], | |
391 \ sign_getplaced()) | |
392 call assert_fails("call sign_getplaced('dummy.sign')", 'E158:') | |
393 call assert_fails('call sign_getplaced("")', 'E158:') | |
394 call assert_fails('call sign_getplaced(-1)', 'E158:') | |
395 call assert_fails('call sign_getplaced("Xsign", [])', 'E715:') | |
396 call assert_equal([{'bufnr' : bufnr(''), 'signs' : []}], | |
397 \ sign_getplaced('Xsign', {'lnum' : 1000000})) | |
398 call assert_fails("call sign_getplaced('Xsign', {'lnum' : []})", | |
399 \ 'E745:') | |
400 call assert_equal([{'bufnr' : bufnr(''), 'signs' : []}], | |
401 \ sign_getplaced('Xsign', {'id' : 44})) | |
402 call assert_fails("call sign_getplaced('Xsign', {'id' : []})", | |
403 \ 'E745:') | |
404 | |
405 " Tests for sign_unplace() | |
406 call sign_place(20, '', 'sign2', 'Xsign', {"lnum" : 30}) | |
407 call assert_equal(0, sign_unplace('', | |
408 \ {'id' : 20, 'buffer' : 'Xsign'})) | |
409 call assert_equal(-1, sign_unplace('', | |
410 \ {'id' : 30, 'buffer' : 'Xsign'})) | |
411 call sign_place(20, '', 'sign2', 'Xsign', {"lnum" : 30}) | |
412 call assert_fails("call sign_unplace('', | |
413 \ {'id' : 20, 'buffer' : 'buffer.c'})", 'E158:') | |
414 call assert_fails("call sign_unplace('', | |
415 \ {'id' : 20, 'buffer' : ''})", 'E158:') | |
416 call assert_fails("call sign_unplace('', | |
417 \ {'id' : 20, 'buffer' : 200})", 'E158:') | |
418 call assert_fails("call sign_unplace('', 'mySign')", 'E715:') | |
419 | |
420 " Tests for sign_undefine() | |
421 call assert_equal(0, sign_undefine("sign1")) | |
422 call assert_equal([], sign_getdefined("sign1")) | |
423 call assert_fails('call sign_undefine("none")', 'E155:') | |
424 call assert_fails('call sign_undefine([])', 'E730:') | |
425 | |
426 call delete("Xsign") | |
427 call sign_unplace('*') | |
428 call sign_undefine() | |
429 enew | only | |
430 endfunc | |
431 | |
432 " Tests for sign groups | |
433 func Test_sign_group() | |
434 enew | only | |
435 " Remove all the signs | |
436 call sign_unplace('*') | |
437 call sign_undefine() | |
438 | |
439 call writefile(repeat(["Sun is shining"], 30), "Xsign") | |
440 | |
441 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'} | |
442 call assert_equal(0, sign_define("sign1", attr)) | |
443 | |
444 edit Xsign | |
445 let bnum = bufnr('%') | |
446 let fname = fnamemodify('Xsign', ':p') | |
447 | |
448 " Error case | |
449 call assert_fails("call sign_place(5, [], 'sign1', 'Xsign', | |
450 \ {'lnum' : 30})", 'E730:') | |
451 | |
452 " place three signs with the same identifier. One in the global group and | |
453 " others in the named groups | |
454 call assert_equal(5, sign_place(5, '', 'sign1', 'Xsign', | |
455 \ {'lnum' : 10})) | |
456 call assert_equal(5, sign_place(5, 'g1', 'sign1', bnum, {'lnum' : 20})) | |
457 call assert_equal(5, sign_place(5, 'g2', 'sign1', bnum, {'lnum' : 30})) | |
458 | |
459 " Test for sign_getplaced() with group | |
460 let s = sign_getplaced('Xsign') | |
461 call assert_equal(1, len(s[0].signs)) | |
462 call assert_equal(s[0].signs[0].group, '') | |
463 let s = sign_getplaced(bnum, {'group' : 'g2'}) | |
464 call assert_equal('g2', s[0].signs[0].group) | |
465 let s = sign_getplaced(bnum, {'group' : 'g3'}) | |
466 call assert_equal([], s[0].signs) | |
467 let s = sign_getplaced(bnum, {'group' : '*'}) | |
468 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10, | |
469 \ 'priority' : 10}, | |
470 \ {'id' : 5, 'group' : 'g1', 'name' : 'sign1', 'lnum' : 20, | |
471 \ 'priority' : 10}, | |
472 \ {'id' : 5, 'group' : 'g2', 'name' : 'sign1', 'lnum' : 30, | |
473 \ 'priority' : 10}], | |
474 \ s[0].signs) | |
475 | |
476 " Test for sign_getplaced() with id | |
477 let s = sign_getplaced(bnum, {'id' : 5}) | |
478 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10, | |
479 \ 'priority' : 10}], | |
480 \ s[0].signs) | |
481 let s = sign_getplaced(bnum, {'id' : 5, 'group' : 'g2'}) | |
482 call assert_equal( | |
483 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2', | |
484 \ 'priority' : 10}], | |
485 \ s[0].signs) | |
486 let s = sign_getplaced(bnum, {'id' : 5, 'group' : '*'}) | |
487 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10, | |
488 \ 'priority' : 10}, | |
489 \ {'id' : 5, 'group' : 'g1', 'name' : 'sign1', 'lnum' : 20, | |
490 \ 'priority' : 10}, | |
491 \ {'id' : 5, 'group' : 'g2', 'name' : 'sign1', 'lnum' : 30, | |
492 \ 'priority' : 10}], | |
493 \ s[0].signs) | |
494 let s = sign_getplaced(bnum, {'id' : 5, 'group' : 'g3'}) | |
495 call assert_equal([], s[0].signs) | |
496 | |
497 " Test for sign_getplaced() with lnum | |
498 let s = sign_getplaced(bnum, {'lnum' : 20}) | |
499 call assert_equal([], s[0].signs) | |
500 let s = sign_getplaced(bnum, {'lnum' : 20, 'group' : 'g1'}) | |
501 call assert_equal( | |
502 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : 'g1', | |
503 \ 'priority' : 10}], | |
504 \ s[0].signs) | |
505 let s = sign_getplaced(bnum, {'lnum' : 30, 'group' : '*'}) | |
506 call assert_equal( | |
507 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2', | |
508 \ 'priority' : 10}], | |
509 \ s[0].signs) | |
510 let s = sign_getplaced(bnum, {'lnum' : 40, 'group' : '*'}) | |
511 call assert_equal([], s[0].signs) | |
512 | |
513 " Error case | |
514 call assert_fails("call sign_getplaced(bnum, {'group' : []})", | |
515 \ 'E730:') | |
516 | |
517 " Clear the sign in global group | |
518 call sign_unplace('', {'id' : 5, 'buffer' : bnum}) | |
519 let s = sign_getplaced(bnum, {'group' : '*'}) | |
520 call assert_equal([ | |
521 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : 'g1', | |
522 \ 'priority' : 10}, | |
523 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2', | |
524 \ 'priority' : 10}], | |
525 \ s[0].signs) | |
526 | |
527 " Clear the sign in one of the groups | |
528 call sign_unplace('g1', {'buffer' : 'Xsign'}) | |
529 let s = sign_getplaced(bnum, {'group' : '*'}) | |
530 call assert_equal([ | |
531 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2', | |
532 \ 'priority' : 10}], | |
533 \ s[0].signs) | |
534 | |
535 " Clear all the signs from the buffer | |
536 call sign_unplace('*', {'buffer' : bnum}) | |
537 call assert_equal([], sign_getplaced(bnum, {'group' : '*'})[0].signs) | |
538 | |
539 " Clear sign across groups using an identifier | |
540 call sign_place(25, '', 'sign1', bnum, {'lnum' : 10}) | |
541 call sign_place(25, 'g1', 'sign1', bnum, {'lnum' : 11}) | |
542 call sign_place(25, 'g2', 'sign1', bnum, {'lnum' : 12}) | |
543 call assert_equal(0, sign_unplace('*', {'id' : 25})) | |
544 call assert_equal([], sign_getplaced(bnum, {'group' : '*'})[0].signs) | |
545 | |
546 " Error case | |
547 call assert_fails("call sign_unplace([])", 'E474:') | |
548 | |
549 " Place a sign in the global group and try to delete it using a group | |
550 call assert_equal(5, sign_place(5, '', 'sign1', bnum, {'lnum' : 10})) | |
551 call assert_equal(-1, sign_unplace('g1', {'id' : 5})) | |
552 | |
553 " Place signs in multiple groups and delete all the signs in one of the | |
554 " group | |
555 call assert_equal(5, sign_place(5, '', 'sign1', bnum, {'lnum' : 10})) | |
556 call assert_equal(6, sign_place(6, '', 'sign1', bnum, {'lnum' : 11})) | |
557 call assert_equal(5, sign_place(5, 'g1', 'sign1', bnum, {'lnum' : 10})) | |
558 call assert_equal(5, sign_place(5, 'g2', 'sign1', bnum, {'lnum' : 10})) | |
559 call assert_equal(6, sign_place(6, 'g1', 'sign1', bnum, {'lnum' : 11})) | |
560 call assert_equal(6, sign_place(6, 'g2', 'sign1', bnum, {'lnum' : 11})) | |
561 call assert_equal(0, sign_unplace('g1')) | |
562 let s = sign_getplaced(bnum, {'group' : 'g1'}) | |
563 call assert_equal([], s[0].signs) | |
564 let s = sign_getplaced(bnum) | |
565 call assert_equal(2, len(s[0].signs)) | |
566 let s = sign_getplaced(bnum, {'group' : 'g2'}) | |
567 call assert_equal('g2', s[0].signs[0].group) | |
568 call assert_equal(0, sign_unplace('', {'id' : 5})) | |
569 call assert_equal(0, sign_unplace('', {'id' : 6})) | |
570 let s = sign_getplaced(bnum, {'group' : 'g2'}) | |
571 call assert_equal('g2', s[0].signs[0].group) | |
572 call assert_equal(0, sign_unplace('', {'buffer' : bnum})) | |
573 | |
574 call sign_unplace('*') | |
575 | |
576 " Test for :sign command and groups | |
577 exe 'sign place 5 line=10 name=sign1 file=' . fname | |
578 exe 'sign place 5 group=g1 line=10 name=sign1 file=' . fname | |
579 exe 'sign place 5 group=g2 line=10 name=sign1 file=' . fname | |
580 | |
581 " Test for :sign place group={group} file={fname} | |
582 let a = execute('sign place file=' . fname) | |
583 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 name=sign1 priority=10\n", a) | |
584 | |
585 let a = execute('sign place group=g2 file=' . fname) | |
586 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 group=g2 name=sign1 priority=10\n", a) | |
587 | |
588 let a = execute('sign place group=* file=' . fname) | |
589 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
590 \ " line=10 id=5 group=g2 name=sign1 priority=10\n" . | |
591 \ " line=10 id=5 group=g1 name=sign1 priority=10\n" . | |
592 \ " line=10 id=5 name=sign1 priority=10\n", a) | |
593 | |
594 let a = execute('sign place group=xyz file=' . fname) | |
595 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a) | |
596 | |
597 call sign_unplace('*') | |
598 | |
599 " Test for :sign place group={group} buffer={nr} | |
600 let bnum = bufnr('Xsign') | |
601 exe 'sign place 5 line=10 name=sign1 buffer=' . bnum | |
602 exe 'sign place 5 group=g1 line=11 name=sign1 buffer=' . bnum | |
603 exe 'sign place 5 group=g2 line=12 name=sign1 buffer=' . bnum | |
604 | |
605 let a = execute('sign place buffer=' . bnum) | |
606 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=10 id=5 name=sign1 priority=10\n", a) | |
607 | |
608 let a = execute('sign place group=g2 buffer=' . bnum) | |
609 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n line=12 id=5 group=g2 name=sign1 priority=10\n", a) | |
610 | |
611 let a = execute('sign place group=* buffer=' . bnum) | |
612 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
613 \ " line=10 id=5 name=sign1 priority=10\n" . | |
614 \ " line=11 id=5 group=g1 name=sign1 priority=10\n" . | |
615 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a) | |
616 | |
617 let a = execute('sign place group=xyz buffer=' . bnum) | |
618 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a) | |
619 | |
620 let a = execute('sign place group=*') | |
621 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
622 \ " line=10 id=5 name=sign1 priority=10\n" . | |
623 \ " line=11 id=5 group=g1 name=sign1 priority=10\n" . | |
624 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a) | |
625 | |
626 " Test for :sign unplace | |
627 exe 'sign unplace 5 group=g2 file=' . fname | |
628 call assert_equal([], sign_getplaced(bnum, {'group' : 'g2'})[0].signs) | |
629 | |
630 exe 'sign unplace 5 group=g1 buffer=' . bnum | |
631 call assert_equal([], sign_getplaced(bnum, {'group' : 'g1'})[0].signs) | |
632 | |
633 exe 'sign unplace 5 group=xy file=' . fname | |
634 call assert_equal(1, len(sign_getplaced(bnum, {'group' : '*'})[0].signs)) | |
635 | |
636 " Test for removing all the signs. Place the signs again for this test | |
637 exe 'sign place 5 group=g1 line=11 name=sign1 file=' . fname | |
638 exe 'sign place 5 group=g2 line=12 name=sign1 file=' . fname | |
639 exe 'sign place 6 line=20 name=sign1 file=' . fname | |
640 exe 'sign place 6 group=g1 line=21 name=sign1 file=' . fname | |
641 exe 'sign place 6 group=g2 line=22 name=sign1 file=' . fname | |
642 exe 'sign unplace 5 group=* file=' . fname | |
643 let a = execute('sign place group=*') | |
644 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
645 \ " line=20 id=6 name=sign1 priority=10\n" . | |
646 \ " line=21 id=6 group=g1 name=sign1 priority=10\n" . | |
647 \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a) | |
648 | |
649 " Remove all the signs from the global group | |
650 exe 'sign unplace * file=' . fname | |
651 let a = execute('sign place group=*') | |
652 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
653 \ " line=21 id=6 group=g1 name=sign1 priority=10\n" . | |
654 \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a) | |
655 | |
656 " Remove all the signs from a particular group | |
657 exe 'sign place 5 line=10 name=sign1 file=' . fname | |
658 exe 'sign place 5 group=g1 line=11 name=sign1 file=' . fname | |
659 exe 'sign place 5 group=g2 line=12 name=sign1 file=' . fname | |
660 exe 'sign unplace * group=g1 file=' . fname | |
661 let a = execute('sign place group=*') | |
662 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
663 \ " line=10 id=5 name=sign1 priority=10\n" . | |
664 \ " line=12 id=5 group=g2 name=sign1 priority=10\n" . | |
665 \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a) | |
666 | |
667 " Remove all the signs from all the groups in a file | |
668 exe 'sign place 5 group=g1 line=11 name=sign1 file=' . fname | |
669 exe 'sign place 6 line=20 name=sign1 file=' . fname | |
670 exe 'sign place 6 group=g1 line=21 name=sign1 file=' . fname | |
671 exe 'sign unplace * group=* file=' . fname | |
672 let a = execute('sign place group=*') | |
673 call assert_equal("\n--- Signs ---\n", a) | |
674 | |
675 " Remove a particular sign id in a group from all the files | |
676 exe 'sign place 5 group=g1 line=11 name=sign1 file=' . fname | |
677 sign unplace 5 group=g1 | |
678 let a = execute('sign place group=*') | |
679 call assert_equal("\n--- Signs ---\n", a) | |
680 | |
681 " Remove a particular sign id in all the groups from all the files | |
682 exe 'sign place 5 line=10 name=sign1 file=' . fname | |
683 exe 'sign place 5 group=g1 line=11 name=sign1 file=' . fname | |
684 exe 'sign place 5 group=g2 line=12 name=sign1 file=' . fname | |
685 exe 'sign place 6 line=20 name=sign1 file=' . fname | |
686 exe 'sign place 6 group=g1 line=21 name=sign1 file=' . fname | |
687 exe 'sign place 6 group=g2 line=22 name=sign1 file=' . fname | |
688 sign unplace 5 group=* | |
689 let a = execute('sign place group=*') | |
690 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
691 \ " line=20 id=6 name=sign1 priority=10\n" . | |
692 \ " line=21 id=6 group=g1 name=sign1 priority=10\n" . | |
693 \ " line=22 id=6 group=g2 name=sign1 priority=10\n", a) | |
694 | |
695 " Remove all the signs from all the groups in all the files | |
696 exe 'sign place 5 line=10 name=sign1 file=' . fname | |
697 exe 'sign place 5 group=g1 line=11 name=sign1 file=' . fname | |
698 sign unplace * group=* | |
699 let a = execute('sign place group=*') | |
700 call assert_equal("\n--- Signs ---\n", a) | |
701 | |
702 " Error cases | |
703 call assert_fails("exe 'sign place 3 group= name=sign1 buffer=' . bnum", 'E474:') | |
704 | |
705 call delete("Xsign") | |
706 call sign_unplace('*') | |
707 call sign_undefine() | |
708 enew | only | |
709 endfunc | |
710 | |
711 " Tests for auto-generating the sign identifier | |
712 func Test_sign_id_autogen() | |
713 enew | only | |
714 call sign_unplace('*') | |
715 call sign_undefine() | |
716 | |
717 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'} | |
718 call assert_equal(0, sign_define("sign1", attr)) | |
719 | |
720 call writefile(repeat(["Sun is shining"], 30), "Xsign") | |
721 edit Xsign | |
722 | |
723 call assert_equal(1, sign_place(0, '', 'sign1', 'Xsign', | |
724 \ {'lnum' : 10})) | |
725 call assert_equal(2, sign_place(2, '', 'sign1', 'Xsign', | |
726 \ {'lnum' : 12})) | |
727 call assert_equal(3, sign_place(0, '', 'sign1', 'Xsign', | |
728 \ {'lnum' : 14})) | |
729 call sign_unplace('', {'buffer' : 'Xsign', 'id' : 2}) | |
730 call assert_equal(2, sign_place(0, '', 'sign1', 'Xsign', | |
731 \ {'lnum' : 12})) | |
732 | |
733 call assert_equal(1, sign_place(0, 'g1', 'sign1', 'Xsign', | |
734 \ {'lnum' : 11})) | |
735 call assert_equal(0, sign_unplace('g1', {'id' : 1})) | |
736 call assert_equal(10, | |
737 \ sign_getplaced('Xsign', {'id' : 1})[0].signs[0].lnum) | |
738 | |
739 call delete("Xsign") | |
740 call sign_unplace('*') | |
741 call sign_undefine() | |
742 enew | only | |
743 endfunc | |
744 | |
745 " Test for sign priority | |
746 func Test_sign_priority() | |
747 enew | only | |
748 call sign_unplace('*') | |
749 call sign_undefine() | |
750 | |
751 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Search'} | |
752 call sign_define("sign1", attr) | |
753 call sign_define("sign2", attr) | |
754 call sign_define("sign3", attr) | |
755 | |
756 " Place three signs with different priority in the same line | |
757 call writefile(repeat(["Sun is shining"], 30), "Xsign") | |
758 edit Xsign | |
759 let fname = fnamemodify('Xsign', ':p') | |
760 | |
761 call sign_place(1, 'g1', 'sign1', 'Xsign', | |
762 \ {'lnum' : 11, 'priority' : 50}) | |
763 call sign_place(2, 'g2', 'sign2', 'Xsign', | |
764 \ {'lnum' : 11, 'priority' : 100}) | |
765 call sign_place(3, '', 'sign3', 'Xsign', {'lnum' : 11}) | |
766 let s = sign_getplaced('Xsign', {'group' : '*'}) | |
767 call assert_equal([ | |
768 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 11, 'group' : 'g2', | |
769 \ 'priority' : 100}, | |
770 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11, 'group' : 'g1', | |
771 \ 'priority' : 50}, | |
772 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 11, 'group' : '', | |
773 \ 'priority' : 10}], | |
774 \ s[0].signs) | |
775 | |
776 " Error case | |
777 call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign', | |
778 \ [])", 'E715:') | |
779 call sign_unplace('*') | |
780 | |
781 " Tests for the :sign place command with priority | |
782 sign place 5 line=10 name=sign1 priority=30 file=Xsign | |
783 sign place 5 group=g1 line=10 name=sign1 priority=20 file=Xsign | |
784 sign place 5 group=g2 line=10 name=sign1 priority=25 file=Xsign | |
785 let a = execute('sign place group=*') | |
786 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
787 \ " line=10 id=5 name=sign1 priority=30\n" . | |
788 \ " line=10 id=5 group=g2 name=sign1 priority=25\n" . | |
789 \ " line=10 id=5 group=g1 name=sign1 priority=20\n", a) | |
790 | |
791 " Test for :sign place group={group} | |
792 let a = execute('sign place group=g1') | |
793 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" . | |
794 \ " line=10 id=5 group=g1 name=sign1 priority=20\n", a) | |
795 | |
796 call sign_unplace('*') | |
797 call sign_undefine() | |
798 enew | only | |
799 call delete("Xsign") | |
800 endfunc | |
801 | |
802 " Tests for memory allocation failures in sign functions | |
803 func Test_sign_memfailures() | |
804 call writefile(repeat(["Sun is shining"], 30), "Xsign") | |
805 edit Xsign | |
806 | |
807 call test_alloc_fail(GetAllocId('sign_getdefined'), 0, 0) | |
808 call assert_fails('call sign_getdefined("sign1")', 'E342:') | |
809 call test_alloc_fail(GetAllocId('sign_getplaced'), 0, 0) | |
810 call assert_fails('call sign_getplaced("Xsign")', 'E342:') | |
811 call test_alloc_fail(GetAllocId('sign_define_by_name'), 0, 0) | |
812 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'} | |
813 call assert_fails('call sign_define("sign1", attr)', 'E342:') | |
814 | |
815 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'} | |
816 call sign_define("sign1", attr) | |
817 call test_alloc_fail(GetAllocId('sign_getlist'), 0, 0) | |
818 call assert_fails('call sign_getdefined("sign1")', 'E342:') | |
819 | |
820 call sign_place(3, 'g1', 'sign1', 'Xsign', {'lnum' : 10}) | |
821 call test_alloc_fail(GetAllocId('sign_getplaced_dict'), 0, 0) | |
822 call assert_fails('call sign_getplaced("Xsign")', 'E342:') | |
823 call test_alloc_fail(GetAllocId('sign_getplaced_list'), 0, 0) | |
824 call assert_fails('call sign_getplaced("Xsign")', 'E342:') | |
825 | |
826 call test_alloc_fail(GetAllocId('insert_sign'), 0, 0) | |
827 call assert_fails('call sign_place(4, "g1", "sign1", "Xsign", {"lnum" : 11})', | |
828 \ 'E342:') | |
829 | |
830 call test_alloc_fail(GetAllocId('sign_getinfo'), 0, 0) | |
831 call assert_fails('call getbufinfo()', 'E342:') | |
832 call sign_place(4, 'g1', 'sign1', 'Xsign', {'lnum' : 11}) | |
833 call test_alloc_fail(GetAllocId('sign_getinfo'), 0, 0) | |
834 call assert_fails('let binfo=getbufinfo("Xsign")', 'E342:') | |
835 call assert_equal([{'lnum': 11, 'id': 4, 'name': 'sign1', | |
836 \ 'priority': 10, 'group': 'g1'}], binfo[0].signs) | |
837 | |
838 call sign_unplace('*') | |
839 call sign_undefine() | |
840 enew | only | |
841 call delete("Xsign") | |
842 endfunc |