blob: ec54209180c835917c266ab1d7de5d3c806efdc1 [file] [log] [blame]
Bram Moolenaar544d3bc2017-02-05 21:14:50 +01001" Test for linebreak and list option in utf-8 mode
2
3set encoding=utf-8
4scriptencoding utf-8
5
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02006source check.vim
7CheckOption linebreak
8CheckFeature conceal
9CheckFeature signs
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010010
11source view_util.vim
12
Bram Moolenaar1e115362019-01-09 23:01:02 +010013func s:screen_lines(lnum, width) abort
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010014 return ScreenLines(a:lnum, a:width)
Bram Moolenaar1e115362019-01-09 23:01:02 +010015endfunc
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010016
Bram Moolenaar1e115362019-01-09 23:01:02 +010017func s:compare_lines(expect, actual)
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010018 call assert_equal(a:expect, a:actual)
Bram Moolenaar1e115362019-01-09 23:01:02 +010019endfunc
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010020
Bram Moolenaar1e115362019-01-09 23:01:02 +010021func s:screen_attr(lnum, chars, ...) abort
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010022 let line = getline(a:lnum)
23 let attr = []
24 let prefix = get(a:000, 0, 0)
25 for i in range(a:chars[0], a:chars[1])
26 let scol = strdisplaywidth(strcharpart(line, 0, i-1)) + 1
27 let attr += [screenattr(a:lnum, scol + prefix)]
28 endfor
29 return attr
Bram Moolenaar1e115362019-01-09 23:01:02 +010030endfunc
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010031
Bram Moolenaar1e115362019-01-09 23:01:02 +010032func s:test_windows(...)
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010033 call NewWindow(10, 20)
34 setl ts=4 sw=4 sts=4 linebreak sbr=+ wrap
35 exe get(a:000, 0, '')
Bram Moolenaar1e115362019-01-09 23:01:02 +010036endfunc
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010037
Bram Moolenaar1e115362019-01-09 23:01:02 +010038func s:close_windows(...)
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010039 call CloseWindow()
40 exe get(a:000, 0, '')
Bram Moolenaar1e115362019-01-09 23:01:02 +010041endfunc
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010042
43func Test_linebreak_with_fancy_listchars()
44 call s:test_windows("setl list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
45 call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ")
46 redraw!
47 let lines = s:screen_lines([1, 4], winwidth(0))
48 let expect = [
49\ "▕———abcdef ",
50\ "+hijklmn▕——— ",
51\ "+pqrstuvwxyz1060ABC",
52\ "+DEFGHIJKLMNOPˑ¶ ",
53\ ]
54 call s:compare_lines(expect, lines)
55 call s:close_windows()
56endfunc
57
58func Test_nolinebreak_with_list()
59 call s:test_windows("setl nolinebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
60 call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ")
61 redraw!
62 let lines = s:screen_lines([1, 4], winwidth(0))
63 let expect = [
64\ "▕———abcdef hijklmn▕—",
65\ "+pqrstuvwxyz1060ABC",
66\ "+DEFGHIJKLMNOPˑ¶ ",
67\ "~ ",
68\ ]
69 call s:compare_lines(expect, lines)
70 call s:close_windows()
71endfunc
72
Bram Moolenaar89a54b42021-09-07 20:45:31 +020073" this was causing a crash
74func Test_linebreak_with_list_and_tabs()
75 set linebreak list listchars=tab:⇤\ tabstop=100
76 new
77 call setline(1, "\t\t\ttext")
78 redraw
79 bwipe!
80 set nolinebreak nolist listchars&vim tabstop=8
81endfunc
82
Bram Moolenaar544d3bc2017-02-05 21:14:50 +010083func Test_linebreak_with_nolist()
84 call s:test_windows('setl nolist')
85 call setline(1, "\t*mask = nil;")
86 redraw!
87 let lines = s:screen_lines([1, 4], winwidth(0))
88 let expect = [
89\ " *mask = nil; ",
90\ "~ ",
91\ "~ ",
92\ "~ ",
93\ ]
94 call s:compare_lines(expect, lines)
95 call s:close_windows()
96endfunc
97
98func Test_list_and_concealing1()
99 call s:test_windows('setl list listchars=tab:>- cole=1')
100 call setline(1, [
101\ "#define ABCDE\t\t1",
102\ "#define ABCDEF\t\t1",
103\ "#define ABCDEFG\t\t1",
104\ "#define ABCDEFGH\t1",
105\ "#define MSG_MODE_FILE\t\t\t1",
106\ "#define MSG_MODE_CONSOLE\t\t2",
107\ "#define MSG_MODE_FILE_AND_CONSOLE\t3",
108\ "#define MSG_MODE_FILE_THEN_CONSOLE\t4",
109\ ])
110 vert resize 40
111 syn match Conceal conceal cchar=>'AB\|MSG_MODE'
112 redraw!
113 let lines = s:screen_lines([1, 7], winwidth(0))
114 let expect = [
115\ "#define ABCDE>-->---1 ",
116\ "#define >CDEF>-->---1 ",
117\ "#define >CDEFG>->---1 ",
118\ "#define >CDEFGH>----1 ",
119\ "#define >_FILE>--------->--->---1 ",
120\ "#define >_CONSOLE>---------->---2 ",
121\ "#define >_FILE_AND_CONSOLE>---------3 ",
122\ ]
123 call s:compare_lines(expect, lines)
124 call s:close_windows()
125endfunc
126
127func Test_list_and_concealing2()
128 call s:test_windows('setl nowrap ts=2 list listchars=tab:>- cole=2 concealcursor=n')
129 call setline(1, "bbeeeeee\t\t;\tsome text")
130 vert resize 40
131 syn clear
132 syn match meaning /;\s*\zs.*/
133 syn match hasword /^\x\{8}/ contains=word
134 syn match word /\<\x\{8}\>/ contains=beginword,endword contained
135 syn match beginword /\<\x\x/ contained conceal
136 syn match endword /\x\{6}\>/ contained
137 hi meaning guibg=blue
138 hi beginword guibg=green
139 hi endword guibg=red
140 redraw!
141 let lines = s:screen_lines([1, 1], winwidth(0))
142 let expect = [
143\ "eeeeee>--->-;>some text ",
144\ ]
145 call s:compare_lines(expect, lines)
146 call s:close_windows()
147endfunc
148
149func Test_screenattr_for_comment()
150 call s:test_windows("setl ft=c ts=7 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
151 call setline(1, " /*\t\t and some more */")
152 norm! gg0
153 syntax on
154 hi SpecialKey term=underline ctermfg=red guifg=red
155 redraw!
156 let line = getline(1)
157 let attr = s:screen_attr(1, [1, 6])
158 call assert_notequal(attr[0], attr[1])
159 call assert_notequal(attr[1], attr[3])
160 call assert_notequal(attr[3], attr[5])
161 call s:close_windows()
162endfunc
163
164func Test_visual_block_and_selection_exclusive()
165 call s:test_windows('setl selection=exclusive')
166 call setline(1, "long line: " . repeat("foobar ", 40) . "TARGETÃ' at end")
167 exe "norm! $3B\<C-v>eAx\<Esc>"
168 let lines = s:screen_lines([1, 10], winwidth(0))
169 let expect = [
Bram Moolenaar0937b9f2022-10-06 21:24:34 +0100170\ "+foobar foobar ",
Bram Moolenaar544d3bc2017-02-05 21:14:50 +0100171\ "+foobar foobar ",
172\ "+foobar foobar ",
173\ "+foobar foobar ",
174\ "+foobar foobar ",
175\ "+foobar foobar ",
176\ "+foobar foobar ",
177\ "+foobar foobar ",
178\ "+foobar foobar ",
179\ "+foobar TARGETÃx' ",
180\ ]
181 call s:compare_lines(expect, lines)
182 call s:close_windows()
183endfunc
184
185func Test_multibyte_sign_and_colorcolumn()
186 call s:test_windows("setl nolinebreak cc=3 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
187 call setline(1, ["", "a b c", "a b c"])
188 exe "sign define foo text=\uff0b"
189 exe "sign place 1 name=foo line=2 buffer=" . bufnr('%')
190 redraw!
191 norm! ggj0
192 let signwidth = strdisplaywidth("\uff0b")
193 let attr1 = s:screen_attr(2, [1, 3], signwidth)
194 let attr2 = s:screen_attr(3, [1, 3], signwidth)
195 call assert_equal(attr1[0], attr2[0])
196 call assert_equal(attr1[1], attr2[1])
197 call assert_equal(attr1[2], attr2[2])
198 let lines = s:screen_lines([1, 3], winwidth(0))
199 let expect = [
200\ " ¶ ",
201\ "+a b c¶ ",
202\ " a b c¶ ",
203\ ]
204 call s:compare_lines(expect, lines)
205 call s:close_windows()
206endfunc
Bram Moolenaar38632fa2017-02-26 19:40:59 +0100207
Bram Moolenaar774e5a92017-06-25 18:03:37 +0200208func Test_colorcolumn_priority()
209 call s:test_windows('setl cc=4 cuc hls')
210 call setline(1, ["xxyy", ""])
211 norm! gg
212 exe "normal! /xxyy\<CR>"
213 norm! G
214 redraw!
215 let line_attr = s:screen_attr(1, [1, &cc])
216 " Search wins over CursorColumn
217 call assert_equal(line_attr[1], line_attr[0])
218 " Search wins over Colorcolumn
219 call assert_equal(line_attr[2], line_attr[3])
220 call s:close_windows('setl hls&vim')
221endfunc
222
Bram Moolenaar38632fa2017-02-26 19:40:59 +0100223func Test_illegal_byte_and_breakat()
224 call s:test_windows("setl sbr= brk+=<")
225 vert resize 18
226 call setline(1, repeat("\x80", 6))
227 redraw!
228 let lines = s:screen_lines([1, 2], winwidth(0))
229 let expect = [
230\ "<80><80><80><80><8",
231\ "0><80> ",
232\ ]
233 call s:compare_lines(expect, lines)
234 call s:close_windows('setl brk&vim')
235endfunc
236
237func Test_multibyte_wrap_and_breakat()
238 call s:test_windows("setl sbr= brk+=>")
239 call setline(1, repeat('a', 17) . repeat('あ', 2))
240 redraw!
241 let lines = s:screen_lines([1, 2], winwidth(0))
242 let expect = [
243\ "aaaaaaaaaaaaaaaaaあ>",
244\ "あ ",
245\ ]
246 call s:compare_lines(expect, lines)
247 call s:close_windows('setl brk&vim')
248endfunc
Bram Moolenaarabc39ab2017-03-01 18:04:05 +0100249
250func Test_chinese_char_on_wrap_column()
251 call s:test_windows("setl nolbr wrap sbr=")
252 syntax off
253 call setline(1, [
254\ 'aaaaaaaaaaaaaaaaaaa中'.
255\ 'aaaaaaaaaaaaaaaaa中'.
256\ 'aaaaaaaaaaaaaaaaa中'.
257\ 'aaaaaaaaaaaaaaaaa中'.
258\ 'aaaaaaaaaaaaaaaaa中'.
259\ 'aaaaaaaaaaaaaaaaa中'.
260\ 'aaaaaaaaaaaaaaaaa中'.
261\ 'aaaaaaaaaaaaaaaaa中'.
262\ 'aaaaaaaaaaaaaaaaa中'.
263\ 'aaaaaaaaaaaaaaaaa中'.
264\ 'hello'])
265 call cursor(1,1)
266 norm! $
267 redraw!
268 let expect=[
Bram Moolenaar0466d392022-10-03 17:07:34 +0100269\ '<<<aaaaaaaaaaaaaaaa>',
Bram Moolenaarabc39ab2017-03-01 18:04:05 +0100270\ '中aaaaaaaaaaaaaaaaa>',
271\ '中aaaaaaaaaaaaaaaaa>',
272\ '中aaaaaaaaaaaaaaaaa>',
273\ '中aaaaaaaaaaaaaaaaa>',
274\ '中aaaaaaaaaaaaaaaaa>',
275\ '中aaaaaaaaaaaaaaaaa>',
276\ '中aaaaaaaaaaaaaaaaa>',
277\ '中aaaaaaaaaaaaaaaaa>',
278\ '中hello ']
279 let lines = s:screen_lines([1, 10], winwidth(0))
280 call s:compare_lines(expect, lines)
281 call s:close_windows()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200282endfunc
283
284" vim: shiftwidth=2 sts=2 expandtab