blob: b0f3e15aab18a92a2d03d2ae7a7769d853521605 [file] [log] [blame]
Bram Moolenaar04958cb2018-06-23 19:23:02 +02001" Test for variable tabstops
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
4CheckFeature vartabs
Bram Moolenaar04958cb2018-06-23 19:23:02 +02005
Bram Moolenaara87b72c2018-06-25 21:24:51 +02006source view_util.vim
Bram Moolenaar037c54f2019-04-20 23:47:46 +02007
Bram Moolenaar64f41072018-10-15 22:51:50 +02008func s:compare_lines(expect, actual)
Bram Moolenaara87b72c2018-06-25 21:24:51 +02009 call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
Bram Moolenaar64f41072018-10-15 22:51:50 +020010endfunc
Bram Moolenaara87b72c2018-06-25 21:24:51 +020011
Bram Moolenaar64f41072018-10-15 22:51:50 +020012func Test_vartabs()
Bram Moolenaar04958cb2018-06-23 19:23:02 +020013 new
14 %d
15
16 " Test normal operation of tabstops ...
17 set ts=4
18 call setline(1, join(split('aaaaa', '\zs'), "\t"))
19 retab 8
20 let expect = "a a\<tab>a a\<tab>a"
21 call assert_equal(expect, getline(1))
22
23 " ... and softtabstops
24 set ts=8 sts=6
25 exe "norm! Sb\<tab>b\<tab>b\<tab>b\<tab>b"
26 let expect = "b b\<tab> b\<tab> b\<tab>b"
27 call assert_equal(expect, getline(1))
28
29 " Test variable tabstops.
30 set sts=0 vts=4,8,4,8
31 exe "norm! Sc\<tab>c\<tab>c\<tab>c\<tab>c\<tab>c"
32 retab 8
33 let expect = "c c\<tab> c\<tab>c\<tab>c\<tab>c"
34 call assert_equal(expect, getline(1))
35
36 set et vts=4,8,4,8
37 exe "norm! Sd\<tab>d\<tab>d\<tab>d\<tab>d\<tab>d"
38 let expect = "d d d d d d"
39 call assert_equal(expect, getline(1))
40
41 " Changing ts should have no effect if vts is in use.
42 call cursor(1, 1)
43 set ts=6
44 exe "norm! Se\<tab>e\<tab>e\<tab>e\<tab>e\<tab>e"
45 let expect = "e e e e e e"
46 call assert_equal(expect, getline(1))
47
48 " Clearing vts should revert to using ts.
49 set vts=
50 exe "norm! Sf\<tab>f\<tab>f\<tab>f\<tab>f\<tab>f"
51 let expect = "f f f f f f"
52 call assert_equal(expect, getline(1))
53
54 " Test variable softtabstops.
55 set noet ts=8 vsts=12,2,6
56 exe "norm! Sg\<tab>g\<tab>g\<tab>g\<tab>g\<tab>g"
57 let expect = "g\<tab> g g\<tab> g\<tab> g\<tab>g"
58 call assert_equal(expect, getline(1))
59
60 " Variable tabstops and softtabstops combined.
61 set vsts=6,12,8 vts=4,6,8
62 exe "norm! Sh\<tab>h\<tab>h\<tab>h\<tab>h"
63 let expect = "h\<tab> h\<tab>\<tab>h\<tab>h\<tab>h"
64 call assert_equal(expect, getline(1))
65
66 " Retab with a single value, not using vts.
67 set ts=8 sts=0 vts= vsts=
68 exe "norm! Si\<tab>i\<tab>i\<tab>i\<tab>i"
69 retab 4
70 let expect = "i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i"
71 call assert_equal(expect, getline(1))
72
73 " Retab with a single value, using vts.
74 set ts=8 sts=0 vts=6 vsts=
75 exe "norm! Sj\<tab>j\<tab>j\<tab>j\<tab>j"
76 retab 4
77 let expect = "j\<tab> j\<tab>\<tab>j\<tab> j\<tab>\<tab>j"
78 call assert_equal(expect, getline(1))
79
80 " Retab with multiple values, not using vts.
81 set ts=6 sts=0 vts= vsts=
82 exe "norm! Sk\<tab>k\<tab>k\<tab>k\<tab>k\<tab>k"
83 retab 4,8
84 let expect = "k\<tab> k\<tab>k k\<tab> k\<tab> k"
85 call assert_equal(expect, getline(1))
86
87 " Retab with multiple values, using vts.
88 set ts=8 sts=0 vts=6 vsts=
89 exe "norm! Sl\<tab>l\<tab>l\<tab>l\<tab>l\<tab>l"
90 retab 4,8
91 let expect = "l\<tab> l\<tab>l l\<tab> l\<tab> l"
92 call assert_equal(expect, getline(1))
93
94 " Check that global and local values are set.
95 set ts=4 vts=6 sts=8 vsts=10
96 call assert_equal(&ts, 4)
97 call assert_equal(&vts, '6')
98 call assert_equal(&sts, 8)
99 call assert_equal(&vsts, '10')
100 new
101 call assert_equal(&ts, 4)
102 call assert_equal(&vts, '6')
103 call assert_equal(&sts, 8)
104 call assert_equal(&vsts, '10')
105 bwipeout!
106
107 " Check that local values only are set.
108 setlocal ts=5 vts=7 sts=9 vsts=11
109 call assert_equal(&ts, 5)
110 call assert_equal(&vts, '7')
111 call assert_equal(&sts, 9)
112 call assert_equal(&vsts, '11')
113 new
114 call assert_equal(&ts, 4)
115 call assert_equal(&vts, '6')
116 call assert_equal(&sts, 8)
117 call assert_equal(&vsts, '10')
118 bwipeout!
119
120 " Check that global values only are set.
121 setglobal ts=6 vts=8 sts=10 vsts=12
122 call assert_equal(&ts, 5)
123 call assert_equal(&vts, '7')
124 call assert_equal(&sts, 9)
125 call assert_equal(&vsts, '11')
126 new
127 call assert_equal(&ts, 6)
128 call assert_equal(&vts, '8')
129 call assert_equal(&sts, 10)
130 call assert_equal(&vsts, '12')
131 bwipeout!
132
133 set ts& vts& sts& vsts& et&
134 bwipeout!
135endfunc
136
Bram Moolenaar1e115362019-01-09 23:01:02 +0100137func Test_vartabs_breakindent()
Bram Moolenaar04958cb2018-06-23 19:23:02 +0200138 if !exists("+breakindent")
139 return
140 endif
141 new
142 %d
143
144 " Test normal operation of tabstops ...
145 set ts=4
146 call setline(1, join(split('aaaaa', '\zs'), "\t"))
147 retab 8
148 let expect = "a a\<tab>a a\<tab>a"
149 call assert_equal(expect, getline(1))
150
151 " ... and softtabstops
152 set ts=8 sts=6
153 exe "norm! Sb\<tab>b\<tab>b\<tab>b\<tab>b"
154 let expect = "b b\<tab> b\<tab> b\<tab>b"
155 call assert_equal(expect, getline(1))
156
157 " Test variable tabstops.
158 set sts=0 vts=4,8,4,8
159 exe "norm! Sc\<tab>c\<tab>c\<tab>c\<tab>c\<tab>c"
160 retab 8
161 let expect = "c c\<tab> c\<tab>c\<tab>c\<tab>c"
162 call assert_equal(expect, getline(1))
163
164 set et vts=4,8,4,8
165 exe "norm! Sd\<tab>d\<tab>d\<tab>d\<tab>d\<tab>d"
166 let expect = "d d d d d d"
167 call assert_equal(expect, getline(1))
168
169 " Changing ts should have no effect if vts is in use.
170 call cursor(1, 1)
171 set ts=6
172 exe "norm! Se\<tab>e\<tab>e\<tab>e\<tab>e\<tab>e"
173 let expect = "e e e e e e"
174 call assert_equal(expect, getline(1))
175
176 " Clearing vts should revert to using ts.
177 set vts=
178 exe "norm! Sf\<tab>f\<tab>f\<tab>f\<tab>f\<tab>f"
179 let expect = "f f f f f f"
180 call assert_equal(expect, getline(1))
181
182 " Test variable softtabstops.
183 set noet ts=8 vsts=12,2,6
184 exe "norm! Sg\<tab>g\<tab>g\<tab>g\<tab>g\<tab>g"
185 let expect = "g\<tab> g g\<tab> g\<tab> g\<tab>g"
186 call assert_equal(expect, getline(1))
187
188 " Variable tabstops and softtabstops combined.
189 set vsts=6,12,8 vts=4,6,8
190 exe "norm! Sh\<tab>h\<tab>h\<tab>h\<tab>h"
191 let expect = "h\<tab> h\<tab>\<tab>h\<tab>h\<tab>h"
192 call assert_equal(expect, getline(1))
193
194 " Retab with a single value, not using vts.
195 set ts=8 sts=0 vts= vsts=
196 exe "norm! Si\<tab>i\<tab>i\<tab>i\<tab>i"
197 retab 4
198 let expect = "i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i"
199 call assert_equal(expect, getline(1))
200
201 " Retab with a single value, using vts.
202 set ts=8 sts=0 vts=6 vsts=
203 exe "norm! Sj\<tab>j\<tab>j\<tab>j\<tab>j"
204 retab 4
205 let expect = "j\<tab> j\<tab>\<tab>j\<tab> j\<tab>\<tab>j"
206 call assert_equal(expect, getline(1))
207
208 " Retab with multiple values, not using vts.
209 set ts=6 sts=0 vts= vsts=
210 exe "norm! Sk\<tab>k\<tab>k\<tab>k\<tab>k\<tab>k"
211 retab 4,8
212 let expect = "k\<tab> k\<tab>k k\<tab> k\<tab> k"
213 call assert_equal(expect, getline(1))
214
215 " Retab with multiple values, using vts.
216 set ts=8 sts=0 vts=6 vsts=
217 exe "norm! Sl\<tab>l\<tab>l\<tab>l\<tab>l\<tab>l"
218 retab 4,8
219 let expect = "l\<tab> l\<tab>l l\<tab> l\<tab> l"
220 call assert_equal(expect, getline(1))
221
222 " Check that global and local values are set.
223 set ts=4 vts=6 sts=8 vsts=10
224 call assert_equal(&ts, 4)
225 call assert_equal(&vts, '6')
226 call assert_equal(&sts, 8)
227 call assert_equal(&vsts, '10')
228 new
229 call assert_equal(&ts, 4)
230 call assert_equal(&vts, '6')
231 call assert_equal(&sts, 8)
232 call assert_equal(&vsts, '10')
233 bwipeout!
234
235 " Check that local values only are set.
236 setlocal ts=5 vts=7 sts=9 vsts=11
237 call assert_equal(&ts, 5)
238 call assert_equal(&vts, '7')
239 call assert_equal(&sts, 9)
240 call assert_equal(&vsts, '11')
241 new
242 call assert_equal(&ts, 4)
243 call assert_equal(&vts, '6')
244 call assert_equal(&sts, 8)
245 call assert_equal(&vsts, '10')
246 bwipeout!
247
248 " Check that global values only are set.
249 setglobal ts=6 vts=8 sts=10 vsts=12
250 call assert_equal(&ts, 5)
251 call assert_equal(&vts, '7')
252 call assert_equal(&sts, 9)
253 call assert_equal(&vsts, '11')
254 new
255 call assert_equal(&ts, 6)
256 call assert_equal(&vts, '8')
257 call assert_equal(&sts, 10)
258 call assert_equal(&vsts, '12')
259 bwipeout!
260
261 bwipeout!
262endfunc
Bram Moolenaara87b72c2018-06-25 21:24:51 +0200263
Bram Moolenaar64f41072018-10-15 22:51:50 +0200264func Test_vartabs_linebreak()
Bram Moolenaar307ac5c2018-06-28 22:23:00 +0200265 if winwidth(0) < 40
Bram Moolenaara87b72c2018-06-25 21:24:51 +0200266 return
267 endif
268 new
Bram Moolenaar307ac5c2018-06-28 22:23:00 +0200269 40vnew
Bram Moolenaara87b72c2018-06-25 21:24:51 +0200270 %d
Bram Moolenaar307ac5c2018-06-28 22:23:00 +0200271 setl linebreak vartabstop=10,20,30,40
Bram Moolenaara87b72c2018-06-25 21:24:51 +0200272 call setline(1, "\tx\tx\tx\tx")
273
Bram Moolenaar307ac5c2018-06-28 22:23:00 +0200274 let expect = [' x ',
275 \ 'x x ',
276 \ 'x ']
277 let lines = ScreenLines([1, 3], winwidth(0))
278 call s:compare_lines(expect, lines)
279 setl list listchars=tab:>-
280 let expect = ['>---------x>------------------ ',
281 \ 'x>------------------x>------------------',
282 \ 'x ']
283 let lines = ScreenLines([1, 3], winwidth(0))
284 call s:compare_lines(expect, lines)
285 setl linebreak vartabstop=40
286 let expect = ['>---------------------------------------',
287 \ 'x>--------------------------------------',
288 \ 'x>--------------------------------------',
289 \ 'x>--------------------------------------',
290 \ 'x ']
291 let lines = ScreenLines([1, 5], winwidth(0))
Bram Moolenaara87b72c2018-06-25 21:24:51 +0200292 call s:compare_lines(expect, lines)
293
294 " cleanup
295 bw!
296 bw!
Bram Moolenaar307ac5c2018-06-28 22:23:00 +0200297 set nolist listchars&vim
Bram Moolenaara87b72c2018-06-25 21:24:51 +0200298endfunc
Bram Moolenaar64f41072018-10-15 22:51:50 +0200299
Bram Moolenaarf9514162018-11-22 03:08:29 +0100300func Test_vartabs_shiftwidth()
301 "return
302 if winwidth(0) < 40
303 return
304 endif
305 new
306 40vnew
307 %d
308" setl varsofttabstop=10,20,30,40
309 setl shiftwidth=0 vartabstop=10,20,30,40
310 call setline(1, "x")
311
312 " Check without any change.
313 let expect = ['x ']
314 let lines = ScreenLines(1, winwidth(0))
315 call s:compare_lines(expect, lines)
316 " Test 1:
317 " shiftwidth depends on the indent, first check with cursor at the end of the
318 " line (which is the same as the start of the line, since there is only one
319 " character).
320 norm! $>>
321 let expect1 = [' x ']
322 let lines = ScreenLines(1, winwidth(0))
323 call s:compare_lines(expect1, lines)
324 call assert_equal(10, shiftwidth())
325 call assert_equal(10, shiftwidth(1))
326 call assert_equal(20, shiftwidth(virtcol('.')))
327 norm! $>>
328 let expect2 = [' x ', '~ ']
329 let lines = ScreenLines([1, 2], winwidth(0))
330 call s:compare_lines(expect2, lines)
331 call assert_equal(20, shiftwidth(virtcol('.')-2))
332 call assert_equal(30, shiftwidth(virtcol('.')))
333 norm! $>>
334 let expect3 = [' ', ' x ', '~ ']
335 let lines = ScreenLines([1, 3], winwidth(0))
336 call s:compare_lines(expect3, lines)
337 call assert_equal(30, shiftwidth(virtcol('.')-2))
338 call assert_equal(40, shiftwidth(virtcol('.')))
339 norm! $>>
340 let expect4 = [' ', ' ', ' x ']
341 let lines = ScreenLines([1, 3], winwidth(0))
342 call assert_equal(40, shiftwidth(virtcol('.')))
343 call s:compare_lines(expect4, lines)
344
345 " Test 2: Put the cursor at the first column, result should be the same
346 call setline(1, "x")
347 norm! 0>>
348 let lines = ScreenLines(1, winwidth(0))
349 call s:compare_lines(expect1, lines)
350 norm! 0>>
351 let lines = ScreenLines([1, 2], winwidth(0))
352 call s:compare_lines(expect2, lines)
353 norm! 0>>
354 let lines = ScreenLines([1, 3], winwidth(0))
355 call s:compare_lines(expect3, lines)
356 norm! 0>>
357 let lines = ScreenLines([1, 3], winwidth(0))
358 call s:compare_lines(expect4, lines)
359
360 " cleanup
361 bw!
362 bw!
363endfunc
364
Bram Moolenaar64f41072018-10-15 22:51:50 +0200365func Test_vartabs_failures()
366 call assert_fails('set vts=8,')
367 call assert_fails('set vsts=8,')
368 call assert_fails('set vts=8,,8')
369 call assert_fails('set vsts=8,,8')
370 call assert_fails('set vts=8,,8,')
371 call assert_fails('set vsts=8,,8,')
372 call assert_fails('set vts=,8')
373 call assert_fails('set vsts=,8')
374endfunc
Bram Moolenaar037c54f2019-04-20 23:47:46 +0200375
376func Test_vartabs_reset()
377 set vts=8
378 set all&
379 call assert_equal('', &vts)
380endfunc