blob: e23d9ac595deb5055c7fa114a8260ea9592b4cf7 [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
James McCoya80aad72021-12-22 19:45:28 +000018 call Sign_command_ignore_error('sign define Sign2 text=xy texthl=Title linehl=Error culhl=Search numhl=Number 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 ' .
James McCoya80aad72021-12-22 19:45:28 +000024 \ 'linehl=Error texthl=Title culhl=Search numhl=Number$', 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 an existing sign clears it
James McCoya80aad72021-12-22 19:45:28 +0000130 sign define SignY texthl=TextHl culhl=CulHl linehl=LineHl numhl=NumHl
Bram Moolenaar0bac5fc2021-12-05 17:45:49 +0000131 let sl = sign_getdefined('SignY')[0]
132 call assert_equal('TextHl', sl.texthl)
133 call assert_equal('CulHl', sl.culhl)
134 call assert_equal('LineHl', sl.linehl)
James McCoya80aad72021-12-22 19:45:28 +0000135 call assert_equal('NumHl', sl.numhl)
Bram Moolenaar0bac5fc2021-12-05 17:45:49 +0000136
James McCoya80aad72021-12-22 19:45:28 +0000137 sign define SignY texthl= culhl=CulHl linehl=LineHl numhl=NumHl
Bram Moolenaar0bac5fc2021-12-05 17:45:49 +0000138 let sl = sign_getdefined('SignY')[0]
139 call assert_false(has_key(sl, 'texthl'))
140 call assert_equal('CulHl', sl.culhl)
141 call assert_equal('LineHl', sl.linehl)
James McCoya80aad72021-12-22 19:45:28 +0000142 call assert_equal('NumHl', sl.numhl)
Bram Moolenaar0bac5fc2021-12-05 17:45:49 +0000143
144 sign define SignY linehl=
145 let sl = sign_getdefined('SignY')[0]
146 call assert_false(has_key(sl, 'linehl'))
147 call assert_equal('CulHl', sl.culhl)
James McCoya80aad72021-12-22 19:45:28 +0000148 call assert_equal('NumHl', sl.numhl)
Bram Moolenaar0bac5fc2021-12-05 17:45:49 +0000149
150 sign define SignY culhl=
151 let sl = sign_getdefined('SignY')[0]
152 call assert_false(has_key(sl, 'culhl'))
James McCoya80aad72021-12-22 19:45:28 +0000153 call assert_equal('NumHl', sl.numhl)
154
155 sign define SignY numhl=
156 let sl = sign_getdefined('SignY')[0]
157 call assert_false(has_key(sl, 'numhl'))
Bram Moolenaar0bac5fc2021-12-05 17:45:49 +0000158
159 sign undefine SignY
Bram Moolenaar5e18ccc2021-12-05 13:02:50 +0000160
Bram Moolenaar06b056e2018-12-14 19:37:08 +0100161 " define sign with whitespace
162 sign define Sign4 text=\ X linehl=Comment
163 sign undefine Sign4
164 sign define Sign4 linehl=Comment text=\ X
165 sign undefine Sign4
166
167 sign define Sign5 text=X\ linehl=Comment
168 sign undefine Sign5
169 sign define Sign5 linehl=Comment text=X\
170 sign undefine Sign5
171
172 " define sign with backslash
173 sign define Sign4 text=\\\\ linehl=Comment
174 sign undefine Sign4
175 sign define Sign4 text=\\ linehl=Comment
176 sign undefine Sign4
177
Bram Moolenaara3556522018-12-31 22:02:29 +0100178 " define a sign with a leading 0 in the name
179 sign unplace *
180 sign define 004 text=#> linehl=Comment
181 let a = execute('sign list 4')
182 call assert_equal("\nsign 4 text=#> linehl=Comment", a)
183 exe 'sign place 20 line=3 name=004 buffer=' . bufnr('')
184 let a = execute('sign place')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100185 call assert_equal("\n--- Signs ---\nSigns for foo:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100186 \ " line=3 id=20 name=4 priority=10\n", a)
Bram Moolenaara3556522018-12-31 22:02:29 +0100187 exe 'sign unplace 20 buffer=' . bufnr('')
188 sign undefine 004
189 call assert_fails('sign list 4', 'E155:')
190
Bram Moolenaar09de1752016-08-08 22:26:48 +0200191 " After undefining the sign, we should no longer be able to place it.
192 sign undefine Sign1
193 sign undefine Sign2
Bram Moolenaar446a9732016-08-10 21:36:23 +0200194 sign undefine Sign3
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100195 call assert_fails("sign place 41 line=3 name=Sign1 buffer=" .
196 \ bufnr('%'), 'E155:')
Bram Moolenaar446a9732016-08-10 21:36:23 +0200197endfunc
Bram Moolenaar09de1752016-08-08 22:26:48 +0200198
Bram Moolenaar446a9732016-08-10 21:36:23 +0200199" Undefining placed sign is not recommended.
200" Quoting :help sign
201"
202" :sign undefine {name}
203" Deletes a previously defined sign. If signs with this {name}
204" are still placed this will cause trouble.
205func Test_sign_undefine_still_placed()
206 new foobar
207 sign define Sign text=x
208 exe 'sign place 41 line=1 name=Sign buffer=' . bufnr('%')
209 sign undefine Sign
210
211 " Listing placed sign should show that sign is deleted.
212 let a=execute('sign place')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100213 call assert_equal("\n--- Signs ---\nSigns for foobar:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100214 \ " line=1 id=41 name=[Deleted] priority=10\n", a)
Bram Moolenaar446a9732016-08-10 21:36:23 +0200215
216 sign unplace 41
217 let a=execute('sign place')
218 call assert_equal("\n--- Signs ---\n", a)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200219endfunc
220
221func Test_sign_completion()
222 sign define Sign1 text=x
223 sign define Sign2 text=y
224
225 call feedkeys(":sign \<C-A>\<C-B>\"\<CR>", 'tx')
226 call assert_equal('"sign define jump list place undefine unplace', @:)
227
228 call feedkeys(":sign define Sign \<C-A>\<C-B>\"\<CR>", 'tx')
James McCoya80aad72021-12-22 19:45:28 +0000229 call assert_equal('"sign define Sign culhl= icon= linehl= numhl= text= texthl=', @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200230
James McCoya80aad72021-12-22 19:45:28 +0000231 for hl in ['culhl', 'linehl', 'numhl', 'texthl']
232 call feedkeys(":sign define Sign "..hl.."=Spell\<C-A>\<C-B>\"\<CR>", 'tx')
233 call assert_equal('"sign define Sign '..hl..'=SpellBad SpellCap ' .
234 \ 'SpellLocal SpellRare', @:)
235 endfor
Bram Moolenaar3678f652019-02-17 14:50:25 +0100236
237 call writefile(repeat(["Sun is shining"], 30), "XsignOne")
238 call writefile(repeat(["Sky is blue"], 30), "XsignTwo")
Bram Moolenaar64cefed2016-08-29 23:06:28 +0200239 call feedkeys(":sign define Sign icon=Xsig\<C-A>\<C-B>\"\<CR>", 'tx')
240 call assert_equal('"sign define Sign icon=XsignOne XsignTwo', @:)
Bram Moolenaar446a9732016-08-10 21:36:23 +0200241
Bram Moolenaar3678f652019-02-17 14:50:25 +0100242 " Test for completion of arguments to ':sign undefine'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200243 call feedkeys(":sign undefine \<C-A>\<C-B>\"\<CR>", 'tx')
244 call assert_equal('"sign undefine Sign1 Sign2', @:)
245
246 call feedkeys(":sign place 1 \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100247 call assert_equal('"sign place 1 buffer= file= group= line= name= priority=',
248 \ @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200249
250 call feedkeys(":sign place 1 name=\<C-A>\<C-B>\"\<CR>", 'tx')
251 call assert_equal('"sign place 1 name=Sign1 Sign2', @:)
252
Bram Moolenaar3678f652019-02-17 14:50:25 +0100253 edit XsignOne
254 sign place 1 name=Sign1 line=5
255 sign place 1 name=Sign1 group=g1 line=10
256 edit XsignTwo
257 sign place 1 name=Sign2 group=g2 line=15
258
259 " Test for completion of group= and file= arguments to ':sign place'
260 call feedkeys(":sign place 1 name=Sign1 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
261 call assert_equal('"sign place 1 name=Sign1 file=XsignOne XsignTwo', @:)
262 call feedkeys(":sign place 1 name=Sign1 group=\<C-A>\<C-B>\"\<CR>", 'tx')
263 call assert_equal('"sign place 1 name=Sign1 group=g1 g2', @:)
264
265 " Test for completion of arguments to 'sign place' without sign identifier
266 call feedkeys(":sign place \<C-A>\<C-B>\"\<CR>", 'tx')
267 call assert_equal('"sign place buffer= file= group=', @:)
268 call feedkeys(":sign place file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
269 call assert_equal('"sign place file=XsignOne XsignTwo', @:)
270 call feedkeys(":sign place group=\<C-A>\<C-B>\"\<CR>", 'tx')
271 call assert_equal('"sign place group=g1 g2', @:)
272 call feedkeys(":sign place group=g1 file=\<C-A>\<C-B>\"\<CR>", 'tx')
273 call assert_equal('"sign place group=g1 file=XsignOne XsignTwo', @:)
274
275 " Test for completion of arguments to ':sign unplace'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200276 call feedkeys(":sign unplace 1 \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100277 call assert_equal('"sign unplace 1 buffer= file= group=', @:)
Bram Moolenaar3678f652019-02-17 14:50:25 +0100278 call feedkeys(":sign unplace 1 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
279 call assert_equal('"sign unplace 1 file=XsignOne XsignTwo', @:)
280 call feedkeys(":sign unplace 1 group=\<C-A>\<C-B>\"\<CR>", 'tx')
281 call assert_equal('"sign unplace 1 group=g1 g2', @:)
282 call feedkeys(":sign unplace 1 group=g2 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
283 call assert_equal('"sign unplace 1 group=g2 file=XsignOne XsignTwo', @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200284
Bram Moolenaar3678f652019-02-17 14:50:25 +0100285 " Test for completion of arguments to ':sign list'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200286 call feedkeys(":sign list \<C-A>\<C-B>\"\<CR>", 'tx')
287 call assert_equal('"sign list Sign1 Sign2', @:)
288
Bram Moolenaar3678f652019-02-17 14:50:25 +0100289 " Test for completion of arguments to ':sign jump'
Bram Moolenaar09de1752016-08-08 22:26:48 +0200290 call feedkeys(":sign jump 1 \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100291 call assert_equal('"sign jump 1 buffer= file= group=', @:)
Bram Moolenaar3678f652019-02-17 14:50:25 +0100292 call feedkeys(":sign jump 1 file=Xsign\<C-A>\<C-B>\"\<CR>", 'tx')
293 call assert_equal('"sign jump 1 file=XsignOne XsignTwo', @:)
294 call feedkeys(":sign jump 1 group=\<C-A>\<C-B>\"\<CR>", 'tx')
295 call assert_equal('"sign jump 1 group=g1 g2', @:)
Bram Moolenaar09de1752016-08-08 22:26:48 +0200296
Bram Moolenaar3678f652019-02-17 14:50:25 +0100297 " Error cases
298 call feedkeys(":sign here\<C-A>\<C-B>\"\<CR>", 'tx')
299 call assert_equal('"sign here', @:)
300 call feedkeys(":sign define Sign here=\<C-A>\<C-B>\"\<CR>", 'tx')
301 call assert_equal("\"sign define Sign here=\<C-A>", @:)
302 call feedkeys(":sign place 1 here=\<C-A>\<C-B>\"\<CR>", 'tx')
303 call assert_equal("\"sign place 1 here=\<C-A>", @:)
304 call feedkeys(":sign jump 1 here=\<C-A>\<C-B>\"\<CR>", 'tx')
305 call assert_equal("\"sign jump 1 here=\<C-A>", @:)
306 call feedkeys(":sign here there\<C-A>\<C-B>\"\<CR>", 'tx')
307 call assert_equal("\"sign here there\<C-A>", @:)
308 call feedkeys(":sign here there=\<C-A>\<C-B>\"\<CR>", 'tx')
309 call assert_equal("\"sign here there=\<C-A>", @:)
310
311 sign unplace * group=*
Bram Moolenaar09de1752016-08-08 22:26:48 +0200312 sign undefine Sign1
313 sign undefine Sign2
Bram Moolenaar3678f652019-02-17 14:50:25 +0100314 enew
315 call delete('XsignOne')
316 call delete('XsignTwo')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200317endfunc
318
319func Test_sign_invalid_commands()
Bram Moolenaar162b7142018-12-21 15:17:36 +0100320 sign define Sign1 text=x
321
Bram Moolenaar09de1752016-08-08 22:26:48 +0200322 call assert_fails('sign', 'E471:')
Bram Moolenaar446a9732016-08-10 21:36:23 +0200323 call assert_fails('sign jump', 'E471:')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200324 call assert_fails('sign xxx', 'E160:')
325 call assert_fails('sign define', 'E156:')
Bram Moolenaar446a9732016-08-10 21:36:23 +0200326 call assert_fails('sign define Sign1 xxx', 'E475:')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200327 call assert_fails('sign undefine', 'E156:')
328 call assert_fails('sign list xxx', 'E155:')
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200329 call assert_fails('sign place 1 buffer=999', 'E158:')
Bram Moolenaara3556522018-12-31 22:02:29 +0100330 call assert_fails('sign place 1 name=Sign1 buffer=999', 'E158:')
331 call assert_fails('sign place buffer=999', 'E158:')
332 call assert_fails('sign jump buffer=999', 'E158:')
333 call assert_fails('sign jump 1 file=', 'E158:')
334 call assert_fails('sign jump 1 group=', 'E474:')
335 call assert_fails('sign jump 1 name=', 'E474:')
336 call assert_fails('sign jump 1 name=Sign1', 'E474:')
337 call assert_fails('sign jump 1 line=100', '474:')
Bram Moolenaar09de1752016-08-08 22:26:48 +0200338 call assert_fails('sign define Sign2 text=', 'E239:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100339 " Non-numeric identifier for :sign place
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100340 call assert_fails("sign place abc line=3 name=Sign1 buffer=" . bufnr(''),
341 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100342 " Non-numeric identifier for :sign unplace
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100343 call assert_fails("sign unplace abc name=Sign1 buffer=" . bufnr(''),
344 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100345 " Number followed by an alphabet as sign identifier for :sign place
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100346 call assert_fails("sign place 1abc line=3 name=Sign1 buffer=" . bufnr(''),
347 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100348 " Number followed by an alphabet as sign identifier for :sign unplace
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100349 call assert_fails("sign unplace 2abc name=Sign1 buffer=" . bufnr(''),
350 \ 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100351 " Sign identifier and '*' for :sign unplace
352 call assert_fails("sign unplace 2 *", 'E474:')
353 " Trailing characters after buffer number for :sign place
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100354 call assert_fails("sign place 1 line=3 name=Sign1 buffer=" .
355 \ bufnr('%') . 'xxx', 'E488:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100356 " Trailing characters after buffer number for :sign unplace
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100357 call assert_fails("sign unplace 1 buffer=" . bufnr('%') . 'xxx', 'E488:')
358 call assert_fails("sign unplace * buffer=" . bufnr('%') . 'xxx', 'E488:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100359 call assert_fails("sign unplace 1 xxx", 'E474:')
360 call assert_fails("sign unplace * xxx", 'E474:')
361 call assert_fails("sign unplace xxx", 'E474:')
362 " Placing a sign without line number
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100363 call assert_fails("sign place name=Sign1 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100364 " Placing a sign without sign name
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100365 call assert_fails("sign place line=10 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100366 " Unplacing a sign with line number
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100367 call assert_fails("sign unplace 2 line=10 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100368 " Unplacing a sign with sign name
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100369 call assert_fails("sign unplace 2 name=Sign1 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100370 " Placing a sign without sign name
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100371 call assert_fails("sign place 2 line=3 buffer=" . bufnr('%'), 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100372 " Placing a sign with only sign identifier
373 call assert_fails("sign place 2", 'E474:')
374 " Placing a sign with only a name
375 call assert_fails("sign place abc", 'E474:')
376 " Placing a sign with only line number
377 call assert_fails("sign place 5 line=3", 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100378 " Placing a sign with only sign group
379 call assert_fails("sign place 5 group=g1", 'E474:')
380 call assert_fails("sign place 5 group=*", 'E474:')
381 " Placing a sign with only sign priority
382 call assert_fails("sign place 5 priority=10", 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100383
384 sign undefine Sign1
Bram Moolenaar09de1752016-08-08 22:26:48 +0200385endfunc
Bram Moolenaarbfd096d2016-08-17 22:29:09 +0200386
387func Test_sign_delete_buffer()
388 new
389 sign define Sign text=x
390 let bufnr = bufnr('%')
391 new
392 exe 'bd ' . bufnr
393 exe 'sign place 61 line=3 name=Sign buffer=' . bufnr
394 call assert_fails('sign jump 61 buffer=' . bufnr, 'E934:')
395 sign unplace 61
396 sign undefine Sign
397endfunc
Bram Moolenaar162b7142018-12-21 15:17:36 +0100398
Bram Moolenaard933c822019-08-21 13:45:16 +0200399" Ignore error: E255: Couldn't read in sign data!
400" This error can happen when running in the GUI.
401" Some gui like Motif do not support the png icon format.
402func Sign_command_ignore_error(cmd)
403 try
404 exe a:cmd
405 catch /E255:/
406 endtry
407endfunc
408
409" ignore error: E255: Couldn't read in sign data!
410" This error can happen when running in gui.
411func Sign_define_ignore_error(name, attr)
412 try
413 call sign_define(a:name, a:attr)
414 catch /E255:/
415 endtry
416endfunc
417
Bram Moolenaar6436cd82018-12-27 00:28:33 +0100418" Test for Vim script functions for managing signs
Bram Moolenaar162b7142018-12-21 15:17:36 +0100419func Test_sign_funcs()
420 " Remove all the signs
421 call sign_unplace('*')
422 call sign_undefine()
423
424 " Tests for sign_define()
Bram Moolenaare413ea02021-11-24 16:20:13 +0000425 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error',
James McCoya80aad72021-12-22 19:45:28 +0000426 \ 'culhl': 'Visual', 'numhl': 'Number'}
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200427 call assert_equal(0, "sign1"->sign_define(attr))
James McCoya80aad72021-12-22 19:45:28 +0000428 call assert_equal([{'name' : 'sign1', 'texthl' : 'Error', 'linehl' : 'Search',
429 \ 'culhl' : 'Visual', 'numhl': 'Number', 'text' : '=>'}],
Bram Moolenaare413ea02021-11-24 16:20:13 +0000430 \ sign_getdefined())
Bram Moolenaar162b7142018-12-21 15:17:36 +0100431
432 " Define a new sign without attributes and then update it
433 call sign_define("sign2")
434 let attr = {'text' : '!!', 'linehl' : 'DiffAdd', 'texthl' : 'DiffChange',
James McCoya80aad72021-12-22 19:45:28 +0000435 \ 'culhl': 'DiffDelete', 'numhl': 'Number', 'icon' : 'sign2.ico'}
Bram Moolenaard933c822019-08-21 13:45:16 +0200436 call Sign_define_ignore_error("sign2", attr)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100437 call assert_equal([{'name' : 'sign2', 'texthl' : 'DiffChange',
Bram Moolenaare413ea02021-11-24 16:20:13 +0000438 \ 'linehl' : 'DiffAdd', 'culhl' : 'DiffDelete', 'text' : '!!',
James McCoya80aad72021-12-22 19:45:28 +0000439 \ 'numhl': 'Number', 'icon' : 'sign2.ico'}],
440 \ "sign2"->sign_getdefined())
Bram Moolenaar162b7142018-12-21 15:17:36 +0100441
442 " Test for a sign name with digits
443 call assert_equal(0, sign_define(0002, {'linehl' : 'StatusLine'}))
444 call assert_equal([{'name' : '2', 'linehl' : 'StatusLine'}],
445 \ sign_getdefined(0002))
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200446 eval 0002->sign_undefine()
Bram Moolenaar162b7142018-12-21 15:17:36 +0100447
448 " Tests for invalid arguments to sign_define()
449 call assert_fails('call sign_define("sign4", {"text" : "===>"})', 'E239:')
450 call assert_fails('call sign_define("sign5", {"text" : ""})', 'E239:')
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200451 call assert_fails('call sign_define({})', 'E731:')
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +0100452 call assert_fails('call sign_define("sign6", [])', 'E1206:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100453
454 " Tests for sign_getdefined()
455 call assert_equal([], sign_getdefined("none"))
456 call assert_fails('call sign_getdefined({})', 'E731:')
457
458 " Tests for sign_place()
459 call writefile(repeat(["Sun is shining"], 30), "Xsign")
460 edit Xsign
461
462 call assert_equal(10, sign_place(10, '', 'sign1', 'Xsign',
463 \ {'lnum' : 20}))
464 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
465 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
466 \ 'priority' : 10}]}], sign_getplaced('Xsign'))
467 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
468 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
469 \ 'priority' : 10}]}],
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200470 \ '%'->sign_getplaced({'lnum' : 20}))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100471 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
472 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
473 \ 'priority' : 10}]}],
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100474 \ sign_getplaced('', {'id' : 10}))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100475
476 " Tests for invalid arguments to sign_place()
477 call assert_fails('call sign_place([], "", "mySign", 1)', 'E745:')
478 call assert_fails('call sign_place(5, "", "mySign", -1)', 'E158:')
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +0100479 call assert_fails('call sign_place(-1, "", "sign1", "Xsign", [])', 'E1206:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100480 call assert_fails('call sign_place(-1, "", "sign1", "Xsign",
481 \ {"lnum" : 30})', 'E474:')
482 call assert_fails('call sign_place(10, "", "xsign1x", "Xsign",
483 \ {"lnum" : 30})', 'E155:')
484 call assert_fails('call sign_place(10, "", "", "Xsign",
485 \ {"lnum" : 30})', 'E155:')
486 call assert_fails('call sign_place(10, "", [], "Xsign",
487 \ {"lnum" : 30})', 'E730:')
488 call assert_fails('call sign_place(5, "", "sign1", "abcxyz.xxx",
489 \ {"lnum" : 10})', 'E158:')
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100490 call assert_fails('call sign_place(5, "", "sign1", "@", {"lnum" : 10})',
Bram Moolenaar162b7142018-12-21 15:17:36 +0100491 \ 'E158:')
492 call assert_fails('call sign_place(5, "", "sign1", [], {"lnum" : 10})',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200493 \ 'E730:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100494 call assert_fails('call sign_place(21, "", "sign1", "Xsign",
Bram Moolenaar42aff462019-08-21 13:20:29 +0200495 \ {"lnum" : -1})', 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100496 call assert_fails('call sign_place(22, "", "sign1", "Xsign",
Bram Moolenaar42aff462019-08-21 13:20:29 +0200497 \ {"lnum" : 0})', 'E474:')
Bram Moolenaar1ea88a32018-12-29 21:00:27 +0100498 call assert_fails('call sign_place(22, "", "sign1", "Xsign",
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200499 \ {"lnum" : []})', 'E745:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100500 call assert_equal(-1, sign_place(1, "*", "sign1", "Xsign", {"lnum" : 10}))
501
502 " Tests for sign_getplaced()
503 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
504 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
505 \ 'priority' : 10}]}],
506 \ sign_getplaced(bufnr('Xsign')))
507 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
508 \ [{'id' : 10, 'group' : '', 'lnum' : 20, 'name' : 'sign1',
509 \ 'priority' : 10}]}],
510 \ sign_getplaced())
511 call assert_fails("call sign_getplaced('dummy.sign')", 'E158:')
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100512 call assert_fails('call sign_getplaced("&")', 'E158:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100513 call assert_fails('call sign_getplaced(-1)', 'E158:')
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +0100514 call assert_fails('call sign_getplaced("Xsign", [])', 'E1206:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100515 call assert_equal([{'bufnr' : bufnr(''), 'signs' : []}],
516 \ sign_getplaced('Xsign', {'lnum' : 1000000}))
517 call assert_fails("call sign_getplaced('Xsign', {'lnum' : []})",
518 \ 'E745:')
519 call assert_equal([{'bufnr' : bufnr(''), 'signs' : []}],
520 \ sign_getplaced('Xsign', {'id' : 44}))
521 call assert_fails("call sign_getplaced('Xsign', {'id' : []})",
522 \ 'E745:')
523
524 " Tests for sign_unplace()
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200525 eval 20->sign_place('', 'sign2', 'Xsign', {"lnum" : 30})
Bram Moolenaar162b7142018-12-21 15:17:36 +0100526 call assert_equal(0, sign_unplace('',
527 \ {'id' : 20, 'buffer' : 'Xsign'}))
Bram Moolenaar93476fd2019-09-06 22:00:54 +0200528 call assert_equal(-1, ''->sign_unplace(
Bram Moolenaar162b7142018-12-21 15:17:36 +0100529 \ {'id' : 30, 'buffer' : 'Xsign'}))
530 call sign_place(20, '', 'sign2', 'Xsign', {"lnum" : 30})
531 call assert_fails("call sign_unplace('',
532 \ {'id' : 20, 'buffer' : 'buffer.c'})", 'E158:')
533 call assert_fails("call sign_unplace('',
Bram Moolenaar2cbc1a02019-01-02 13:40:31 +0100534 \ {'id' : 20, 'buffer' : '&'})", 'E158:')
Bram Moolenaar1ea88a32018-12-29 21:00:27 +0100535 call assert_fails("call sign_unplace('g1',
Bram Moolenaar162b7142018-12-21 15:17:36 +0100536 \ {'id' : 20, 'buffer' : 200})", 'E158:')
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +0100537 call assert_fails("call sign_unplace('g1', 'mySign')", 'E1206:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100538
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200539 call sign_unplace('*')
540
541 " Test for modifying a placed sign
542 call assert_equal(15, sign_place(15, '', 'sign1', 'Xsign', {'lnum' : 20}))
543 call assert_equal(15, sign_place(15, '', 'sign2', 'Xsign'))
544 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
545 \ [{'id' : 15, 'group' : '', 'lnum' : 20, 'name' : 'sign2',
546 \ 'priority' : 10}]}],
547 \ sign_getplaced())
548
Bram Moolenaar162b7142018-12-21 15:17:36 +0100549 " Tests for sign_undefine()
550 call assert_equal(0, sign_undefine("sign1"))
551 call assert_equal([], sign_getdefined("sign1"))
552 call assert_fails('call sign_undefine("none")', 'E155:')
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200553 call assert_fails('call sign_undefine({})', 'E731:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100554
Bram Moolenaar42aff462019-08-21 13:20:29 +0200555 " Test for using '.' as the line number for sign_place()
Bram Moolenaard933c822019-08-21 13:45:16 +0200556 call Sign_define_ignore_error("sign1", attr)
Bram Moolenaar42aff462019-08-21 13:20:29 +0200557 call cursor(22, 1)
558 call assert_equal(15, sign_place(15, '', 'sign1', 'Xsign',
559 \ {'lnum' : '.'}))
560 call assert_equal([{'bufnr' : bufnr(''), 'signs' :
561 \ [{'id' : 15, 'group' : '', 'lnum' : 22, 'name' : 'sign1',
562 \ 'priority' : 10}]}],
563 \ sign_getplaced('%', {'lnum' : 22}))
564
Bram Moolenaar162b7142018-12-21 15:17:36 +0100565 call delete("Xsign")
566 call sign_unplace('*')
567 call sign_undefine()
568 enew | only
569endfunc
570
571" Tests for sign groups
572func Test_sign_group()
573 enew | only
574 " Remove all the signs
575 call sign_unplace('*')
576 call sign_undefine()
577
578 call writefile(repeat(["Sun is shining"], 30), "Xsign")
579
580 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
581 call assert_equal(0, sign_define("sign1", attr))
582
583 edit Xsign
584 let bnum = bufnr('%')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100585
586 " Error case
587 call assert_fails("call sign_place(5, [], 'sign1', 'Xsign',
588 \ {'lnum' : 30})", 'E730:')
589
590 " place three signs with the same identifier. One in the global group and
591 " others in the named groups
592 call assert_equal(5, sign_place(5, '', 'sign1', 'Xsign',
593 \ {'lnum' : 10}))
594 call assert_equal(5, sign_place(5, 'g1', 'sign1', bnum, {'lnum' : 20}))
595 call assert_equal(5, sign_place(5, 'g2', 'sign1', bnum, {'lnum' : 30}))
596
597 " Test for sign_getplaced() with group
598 let s = sign_getplaced('Xsign')
599 call assert_equal(1, len(s[0].signs))
600 call assert_equal(s[0].signs[0].group, '')
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100601 let s = sign_getplaced(bnum, {'group' : ''})
602 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
603 \ 'priority' : 10}], s[0].signs)
604 call assert_equal(1, len(s[0].signs))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100605 let s = sign_getplaced(bnum, {'group' : 'g2'})
606 call assert_equal('g2', s[0].signs[0].group)
607 let s = sign_getplaced(bnum, {'group' : 'g3'})
608 call assert_equal([], s[0].signs)
609 let s = sign_getplaced(bnum, {'group' : '*'})
610 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
611 \ 'priority' : 10},
612 \ {'id' : 5, 'group' : 'g1', 'name' : 'sign1', 'lnum' : 20,
613 \ 'priority' : 10},
614 \ {'id' : 5, 'group' : 'g2', 'name' : 'sign1', 'lnum' : 30,
615 \ 'priority' : 10}],
616 \ s[0].signs)
617
618 " Test for sign_getplaced() with id
619 let s = sign_getplaced(bnum, {'id' : 5})
620 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
621 \ 'priority' : 10}],
622 \ s[0].signs)
623 let s = sign_getplaced(bnum, {'id' : 5, 'group' : 'g2'})
624 call assert_equal(
625 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
626 \ 'priority' : 10}],
627 \ s[0].signs)
628 let s = sign_getplaced(bnum, {'id' : 5, 'group' : '*'})
629 call assert_equal([{'id' : 5, 'group' : '', 'name' : 'sign1', 'lnum' : 10,
630 \ 'priority' : 10},
631 \ {'id' : 5, 'group' : 'g1', 'name' : 'sign1', 'lnum' : 20,
632 \ 'priority' : 10},
633 \ {'id' : 5, 'group' : 'g2', 'name' : 'sign1', 'lnum' : 30,
634 \ 'priority' : 10}],
635 \ s[0].signs)
636 let s = sign_getplaced(bnum, {'id' : 5, 'group' : 'g3'})
637 call assert_equal([], s[0].signs)
638
639 " Test for sign_getplaced() with lnum
640 let s = sign_getplaced(bnum, {'lnum' : 20})
641 call assert_equal([], s[0].signs)
642 let s = sign_getplaced(bnum, {'lnum' : 20, 'group' : 'g1'})
643 call assert_equal(
644 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : 'g1',
645 \ 'priority' : 10}],
646 \ s[0].signs)
647 let s = sign_getplaced(bnum, {'lnum' : 30, 'group' : '*'})
648 call assert_equal(
649 \ [{'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
650 \ 'priority' : 10}],
651 \ s[0].signs)
652 let s = sign_getplaced(bnum, {'lnum' : 40, 'group' : '*'})
653 call assert_equal([], s[0].signs)
654
655 " Error case
656 call assert_fails("call sign_getplaced(bnum, {'group' : []})",
657 \ 'E730:')
658
659 " Clear the sign in global group
660 call sign_unplace('', {'id' : 5, 'buffer' : bnum})
661 let s = sign_getplaced(bnum, {'group' : '*'})
662 call assert_equal([
663 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : 'g1',
664 \ 'priority' : 10},
665 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
666 \ 'priority' : 10}],
667 \ s[0].signs)
668
669 " Clear the sign in one of the groups
670 call sign_unplace('g1', {'buffer' : 'Xsign'})
671 let s = sign_getplaced(bnum, {'group' : '*'})
672 call assert_equal([
673 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 30, 'group' : 'g2',
674 \ 'priority' : 10}],
675 \ s[0].signs)
676
677 " Clear all the signs from the buffer
678 call sign_unplace('*', {'buffer' : bnum})
679 call assert_equal([], sign_getplaced(bnum, {'group' : '*'})[0].signs)
680
681 " Clear sign across groups using an identifier
682 call sign_place(25, '', 'sign1', bnum, {'lnum' : 10})
683 call sign_place(25, 'g1', 'sign1', bnum, {'lnum' : 11})
684 call sign_place(25, 'g2', 'sign1', bnum, {'lnum' : 12})
685 call assert_equal(0, sign_unplace('*', {'id' : 25}))
686 call assert_equal([], sign_getplaced(bnum, {'group' : '*'})[0].signs)
687
688 " Error case
Bram Moolenaar809ce4d2019-07-13 21:21:40 +0200689 call assert_fails("call sign_unplace({})", 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100690
691 " Place a sign in the global group and try to delete it using a group
692 call assert_equal(5, sign_place(5, '', 'sign1', bnum, {'lnum' : 10}))
693 call assert_equal(-1, sign_unplace('g1', {'id' : 5}))
694
695 " Place signs in multiple groups and delete all the signs in one of the
696 " group
697 call assert_equal(5, sign_place(5, '', 'sign1', bnum, {'lnum' : 10}))
698 call assert_equal(6, sign_place(6, '', 'sign1', bnum, {'lnum' : 11}))
699 call assert_equal(5, sign_place(5, 'g1', 'sign1', bnum, {'lnum' : 10}))
700 call assert_equal(5, sign_place(5, 'g2', 'sign1', bnum, {'lnum' : 10}))
701 call assert_equal(6, sign_place(6, 'g1', 'sign1', bnum, {'lnum' : 11}))
702 call assert_equal(6, sign_place(6, 'g2', 'sign1', bnum, {'lnum' : 11}))
703 call assert_equal(0, sign_unplace('g1'))
704 let s = sign_getplaced(bnum, {'group' : 'g1'})
705 call assert_equal([], s[0].signs)
706 let s = sign_getplaced(bnum)
707 call assert_equal(2, len(s[0].signs))
708 let s = sign_getplaced(bnum, {'group' : 'g2'})
709 call assert_equal('g2', s[0].signs[0].group)
710 call assert_equal(0, sign_unplace('', {'id' : 5}))
711 call assert_equal(0, sign_unplace('', {'id' : 6}))
712 let s = sign_getplaced(bnum, {'group' : 'g2'})
713 call assert_equal('g2', s[0].signs[0].group)
714 call assert_equal(0, sign_unplace('', {'buffer' : bnum}))
715
716 call sign_unplace('*')
717
718 " Test for :sign command and groups
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100719 sign place 5 line=10 name=sign1 file=Xsign
720 sign place 5 group=g1 line=10 name=sign1 file=Xsign
721 sign place 5 group=g2 line=10 name=sign1 file=Xsign
Bram Moolenaar162b7142018-12-21 15:17:36 +0100722
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100723 " Tests for the ':sign place' command
724
725 " :sign place file={fname}
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100726 let a = execute('sign place file=Xsign')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100727 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100728 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100729
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100730 " :sign place group={group} file={fname}
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100731 let a = execute('sign place group=g2 file=Xsign')
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100732 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100733 \ " line=10 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100734
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100735 " :sign place group=* file={fname}
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100736 let a = execute('sign place group=* file=Xsign')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100737 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100738 \ " line=10 id=5 group=g2 name=sign1 priority=10\n" .
739 \ " line=10 id=5 group=g1 name=sign1 priority=10\n" .
740 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100741
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100742 " Error case: non-existing group
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100743 let a = execute('sign place group=xyz file=Xsign')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100744 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
745
746 call sign_unplace('*')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100747 let bnum = bufnr('Xsign')
748 exe 'sign place 5 line=10 name=sign1 buffer=' . bnum
749 exe 'sign place 5 group=g1 line=11 name=sign1 buffer=' . bnum
750 exe 'sign place 5 group=g2 line=12 name=sign1 buffer=' . bnum
751
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100752 " :sign place buffer={fname}
Bram Moolenaar162b7142018-12-21 15:17:36 +0100753 let a = execute('sign place buffer=' . bnum)
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100754 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100755 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100756
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100757 " :sign place group={group} buffer={fname}
Bram Moolenaar162b7142018-12-21 15:17:36 +0100758 let a = execute('sign place group=g2 buffer=' . bnum)
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100759 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100760 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100761
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100762 " :sign place group=* buffer={fname}
Bram Moolenaar162b7142018-12-21 15:17:36 +0100763 let a = execute('sign place group=* buffer=' . bnum)
764 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100765 \ " line=10 id=5 name=sign1 priority=10\n" .
766 \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
767 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100768
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100769 " Error case: non-existing group
Bram Moolenaar162b7142018-12-21 15:17:36 +0100770 let a = execute('sign place group=xyz buffer=' . bnum)
771 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n", a)
772
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100773 " :sign place
774 let a = execute('sign place')
775 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100776 \ " line=10 id=5 name=sign1 priority=10\n", a)
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100777
Bram Moolenaarb589f952019-01-07 22:10:00 +0100778 " Place signs in more than one buffer and list the signs
779 split foo
780 set buftype=nofile
781 sign place 25 line=76 name=sign1 priority=99 file=foo
782 let a = execute('sign place')
783 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
784 \ " line=10 id=5 name=sign1 priority=10\n" .
785 \ "Signs for foo:\n" .
786 \ " line=76 id=25 name=sign1 priority=99\n", a)
787 close
788 bwipe foo
789
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100790 " :sign place group={group}
791 let a = execute('sign place group=g1')
792 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100793 \ " line=11 id=5 group=g1 name=sign1 priority=10\n", a)
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100794
795 " :sign place group=*
Bram Moolenaar162b7142018-12-21 15:17:36 +0100796 let a = execute('sign place group=*')
797 call assert_equal("\n--- Signs ---\nSigns for Xsign:\n" .
Bram Moolenaard730c8e2019-01-07 21:16:53 +0100798 \ " line=10 id=5 name=sign1 priority=10\n" .
799 \ " line=11 id=5 group=g1 name=sign1 priority=10\n" .
800 \ " line=12 id=5 group=g2 name=sign1 priority=10\n", a)
Bram Moolenaar162b7142018-12-21 15:17:36 +0100801
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100802 " Test for ':sign jump' command with groups
803 sign jump 5 group=g1 file=Xsign
804 call assert_equal(11, line('.'))
805 call assert_equal('Xsign', bufname(''))
806 sign jump 5 group=g2 file=Xsign
807 call assert_equal(12, line('.'))
Bram Moolenaar162b7142018-12-21 15:17:36 +0100808
Bram Moolenaarb328cca2019-01-06 16:24:01 +0100809 " Test for :sign jump command without the filename or buffer
810 sign jump 5
811 call assert_equal(10, line('.'))
812 sign jump 5 group=g1
813 call assert_equal(11, line('.'))
814
Bram Moolenaar162b7142018-12-21 15:17:36 +0100815 " Error cases
Bram Moolenaar7a2d9892018-12-24 20:23:49 +0100816 call assert_fails("sign place 3 group= name=sign1 buffer=" . bnum, 'E474:')
Bram Moolenaar162b7142018-12-21 15:17:36 +0100817
818 call delete("Xsign")
819 call sign_unplace('*')
820 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +0100821 enew | only
Bram Moolenaar162b7142018-12-21 15:17:36 +0100822endfunc
823
Bram Moolenaar7d83bf42018-12-29 18:53:55 +0100824" Place signs used for ":sign unplace" command test
825func Place_signs_for_test()
826 call sign_unplace('*')
827
828 sign place 3 line=10 name=sign1 file=Xsign1
829 sign place 3 group=g1 line=11 name=sign1 file=Xsign1
830 sign place 3 group=g2 line=12 name=sign1 file=Xsign1
831 sign place 4 line=15 name=sign1 file=Xsign1
832 sign place 4 group=g1 line=16 name=sign1 file=Xsign1
833 sign place 4 group=g2 line=17 name=sign1 file=Xsign1
834 sign place 5 line=20 name=sign1 file=Xsign2
835 sign place 5 group=g1 line=21 name=sign1 file=Xsign2
836 sign place 5 group=g2 line=22 name=sign1 file=Xsign2
837 sign place 6 line=25 name=sign1 file=Xsign2
838 sign place 6 group=g1 line=26 name=sign1 file=Xsign2
839 sign place 6 group=g2 line=27 name=sign1 file=Xsign2
840endfunc
841
842" Place multiple signs in a single line for test
843func Place_signs_at_line_for_test()
844 call sign_unplace('*')
845 sign place 3 line=13 name=sign1 file=Xsign1
846 sign place 3 group=g1 line=13 name=sign1 file=Xsign1
847 sign place 3 group=g2 line=13 name=sign1 file=Xsign1
848 sign place 4 line=13 name=sign1 file=Xsign1
849 sign place 4 group=g1 line=13 name=sign1 file=Xsign1
850 sign place 4 group=g2 line=13 name=sign1 file=Xsign1
851endfunc
852
853" Tests for the ':sign unplace' command
854func Test_sign_unplace()
855 enew | only
856 " Remove all the signs
857 call sign_unplace('*')
858 call sign_undefine()
859
860 " Create two files and define signs
861 call writefile(repeat(["Sun is shining"], 30), "Xsign1")
862 call writefile(repeat(["It is beautiful"], 30), "Xsign2")
863
864 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
865 call sign_define("sign1", attr)
866
867 edit Xsign1
868 let bnum1 = bufnr('%')
869 split Xsign2
870 let bnum2 = bufnr('%')
871
872 let signs1 = [{'id' : 3, 'name' : 'sign1', 'lnum' : 10, 'group' : '',
873 \ 'priority' : 10},
874 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 11, 'group' : 'g1',
875 \ 'priority' : 10},
876 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 12, 'group' : 'g2',
877 \ 'priority' : 10},
878 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 15, 'group' : '',
879 \ 'priority' : 10},
880 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 16, 'group' : 'g1',
881 \ 'priority' : 10},
882 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 17, 'group' : 'g2',
883 \ 'priority' : 10},]
884 let signs2 = [{'id' : 5, 'name' : 'sign1', 'lnum' : 20, 'group' : '',
885 \ 'priority' : 10},
886 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 21, 'group' : 'g1',
887 \ 'priority' : 10},
888 \ {'id' : 5, 'name' : 'sign1', 'lnum' : 22, 'group' : 'g2',
889 \ 'priority' : 10},
890 \ {'id' : 6, 'name' : 'sign1', 'lnum' : 25, 'group' : '',
891 \ 'priority' : 10},
892 \ {'id' : 6, 'name' : 'sign1', 'lnum' : 26, 'group' : 'g1',
893 \ 'priority' : 10},
894 \ {'id' : 6, 'name' : 'sign1', 'lnum' : 27, 'group' : 'g2',
895 \ 'priority' : 10},]
896
897 " Test for :sign unplace {id} file={fname}
898 call Place_signs_for_test()
899 sign unplace 3 file=Xsign1
900 sign unplace 6 file=Xsign2
901 call assert_equal(
902 \ filter(copy(signs1),
903 \ {idx, val -> val.id != 3 || val.group != ''}),
904 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
905 call assert_equal(
906 \ filter(copy(signs2),
907 \ {idx, val -> val.id != 6 || val.group != ''}),
908 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
909
910 " Test for :sign unplace {id} group={group} file={fname}
911 call Place_signs_for_test()
912 sign unplace 4 group=g1 file=Xsign1
913 sign unplace 5 group=g2 file=Xsign2
914 call assert_equal(
915 \ filter(copy(signs1),
916 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
917 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
918 call assert_equal(
919 \ filter(copy(signs2),
920 \ {idx, val -> val.id != 5 || val.group != 'g2'}),
921 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
922
923 " Test for :sign unplace {id} group=* file={fname}
924 call Place_signs_for_test()
925 sign unplace 3 group=* file=Xsign1
926 sign unplace 6 group=* file=Xsign2
927 call assert_equal(
928 \ filter(copy(signs1),
929 \ {idx, val -> val.id != 3}),
930 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
931 call assert_equal(
932 \ filter(copy(signs2),
933 \ {idx, val -> val.id != 6}),
934 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
935
936 " Test for :sign unplace * file={fname}
937 call Place_signs_for_test()
938 sign unplace * file=Xsign1
939 call assert_equal(
940 \ filter(copy(signs1),
941 \ {idx, val -> val.group != ''}),
942 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
943 call assert_equal(signs2, sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
944
945 " Test for :sign unplace * group={group} file={fname}
946 call Place_signs_for_test()
947 sign unplace * group=g1 file=Xsign1
948 sign unplace * group=g2 file=Xsign2
949 call assert_equal(
950 \ filter(copy(signs1),
951 \ {idx, val -> val.group != 'g1'}),
952 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
953 call assert_equal(
954 \ filter(copy(signs2),
955 \ {idx, val -> val.group != 'g2'}),
956 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
957
958 " Test for :sign unplace * group=* file={fname}
959 call Place_signs_for_test()
960 sign unplace * group=* file=Xsign2
961 call assert_equal(signs1, sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
962 call assert_equal([], sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
963
964 " Test for :sign unplace {id} buffer={nr}
965 call Place_signs_for_test()
966 exe 'sign unplace 3 buffer=' . bnum1
967 exe 'sign unplace 6 buffer=' . bnum2
968 call assert_equal(
969 \ filter(copy(signs1),
970 \ {idx, val -> val.id != 3 || val.group != ''}),
971 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
972 call assert_equal(
973 \ filter(copy(signs2),
974 \ {idx, val -> val.id != 6 || val.group != ''}),
975 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
976
977 " Test for :sign unplace {id} group={group} buffer={nr}
978 call Place_signs_for_test()
979 exe 'sign unplace 4 group=g1 buffer=' . bnum1
980 exe 'sign unplace 5 group=g2 buffer=' . bnum2
981 call assert_equal(
982 \ filter(copy(signs1),
983 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
984 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
985 call assert_equal(
986 \ filter(copy(signs2),
987 \ {idx, val -> val.id != 5 || val.group != 'g2'}),
988 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
989
990 " Test for :sign unplace {id} group=* buffer={nr}
991 call Place_signs_for_test()
992 exe 'sign unplace 3 group=* buffer=' . bnum1
993 exe 'sign unplace 6 group=* buffer=' . bnum2
994 call assert_equal(
995 \ filter(copy(signs1),
996 \ {idx, val -> val.id != 3}),
997 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
998 call assert_equal(
999 \ filter(copy(signs2),
1000 \ {idx, val -> val.id != 6}),
1001 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1002
1003 " Test for :sign unplace * buffer={nr}
1004 call Place_signs_for_test()
1005 exe 'sign unplace * buffer=' . bnum1
1006 call assert_equal(
1007 \ filter(copy(signs1),
1008 \ {idx, val -> val.group != ''}),
1009 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
1010 call assert_equal(signs2, sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1011
1012 " Test for :sign unplace * group={group} buffer={nr}
1013 call Place_signs_for_test()
1014 exe 'sign unplace * group=g1 buffer=' . bnum1
1015 exe 'sign unplace * group=g2 buffer=' . bnum2
1016 call assert_equal(
1017 \ filter(copy(signs1),
1018 \ {idx, val -> val.group != 'g1'}),
1019 \ sign_getplaced(bnum1, {'group' : '*'})[0].signs)
1020 call assert_equal(
1021 \ filter(copy(signs2),
1022 \ {idx, val -> val.group != 'g2'}),
1023 \ sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1024
1025 " Test for :sign unplace * group=* buffer={nr}
1026 call Place_signs_for_test()
1027 exe 'sign unplace * group=* buffer=' . bnum2
1028 call assert_equal(signs1, sign_getplaced(bnum1, {'group' : '*'})[0].signs)
1029 call assert_equal([], sign_getplaced(bnum2, {'group' : '*'})[0].signs)
1030
1031 " Test for :sign unplace {id}
1032 call Place_signs_for_test()
1033 sign unplace 4
1034 sign unplace 6
1035 call assert_equal(
1036 \ filter(copy(signs1),
1037 \ {idx, val -> val.id != 4 || val.group != ''}),
1038 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1039 call assert_equal(
1040 \ filter(copy(signs2),
1041 \ {idx, val -> val.id != 6 || val.group != ''}),
1042 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1043
1044 " Test for :sign unplace {id} group={group}
1045 call Place_signs_for_test()
1046 sign unplace 4 group=g1
1047 sign unplace 6 group=g2
1048 call assert_equal(
1049 \ filter(copy(signs1),
1050 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
1051 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1052 call assert_equal(
1053 \ filter(copy(signs2),
1054 \ {idx, val -> val.id != 6 || val.group != 'g2'}),
1055 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1056
1057 " Test for :sign unplace {id} group=*
1058 call Place_signs_for_test()
1059 sign unplace 3 group=*
1060 sign unplace 5 group=*
1061 call assert_equal(
1062 \ filter(copy(signs1),
1063 \ {idx, val -> val.id != 3}),
1064 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1065 call assert_equal(
1066 \ filter(copy(signs2),
1067 \ {idx, val -> val.id != 5}),
1068 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1069
1070 " Test for :sign unplace *
1071 call Place_signs_for_test()
1072 sign unplace *
1073 call assert_equal(
1074 \ filter(copy(signs1),
1075 \ {idx, val -> val.group != ''}),
1076 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1077 call assert_equal(
1078 \ filter(copy(signs2),
1079 \ {idx, val -> val.group != ''}),
1080 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1081
1082 " Test for :sign unplace * group={group}
1083 call Place_signs_for_test()
1084 sign unplace * group=g1
1085 call assert_equal(
1086 \ filter(copy(signs1),
1087 \ {idx, val -> val.group != 'g1'}),
1088 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1089 call assert_equal(
1090 \ filter(copy(signs2),
1091 \ {idx, val -> val.group != 'g1'}),
1092 \ sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1093
1094 " Test for :sign unplace * group=*
1095 call Place_signs_for_test()
1096 sign unplace * group=*
1097 call assert_equal([], sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1098 call assert_equal([], sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1099
1100 " Negative test cases
1101 call Place_signs_for_test()
1102 sign unplace 3 group=xy file=Xsign1
1103 sign unplace * group=xy file=Xsign1
1104 silent! sign unplace * group=* file=FileNotPresent
1105 call assert_equal(signs1, sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1106 call assert_equal(signs2, sign_getplaced('Xsign2', {'group' : '*'})[0].signs)
1107
1108 " Tests for removing sign at the current cursor position
1109
1110 " Test for ':sign unplace'
1111 let signs1 = [{'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g2',
1112 \ 'priority' : 10},
1113 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g1',
1114 \ 'priority' : 10},
1115 \ {'id' : 4, 'name' : 'sign1', 'lnum' : 13, 'group' : '',
1116 \ 'priority' : 10},
1117 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g2',
1118 \ 'priority' : 10},
1119 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : 'g1',
1120 \ 'priority' : 10},
1121 \ {'id' : 3, 'name' : 'sign1', 'lnum' : 13, 'group' : '',
1122 \ 'priority' : 10},]
1123 exe bufwinnr('Xsign1') . 'wincmd w'
1124 call cursor(13, 1)
1125
1126 " Should remove only one sign in the global group
1127 call Place_signs_at_line_for_test()
1128 sign unplace
1129 call assert_equal(
1130 \ filter(copy(signs1),
1131 \ {idx, val -> val.id != 4 || val.group != ''}),
1132 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1133 " Should remove the second sign in the global group
1134 sign unplace
1135 call assert_equal(
1136 \ filter(copy(signs1),
1137 \ {idx, val -> val.group != ''}),
1138 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1139
1140 " Test for ':sign unplace group={group}'
1141 call Place_signs_at_line_for_test()
1142 " Should remove only one sign in group g1
1143 sign unplace group=g1
1144 call assert_equal(
1145 \ filter(copy(signs1),
1146 \ {idx, val -> val.id != 4 || val.group != 'g1'}),
1147 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1148 sign unplace group=g2
1149 call assert_equal(
1150 \ filter(copy(signs1),
1151 \ {idx, val -> val.id != 4 || val.group == ''}),
1152 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1153
1154 " Test for ':sign unplace group=*'
1155 call Place_signs_at_line_for_test()
1156 sign unplace group=*
1157 sign unplace group=*
1158 sign unplace group=*
1159 call assert_equal(
1160 \ filter(copy(signs1),
1161 \ {idx, val -> val.id != 4}),
1162 \ sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1163 sign unplace group=*
1164 sign unplace group=*
1165 sign unplace group=*
1166 call assert_equal([], sign_getplaced('Xsign1', {'group' : '*'})[0].signs)
1167
1168 call sign_unplace('*')
1169 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001170 enew | only
Bram Moolenaar7d83bf42018-12-29 18:53:55 +01001171 call delete("Xsign1")
1172 call delete("Xsign2")
1173endfunc
1174
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001175" Tests for auto-generating the sign identifier.
1176func Test_aaa_sign_id_autogen()
Bram Moolenaar162b7142018-12-21 15:17:36 +01001177 enew | only
1178 call sign_unplace('*')
1179 call sign_undefine()
1180
1181 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Error'}
1182 call assert_equal(0, sign_define("sign1", attr))
1183
1184 call writefile(repeat(["Sun is shining"], 30), "Xsign")
1185 edit Xsign
1186
1187 call assert_equal(1, sign_place(0, '', 'sign1', 'Xsign',
1188 \ {'lnum' : 10}))
1189 call assert_equal(2, sign_place(2, '', 'sign1', 'Xsign',
1190 \ {'lnum' : 12}))
1191 call assert_equal(3, sign_place(0, '', 'sign1', 'Xsign',
1192 \ {'lnum' : 14}))
1193 call sign_unplace('', {'buffer' : 'Xsign', 'id' : 2})
Bram Moolenaar6436cd82018-12-27 00:28:33 +01001194 call assert_equal(4, sign_place(0, '', 'sign1', 'Xsign',
Bram Moolenaar162b7142018-12-21 15:17:36 +01001195 \ {'lnum' : 12}))
1196
1197 call assert_equal(1, sign_place(0, 'g1', 'sign1', 'Xsign',
1198 \ {'lnum' : 11}))
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001199 " Check for the next generated sign id in this group
1200 call assert_equal(2, sign_place(0, 'g1', 'sign1', 'Xsign',
1201 \ {'lnum' : 12}))
Bram Moolenaar162b7142018-12-21 15:17:36 +01001202 call assert_equal(0, sign_unplace('g1', {'id' : 1}))
1203 call assert_equal(10,
1204 \ sign_getplaced('Xsign', {'id' : 1})[0].signs[0].lnum)
1205
1206 call delete("Xsign")
1207 call sign_unplace('*')
1208 call sign_undefine()
Bram Moolenaar1ea88a32018-12-29 21:00:27 +01001209 enew | only
Bram Moolenaar162b7142018-12-21 15:17:36 +01001210endfunc
1211
1212" Test for sign priority
1213func Test_sign_priority()
1214 enew | only
1215 call sign_unplace('*')
1216 call sign_undefine()
1217
1218 let attr = {'text' : '=>', 'linehl' : 'Search', 'texthl' : 'Search'}
1219 call sign_define("sign1", attr)
1220 call sign_define("sign2", attr)
1221 call sign_define("sign3", attr)
1222
1223 " Place three signs with different priority in the same line
1224 call writefile(repeat(["Sun is shining"], 30), "Xsign")
1225 edit Xsign
Bram Moolenaar162b7142018-12-21 15:17:36 +01001226
1227 call sign_place(1, 'g1', 'sign1', 'Xsign',
1228 \ {'lnum' : 11, 'priority' : 50})
1229 call sign_place(2, 'g2', 'sign2', 'Xsign',
1230 \ {'lnum' : 11, 'priority' : 100})
1231 call sign_place(3, '', 'sign3', 'Xsign', {'lnum' : 11})
1232 let s = sign_getplaced('Xsign', {'group' : '*'})
1233 call assert_equal([
1234 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 11, 'group' : 'g2',
1235 \ 'priority' : 100},
1236 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11, 'group' : 'g1',
1237 \ 'priority' : 50},
1238 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 11, 'group' : '',
1239 \ 'priority' : 10}],
1240 \ s[0].signs)
1241
Bram Moolenaar64416122019-06-07 21:37:13 +02001242 call sign_unplace('*')
1243
1244 " Three signs on different lines with changing priorities
1245 call sign_place(1, '', 'sign1', 'Xsign',
1246 \ {'lnum' : 11, 'priority' : 50})
1247 call sign_place(2, '', 'sign2', 'Xsign',
1248 \ {'lnum' : 12, 'priority' : 60})
1249 call sign_place(3, '', 'sign3', 'Xsign',
1250 \ {'lnum' : 13, 'priority' : 70})
1251 call sign_place(2, '', 'sign2', 'Xsign',
1252 \ {'lnum' : 12, 'priority' : 40})
1253 call sign_place(3, '', 'sign3', 'Xsign',
1254 \ {'lnum' : 13, 'priority' : 30})
1255 call sign_place(1, '', 'sign1', 'Xsign',
1256 \ {'lnum' : 11, 'priority' : 50})
1257 let s = sign_getplaced('Xsign', {'group' : '*'})
1258 call assert_equal([
1259 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11, 'group' : '',
1260 \ 'priority' : 50},
1261 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 12, 'group' : '',
1262 \ 'priority' : 40},
1263 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 13, 'group' : '',
1264 \ 'priority' : 30}],
1265 \ s[0].signs)
1266
1267 call sign_unplace('*')
1268
1269 " Two signs on the same line with changing priorities
1270 call sign_place(1, '', 'sign1', 'Xsign',
1271 \ {'lnum' : 4, 'priority' : 20})
1272 call sign_place(2, '', 'sign2', 'Xsign',
1273 \ {'lnum' : 4, 'priority' : 30})
1274 let s = sign_getplaced('Xsign', {'group' : '*'})
1275 call assert_equal([
1276 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1277 \ 'priority' : 30},
1278 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1279 \ 'priority' : 20}],
1280 \ s[0].signs)
1281 " Change the priority of the last sign to highest
1282 call sign_place(1, '', 'sign1', 'Xsign',
1283 \ {'lnum' : 4, 'priority' : 40})
1284 let s = sign_getplaced('Xsign', {'group' : '*'})
1285 call assert_equal([
1286 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1287 \ 'priority' : 40},
1288 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1289 \ 'priority' : 30}],
1290 \ s[0].signs)
1291 " Change the priority of the first sign to lowest
1292 call sign_place(1, '', 'sign1', 'Xsign',
1293 \ {'lnum' : 4, 'priority' : 25})
1294 let s = sign_getplaced('Xsign', {'group' : '*'})
1295 call assert_equal([
1296 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1297 \ 'priority' : 30},
1298 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1299 \ 'priority' : 25}],
1300 \ s[0].signs)
1301 call sign_place(1, '', 'sign1', 'Xsign',
1302 \ {'lnum' : 4, 'priority' : 45})
1303 call sign_place(2, '', 'sign2', 'Xsign',
1304 \ {'lnum' : 4, 'priority' : 55})
1305 let s = sign_getplaced('Xsign', {'group' : '*'})
1306 call assert_equal([
1307 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1308 \ 'priority' : 55},
1309 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1310 \ 'priority' : 45}],
1311 \ s[0].signs)
1312
1313 call sign_unplace('*')
1314
1315 " Three signs on the same line with changing priorities
1316 call sign_place(1, '', 'sign1', 'Xsign',
1317 \ {'lnum' : 4, 'priority' : 40})
1318 call sign_place(2, '', 'sign2', 'Xsign',
1319 \ {'lnum' : 4, 'priority' : 30})
1320 call sign_place(3, '', 'sign3', 'Xsign',
1321 \ {'lnum' : 4, 'priority' : 20})
1322 let s = sign_getplaced('Xsign', {'group' : '*'})
1323 call assert_equal([
1324 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1325 \ 'priority' : 40},
1326 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1327 \ 'priority' : 30},
1328 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1329 \ 'priority' : 20}],
1330 \ s[0].signs)
1331
1332 " Change the priority of the middle sign to the highest
1333 call sign_place(2, '', 'sign2', 'Xsign',
1334 \ {'lnum' : 4, 'priority' : 50})
1335 let s = sign_getplaced('Xsign', {'group' : '*'})
1336 call assert_equal([
1337 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1338 \ 'priority' : 50},
1339 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1340 \ 'priority' : 40},
1341 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1342 \ 'priority' : 20}],
1343 \ s[0].signs)
1344
1345 " Change the priority of the middle sign to the lowest
1346 call sign_place(1, '', 'sign1', 'Xsign',
1347 \ {'lnum' : 4, 'priority' : 15})
1348 let s = sign_getplaced('Xsign', {'group' : '*'})
1349 call assert_equal([
1350 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1351 \ 'priority' : 50},
1352 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1353 \ 'priority' : 20},
1354 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1355 \ 'priority' : 15}],
1356 \ s[0].signs)
1357
1358 " Change the priority of the last sign to the highest
1359 call sign_place(1, '', 'sign1', 'Xsign',
1360 \ {'lnum' : 4, 'priority' : 55})
1361 let s = sign_getplaced('Xsign', {'group' : '*'})
1362 call assert_equal([
1363 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1364 \ 'priority' : 55},
1365 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1366 \ 'priority' : 50},
1367 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1368 \ 'priority' : 20}],
1369 \ s[0].signs)
1370
1371 " Change the priority of the first sign to the lowest
1372 call sign_place(1, '', 'sign1', 'Xsign',
1373 \ {'lnum' : 4, 'priority' : 15})
1374 let s = sign_getplaced('Xsign', {'group' : '*'})
1375 call assert_equal([
1376 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1377 \ 'priority' : 50},
1378 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1379 \ 'priority' : 20},
1380 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1381 \ 'priority' : 15}],
1382 \ s[0].signs)
1383
1384 call sign_unplace('*')
1385
1386 " Three signs on the same line with changing priorities along with other
1387 " signs
1388 call sign_place(1, '', 'sign1', 'Xsign',
1389 \ {'lnum' : 2, 'priority' : 10})
1390 call sign_place(2, '', 'sign1', 'Xsign',
1391 \ {'lnum' : 4, 'priority' : 30})
1392 call sign_place(3, '', 'sign2', 'Xsign',
1393 \ {'lnum' : 4, 'priority' : 20})
1394 call sign_place(4, '', 'sign3', 'Xsign',
1395 \ {'lnum' : 4, 'priority' : 25})
1396 call sign_place(5, '', 'sign2', 'Xsign',
1397 \ {'lnum' : 6, 'priority' : 80})
1398 let s = sign_getplaced('Xsign', {'group' : '*'})
1399 call assert_equal([
1400 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1401 \ 'priority' : 10},
1402 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1403 \ 'priority' : 30},
1404 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1405 \ 'priority' : 25},
1406 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1407 \ 'priority' : 20},
1408 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1409 \ 'priority' : 80}],
1410 \ s[0].signs)
1411
1412 " Change the priority of the first sign to lowest
1413 call sign_place(2, '', 'sign1', 'Xsign',
1414 \ {'lnum' : 4, 'priority' : 15})
1415 let s = sign_getplaced('Xsign', {'group' : '*'})
1416 call assert_equal([
1417 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1418 \ 'priority' : 10},
1419 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1420 \ 'priority' : 25},
1421 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1422 \ 'priority' : 20},
1423 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1424 \ 'priority' : 15},
1425 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1426 \ 'priority' : 80}],
1427 \ s[0].signs)
1428
1429 " Change the priority of the last sign to highest
1430 call sign_place(2, '', 'sign1', 'Xsign',
1431 \ {'lnum' : 4, 'priority' : 30})
1432 let s = sign_getplaced('Xsign', {'group' : '*'})
1433 call assert_equal([
1434 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1435 \ 'priority' : 10},
1436 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1437 \ 'priority' : 30},
1438 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1439 \ 'priority' : 25},
1440 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1441 \ 'priority' : 20},
1442 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1443 \ 'priority' : 80}],
1444 \ s[0].signs)
1445
1446 " Change the priority of the middle sign to lowest
1447 call sign_place(4, '', 'sign3', 'Xsign',
1448 \ {'lnum' : 4, 'priority' : 15})
1449 let s = sign_getplaced('Xsign', {'group' : '*'})
1450 call assert_equal([
1451 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1452 \ 'priority' : 10},
1453 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1454 \ 'priority' : 30},
1455 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1456 \ 'priority' : 20},
1457 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1458 \ 'priority' : 15},
1459 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1460 \ 'priority' : 80}],
1461 \ s[0].signs)
1462
1463 " Change the priority of the middle sign to highest
1464 call sign_place(3, '', 'sign2', 'Xsign',
1465 \ {'lnum' : 4, 'priority' : 35})
1466 let s = sign_getplaced('Xsign', {'group' : '*'})
1467 call assert_equal([
1468 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 2, 'group' : '',
1469 \ 'priority' : 10},
1470 \ {'id' : 3, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1471 \ 'priority' : 35},
1472 \ {'id' : 2, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1473 \ 'priority' : 30},
1474 \ {'id' : 4, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1475 \ 'priority' : 15},
1476 \ {'id' : 5, 'name' : 'sign2', 'lnum' : 6, 'group' : '',
1477 \ 'priority' : 80}],
1478 \ s[0].signs)
1479
1480 call sign_unplace('*')
1481
1482 " Multiple signs with the same priority on the same line
1483 call sign_place(1, '', 'sign1', 'Xsign',
1484 \ {'lnum' : 4, 'priority' : 20})
1485 call sign_place(2, '', 'sign2', 'Xsign',
1486 \ {'lnum' : 4, 'priority' : 20})
1487 call sign_place(3, '', 'sign3', 'Xsign',
1488 \ {'lnum' : 4, 'priority' : 20})
1489 let s = sign_getplaced('Xsign', {'group' : '*'})
1490 call assert_equal([
1491 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1492 \ 'priority' : 20},
1493 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1494 \ 'priority' : 20},
1495 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1496 \ 'priority' : 20}],
1497 \ s[0].signs)
1498 " Place the last sign again with the same priority
1499 call sign_place(1, '', 'sign1', 'Xsign',
1500 \ {'lnum' : 4, 'priority' : 20})
1501 let s = sign_getplaced('Xsign', {'group' : '*'})
1502 call assert_equal([
1503 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1504 \ 'priority' : 20},
1505 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1506 \ 'priority' : 20},
1507 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1508 \ 'priority' : 20}],
1509 \ s[0].signs)
1510 " Place the first sign again with the same priority
1511 call sign_place(1, '', 'sign1', 'Xsign',
1512 \ {'lnum' : 4, 'priority' : 20})
1513 let s = sign_getplaced('Xsign', {'group' : '*'})
1514 call assert_equal([
1515 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1516 \ 'priority' : 20},
1517 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1518 \ 'priority' : 20},
1519 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1520 \ 'priority' : 20}],
1521 \ s[0].signs)
1522 " Place the middle sign again with the same priority
1523 call sign_place(3, '', 'sign3', 'Xsign',
1524 \ {'lnum' : 4, 'priority' : 20})
1525 let s = sign_getplaced('Xsign', {'group' : '*'})
1526 call assert_equal([
1527 \ {'id' : 3, 'name' : 'sign3', 'lnum' : 4, 'group' : '',
1528 \ 'priority' : 20},
1529 \ {'id' : 1, 'name' : 'sign1', 'lnum' : 4, 'group' : '',
1530 \ 'priority' : 20},
1531 \ {'id' : 2, 'name' : 'sign2', 'lnum' : 4, 'group' : '',
1532 \ 'priority' : 20}],
1533 \ s[0].signs)
1534
1535 call sign_unplace('*')
1536
Bram Moolenaar58a7f872019-06-04 22:48:15 +02001537 " Place multiple signs with same id on a line with different priority
1538 call sign_place(1, '', 'sign1', 'Xsign',
1539 \ {'lnum' : 5, 'priority' : 20})
1540 call sign_place(1, '', 'sign2', 'Xsign',
1541 \ {'lnum' : 5, 'priority' : 10})
1542 let s = sign_getplaced('Xsign', {'lnum' : 5})
1543 call assert_equal([
1544 \ {'id' : 1, 'name' : 'sign2', 'lnum' : 5, 'group' : '',
1545 \ 'priority' : 10}],
1546 \ s[0].signs)
1547 call sign_place(1, '', 'sign2', 'Xsign',
1548 \ {'lnum' : 5, 'priority' : 5})
1549 let s = sign_getplaced('Xsign', {'lnum' : 5})
1550 call assert_equal([
1551 \ {'id' : 1, 'name' : 'sign2', 'lnum' : 5, 'group' : '',
1552 \ 'priority' : 5}],
1553 \ s[0].signs)
1554
Bram Moolenaar162b7142018-12-21 15:17:36 +01001555 " Error case
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +01001556 call assert_fails("call sign_place(1, 'g1', 'sign1', 'Xsign', [])", 'E1206:')
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