1544d3bc9SBram Moolenaar" Test for linebreak and list option in utf-8 mode
2544d3bc9SBram Moolenaar
3544d3bc9SBram Moolenaarset encoding=utf-8
4544d3bc9SBram Moolenaarscriptencoding utf-8
5544d3bc9SBram Moolenaar
6b46fecd3SBram Moolenaarsource check.vim
7b46fecd3SBram MoolenaarCheckOption linebreak
8b46fecd3SBram MoolenaarCheckFeature conceal
9b46fecd3SBram MoolenaarCheckFeature signs
10544d3bc9SBram Moolenaar
11544d3bc9SBram Moolenaarsource view_util.vim
12544d3bc9SBram Moolenaar
131e115360SBram Moolenaarfunc s:screen_lines(lnum, width) abort
14544d3bc9SBram Moolenaar  return ScreenLines(a:lnum, a:width)
151e115360SBram Moolenaarendfunc
16544d3bc9SBram Moolenaar
171e115360SBram Moolenaarfunc s:compare_lines(expect, actual)
18544d3bc9SBram Moolenaar  call assert_equal(a:expect, a:actual)
191e115360SBram Moolenaarendfunc
20544d3bc9SBram Moolenaar
211e115360SBram Moolenaarfunc s:screen_attr(lnum, chars, ...) abort
22544d3bc9SBram Moolenaar  let line = getline(a:lnum)
23544d3bc9SBram Moolenaar  let attr = []
24544d3bc9SBram Moolenaar  let prefix = get(a:000, 0, 0)
25544d3bc9SBram Moolenaar  for i in range(a:chars[0], a:chars[1])
26544d3bc9SBram Moolenaar    let scol = strdisplaywidth(strcharpart(line, 0, i-1)) + 1
27544d3bc9SBram Moolenaar    let attr += [screenattr(a:lnum, scol + prefix)]
28544d3bc9SBram Moolenaar  endfor
29544d3bc9SBram Moolenaar  return attr
301e115360SBram Moolenaarendfunc
31544d3bc9SBram Moolenaar
321e115360SBram Moolenaarfunc s:test_windows(...)
33544d3bc9SBram Moolenaar  call NewWindow(10, 20)
34544d3bc9SBram Moolenaar  setl ts=4 sw=4 sts=4 linebreak sbr=+ wrap
35544d3bc9SBram Moolenaar  exe get(a:000, 0, '')
361e115360SBram Moolenaarendfunc
37544d3bc9SBram Moolenaar
381e115360SBram Moolenaarfunc s:close_windows(...)
39544d3bc9SBram Moolenaar  call CloseWindow()
40544d3bc9SBram Moolenaar  exe get(a:000, 0, '')
411e115360SBram Moolenaarendfunc
42544d3bc9SBram Moolenaar
43544d3bc9SBram Moolenaarfunc Test_linebreak_with_fancy_listchars()
44544d3bc9SBram Moolenaar  call s:test_windows("setl list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
45544d3bc9SBram Moolenaar  call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ")
46544d3bc9SBram Moolenaar  redraw!
47544d3bc9SBram Moolenaar  let lines = s:screen_lines([1, 4], winwidth(0))
48544d3bc9SBram Moolenaar  let expect = [
49544d3bc9SBram Moolenaar\ "▕———abcdef          ",
50544d3bc9SBram Moolenaar\ "+hijklmn▕———        ",
51544d3bc9SBram Moolenaar\ "+pqrstuvwxyz␣1060ABC",
52544d3bc9SBram Moolenaar\ "+DEFGHIJKLMNOPˑ¶    ",
53544d3bc9SBram Moolenaar\ ]
54544d3bc9SBram Moolenaar  call s:compare_lines(expect, lines)
55544d3bc9SBram Moolenaar  call s:close_windows()
56544d3bc9SBram Moolenaarendfunc
57544d3bc9SBram Moolenaar
58544d3bc9SBram Moolenaarfunc Test_nolinebreak_with_list()
59544d3bc9SBram Moolenaar  call s:test_windows("setl nolinebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
60544d3bc9SBram Moolenaar  call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP ")
61544d3bc9SBram Moolenaar  redraw!
62544d3bc9SBram Moolenaar  let lines = s:screen_lines([1, 4], winwidth(0))
63544d3bc9SBram Moolenaar  let expect = [
64544d3bc9SBram Moolenaar\ "▕———abcdef hijklmn▕—",
65544d3bc9SBram Moolenaar\ "+pqrstuvwxyz␣1060ABC",
66544d3bc9SBram Moolenaar\ "+DEFGHIJKLMNOPˑ¶    ",
67544d3bc9SBram Moolenaar\ "~                   ",
68544d3bc9SBram Moolenaar\ ]
69544d3bc9SBram Moolenaar  call s:compare_lines(expect, lines)
70544d3bc9SBram Moolenaar  call s:close_windows()
71544d3bc9SBram Moolenaarendfunc
72544d3bc9SBram Moolenaar
73*89a54b41SBram Moolenaar" this was causing a crash
74*89a54b41SBram Moolenaarfunc Test_linebreak_with_list_and_tabs()
75*89a54b41SBram Moolenaar  set linebreak list listchars=tab:⇤\ ⇥ tabstop=100
76*89a54b41SBram Moolenaar  new
77*89a54b41SBram Moolenaar  call setline(1, "\t\t\ttext")
78*89a54b41SBram Moolenaar  redraw
79*89a54b41SBram Moolenaar  bwipe!
80*89a54b41SBram Moolenaar  set nolinebreak nolist listchars&vim tabstop=8
81*89a54b41SBram Moolenaarendfunc
82*89a54b41SBram Moolenaar
83544d3bc9SBram Moolenaarfunc Test_linebreak_with_nolist()
84544d3bc9SBram Moolenaar  call s:test_windows('setl nolist')
85544d3bc9SBram Moolenaar  call setline(1, "\t*mask = nil;")
86544d3bc9SBram Moolenaar  redraw!
87544d3bc9SBram Moolenaar  let lines = s:screen_lines([1, 4], winwidth(0))
88544d3bc9SBram Moolenaar  let expect = [
89544d3bc9SBram Moolenaar\ "    *mask = nil;    ",
90544d3bc9SBram Moolenaar\ "~                   ",
91544d3bc9SBram Moolenaar\ "~                   ",
92544d3bc9SBram Moolenaar\ "~                   ",
93544d3bc9SBram Moolenaar\ ]
94544d3bc9SBram Moolenaar  call s:compare_lines(expect, lines)
95544d3bc9SBram Moolenaar  call s:close_windows()
96544d3bc9SBram Moolenaarendfunc
97544d3bc9SBram Moolenaar
98544d3bc9SBram Moolenaarfunc Test_list_and_concealing1()
99544d3bc9SBram Moolenaar  call s:test_windows('setl list listchars=tab:>- cole=1')
100544d3bc9SBram Moolenaar  call setline(1, [
101544d3bc9SBram Moolenaar\ "#define ABCDE\t\t1",
102544d3bc9SBram Moolenaar\ "#define ABCDEF\t\t1",
103544d3bc9SBram Moolenaar\ "#define ABCDEFG\t\t1",
104544d3bc9SBram Moolenaar\ "#define ABCDEFGH\t1",
105544d3bc9SBram Moolenaar\ "#define MSG_MODE_FILE\t\t\t1",
106544d3bc9SBram Moolenaar\ "#define MSG_MODE_CONSOLE\t\t2",
107544d3bc9SBram Moolenaar\ "#define MSG_MODE_FILE_AND_CONSOLE\t3",
108544d3bc9SBram Moolenaar\ "#define MSG_MODE_FILE_THEN_CONSOLE\t4",
109544d3bc9SBram Moolenaar\ ])
110544d3bc9SBram Moolenaar  vert resize 40
111544d3bc9SBram Moolenaar  syn match Conceal conceal cchar=>'AB\|MSG_MODE'
112544d3bc9SBram Moolenaar  redraw!
113544d3bc9SBram Moolenaar  let lines = s:screen_lines([1, 7], winwidth(0))
114544d3bc9SBram Moolenaar  let expect = [
115544d3bc9SBram Moolenaar\ "#define ABCDE>-->---1                   ",
116544d3bc9SBram Moolenaar\ "#define >CDEF>-->---1                   ",
117544d3bc9SBram Moolenaar\ "#define >CDEFG>->---1                   ",
118544d3bc9SBram Moolenaar\ "#define >CDEFGH>----1                   ",
119544d3bc9SBram Moolenaar\ "#define >_FILE>--------->--->---1       ",
120544d3bc9SBram Moolenaar\ "#define >_CONSOLE>---------->---2       ",
121544d3bc9SBram Moolenaar\ "#define >_FILE_AND_CONSOLE>---------3   ",
122544d3bc9SBram Moolenaar\ ]
123544d3bc9SBram Moolenaar  call s:compare_lines(expect, lines)
124544d3bc9SBram Moolenaar  call s:close_windows()
125544d3bc9SBram Moolenaarendfunc
126544d3bc9SBram Moolenaar
127544d3bc9SBram Moolenaarfunc Test_list_and_concealing2()
128544d3bc9SBram Moolenaar  call s:test_windows('setl nowrap ts=2 list listchars=tab:>- cole=2 concealcursor=n')
129544d3bc9SBram Moolenaar  call setline(1, "bbeeeeee\t\t;\tsome text")
130544d3bc9SBram Moolenaar  vert resize 40
131544d3bc9SBram Moolenaar  syn clear
132544d3bc9SBram Moolenaar  syn match meaning    /;\s*\zs.*/
133544d3bc9SBram Moolenaar  syn match hasword    /^\x\{8}/    contains=word
134544d3bc9SBram Moolenaar  syn match word       /\<\x\{8}\>/ contains=beginword,endword contained
135544d3bc9SBram Moolenaar  syn match beginword  /\<\x\x/     contained conceal
136544d3bc9SBram Moolenaar  syn match endword    /\x\{6}\>/   contained
137544d3bc9SBram Moolenaar  hi meaning   guibg=blue
138544d3bc9SBram Moolenaar  hi beginword guibg=green
139544d3bc9SBram Moolenaar  hi endword   guibg=red
140544d3bc9SBram Moolenaar  redraw!
141544d3bc9SBram Moolenaar  let lines = s:screen_lines([1, 1], winwidth(0))
142544d3bc9SBram Moolenaar  let expect = [
143544d3bc9SBram Moolenaar\ "eeeeee>--->-;>some text                 ",
144544d3bc9SBram Moolenaar\ ]
145544d3bc9SBram Moolenaar  call s:compare_lines(expect, lines)
146544d3bc9SBram Moolenaar  call s:close_windows()
147544d3bc9SBram Moolenaarendfunc
148544d3bc9SBram Moolenaar
149544d3bc9SBram Moolenaarfunc Test_screenattr_for_comment()
150544d3bc9SBram Moolenaar  call s:test_windows("setl ft=c ts=7 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
151544d3bc9SBram Moolenaar  call setline(1, " /*\t\t and some more */")
152544d3bc9SBram Moolenaar  norm! gg0
153544d3bc9SBram Moolenaar  syntax on
154544d3bc9SBram Moolenaar  hi SpecialKey term=underline ctermfg=red guifg=red
155544d3bc9SBram Moolenaar  redraw!
156544d3bc9SBram Moolenaar  let line = getline(1)
157544d3bc9SBram Moolenaar  let attr = s:screen_attr(1, [1, 6])
158544d3bc9SBram Moolenaar  call assert_notequal(attr[0], attr[1])
159544d3bc9SBram Moolenaar  call assert_notequal(attr[1], attr[3])
160544d3bc9SBram Moolenaar  call assert_notequal(attr[3], attr[5])
161544d3bc9SBram Moolenaar  call s:close_windows()
162544d3bc9SBram Moolenaarendfunc
163544d3bc9SBram Moolenaar
164544d3bc9SBram Moolenaarfunc Test_visual_block_and_selection_exclusive()
165544d3bc9SBram Moolenaar  call s:test_windows('setl selection=exclusive')
166544d3bc9SBram Moolenaar  call setline(1, "long line: " . repeat("foobar ", 40) . "TARGETÃ' at end")
167544d3bc9SBram Moolenaar  exe "norm! $3B\<C-v>eAx\<Esc>"
168544d3bc9SBram Moolenaar  let lines = s:screen_lines([1, 10], winwidth(0))
169544d3bc9SBram Moolenaar  let expect = [
170544d3bc9SBram Moolenaar\ "+foobar foobar      ",
171544d3bc9SBram Moolenaar\ "+foobar foobar      ",
172544d3bc9SBram Moolenaar\ "+foobar foobar      ",
173544d3bc9SBram Moolenaar\ "+foobar foobar      ",
174544d3bc9SBram Moolenaar\ "+foobar foobar      ",
175544d3bc9SBram Moolenaar\ "+foobar foobar      ",
176544d3bc9SBram Moolenaar\ "+foobar foobar      ",
177544d3bc9SBram Moolenaar\ "+foobar foobar      ",
178544d3bc9SBram Moolenaar\ "+foobar foobar      ",
179544d3bc9SBram Moolenaar\ "+foobar TARGETÃx'   ",
180544d3bc9SBram Moolenaar\ ]
181544d3bc9SBram Moolenaar  call s:compare_lines(expect, lines)
182544d3bc9SBram Moolenaar  call s:close_windows()
183544d3bc9SBram Moolenaarendfunc
184544d3bc9SBram Moolenaar
185544d3bc9SBram Moolenaarfunc Test_multibyte_sign_and_colorcolumn()
186544d3bc9SBram Moolenaar  call s:test_windows("setl nolinebreak cc=3 list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6")
187544d3bc9SBram Moolenaar  call setline(1, ["", "a b c", "a b c"])
188544d3bc9SBram Moolenaar  exe "sign define foo text=\uff0b"
189544d3bc9SBram Moolenaar  exe "sign place 1 name=foo line=2 buffer=" . bufnr('%')
190544d3bc9SBram Moolenaar  redraw!
191544d3bc9SBram Moolenaar  norm! ggj0
192544d3bc9SBram Moolenaar  let signwidth = strdisplaywidth("\uff0b")
193544d3bc9SBram Moolenaar  let attr1 = s:screen_attr(2, [1, 3], signwidth)
194544d3bc9SBram Moolenaar  let attr2 = s:screen_attr(3, [1, 3], signwidth)
195544d3bc9SBram Moolenaar  call assert_equal(attr1[0], attr2[0])
196544d3bc9SBram Moolenaar  call assert_equal(attr1[1], attr2[1])
197544d3bc9SBram Moolenaar  call assert_equal(attr1[2], attr2[2])
198544d3bc9SBram Moolenaar  let lines = s:screen_lines([1, 3], winwidth(0))
199544d3bc9SBram Moolenaar  let expect = [
200544d3bc9SBram Moolenaar\ "  ¶                 ",
201544d3bc9SBram Moolenaar\ "+a b c¶            ",
202544d3bc9SBram Moolenaar\ "  a b c¶            ",
203544d3bc9SBram Moolenaar\ ]
204544d3bc9SBram Moolenaar  call s:compare_lines(expect, lines)
205544d3bc9SBram Moolenaar  call s:close_windows()
206544d3bc9SBram Moolenaarendfunc
20738632fafSBram Moolenaar
208774e5a96SBram Moolenaarfunc Test_colorcolumn_priority()
209774e5a96SBram Moolenaar  call s:test_windows('setl cc=4 cuc hls')
210774e5a96SBram Moolenaar  call setline(1, ["xxyy", ""])
211774e5a96SBram Moolenaar  norm! gg
212774e5a96SBram Moolenaar  exe "normal! /xxyy\<CR>"
213774e5a96SBram Moolenaar  norm! G
214774e5a96SBram Moolenaar  redraw!
215774e5a96SBram Moolenaar  let line_attr = s:screen_attr(1, [1, &cc])
216774e5a96SBram Moolenaar  " Search wins over CursorColumn
217774e5a96SBram Moolenaar  call assert_equal(line_attr[1], line_attr[0])
218774e5a96SBram Moolenaar  " Search wins over Colorcolumn
219774e5a96SBram Moolenaar  call assert_equal(line_attr[2], line_attr[3])
220774e5a96SBram Moolenaar  call s:close_windows('setl hls&vim')
221774e5a96SBram Moolenaarendfunc
222774e5a96SBram Moolenaar
22338632fafSBram Moolenaarfunc Test_illegal_byte_and_breakat()
22438632fafSBram Moolenaar  call s:test_windows("setl sbr= brk+=<")
22538632fafSBram Moolenaar  vert resize 18
22638632fafSBram Moolenaar  call setline(1, repeat("\x80", 6))
22738632fafSBram Moolenaar  redraw!
22838632fafSBram Moolenaar  let lines = s:screen_lines([1, 2], winwidth(0))
22938632fafSBram Moolenaar  let expect = [
23038632fafSBram Moolenaar\ "<80><80><80><80><8",
23138632fafSBram Moolenaar\ "0><80>            ",
23238632fafSBram Moolenaar\ ]
23338632fafSBram Moolenaar  call s:compare_lines(expect, lines)
23438632fafSBram Moolenaar  call s:close_windows('setl brk&vim')
23538632fafSBram Moolenaarendfunc
23638632fafSBram Moolenaar
23738632fafSBram Moolenaarfunc Test_multibyte_wrap_and_breakat()
23838632fafSBram Moolenaar  call s:test_windows("setl sbr= brk+=>")
23938632fafSBram Moolenaar  call setline(1, repeat('a', 17) . repeat('あ', 2))
24038632fafSBram Moolenaar  redraw!
24138632fafSBram Moolenaar  let lines = s:screen_lines([1, 2], winwidth(0))
24238632fafSBram Moolenaar  let expect = [
24338632fafSBram Moolenaar\ "aaaaaaaaaaaaaaaaaあ>",
24438632fafSBram Moolenaar\ "あ                  ",
24538632fafSBram Moolenaar\ ]
24638632fafSBram Moolenaar  call s:compare_lines(expect, lines)
24738632fafSBram Moolenaar  call s:close_windows('setl brk&vim')
24838632fafSBram Moolenaarendfunc
249abc39ab6SBram Moolenaar
250abc39ab6SBram Moolenaarfunc Test_chinese_char_on_wrap_column()
251abc39ab6SBram Moolenaar  call s:test_windows("setl nolbr wrap sbr=")
252abc39ab6SBram Moolenaar  syntax off
253abc39ab6SBram Moolenaar  call setline(1, [
254abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaaaa中'.
255abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
256abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
257abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
258abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
259abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
260abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
261abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
262abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
263abc39ab6SBram Moolenaar\ 'aaaaaaaaaaaaaaaaa中'.
264abc39ab6SBram Moolenaar\ 'hello'])
265abc39ab6SBram Moolenaar  call cursor(1,1)
266abc39ab6SBram Moolenaar  norm! $
267abc39ab6SBram Moolenaar  redraw!
268abc39ab6SBram Moolenaar  let expect=[
269abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
270abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
271abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
272abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
273abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
274abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
275abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
276abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
277abc39ab6SBram Moolenaar\ '中aaaaaaaaaaaaaaaaa>',
278abc39ab6SBram Moolenaar\ '中hello             ']
279abc39ab6SBram Moolenaar  let lines = s:screen_lines([1, 10], winwidth(0))
280abc39ab6SBram Moolenaar  call s:compare_lines(expect, lines)
281abc39ab6SBram Moolenaar  call s:close_windows()
2826d91bcb4SBram Moolenaarendfunc
2836d91bcb4SBram Moolenaar
2846d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
285