198aefe7cSBram Moolenaar" Tests for defining text property types and adding text properties to the
298aefe7cSBram Moolenaar" buffer.
398aefe7cSBram Moolenaar
4b46fecd3SBram Moolenaarsource check.vim
5b46fecd3SBram MoolenaarCheckFeature textprop
698aefe7cSBram Moolenaar
7c6d86dccSBram Moolenaarsource screendump.vim
8c6d86dccSBram Moolenaar
998aefe7cSBram Moolenaarfunc Test_proptype_global()
1098aefe7cSBram Moolenaar  call prop_type_add('comment', {'highlight': 'Directory', 'priority': 123, 'start_incl': 1, 'end_incl': 1})
1198aefe7cSBram Moolenaar  let proptypes = prop_type_list()
1298aefe7cSBram Moolenaar  call assert_equal(1, len(proptypes))
1398aefe7cSBram Moolenaar  call assert_equal('comment', proptypes[0])
1498aefe7cSBram Moolenaar
1598aefe7cSBram Moolenaar  let proptype = prop_type_get('comment')
1698aefe7cSBram Moolenaar  call assert_equal('Directory', proptype['highlight'])
1798aefe7cSBram Moolenaar  call assert_equal(123, proptype['priority'])
1898aefe7cSBram Moolenaar  call assert_equal(1, proptype['start_incl'])
1998aefe7cSBram Moolenaar  call assert_equal(1, proptype['end_incl'])
2098aefe7cSBram Moolenaar
2198aefe7cSBram Moolenaar  call prop_type_delete('comment')
2298aefe7cSBram Moolenaar  call assert_equal(0, len(prop_type_list()))
2398aefe7cSBram Moolenaar
2498aefe7cSBram Moolenaar  call prop_type_add('one', {})
2598aefe7cSBram Moolenaar  call assert_equal(1, len(prop_type_list()))
26a5a7882eSBram Moolenaar  let proptype = 'one'->prop_type_get()
2798aefe7cSBram Moolenaar  call assert_false(has_key(proptype, 'highlight'))
2898aefe7cSBram Moolenaar  call assert_equal(0, proptype['priority'])
2998aefe7cSBram Moolenaar  call assert_equal(0, proptype['start_incl'])
3098aefe7cSBram Moolenaar  call assert_equal(0, proptype['end_incl'])
3198aefe7cSBram Moolenaar
3298aefe7cSBram Moolenaar  call prop_type_add('two', {})
3398aefe7cSBram Moolenaar  call assert_equal(2, len(prop_type_list()))
3498aefe7cSBram Moolenaar  call prop_type_delete('one')
3598aefe7cSBram Moolenaar  call assert_equal(1, len(prop_type_list()))
3698aefe7cSBram Moolenaar  call prop_type_delete('two')
3798aefe7cSBram Moolenaar  call assert_equal(0, len(prop_type_list()))
3898aefe7cSBram Moolenaarendfunc
3998aefe7cSBram Moolenaar
4098aefe7cSBram Moolenaarfunc Test_proptype_buf()
4198aefe7cSBram Moolenaar  let bufnr = bufnr('')
42e2390c7fSMartin Tournoij  call prop_type_add('comment', #{bufnr: bufnr, highlight: 'Directory', priority: 123, start_incl: 1, end_incl: 1})
4398aefe7cSBram Moolenaar  let proptypes = prop_type_list({'bufnr': bufnr})
4498aefe7cSBram Moolenaar  call assert_equal(1, len(proptypes))
4598aefe7cSBram Moolenaar  call assert_equal('comment', proptypes[0])
4698aefe7cSBram Moolenaar
4798aefe7cSBram Moolenaar  let proptype = prop_type_get('comment', {'bufnr': bufnr})
4898aefe7cSBram Moolenaar  call assert_equal('Directory', proptype['highlight'])
4998aefe7cSBram Moolenaar  call assert_equal(123, proptype['priority'])
5098aefe7cSBram Moolenaar  call assert_equal(1, proptype['start_incl'])
5198aefe7cSBram Moolenaar  call assert_equal(1, proptype['end_incl'])
5298aefe7cSBram Moolenaar
5398aefe7cSBram Moolenaar  call prop_type_delete('comment', {'bufnr': bufnr})
54a5a7882eSBram Moolenaar  call assert_equal(0, len({'bufnr': bufnr}->prop_type_list()))
5598aefe7cSBram Moolenaar
5698aefe7cSBram Moolenaar  call prop_type_add('one', {'bufnr': bufnr})
5798aefe7cSBram Moolenaar  let proptype = prop_type_get('one', {'bufnr': bufnr})
5898aefe7cSBram Moolenaar  call assert_false(has_key(proptype, 'highlight'))
5998aefe7cSBram Moolenaar  call assert_equal(0, proptype['priority'])
6098aefe7cSBram Moolenaar  call assert_equal(0, proptype['start_incl'])
6198aefe7cSBram Moolenaar  call assert_equal(0, proptype['end_incl'])
6298aefe7cSBram Moolenaar
6398aefe7cSBram Moolenaar  call prop_type_add('two', {'bufnr': bufnr})
6498aefe7cSBram Moolenaar  call assert_equal(2, len(prop_type_list({'bufnr': bufnr})))
6598aefe7cSBram Moolenaar  call prop_type_delete('one', {'bufnr': bufnr})
6698aefe7cSBram Moolenaar  call assert_equal(1, len(prop_type_list({'bufnr': bufnr})))
6798aefe7cSBram Moolenaar  call prop_type_delete('two', {'bufnr': bufnr})
6898aefe7cSBram Moolenaar  call assert_equal(0, len(prop_type_list({'bufnr': bufnr})))
69f0884c5fSBram Moolenaar
70f0884c5fSBram Moolenaar  call assert_fails("call prop_type_add('one', {'bufnr': 98764})", "E158:")
7198aefe7cSBram Moolenaarendfunc
7298aefe7cSBram Moolenaar
73e2390c7fSMartin Tournoijdef Test_proptype_buf_list()
74e2390c7fSMartin Tournoij  new
75e2390c7fSMartin Tournoij  var bufnr = bufnr('')
76e2390c7fSMartin Tournoij  try
77e2390c7fSMartin Tournoij    prop_type_add('global', {})
78e2390c7fSMartin Tournoij    prop_type_add('local', {bufnr: bufnr})
79e2390c7fSMartin Tournoij
80e2390c7fSMartin Tournoij    prop_add(1, 1, {type: 'global'})
81e2390c7fSMartin Tournoij    prop_add(1, 1, {type: 'local'})
82e2390c7fSMartin Tournoij
83e2390c7fSMartin Tournoij    assert_equal([
84e2390c7fSMartin Tournoij      {type: 'local',  type_bufnr: bufnr, id: 0, col: 1, end: 1, length: 0, start: 1},
85e2390c7fSMartin Tournoij      {type: 'global', type_bufnr: 0,     id: 0, col: 1, end: 1, length: 0, start: 1},
86e2390c7fSMartin Tournoij    ], prop_list(1))
87e2390c7fSMartin Tournoij    assert_equal(
88e2390c7fSMartin Tournoij      {lnum: 1, id: 0, col: 1, type_bufnr: bufnr, end: 1, type: 'local', length: 0, start: 1},
89e2390c7fSMartin Tournoij      prop_find({lnum: 1, type: 'local'}))
90e2390c7fSMartin Tournoij    assert_equal(
91e2390c7fSMartin Tournoij      {lnum: 1, id: 0, col: 1, type_bufnr: 0, end: 1, type: 'global', length: 0, start: 1},
92e2390c7fSMartin Tournoij      prop_find({lnum: 1, type: 'global'}))
93e2390c7fSMartin Tournoij
94e2390c7fSMartin Tournoij    prop_remove({type: 'global'}, 1)
95e2390c7fSMartin Tournoij    prop_remove({type: 'local'}, 1)
96e2390c7fSMartin Tournoij  finally
97e2390c7fSMartin Tournoij    prop_type_delete('global')
98e2390c7fSMartin Tournoij    prop_type_delete('local', {bufnr: bufnr})
99e2390c7fSMartin Tournoij    bwipe!
100e2390c7fSMartin Tournoij  endtry
101e2390c7fSMartin Tournoijenddef
102e2390c7fSMartin Tournoij
10398aefe7cSBram Moolenaarfunc AddPropTypes()
10498aefe7cSBram Moolenaar  call prop_type_add('one', {})
10598aefe7cSBram Moolenaar  call prop_type_add('two', {})
10698aefe7cSBram Moolenaar  call prop_type_add('three', {})
10798aefe7cSBram Moolenaar  call prop_type_add('whole', {})
10898aefe7cSBram Moolenaarendfunc
10998aefe7cSBram Moolenaar
11098aefe7cSBram Moolenaarfunc DeletePropTypes()
11198aefe7cSBram Moolenaar  call prop_type_delete('one')
11298aefe7cSBram Moolenaar  call prop_type_delete('two')
11398aefe7cSBram Moolenaar  call prop_type_delete('three')
11498aefe7cSBram Moolenaar  call prop_type_delete('whole')
11598aefe7cSBram Moolenaarendfunc
11698aefe7cSBram Moolenaar
11798aefe7cSBram Moolenaarfunc SetupPropsInFirstLine()
11898aefe7cSBram Moolenaar  call setline(1, 'one two three')
11998aefe7cSBram Moolenaar  call prop_add(1, 1, {'length': 3, 'id': 11, 'type': 'one'})
120a5a7882eSBram Moolenaar  eval 1->prop_add(5, {'length': 3, 'id': 12, 'type': 'two'})
1214164bb20SBram Moolenaar  call prop_add(1, 9, {'length': 5, 'id': 13, 'type': 'three'})
12298aefe7cSBram Moolenaar  call prop_add(1, 1, {'length': 13, 'id': 14, 'type': 'whole'})
12398aefe7cSBram Moolenaarendfunc
12498aefe7cSBram Moolenaar
1254164bb20SBram Moolenaarfunc Get_expected_props()
1264164bb20SBram Moolenaar  return [
127e2390c7fSMartin Tournoij      \ #{type_bufnr: 0, col: 1, length: 13, id: 14, type: 'whole', start: 1, end: 1},
128e2390c7fSMartin Tournoij      \ #{type_bufnr: 0, col: 1, length: 3,  id: 11, type: 'one',   start: 1, end: 1},
129e2390c7fSMartin Tournoij      \ #{type_bufnr: 0, col: 5, length: 3,  id: 12, type: 'two',   start: 1, end: 1},
130e2390c7fSMartin Tournoij      \ #{type_bufnr: 0, col: 9, length: 5,  id: 13, type: 'three', start: 1, end: 1},
13198aefe7cSBram Moolenaar      \ ]
1324164bb20SBram Moolenaarendfunc
13398aefe7cSBram Moolenaar
134e05a89acSBram Moolenaarfunc Test_prop_find()
135e05a89acSBram Moolenaar  new
136e05a89acSBram Moolenaar  call setline(1, ['one one one', 'twotwo', 'three', 'fourfour', 'five', 'sixsix'])
137e05a89acSBram Moolenaar
138e05a89acSBram Moolenaar  " Add two text props on lines 1 and 5, and one spanning lines 2 to 4.
139e05a89acSBram Moolenaar  call prop_type_add('prop_name', {'highlight': 'Directory'})
140e05a89acSBram Moolenaar  call prop_add(1, 5, {'type': 'prop_name', 'id': 10, 'length': 3})
141e05a89acSBram Moolenaar  call prop_add(2, 4, {'type': 'prop_name', 'id': 11, 'end_lnum': 4, 'end_col': 9})
142e05a89acSBram Moolenaar  call prop_add(5, 4, {'type': 'prop_name', 'id': 12, 'length': 1})
143e05a89acSBram Moolenaar
144e05a89acSBram Moolenaar  let expected = [
145e2390c7fSMartin Tournoij    \ #{type_bufnr: 0, lnum: 1, col: 5, length: 3, id: 10, type: 'prop_name', start: 1, end: 1},
146e2390c7fSMartin Tournoij    \ #{type_bufnr: 0, lnum: 2, col: 4, id: 11, type: 'prop_name', start: 1, end: 0},
147e2390c7fSMartin Tournoij    \ #{type_bufnr: 0, lnum: 5, col: 4, length: 1, id: 12, type: 'prop_name', start: 1, end: 1}
148e05a89acSBram Moolenaar    \ ]
149e05a89acSBram Moolenaar
150e05a89acSBram Moolenaar  " Starting at line 5 col 1 this should find the prop at line 5 col 4.
151e05a89acSBram Moolenaar  call cursor(5,1)
152e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name'}, 'f')
153e05a89acSBram Moolenaar  call assert_equal(expected[2], result)
154e05a89acSBram Moolenaar
155e05a89acSBram Moolenaar  " With skipstart left at false (default), this should find the prop at line
156e05a89acSBram Moolenaar  " 5 col 4.
157e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name', 'lnum': 5, 'col': 4}, 'b')
158e05a89acSBram Moolenaar  call assert_equal(expected[2], result)
159e05a89acSBram Moolenaar
160e05a89acSBram Moolenaar  " With skipstart set to true, this should skip the prop at line 5 col 4.
161e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name', 'lnum': 5, 'col': 4, 'skipstart': 1}, 'b')
162e05a89acSBram Moolenaar  unlet result.length
163e05a89acSBram Moolenaar  call assert_equal(expected[1], result)
164e05a89acSBram Moolenaar
165e05a89acSBram Moolenaar  " Search backwards from line 1 col 10 to find the prop on the same line.
166e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name', 'lnum': 1, 'col': 10}, 'b')
167e05a89acSBram Moolenaar  call assert_equal(expected[0], result)
168e05a89acSBram Moolenaar
169e05a89acSBram Moolenaar  " with skipstart set to false, if the start position is anywhere between the
170e05a89acSBram Moolenaar  " start and end lines of a text prop (searching forward or backward), the
171e05a89acSBram Moolenaar  " result should be the prop on the first line (the line with 'start' set to 1).
172e05a89acSBram Moolenaar  call cursor(3,1)
173e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name'}, 'f')
174e05a89acSBram Moolenaar  unlet result.length
175e05a89acSBram Moolenaar  call assert_equal(expected[1], result)
176e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name'}, 'b')
177e05a89acSBram Moolenaar  unlet result.length
178e05a89acSBram Moolenaar  call assert_equal(expected[1], result)
179e05a89acSBram Moolenaar
180e05a89acSBram Moolenaar  " with skipstart set to true, if the start position is anywhere between the
181e05a89acSBram Moolenaar  " start and end lines of a text prop (searching forward or backward), all lines
182e05a89acSBram Moolenaar  " of the prop will be skipped.
183e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name', 'skipstart': 1}, 'b')
184e05a89acSBram Moolenaar  call assert_equal(expected[0], result)
185e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name', 'skipstart': 1}, 'f')
186e05a89acSBram Moolenaar  call assert_equal(expected[2], result)
187e05a89acSBram Moolenaar
188e05a89acSBram Moolenaar  " Use skipstart to search through all props with type name 'prop_name'.
189e05a89acSBram Moolenaar  " First forward...
190e05a89acSBram Moolenaar  let lnum = 1
191e05a89acSBram Moolenaar  let col = 1
192e05a89acSBram Moolenaar  let i = 0
193e05a89acSBram Moolenaar  for exp in expected
194e05a89acSBram Moolenaar    let result = prop_find({'type': 'prop_name', 'lnum': lnum, 'col': col, 'skipstart': 1}, 'f')
195e05a89acSBram Moolenaar    if !has_key(exp, "length")
196e05a89acSBram Moolenaar      unlet result.length
197e05a89acSBram Moolenaar    endif
198e05a89acSBram Moolenaar    call assert_equal(exp, result)
199e05a89acSBram Moolenaar    let lnum = result.lnum
200e05a89acSBram Moolenaar    let col = result.col
201e05a89acSBram Moolenaar    let i = i + 1
202e05a89acSBram Moolenaar  endfor
203e05a89acSBram Moolenaar
204e05a89acSBram Moolenaar  " ...then backwards.
205e05a89acSBram Moolenaar  let lnum = 6
206e05a89acSBram Moolenaar  let col = 4
207e05a89acSBram Moolenaar  let i = 2
208e05a89acSBram Moolenaar  while i >= 0
209e05a89acSBram Moolenaar    let result = prop_find({'type': 'prop_name', 'lnum': lnum, 'col': col, 'skipstart': 1}, 'b')
210e05a89acSBram Moolenaar    if !has_key(expected[i], "length")
211e05a89acSBram Moolenaar      unlet result.length
212e05a89acSBram Moolenaar    endif
213e05a89acSBram Moolenaar    call assert_equal(expected[i], result)
214e05a89acSBram Moolenaar    let lnum = result.lnum
215e05a89acSBram Moolenaar    let col = result.col
216e05a89acSBram Moolenaar    let i = i - 1
217e05a89acSBram Moolenaar  endwhile
218e05a89acSBram Moolenaar
219e05a89acSBram Moolenaar  " Starting from line 6 col 1 search backwards for prop with id 10.
220e05a89acSBram Moolenaar  call cursor(6,1)
221e05a89acSBram Moolenaar  let result = prop_find({'id': 10, 'skipstart': 1}, 'b')
222e05a89acSBram Moolenaar  call assert_equal(expected[0], result)
223e05a89acSBram Moolenaar
224e05a89acSBram Moolenaar  " Starting from line 1 col 1 search forwards for prop with id 12.
225e05a89acSBram Moolenaar  call cursor(1,1)
226e05a89acSBram Moolenaar  let result = prop_find({'id': 12}, 'f')
227e05a89acSBram Moolenaar  call assert_equal(expected[2], result)
228e05a89acSBram Moolenaar
229e05a89acSBram Moolenaar  " Search for a prop with an unknown id.
230e05a89acSBram Moolenaar  let result = prop_find({'id': 999}, 'f')
231e05a89acSBram Moolenaar  call assert_equal({}, result)
232e05a89acSBram Moolenaar
233e05a89acSBram Moolenaar  " Search backwards from the proceeding position of the prop with id 11
234e05a89acSBram Moolenaar  " (at line num 2 col 4). This should return an empty dict.
235e05a89acSBram Moolenaar  let result = prop_find({'id': 11, 'lnum': 2, 'col': 3}, 'b')
236e05a89acSBram Moolenaar  call assert_equal({}, result)
237e05a89acSBram Moolenaar
238e05a89acSBram Moolenaar  " When lnum is given and col is omitted, use column 1.
239e05a89acSBram Moolenaar  let result = prop_find({'type': 'prop_name', 'lnum': 1}, 'f')
240e05a89acSBram Moolenaar  call assert_equal(expected[0], result)
241e05a89acSBram Moolenaar
242e041dde7SBram Moolenaar  " Negative ID is possible, just like prop is not found.
2438e3fc135SBram Moolenaar  call assert_equal({}, prop_find({'id': -1}))
244e041dde7SBram Moolenaar  call assert_equal({}, prop_find({'id': -2}))
2458e3fc135SBram Moolenaar
246e05a89acSBram Moolenaar  call prop_clear(1, 6)
2474da7a259SBram Moolenaar
248e041dde7SBram Moolenaar  " Default ID is zero
249e041dde7SBram Moolenaar  call prop_add(5, 4, {'type': 'prop_name', 'length': 1})
250e041dde7SBram Moolenaar  call assert_equal(#{lnum: 5, id: 0, col: 4, type_bufnr: 0, end: 1, type: 'prop_name', length: 1, start: 1}, prop_find({'id': 0}))
251e041dde7SBram Moolenaar
252e041dde7SBram Moolenaar  call prop_type_delete('prop_name')
253e041dde7SBram Moolenaar  call prop_clear(1, 6)
2544da7a259SBram Moolenaar  bwipe!
255e05a89acSBram Moolenaarendfunc
256e05a89acSBram Moolenaar
257eb24556dSBram Moolenaardef Test_prop_find2()
258eb24556dSBram Moolenaar  # Multiple props per line, start on the first, should find the second.
259eb24556dSBram Moolenaar  new
260eb24556dSBram Moolenaar  ['the quikc bronw fox jumsp over the layz dog']->repeat(2)->setline(1)
261e0de171eSBram Moolenaar  prop_type_add('misspell', {highlight: 'ErrorMsg'})
262eb24556dSBram Moolenaar  for lnum in [1, 2]
263eb24556dSBram Moolenaar    for col in [8, 14, 24, 38]
264e0de171eSBram Moolenaar      prop_add(lnum, col, {type: 'misspell', length: 2})
265eb24556dSBram Moolenaar    endfor
266eb24556dSBram Moolenaar  endfor
267eb24556dSBram Moolenaar  cursor(1, 8)
268e2390c7fSMartin Tournoij  var expected = {type_bufnr: 0, lnum: 1, id: 0, col: 14, end: 1, type: 'misspell', length: 2, start: 1}
269e0de171eSBram Moolenaar  var result = prop_find({type: 'misspell', skipstart: true}, 'f')
270eb24556dSBram Moolenaar  assert_equal(expected, result)
271eb24556dSBram Moolenaar
272eb24556dSBram Moolenaar  prop_type_delete('misspell')
273eb24556dSBram Moolenaar  bwipe!
274eb24556dSBram Moolenaarenddef
275eb24556dSBram Moolenaar
276346f18e5SBram Moolenaarfunc Test_prop_find_smaller_len_than_match_col()
277346f18e5SBram Moolenaar  new
278346f18e5SBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
279346f18e5SBram Moolenaar  call setline(1, ['xxxx', 'x'])
280346f18e5SBram Moolenaar  call prop_add(1, 4, {'type': 'test'})
281e2390c7fSMartin Tournoij  call assert_equal(
282e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, lnum: 1, col: 4, type: 'test', length: 0, start: 1, end: 1},
283346f18e5SBram Moolenaar        \ prop_find({'type': 'test', 'lnum': 2, 'col': 1}, 'b'))
284346f18e5SBram Moolenaar  bwipe!
285346f18e5SBram Moolenaar  call prop_type_delete('test')
286346f18e5SBram Moolenaarendfunc
287346f18e5SBram Moolenaar
28824f21fdfSBram Moolenaarfunc Test_prop_find_with_both_option_enabled()
28924f21fdfSBram Moolenaar  " Initialize
29024f21fdfSBram Moolenaar  new
29124f21fdfSBram Moolenaar  call AddPropTypes()
29224f21fdfSBram Moolenaar  call SetupPropsInFirstLine()
29324f21fdfSBram Moolenaar  let props = Get_expected_props()->map({_, v -> extend(v, {'lnum': 1})})
29424f21fdfSBram Moolenaar  " Test
29524f21fdfSBram Moolenaar  call assert_fails("call prop_find({'both': 1})", 'E968:')
29624f21fdfSBram Moolenaar  call assert_fails("call prop_find({'id': 11, 'both': 1})", 'E860:')
29724f21fdfSBram Moolenaar  call assert_fails("call prop_find({'type': 'three', 'both': 1})", 'E860:')
29824f21fdfSBram Moolenaar  call assert_equal({}, prop_find({'id': 11, 'type': 'three', 'both': 1}))
29924f21fdfSBram Moolenaar  call assert_equal({}, prop_find({'id': 130000, 'type': 'one', 'both': 1}))
30024f21fdfSBram Moolenaar  call assert_equal(props[2], prop_find({'id': 12, 'type': 'two', 'both': 1}))
30124f21fdfSBram Moolenaar  call assert_equal(props[0], prop_find({'id': 14, 'type': 'whole', 'both': 1}))
30224f21fdfSBram Moolenaar  " Clean up
30324f21fdfSBram Moolenaar  call DeletePropTypes()
30424f21fdfSBram Moolenaar  bwipe!
30524f21fdfSBram Moolenaarendfunc
30624f21fdfSBram Moolenaar
30798aefe7cSBram Moolenaarfunc Test_prop_add()
30898aefe7cSBram Moolenaar  new
30998aefe7cSBram Moolenaar  call AddPropTypes()
31098aefe7cSBram Moolenaar  call SetupPropsInFirstLine()
3114164bb20SBram Moolenaar  let expected_props = Get_expected_props()
3124164bb20SBram Moolenaar  call assert_equal(expected_props, prop_list(1))
31398aefe7cSBram Moolenaar  call assert_fails("call prop_add(10, 1, {'length': 1, 'id': 14, 'type': 'whole'})", 'E966:')
31498aefe7cSBram Moolenaar  call assert_fails("call prop_add(1, 22, {'length': 1, 'id': 14, 'type': 'whole'})", 'E964:')
31598aefe7cSBram Moolenaar
31698aefe7cSBram Moolenaar  " Insert a line above, text props must still be there.
31798aefe7cSBram Moolenaar  call append(0, 'empty')
3184164bb20SBram Moolenaar  call assert_equal(expected_props, prop_list(2))
31998aefe7cSBram Moolenaar  " Delete a line above, text props must still be there.
32098aefe7cSBram Moolenaar  1del
3214164bb20SBram Moolenaar  call assert_equal(expected_props, prop_list(1))
32298aefe7cSBram Moolenaar
323b9c67a51SBram Moolenaar  " Prop without length or end column is zero length
324b9c67a51SBram Moolenaar  call prop_clear(1)
32512f20038SBram Moolenaar  call prop_type_add('included', {'start_incl': 1, 'end_incl': 1})
32612f20038SBram Moolenaar  call prop_add(1, 5, #{type: 'included'})
327e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 5, length: 0, type: 'included', id: 0, start: 1, end: 1}]
32812f20038SBram Moolenaar  call assert_equal(expected, prop_list(1))
32912f20038SBram Moolenaar
33012f20038SBram Moolenaar  " Inserting text makes the prop bigger.
33112f20038SBram Moolenaar  exe "normal 5|ixx\<Esc>"
332e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 5, length: 2, type: 'included', id: 0, start: 1, end: 1}]
333b9c67a51SBram Moolenaar  call assert_equal(expected, prop_list(1))
334b9c67a51SBram Moolenaar
335f0884c5fSBram Moolenaar  call assert_fails("call prop_add(1, 5, {'type': 'two', 'bufnr': 234343})", 'E158:')
336f0884c5fSBram Moolenaar
33798aefe7cSBram Moolenaar  call DeletePropTypes()
33812f20038SBram Moolenaar  call prop_type_delete('included')
33998aefe7cSBram Moolenaar  bwipe!
34098aefe7cSBram Moolenaarendfunc
34198aefe7cSBram Moolenaar
342ccfb7c67SYegappan Lakshmanan" Test for the prop_add_list() function
343ccfb7c67SYegappan Lakshmananfunc Test_prop_add_list()
344ccfb7c67SYegappan Lakshmanan  new
345ccfb7c67SYegappan Lakshmanan  call AddPropTypes()
346ccfb7c67SYegappan Lakshmanan  call setline(1, ['one one one', 'two two two', 'six six six', 'ten ten ten'])
347ccfb7c67SYegappan Lakshmanan  call prop_add_list(#{type: 'one', id: 2},
348ccfb7c67SYegappan Lakshmanan        \ [[1, 1, 1, 3], [2, 5, 2, 7], [3, 6, 4, 6]])
349ccfb7c67SYegappan Lakshmanan  call assert_equal([#{id: 2, col: 1, type_bufnr: 0, end: 1, type: 'one',
350ccfb7c67SYegappan Lakshmanan        \ length: 2, start: 1}], prop_list(1))
351ccfb7c67SYegappan Lakshmanan  call assert_equal([#{id: 2, col: 5, type_bufnr: 0, end: 1, type: 'one',
352ccfb7c67SYegappan Lakshmanan        \ length: 2, start: 1}], prop_list(2))
353ccfb7c67SYegappan Lakshmanan  call assert_equal([#{id: 2, col: 6, type_bufnr: 0, end: 0, type: 'one',
354ccfb7c67SYegappan Lakshmanan        \ length: 7, start: 1}], prop_list(3))
355ccfb7c67SYegappan Lakshmanan  call assert_equal([#{id: 2, col: 1, type_bufnr: 0, end: 1, type: 'one',
356ccfb7c67SYegappan Lakshmanan        \ length: 5, start: 0}], prop_list(4))
357ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list([1, 2], [[1, 1, 3]])', 'E1206:')
358ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list({}, {})', 'E1211:')
359ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list({}, [[1, 1, 3]])', 'E965:')
360ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "abc"}, [[1, 1, 1, 3]])', 'E971:')
361ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[]])', 'E474:')
362ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[1, 1, 1, 1], {}])', 'E714:')
363ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[1, 1, "a"]])', 'E474:')
364ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[2, 2]])', 'E474:')
365ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[1, 1, 2], [2, 2]])', 'E474:')
366ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[1, 1, 1, 2], [4, 1, 5, 2]])', 'E966:')
367ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[3, 1, 1, 2]])', 'E966:')
368ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [[2, 2, 2, 2], [3, 20, 3, 22]])', 'E964:')
369ccfb7c67SYegappan Lakshmanan  call assert_fails('eval #{type: "one"}->prop_add_list([[2, 2, 2, 2], [3, 20, 3, 22]])', 'E964:')
370ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(test_null_dict(), [[2, 2, 2]])', 'E965:')
371ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, test_null_list())', 'E714:')
372ccfb7c67SYegappan Lakshmanan  call assert_fails('call prop_add_list(#{type: "one"}, [test_null_list()])', 'E714:')
373ccfb7c67SYegappan Lakshmanan  call DeletePropTypes()
374ccfb7c67SYegappan Lakshmanan  bw!
375ccfb7c67SYegappan Lakshmananendfunc
376ccfb7c67SYegappan Lakshmanan
37798aefe7cSBram Moolenaarfunc Test_prop_remove()
37898aefe7cSBram Moolenaar  new
37998aefe7cSBram Moolenaar  call AddPropTypes()
38098aefe7cSBram Moolenaar  call SetupPropsInFirstLine()
3814164bb20SBram Moolenaar  let props = Get_expected_props()
38298aefe7cSBram Moolenaar  call assert_equal(props, prop_list(1))
38398aefe7cSBram Moolenaar
38498aefe7cSBram Moolenaar  " remove by id
385a5a7882eSBram Moolenaar  call assert_equal(1, {'id': 12}->prop_remove(1))
38698aefe7cSBram Moolenaar  unlet props[2]
38798aefe7cSBram Moolenaar  call assert_equal(props, prop_list(1))
38898aefe7cSBram Moolenaar
38998aefe7cSBram Moolenaar  " remove by type
390f0884c5fSBram Moolenaar  call assert_equal(1, prop_remove({'type': 'one'}, 1))
39198aefe7cSBram Moolenaar  unlet props[1]
39298aefe7cSBram Moolenaar  call assert_equal(props, prop_list(1))
39398aefe7cSBram Moolenaar
394f0884c5fSBram Moolenaar  " remove from unknown buffer
395f0884c5fSBram Moolenaar  call assert_fails("call prop_remove({'type': 'one', 'bufnr': 123456}, 1)", 'E158:')
396f0884c5fSBram Moolenaar
39798aefe7cSBram Moolenaar  call DeletePropTypes()
39898aefe7cSBram Moolenaar  bwipe!
39949b79bd4SBram Moolenaar
40049b79bd4SBram Moolenaar  new
40149b79bd4SBram Moolenaar  call AddPropTypes()
40249b79bd4SBram Moolenaar  call SetupPropsInFirstLine()
40349b79bd4SBram Moolenaar  call prop_add(1, 6, {'length': 2, 'id': 11, 'type': 'three'})
40449b79bd4SBram Moolenaar  let props = Get_expected_props()
405e2390c7fSMartin Tournoij  call insert(props, #{type_bufnr: 0, col: 6, length: 2, id: 11, type: 'three', start: 1, end: 1}, 3)
40649b79bd4SBram Moolenaar  call assert_equal(props, prop_list(1))
40749b79bd4SBram Moolenaar  call assert_equal(1, prop_remove({'type': 'three', 'id': 11, 'both': 1, 'all': 1}, 1))
40849b79bd4SBram Moolenaar  unlet props[3]
40949b79bd4SBram Moolenaar  call assert_equal(props, prop_list(1))
41049b79bd4SBram Moolenaar
411e2e4075fSBram Moolenaar  call assert_fails("call prop_remove({'id': 11, 'both': 1})", 'E860:')
412e2e4075fSBram Moolenaar  call assert_fails("call prop_remove({'type': 'three', 'both': 1})", 'E860:')
41349b79bd4SBram Moolenaar
41449b79bd4SBram Moolenaar  call DeletePropTypes()
41549b79bd4SBram Moolenaar  bwipe!
41698aefe7cSBram Moolenaarendfunc
41798aefe7cSBram Moolenaar
418fa2e38dfSBram Moolenaardef Test_prop_add_vim9()
419e0de171eSBram Moolenaar  prop_type_add('comment', {
420fa2e38dfSBram Moolenaar      highlight: 'Directory',
421fa2e38dfSBram Moolenaar      priority: 123,
422fa2e38dfSBram Moolenaar      start_incl: true,
423fa2e38dfSBram Moolenaar      end_incl: true,
424fa2e38dfSBram Moolenaar      combine: false,
425fa2e38dfSBram Moolenaar    })
426fa2e38dfSBram Moolenaar  prop_type_delete('comment')
427fa2e38dfSBram Moolenaarenddef
428fa2e38dfSBram Moolenaar
429a5a40c56SBram Moolenaardef Test_prop_remove_vim9()
430a5a40c56SBram Moolenaar  new
431d2c61705SBram Moolenaar  AddPropTypes()
432d2c61705SBram Moolenaar  SetupPropsInFirstLine()
433e0de171eSBram Moolenaar  assert_equal(1, prop_remove({type: 'three', id: 13, both: true, all: true}))
434d2c61705SBram Moolenaar  DeletePropTypes()
435a5a40c56SBram Moolenaar  bwipe!
436a5a40c56SBram Moolenaarenddef
437a5a40c56SBram Moolenaar
438196d157fSBram Moolenaarfunc SetupOneLine()
439196d157fSBram Moolenaar  call setline(1, 'xonex xtwoxx')
44045dd07f1SBram Moolenaar  normal gg0
441196d157fSBram Moolenaar  call AddPropTypes()
442196d157fSBram Moolenaar  call prop_add(1, 2, {'length': 3, 'id': 11, 'type': 'one'})
443196d157fSBram Moolenaar  call prop_add(1, 8, {'length': 3, 'id': 12, 'type': 'two'})
444196d157fSBram Moolenaar  let expected = [
445e2390c7fSMartin Tournoij	\ #{type_bufnr: 0, col: 2, length: 3, id: 11, type: 'one', start: 1, end: 1},
446e2390c7fSMartin Tournoij	\ #{type_bufnr: 0, col: 8, length: 3, id: 12, type: 'two', start: 1, end: 1},
447196d157fSBram Moolenaar	\]
448196d157fSBram Moolenaar  call assert_equal(expected, prop_list(1))
449196d157fSBram Moolenaar  return expected
450196d157fSBram Moolenaarendfunc
451196d157fSBram Moolenaar
45298aefe7cSBram Moolenaarfunc Test_prop_add_remove_buf()
45398aefe7cSBram Moolenaar  new
45498aefe7cSBram Moolenaar  let bufnr = bufnr('')
45598aefe7cSBram Moolenaar  call AddPropTypes()
4560a2f578eSBram Moolenaar  for lnum in range(1, 4)
4570a2f578eSBram Moolenaar    call setline(lnum, 'one two three')
4580a2f578eSBram Moolenaar  endfor
45998aefe7cSBram Moolenaar  wincmd w
4600a2f578eSBram Moolenaar  for lnum in range(1, 4)
4610a2f578eSBram Moolenaar    call prop_add(lnum, 1, {'length': 3, 'id': 11, 'type': 'one', 'bufnr': bufnr})
4620a2f578eSBram Moolenaar    call prop_add(lnum, 5, {'length': 3, 'id': 12, 'type': 'two', 'bufnr': bufnr})
4630a2f578eSBram Moolenaar    call prop_add(lnum, 11, {'length': 3, 'id': 13, 'type': 'three', 'bufnr': bufnr})
4640a2f578eSBram Moolenaar  endfor
46598aefe7cSBram Moolenaar
46698aefe7cSBram Moolenaar  let props = [
467e2390c7fSMartin Tournoij	\ #{type_bufnr: 0, col: 1, length: 3, id: 11, type: 'one', start: 1, end: 1},
468e2390c7fSMartin Tournoij	\ #{type_bufnr: 0, col: 5, length: 3, id: 12, type: 'two', start: 1, end: 1},
469e2390c7fSMartin Tournoij	\ #{type_bufnr: 0, col: 11, length: 3, id: 13, type: 'three', start: 1, end: 1},
47098aefe7cSBram Moolenaar	\]
47198aefe7cSBram Moolenaar  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
47298aefe7cSBram Moolenaar
47398aefe7cSBram Moolenaar  " remove by id
4740a2f578eSBram Moolenaar  let before_props = deepcopy(props)
47598aefe7cSBram Moolenaar  unlet props[1]
4760a2f578eSBram Moolenaar
4770a2f578eSBram Moolenaar  call prop_remove({'id': 12, 'bufnr': bufnr}, 1)
47898aefe7cSBram Moolenaar  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
4790a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(2, {'bufnr': bufnr}))
4800a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(3, {'bufnr': bufnr}))
4810a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(4, {'bufnr': bufnr}))
4820a2f578eSBram Moolenaar
4830a2f578eSBram Moolenaar  call prop_remove({'id': 12, 'bufnr': bufnr}, 3, 4)
4840a2f578eSBram Moolenaar  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
4850a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(2, {'bufnr': bufnr}))
4860a2f578eSBram Moolenaar  call assert_equal(props, prop_list(3, {'bufnr': bufnr}))
4870a2f578eSBram Moolenaar  call assert_equal(props, prop_list(4, {'bufnr': bufnr}))
4880a2f578eSBram Moolenaar
4890a2f578eSBram Moolenaar  call prop_remove({'id': 12, 'bufnr': bufnr})
4900a2f578eSBram Moolenaar  for lnum in range(1, 4)
4910a2f578eSBram Moolenaar    call assert_equal(props, prop_list(lnum, {'bufnr': bufnr}))
4920a2f578eSBram Moolenaar  endfor
49398aefe7cSBram Moolenaar
49498aefe7cSBram Moolenaar  " remove by type
4950a2f578eSBram Moolenaar  let before_props = deepcopy(props)
49698aefe7cSBram Moolenaar  unlet props[0]
4970a2f578eSBram Moolenaar
4980a2f578eSBram Moolenaar  call prop_remove({'type': 'one', 'bufnr': bufnr}, 1)
49998aefe7cSBram Moolenaar  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
5000a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(2, {'bufnr': bufnr}))
5010a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(3, {'bufnr': bufnr}))
5020a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(4, {'bufnr': bufnr}))
5030a2f578eSBram Moolenaar
5040a2f578eSBram Moolenaar  call prop_remove({'type': 'one', 'bufnr': bufnr}, 3, 4)
5050a2f578eSBram Moolenaar  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
5060a2f578eSBram Moolenaar  call assert_equal(before_props, prop_list(2, {'bufnr': bufnr}))
5070a2f578eSBram Moolenaar  call assert_equal(props, prop_list(3, {'bufnr': bufnr}))
5080a2f578eSBram Moolenaar  call assert_equal(props, prop_list(4, {'bufnr': bufnr}))
5090a2f578eSBram Moolenaar
5100a2f578eSBram Moolenaar  call prop_remove({'type': 'one', 'bufnr': bufnr})
5110a2f578eSBram Moolenaar  for lnum in range(1, 4)
5120a2f578eSBram Moolenaar    call assert_equal(props, prop_list(lnum, {'bufnr': bufnr}))
5130a2f578eSBram Moolenaar  endfor
51498aefe7cSBram Moolenaar
51598aefe7cSBram Moolenaar  call DeletePropTypes()
51698aefe7cSBram Moolenaar  wincmd w
51798aefe7cSBram Moolenaar  bwipe!
51898aefe7cSBram Moolenaarendfunc
51998aefe7cSBram Moolenaar
52033c8ca92SBram Moolenaarfunc Test_prop_backspace()
52133c8ca92SBram Moolenaar  new
52233c8ca92SBram Moolenaar  set bs=2
523196d157fSBram Moolenaar  let expected = SetupOneLine() " 'xonex xtwoxx'
52433c8ca92SBram Moolenaar
52533c8ca92SBram Moolenaar  exe "normal 0li\<BS>\<Esc>fxli\<BS>\<Esc>"
52633c8ca92SBram Moolenaar  call assert_equal('one xtwoxx', getline(1))
52733c8ca92SBram Moolenaar  let expected[0].col = 1
52833c8ca92SBram Moolenaar  let expected[1].col = 6
52933c8ca92SBram Moolenaar  call assert_equal(expected, prop_list(1))
53033c8ca92SBram Moolenaar
53133c8ca92SBram Moolenaar  call DeletePropTypes()
53233c8ca92SBram Moolenaar  bwipe!
53333c8ca92SBram Moolenaar  set bs&
53433c8ca92SBram Moolenaarendfunc
53598aefe7cSBram Moolenaar
536196d157fSBram Moolenaarfunc Test_prop_replace()
537196d157fSBram Moolenaar  new
538196d157fSBram Moolenaar  set bs=2
539196d157fSBram Moolenaar  let expected = SetupOneLine() " 'xonex xtwoxx'
540196d157fSBram Moolenaar
541196d157fSBram Moolenaar  exe "normal 0Ryyy\<Esc>"
542196d157fSBram Moolenaar  call assert_equal('yyyex xtwoxx', getline(1))
543196d157fSBram Moolenaar  call assert_equal(expected, prop_list(1))
544196d157fSBram Moolenaar
545196d157fSBram Moolenaar  exe "normal ftRyy\<BS>"
546196d157fSBram Moolenaar  call assert_equal('yyyex xywoxx', getline(1))
547196d157fSBram Moolenaar  call assert_equal(expected, prop_list(1))
548196d157fSBram Moolenaar
549196d157fSBram Moolenaar  exe "normal 0fwRyy\<BS>"
550196d157fSBram Moolenaar  call assert_equal('yyyex xyyoxx', getline(1))
551196d157fSBram Moolenaar  call assert_equal(expected, prop_list(1))
552196d157fSBram Moolenaar
553196d157fSBram Moolenaar  exe "normal 0foRyy\<BS>\<BS>"
554196d157fSBram Moolenaar  call assert_equal('yyyex xyyoxx', getline(1))
555196d157fSBram Moolenaar  call assert_equal(expected, prop_list(1))
556196d157fSBram Moolenaar
557196d157fSBram Moolenaar  call DeletePropTypes()
558196d157fSBram Moolenaar  bwipe!
559196d157fSBram Moolenaar  set bs&
560196d157fSBram Moolenaarendfunc
561196d157fSBram Moolenaar
56245dd07f1SBram Moolenaarfunc Test_prop_open_line()
56345dd07f1SBram Moolenaar  new
56445dd07f1SBram Moolenaar
56545dd07f1SBram Moolenaar  " open new line, props stay in top line
56645dd07f1SBram Moolenaar  let expected = SetupOneLine() " 'xonex xtwoxx'
56745dd07f1SBram Moolenaar  exe "normal o\<Esc>"
56845dd07f1SBram Moolenaar  call assert_equal('xonex xtwoxx', getline(1))
56945dd07f1SBram Moolenaar  call assert_equal('', getline(2))
57045dd07f1SBram Moolenaar  call assert_equal(expected, prop_list(1))
57145dd07f1SBram Moolenaar  call DeletePropTypes()
57245dd07f1SBram Moolenaar
57345dd07f1SBram Moolenaar  " move all props to next line
57445dd07f1SBram Moolenaar  let expected = SetupOneLine() " 'xonex xtwoxx'
57545dd07f1SBram Moolenaar  exe "normal 0i\<CR>\<Esc>"
57645dd07f1SBram Moolenaar  call assert_equal('', getline(1))
57745dd07f1SBram Moolenaar  call assert_equal('xonex xtwoxx', getline(2))
57845dd07f1SBram Moolenaar  call assert_equal(expected, prop_list(2))
57945dd07f1SBram Moolenaar  call DeletePropTypes()
58045dd07f1SBram Moolenaar
58145dd07f1SBram Moolenaar  " split just before prop, move all props to next line
58245dd07f1SBram Moolenaar  let expected = SetupOneLine() " 'xonex xtwoxx'
58345dd07f1SBram Moolenaar  exe "normal 0li\<CR>\<Esc>"
58445dd07f1SBram Moolenaar  call assert_equal('x', getline(1))
58545dd07f1SBram Moolenaar  call assert_equal('onex xtwoxx', getline(2))
58645dd07f1SBram Moolenaar  let expected[0].col -= 1
58745dd07f1SBram Moolenaar  let expected[1].col -= 1
58845dd07f1SBram Moolenaar  call assert_equal(expected, prop_list(2))
58945dd07f1SBram Moolenaar  call DeletePropTypes()
59045dd07f1SBram Moolenaar
59145dd07f1SBram Moolenaar  " split inside prop, split first prop
59245dd07f1SBram Moolenaar  let expected = SetupOneLine() " 'xonex xtwoxx'
59345dd07f1SBram Moolenaar  exe "normal 0lli\<CR>\<Esc>"
59445dd07f1SBram Moolenaar  call assert_equal('xo', getline(1))
59545dd07f1SBram Moolenaar  call assert_equal('nex xtwoxx', getline(2))
59645dd07f1SBram Moolenaar  let exp_first = [deepcopy(expected[0])]
59745dd07f1SBram Moolenaar  let exp_first[0].length = 1
59887be9be1SBram Moolenaar  let exp_first[0].end = 0
59945dd07f1SBram Moolenaar  call assert_equal(exp_first, prop_list(1))
60045dd07f1SBram Moolenaar  let expected[0].col = 1
60145dd07f1SBram Moolenaar  let expected[0].length = 2
60287be9be1SBram Moolenaar  let expected[0].start = 0
60345dd07f1SBram Moolenaar  let expected[1].col -= 2
60445dd07f1SBram Moolenaar  call assert_equal(expected, prop_list(2))
60545dd07f1SBram Moolenaar  call DeletePropTypes()
60645dd07f1SBram Moolenaar
6075c65e6a0SBram Moolenaar  " split just after first prop, second prop move to next line
60845dd07f1SBram Moolenaar  let expected = SetupOneLine() " 'xonex xtwoxx'
60945dd07f1SBram Moolenaar  exe "normal 0fea\<CR>\<Esc>"
61045dd07f1SBram Moolenaar  call assert_equal('xone', getline(1))
61145dd07f1SBram Moolenaar  call assert_equal('x xtwoxx', getline(2))
61245dd07f1SBram Moolenaar  let exp_first = expected[0:0]
61345dd07f1SBram Moolenaar  call assert_equal(exp_first, prop_list(1))
6145c65e6a0SBram Moolenaar  let expected = expected[1:1]
6155c65e6a0SBram Moolenaar  let expected[0].col -= 4
61645dd07f1SBram Moolenaar  call assert_equal(expected, prop_list(2))
61745dd07f1SBram Moolenaar  call DeletePropTypes()
61845dd07f1SBram Moolenaar
61945dd07f1SBram Moolenaar  bwipe!
62045dd07f1SBram Moolenaar  set bs&
62145dd07f1SBram Moolenaarendfunc
62245dd07f1SBram Moolenaar
62398aefe7cSBram Moolenaarfunc Test_prop_clear()
62498aefe7cSBram Moolenaar  new
62598aefe7cSBram Moolenaar  call AddPropTypes()
62698aefe7cSBram Moolenaar  call SetupPropsInFirstLine()
6274164bb20SBram Moolenaar  call assert_equal(Get_expected_props(), prop_list(1))
62898aefe7cSBram Moolenaar
629a5a7882eSBram Moolenaar  eval 1->prop_clear()
630a5a7882eSBram Moolenaar  call assert_equal([], 1->prop_list())
63198aefe7cSBram Moolenaar
63298aefe7cSBram Moolenaar  call DeletePropTypes()
63398aefe7cSBram Moolenaar  bwipe!
63498aefe7cSBram Moolenaarendfunc
63598aefe7cSBram Moolenaar
63698aefe7cSBram Moolenaarfunc Test_prop_clear_buf()
63798aefe7cSBram Moolenaar  new
63898aefe7cSBram Moolenaar  call AddPropTypes()
63998aefe7cSBram Moolenaar  call SetupPropsInFirstLine()
64098aefe7cSBram Moolenaar  let bufnr = bufnr('')
64198aefe7cSBram Moolenaar  wincmd w
6424164bb20SBram Moolenaar  call assert_equal(Get_expected_props(), prop_list(1, {'bufnr': bufnr}))
64398aefe7cSBram Moolenaar
64498aefe7cSBram Moolenaar  call prop_clear(1, 1, {'bufnr': bufnr})
64598aefe7cSBram Moolenaar  call assert_equal([], prop_list(1, {'bufnr': bufnr}))
64698aefe7cSBram Moolenaar
64798aefe7cSBram Moolenaar  wincmd w
64898aefe7cSBram Moolenaar  call DeletePropTypes()
64998aefe7cSBram Moolenaar  bwipe!
65098aefe7cSBram Moolenaarendfunc
65198aefe7cSBram Moolenaar
65221b5038eSBram Moolenaarfunc Test_prop_setline()
65321b5038eSBram Moolenaar  new
65421b5038eSBram Moolenaar  call AddPropTypes()
65521b5038eSBram Moolenaar  call SetupPropsInFirstLine()
6564164bb20SBram Moolenaar  call assert_equal(Get_expected_props(), prop_list(1))
65721b5038eSBram Moolenaar
65821b5038eSBram Moolenaar  call setline(1, 'foobar')
65921b5038eSBram Moolenaar  call assert_equal([], prop_list(1))
66021b5038eSBram Moolenaar
66121b5038eSBram Moolenaar  call DeletePropTypes()
66221b5038eSBram Moolenaar  bwipe!
66321b5038eSBram Moolenaarendfunc
66421b5038eSBram Moolenaar
66521b5038eSBram Moolenaarfunc Test_prop_setbufline()
66621b5038eSBram Moolenaar  new
66721b5038eSBram Moolenaar  call AddPropTypes()
66821b5038eSBram Moolenaar  call SetupPropsInFirstLine()
66921b5038eSBram Moolenaar  let bufnr = bufnr('')
67021b5038eSBram Moolenaar  wincmd w
6714164bb20SBram Moolenaar  call assert_equal(Get_expected_props(), prop_list(1, {'bufnr': bufnr}))
67221b5038eSBram Moolenaar
67321b5038eSBram Moolenaar  call setbufline(bufnr, 1, 'foobar')
67421b5038eSBram Moolenaar  call assert_equal([], prop_list(1, {'bufnr': bufnr}))
67521b5038eSBram Moolenaar
67621b5038eSBram Moolenaar  wincmd w
67721b5038eSBram Moolenaar  call DeletePropTypes()
67821b5038eSBram Moolenaar  bwipe!
67921b5038eSBram Moolenaarendfunc
68021b5038eSBram Moolenaar
6814164bb20SBram Moolenaarfunc Test_prop_substitute()
6824164bb20SBram Moolenaar  new
6834164bb20SBram Moolenaar  " Set first line to 'one two three'
6844164bb20SBram Moolenaar  call AddPropTypes()
6854164bb20SBram Moolenaar  call SetupPropsInFirstLine()
6864164bb20SBram Moolenaar  let expected_props = Get_expected_props()
6874164bb20SBram Moolenaar  call assert_equal(expected_props, prop_list(1))
6884164bb20SBram Moolenaar
6894164bb20SBram Moolenaar  " Change "n" in "one" to XX: 'oXXe two three'
6904164bb20SBram Moolenaar  s/n/XX/
6914164bb20SBram Moolenaar  let expected_props[0].length += 1
6924164bb20SBram Moolenaar  let expected_props[1].length += 1
6934164bb20SBram Moolenaar  let expected_props[2].col += 1
6944164bb20SBram Moolenaar  let expected_props[3].col += 1
6954164bb20SBram Moolenaar  call assert_equal(expected_props, prop_list(1))
6964164bb20SBram Moolenaar
6974164bb20SBram Moolenaar  " Delete "t" in "two" and "three" to XX: 'oXXe wo hree'
6984164bb20SBram Moolenaar  s/t//g
6994164bb20SBram Moolenaar  let expected_props[0].length -= 2
7004164bb20SBram Moolenaar  let expected_props[2].length -= 1
7014164bb20SBram Moolenaar  let expected_props[3].length -= 1
7024164bb20SBram Moolenaar  let expected_props[3].col -= 1
7034164bb20SBram Moolenaar  call assert_equal(expected_props, prop_list(1))
7044164bb20SBram Moolenaar
7054164bb20SBram Moolenaar  " Split the line by changing w to line break: 'oXXe ', 'o hree'
7064164bb20SBram Moolenaar  " The long prop is split and spans both lines.
7074164bb20SBram Moolenaar  " The props on "two" and "three" move to the next line.
7084164bb20SBram Moolenaar  s/w/\r/
7094164bb20SBram Moolenaar  let new_props = [
7104164bb20SBram Moolenaar	\ copy(expected_props[0]),
7114164bb20SBram Moolenaar	\ copy(expected_props[2]),
7124164bb20SBram Moolenaar	\ copy(expected_props[3]),
7134164bb20SBram Moolenaar	\ ]
7144164bb20SBram Moolenaar  let expected_props[0].length = 5
71587be9be1SBram Moolenaar  let expected_props[0].end = 0
7164164bb20SBram Moolenaar  unlet expected_props[3]
7174164bb20SBram Moolenaar  unlet expected_props[2]
7184164bb20SBram Moolenaar  call assert_equal(expected_props, prop_list(1))
7194164bb20SBram Moolenaar
7204164bb20SBram Moolenaar  let new_props[0].length = 6
72187be9be1SBram Moolenaar  let new_props[0].start = 0
7224164bb20SBram Moolenaar  let new_props[1].col = 1
7234164bb20SBram Moolenaar  let new_props[1].length = 1
7244164bb20SBram Moolenaar  let new_props[2].col = 3
7254164bb20SBram Moolenaar  call assert_equal(new_props, prop_list(2))
7264164bb20SBram Moolenaar
7274164bb20SBram Moolenaar  call DeletePropTypes()
7284164bb20SBram Moolenaar  bwipe!
7294164bb20SBram Moolenaarendfunc
7304164bb20SBram Moolenaar
731663bc89bSBram Moolenaarfunc Test_prop_change_indent()
732663bc89bSBram Moolenaar  call prop_type_add('comment', {'highlight': 'Directory'})
733663bc89bSBram Moolenaar  new
734663bc89bSBram Moolenaar  call setline(1, ['    xxx', 'yyyyy'])
735663bc89bSBram Moolenaar  call prop_add(2, 2, {'length': 2, 'type': 'comment'})
736e2390c7fSMartin Tournoij  let expect = #{type_bufnr: 0, col: 2, length: 2, type: 'comment', start: 1, end: 1, id: 0}
737663bc89bSBram Moolenaar  call assert_equal([expect], prop_list(2))
738663bc89bSBram Moolenaar
739663bc89bSBram Moolenaar  set shiftwidth=3
740663bc89bSBram Moolenaar  normal 2G>>
741663bc89bSBram Moolenaar  call assert_equal('   yyyyy', getline(2))
742663bc89bSBram Moolenaar  let expect.col += 3
743663bc89bSBram Moolenaar  call assert_equal([expect], prop_list(2))
744663bc89bSBram Moolenaar
745663bc89bSBram Moolenaar  normal 2G==
746663bc89bSBram Moolenaar  call assert_equal('    yyyyy', getline(2))
747663bc89bSBram Moolenaar  let expect.col = 6
748663bc89bSBram Moolenaar  call assert_equal([expect], prop_list(2))
749663bc89bSBram Moolenaar
750663bc89bSBram Moolenaar  call prop_clear(2)
751663bc89bSBram Moolenaar  call prop_add(2, 2, {'length': 5, 'type': 'comment'})
752663bc89bSBram Moolenaar  let expect.col = 2
753663bc89bSBram Moolenaar  let expect.length = 5
754663bc89bSBram Moolenaar  call assert_equal([expect], prop_list(2))
755663bc89bSBram Moolenaar
756663bc89bSBram Moolenaar  normal 2G<<
757663bc89bSBram Moolenaar  call assert_equal(' yyyyy', getline(2))
758663bc89bSBram Moolenaar  let expect.length = 2
759663bc89bSBram Moolenaar  call assert_equal([expect], prop_list(2))
760663bc89bSBram Moolenaar
761663bc89bSBram Moolenaar  set shiftwidth&
762663bc89bSBram Moolenaar  call prop_type_delete('comment')
763663bc89bSBram Moolenaarendfunc
764663bc89bSBram Moolenaar
765c1a9bc1aSBram Moolenaar" Setup a three line prop in lines 2 - 4.
766c1a9bc1aSBram Moolenaar" Add short props in line 1 and 5.
767c1a9bc1aSBram Moolenaarfunc Setup_three_line_prop()
768c1a9bc1aSBram Moolenaar  new
769c1a9bc1aSBram Moolenaar  call setline(1, ['one', 'twotwo', 'three', 'fourfour', 'five'])
770c1a9bc1aSBram Moolenaar  call prop_add(1, 2, {'length': 1, 'type': 'comment'})
771c1a9bc1aSBram Moolenaar  call prop_add(2, 4, {'end_lnum': 4, 'end_col': 5, 'type': 'comment'})
772c1a9bc1aSBram Moolenaar  call prop_add(5, 2, {'length': 1, 'type': 'comment'})
773c1a9bc1aSBram Moolenaarendfunc
774c1a9bc1aSBram Moolenaar
775e3d31b02SBram Moolenaarfunc Test_prop_multiline()
776a5a7882eSBram Moolenaar  eval 'comment'->prop_type_add({'highlight': 'Directory'})
777e3d31b02SBram Moolenaar  new
778e3d31b02SBram Moolenaar  call setline(1, ['xxxxxxx', 'yyyyyyyyy', 'zzzzzzzz'])
779e3d31b02SBram Moolenaar
780e3d31b02SBram Moolenaar  " start halfway line 1, end halfway line 3
781e3d31b02SBram Moolenaar  call prop_add(1, 3, {'end_lnum': 3, 'end_col': 5, 'type': 'comment'})
782e2390c7fSMartin Tournoij  let expect1 = #{type_bufnr: 0, col: 3, length: 6, type: 'comment', start: 1, end: 0, id: 0}
783e3d31b02SBram Moolenaar  call assert_equal([expect1], prop_list(1))
784e2390c7fSMartin Tournoij  let expect2 = #{type_bufnr: 0, col: 1, length: 10, type: 'comment', start: 0, end: 0, id: 0}
785e3d31b02SBram Moolenaar  call assert_equal([expect2], prop_list(2))
786e2390c7fSMartin Tournoij  let expect3 = #{type_bufnr: 0, col: 1, length: 4, type: 'comment', start: 0, end: 1, id: 0}
787e3d31b02SBram Moolenaar  call assert_equal([expect3], prop_list(3))
788e3d31b02SBram Moolenaar  call prop_clear(1, 3)
789e3d31b02SBram Moolenaar
790e3d31b02SBram Moolenaar  " include all three lines
791e3d31b02SBram Moolenaar  call prop_add(1, 1, {'end_lnum': 3, 'end_col': 999, 'type': 'comment'})
792e3d31b02SBram Moolenaar  let expect1.col = 1
793e3d31b02SBram Moolenaar  let expect1.length = 8
794e3d31b02SBram Moolenaar  call assert_equal([expect1], prop_list(1))
795e3d31b02SBram Moolenaar  call assert_equal([expect2], prop_list(2))
796e3d31b02SBram Moolenaar  let expect3.length = 9
797e3d31b02SBram Moolenaar  call assert_equal([expect3], prop_list(3))
798e3d31b02SBram Moolenaar  call prop_clear(1, 3)
799e3d31b02SBram Moolenaar
800e3d31b02SBram Moolenaar  bwipe!
801c1a9bc1aSBram Moolenaar
802b9c67a51SBram Moolenaar  " Test deleting the first line of a multi-line prop.
803c1a9bc1aSBram Moolenaar  call Setup_three_line_prop()
804e2390c7fSMartin Tournoij  let expect_short = #{type_bufnr: 0, col: 2, length: 1, type: 'comment', start: 1, end: 1, id: 0}
805b9c67a51SBram Moolenaar  call assert_equal([expect_short], prop_list(1))
806e2390c7fSMartin Tournoij  let expect2 = #{type_bufnr: 0, col: 4, length: 4, type: 'comment', start: 1, end: 0, id: 0}
807c1a9bc1aSBram Moolenaar  call assert_equal([expect2], prop_list(2))
808c1a9bc1aSBram Moolenaar  2del
809c1a9bc1aSBram Moolenaar  call assert_equal([expect_short], prop_list(1))
810e2390c7fSMartin Tournoij  let expect2 = #{type_bufnr: 0, col: 1, length: 6, type: 'comment', start: 1, end: 0, id: 0}
811c1a9bc1aSBram Moolenaar  call assert_equal([expect2], prop_list(2))
812c1a9bc1aSBram Moolenaar  bwipe!
813c1a9bc1aSBram Moolenaar
814b9c67a51SBram Moolenaar  " Test deleting the last line of a multi-line prop.
815c1a9bc1aSBram Moolenaar  call Setup_three_line_prop()
816e2390c7fSMartin Tournoij  let expect3 = #{type_bufnr: 0, col: 1, length: 6, type: 'comment', start: 0, end: 0, id: 0}
817c1a9bc1aSBram Moolenaar  call assert_equal([expect3], prop_list(3))
818e2390c7fSMartin Tournoij  let expect4 = #{type_bufnr: 0, col: 1, length: 4, type: 'comment', start: 0, end: 1, id: 0}
819c1a9bc1aSBram Moolenaar  call assert_equal([expect4], prop_list(4))
820c1a9bc1aSBram Moolenaar  4del
821b9c67a51SBram Moolenaar  let expect3.end = 1
822c1a9bc1aSBram Moolenaar  call assert_equal([expect3], prop_list(3))
823c1a9bc1aSBram Moolenaar  call assert_equal([expect_short], prop_list(4))
824c1a9bc1aSBram Moolenaar  bwipe!
825c1a9bc1aSBram Moolenaar
826b9c67a51SBram Moolenaar  " Test appending a line below the multi-line text prop start.
827b56ac049SBram Moolenaar  call Setup_three_line_prop()
828e2390c7fSMartin Tournoij  let expect2 = #{type_bufnr: 0, col: 4, length: 4, type: 'comment', start: 1, end: 0, id: 0}
829b56ac049SBram Moolenaar  call assert_equal([expect2], prop_list(2))
830b56ac049SBram Moolenaar  call append(2, "new line")
831b56ac049SBram Moolenaar  call assert_equal([expect2], prop_list(2))
832e2390c7fSMartin Tournoij  let expect3 = #{type_bufnr: 0, col: 1, length: 9, type: 'comment', start: 0, end: 0, id: 0}
833b56ac049SBram Moolenaar  call assert_equal([expect3], prop_list(3))
834b56ac049SBram Moolenaar  bwipe!
835b56ac049SBram Moolenaar
836e3d31b02SBram Moolenaar  call prop_type_delete('comment')
837e3d31b02SBram Moolenaarendfunc
838e3d31b02SBram Moolenaar
8399df53b62SBram Moolenaarfunc Test_prop_line2byte()
840b413d2e6SBram Moolenaar  call prop_type_add('comment', {'highlight': 'Directory'})
841b413d2e6SBram Moolenaar  new
84200b1e041SBram Moolenaar  call setline(1, ['line1', 'second line', ''])
8438cf734e0SBram Moolenaar  set ff=unix
84400b1e041SBram Moolenaar  call assert_equal(19, line2byte(3))
845b413d2e6SBram Moolenaar  call prop_add(1, 1, {'end_col': 3, 'type': 'comment'})
84600b1e041SBram Moolenaar  call assert_equal(19, line2byte(3))
847b413d2e6SBram Moolenaar  bwipe!
84814c7530cSBram Moolenaar
84914c7530cSBram Moolenaar  new
850a401bba0SBram Moolenaar  setlocal ff=unix
85114c7530cSBram Moolenaar  call setline(1, range(500))
85214c7530cSBram Moolenaar  call assert_equal(1491, line2byte(401))
85314c7530cSBram Moolenaar  call prop_add(2, 1, {'type': 'comment'})
85414c7530cSBram Moolenaar  call prop_add(222, 1, {'type': 'comment'})
85514c7530cSBram Moolenaar  call assert_equal(1491, line2byte(401))
85614c7530cSBram Moolenaar  call prop_remove({'type': 'comment'})
85714c7530cSBram Moolenaar  call assert_equal(1491, line2byte(401))
85814c7530cSBram Moolenaar  bwipe!
85914c7530cSBram Moolenaar
860cdd8a5e6SBram Moolenaar  new
861*49b93049SBram Moolenaar  setlocal ff=unix
862cdd8a5e6SBram Moolenaar  call setline(1, range(520))
863cdd8a5e6SBram Moolenaar  call assert_equal(1491, line2byte(401))
864cdd8a5e6SBram Moolenaar  call prop_add(2, 1, {'type': 'comment'})
865cdd8a5e6SBram Moolenaar  call assert_equal(1491, line2byte(401))
866cdd8a5e6SBram Moolenaar  2delete
867cdd8a5e6SBram Moolenaar  call assert_equal(1489, line2byte(400))
868cdd8a5e6SBram Moolenaar  bwipe!
869cdd8a5e6SBram Moolenaar
870b413d2e6SBram Moolenaar  call prop_type_delete('comment')
871b413d2e6SBram Moolenaarendfunc
872b413d2e6SBram Moolenaar
8739df53b62SBram Moolenaarfunc Test_prop_byte2line()
8749df53b62SBram Moolenaar  new
8759df53b62SBram Moolenaar  set ff=unix
8769df53b62SBram Moolenaar  call setline(1, ['one one', 'two two', 'three three', 'four four', 'five'])
8779df53b62SBram Moolenaar  call assert_equal(4, byte2line(line2byte(4)))
8789df53b62SBram Moolenaar  call assert_equal(5, byte2line(line2byte(5)))
8799df53b62SBram Moolenaar
8809df53b62SBram Moolenaar  call prop_type_add('prop', {'highlight': 'Directory'})
8819df53b62SBram Moolenaar  call prop_add(3, 1, {'length': 5, 'type': 'prop'})
8829df53b62SBram Moolenaar  call assert_equal(4, byte2line(line2byte(4)))
8839df53b62SBram Moolenaar  call assert_equal(5, byte2line(line2byte(5)))
8849df53b62SBram Moolenaar
8859df53b62SBram Moolenaar  bwipe!
8869df53b62SBram Moolenaar  call prop_type_delete('prop')
8879df53b62SBram Moolenaarendfunc
8889df53b62SBram Moolenaar
88959ff6407SBram Moolenaarfunc Test_prop_goto_byte()
89059ff6407SBram Moolenaar  new
89159ff6407SBram Moolenaar  call setline(1, '')
89259ff6407SBram Moolenaar  call setline(2, 'two three')
89359ff6407SBram Moolenaar  call setline(3, '')
89459ff6407SBram Moolenaar  call setline(4, 'four five')
89559ff6407SBram Moolenaar
89659ff6407SBram Moolenaar  call prop_type_add('testprop', {'highlight': 'Directory'})
89759ff6407SBram Moolenaar  call search('^two')
89859ff6407SBram Moolenaar  call prop_add(line('.'), col('.'), {
89959ff6407SBram Moolenaar        \ 'length': len('two'),
90059ff6407SBram Moolenaar        \ 'type':   'testprop'
90159ff6407SBram Moolenaar        \ })
90259ff6407SBram Moolenaar
90359ff6407SBram Moolenaar  call search('two \zsthree')
90459ff6407SBram Moolenaar  let expected_pos = line2byte(line('.')) + col('.') - 1
90559ff6407SBram Moolenaar  exe expected_pos .. 'goto'
90659ff6407SBram Moolenaar  let actual_pos = line2byte(line('.')) + col('.') - 1
90759ff6407SBram Moolenaar  eval actual_pos->assert_equal(expected_pos)
90859ff6407SBram Moolenaar
90959ff6407SBram Moolenaar  call search('four \zsfive')
91059ff6407SBram Moolenaar  let expected_pos = line2byte(line('.')) + col('.') - 1
91159ff6407SBram Moolenaar  exe expected_pos .. 'goto'
91259ff6407SBram Moolenaar  let actual_pos = line2byte(line('.')) + col('.') - 1
91359ff6407SBram Moolenaar  eval actual_pos->assert_equal(expected_pos)
91459ff6407SBram Moolenaar
91559ff6407SBram Moolenaar  call prop_type_delete('testprop')
91659ff6407SBram Moolenaar  bwipe!
91759ff6407SBram Moolenaarendfunc
91859ff6407SBram Moolenaar
9197f1664e3SBram Moolenaarfunc Test_prop_undo()
9207f1664e3SBram Moolenaar  new
9217f1664e3SBram Moolenaar  call prop_type_add('comment', {'highlight': 'Directory'})
9227f1664e3SBram Moolenaar  call setline(1, ['oneone', 'twotwo', 'three'])
9237f1664e3SBram Moolenaar  " Set 'undolevels' to break changes into undo-able pieces.
9247f1664e3SBram Moolenaar  set ul&
9257f1664e3SBram Moolenaar
9267f1664e3SBram Moolenaar  call prop_add(1, 3, {'end_col': 5, 'type': 'comment'})
927e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 3, length: 2, id: 0, type: 'comment', start: 1, end: 1}]
9287f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9297f1664e3SBram Moolenaar
9307f1664e3SBram Moolenaar  " Insert a character, then undo.
9317f1664e3SBram Moolenaar  exe "normal 0lllix\<Esc>"
9327f1664e3SBram Moolenaar  set ul&
9337f1664e3SBram Moolenaar  let expected[0].length = 3
9347f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9357f1664e3SBram Moolenaar  undo
9367f1664e3SBram Moolenaar  let expected[0].length = 2
9377f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9387f1664e3SBram Moolenaar
9397f1664e3SBram Moolenaar  " Delete a character, then undo
9407f1664e3SBram Moolenaar  exe "normal 0lllx"
9417f1664e3SBram Moolenaar  set ul&
9427f1664e3SBram Moolenaar  let expected[0].length = 1
9437f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9447f1664e3SBram Moolenaar  undo
9457f1664e3SBram Moolenaar  let expected[0].length = 2
9467f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9477f1664e3SBram Moolenaar
9487f1664e3SBram Moolenaar  " Delete the line, then undo
9497f1664e3SBram Moolenaar  1d
9507f1664e3SBram Moolenaar  set ul&
9517f1664e3SBram Moolenaar  call assert_equal([], prop_list(1))
9527f1664e3SBram Moolenaar  undo
9537f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9547f1664e3SBram Moolenaar
9557f1664e3SBram Moolenaar  " Insert a character, delete two characters, then undo with "U"
9567f1664e3SBram Moolenaar  exe "normal 0lllix\<Esc>"
9577f1664e3SBram Moolenaar  set ul&
9587f1664e3SBram Moolenaar  let expected[0].length = 3
9597f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9607f1664e3SBram Moolenaar  exe "normal 0lllxx"
9617f1664e3SBram Moolenaar  set ul&
9627f1664e3SBram Moolenaar  let expected[0].length = 1
9637f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9647f1664e3SBram Moolenaar  normal U
9657f1664e3SBram Moolenaar  let expected[0].length = 2
9667f1664e3SBram Moolenaar  call assert_equal(expected, prop_list(1))
9677f1664e3SBram Moolenaar
968338dfdadSBram Moolenaar  " substitute a word, then undo
969338dfdadSBram Moolenaar  call setline(1, 'the number 123 is highlighted.')
970338dfdadSBram Moolenaar  call prop_add(1, 12, {'length': 3, 'type': 'comment'})
971e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 12, length: 3, id: 0, type: 'comment', start: 1, end: 1} ]
972338dfdadSBram Moolenaar  call assert_equal(expected, prop_list(1))
973338dfdadSBram Moolenaar  set ul&
974338dfdadSBram Moolenaar  1s/number/foo
975338dfdadSBram Moolenaar  let expected[0].col = 9
976338dfdadSBram Moolenaar  call assert_equal(expected, prop_list(1))
977338dfdadSBram Moolenaar  undo
978338dfdadSBram Moolenaar  let expected[0].col = 12
979338dfdadSBram Moolenaar  call assert_equal(expected, prop_list(1))
980f3333b02SBram Moolenaar  call prop_clear(1)
981f3333b02SBram Moolenaar
982f3333b02SBram Moolenaar  " substitute with backslash
983f3333b02SBram Moolenaar  call setline(1, 'the number 123 is highlighted.')
984f3333b02SBram Moolenaar  call prop_add(1, 12, {'length': 3, 'type': 'comment'})
985e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 12, length: 3, id: 0, type: 'comment', start: 1, end: 1} ]
986f3333b02SBram Moolenaar  call assert_equal(expected, prop_list(1))
987f3333b02SBram Moolenaar  1s/the/\The
988f3333b02SBram Moolenaar  call assert_equal(expected, prop_list(1))
989f3333b02SBram Moolenaar  1s/^/\\
990f3333b02SBram Moolenaar  let expected[0].col += 1
991f3333b02SBram Moolenaar  call assert_equal(expected, prop_list(1))
992f3333b02SBram Moolenaar  1s/^/\~
993f3333b02SBram Moolenaar  let expected[0].col += 1
994f3333b02SBram Moolenaar  call assert_equal(expected, prop_list(1))
995f3333b02SBram Moolenaar  1s/123/12\\3
996f3333b02SBram Moolenaar  let expected[0].length += 1
997f3333b02SBram Moolenaar  call assert_equal(expected, prop_list(1))
998f3333b02SBram Moolenaar  call prop_clear(1)
999338dfdadSBram Moolenaar
10007f1664e3SBram Moolenaar  bwipe!
10017f1664e3SBram Moolenaar  call prop_type_delete('comment')
10027f1664e3SBram Moolenaarendfunc
10037f1664e3SBram Moolenaar
1004ecafcc15SBram Moolenaarfunc Test_prop_delete_text()
1005ecafcc15SBram Moolenaar  new
1006ecafcc15SBram Moolenaar  call prop_type_add('comment', {'highlight': 'Directory'})
1007ecafcc15SBram Moolenaar  call setline(1, ['oneone', 'twotwo', 'three'])
1008ecafcc15SBram Moolenaar
1009ecafcc15SBram Moolenaar  " zero length property
1010ecafcc15SBram Moolenaar  call prop_add(1, 3, {'type': 'comment'})
1011e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 3, length: 0, id: 0, type: 'comment', start: 1, end: 1} ]
1012ecafcc15SBram Moolenaar  call assert_equal(expected, prop_list(1))
1013ecafcc15SBram Moolenaar
1014ecafcc15SBram Moolenaar  " delete one char moves the property
1015ecafcc15SBram Moolenaar  normal! x
1016e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 2, length: 0, id: 0, type: 'comment', start: 1, end: 1} ]
1017ecafcc15SBram Moolenaar  call assert_equal(expected, prop_list(1))
1018ecafcc15SBram Moolenaar
1019ecafcc15SBram Moolenaar  " delete char of the property has no effect
1020ecafcc15SBram Moolenaar  normal! lx
1021e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 2, length: 0, id: 0, type: 'comment', start: 1, end: 1} ]
1022ecafcc15SBram Moolenaar  call assert_equal(expected, prop_list(1))
1023ecafcc15SBram Moolenaar
1024ecafcc15SBram Moolenaar  " delete more chars moves property to first column, is not deleted
1025ecafcc15SBram Moolenaar  normal! 0xxxx
1026e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, col: 1, length: 0, id: 0, type: 'comment', start: 1, end: 1} ]
1027ecafcc15SBram Moolenaar  call assert_equal(expected, prop_list(1))
1028ecafcc15SBram Moolenaar
1029ecafcc15SBram Moolenaar  bwipe!
1030ecafcc15SBram Moolenaar  call prop_type_delete('comment')
1031ecafcc15SBram Moolenaarendfunc
1032ecafcc15SBram Moolenaar
1033c6d86dccSBram Moolenaar" screenshot test with textprop highlighting
10348055d173SBram Moolenaarfunc Test_textprop_screenshot_various()
10353439028cSBram Moolenaar  CheckScreendump
1036ed79d1e3SBram Moolenaar  " The Vim running in the terminal needs to use utf-8.
10373439028cSBram Moolenaar  if g:orig_encoding != 'utf-8'
10383439028cSBram Moolenaar    throw 'Skipped: not using utf-8'
1039c6d86dccSBram Moolenaar  endif
1040c6d86dccSBram Moolenaar  call writefile([
1041de24a870SBram Moolenaar	\ "call setline(1, ["
1042de24a870SBram Moolenaar	\	.. "'One two',"
1043de24a870SBram Moolenaar	\	.. "'Numbér 123 änd thœn 4¾7.',"
1044de24a870SBram Moolenaar	\	.. "'--aa--bb--cc--dd--',"
1045de24a870SBram Moolenaar	\	.. "'// comment with error in it',"
104680e737ccSBram Moolenaar	\	.. "'first line',"
104780e737ccSBram Moolenaar	\	.. "'  second line  ',"
104880e737ccSBram Moolenaar	\	.. "'third line',"
104980e737ccSBram Moolenaar	\	.. "'   fourth line',"
1050de24a870SBram Moolenaar	\	.. "])",
1051c6d86dccSBram Moolenaar	\ "hi NumberProp ctermfg=blue",
1052c6d86dccSBram Moolenaar	\ "hi LongProp ctermbg=yellow",
1053de24a870SBram Moolenaar	\ "hi BackgroundProp ctermbg=lightgrey",
1054de24a870SBram Moolenaar	\ "hi UnderlineProp cterm=underline",
1055c6d86dccSBram Moolenaar	\ "call prop_type_add('number', {'highlight': 'NumberProp'})",
1056a5a7882eSBram Moolenaar	\ "call prop_type_add('long', {'highlight': 'NumberProp'})",
1057a5a7882eSBram Moolenaar	\ "call prop_type_change('long', {'highlight': 'LongProp'})",
105844746aa1SBram Moolenaar	\ "call prop_type_add('start', {'highlight': 'NumberProp', 'start_incl': 1})",
105944746aa1SBram Moolenaar	\ "call prop_type_add('end', {'highlight': 'NumberProp', 'end_incl': 1})",
106044746aa1SBram Moolenaar	\ "call prop_type_add('both', {'highlight': 'NumberProp', 'start_incl': 1, 'end_incl': 1})",
1061dbd43168SBram Moolenaar	\ "call prop_type_add('background', {'highlight': 'BackgroundProp', 'combine': 0})",
1062dbd43168SBram Moolenaar	\ "call prop_type_add('backgroundcomb', {'highlight': 'NumberProp', 'combine': 1})",
1063dbd43168SBram Moolenaar	\ "eval 'backgroundcomb'->prop_type_change({'highlight': 'BackgroundProp'})",
106458e32ab5SBram Moolenaar	\ "call prop_type_add('error', {'highlight': 'UnderlineProp'})",
1065c6d86dccSBram Moolenaar	\ "call prop_add(1, 4, {'end_lnum': 3, 'end_col': 3, 'type': 'long'})",
1066b9c67a51SBram Moolenaar	\ "call prop_add(2, 9, {'length': 3, 'type': 'number'})",
1067b9c67a51SBram Moolenaar	\ "call prop_add(2, 24, {'length': 4, 'type': 'number'})",
106844746aa1SBram Moolenaar	\ "call prop_add(3, 3, {'length': 2, 'type': 'number'})",
106944746aa1SBram Moolenaar	\ "call prop_add(3, 7, {'length': 2, 'type': 'start'})",
107044746aa1SBram Moolenaar	\ "call prop_add(3, 11, {'length': 2, 'type': 'end'})",
107144746aa1SBram Moolenaar	\ "call prop_add(3, 15, {'length': 2, 'type': 'both'})",
1072dbd43168SBram Moolenaar	\ "call prop_add(4, 6, {'length': 3, 'type': 'background'})",
1073dbd43168SBram Moolenaar	\ "call prop_add(4, 12, {'length': 10, 'type': 'backgroundcomb'})",
1074de24a870SBram Moolenaar	\ "call prop_add(4, 17, {'length': 5, 'type': 'error'})",
107580e737ccSBram Moolenaar	\ "call prop_add(5, 7, {'length': 4, 'type': 'long'})",
107680e737ccSBram Moolenaar	\ "call prop_add(6, 1, {'length': 8, 'type': 'long'})",
107780e737ccSBram Moolenaar	\ "call prop_add(8, 1, {'length': 1, 'type': 'long'})",
107880e737ccSBram Moolenaar	\ "call prop_add(8, 11, {'length': 4, 'type': 'long'})",
1079bfd45128SBram Moolenaar	\ "set number cursorline",
1080b9c67a51SBram Moolenaar	\ "hi clear SpellBad",
1081c6d86dccSBram Moolenaar	\ "set spell",
1082de24a870SBram Moolenaar	\ "syn match Comment '//.*'",
1083de24a870SBram Moolenaar	\ "hi Comment ctermfg=green",
108444746aa1SBram Moolenaar	\ "normal 3G0llix\<Esc>lllix\<Esc>lllix\<Esc>lllix\<Esc>lllix\<Esc>lllix\<Esc>lllix\<Esc>lllix\<Esc>",
108533c8ca92SBram Moolenaar	\ "normal 3G0lli\<BS>\<Esc>",
108680e737ccSBram Moolenaar	\ "normal 6G0i\<BS>\<Esc>",
108780e737ccSBram Moolenaar	\ "normal 3J",
108880e737ccSBram Moolenaar	\ "normal 3G",
1089c6d86dccSBram Moolenaar	\], 'XtestProp')
109080e737ccSBram Moolenaar  let buf = RunVimInTerminal('-S XtestProp', {'rows': 8})
1091c6d86dccSBram Moolenaar  call VerifyScreenDump(buf, 'Test_textprop_01', {})
1092e3d31b02SBram Moolenaar
1093c6d86dccSBram Moolenaar  " clean up
1094c6d86dccSBram Moolenaar  call StopVimInTerminal(buf)
10952f21fa87SBram Moolenaar  call delete('XtestProp')
1096c6d86dccSBram Moolenaarendfunc
10978055d173SBram Moolenaar
10988055d173SBram Moolenaarfunc RunTestVisualBlock(width, dump)
10998055d173SBram Moolenaar  call writefile([
11008055d173SBram Moolenaar	\ "call setline(1, ["
11018055d173SBram Moolenaar	\	.. "'xxxxxxxxx 123 x',"
11028055d173SBram Moolenaar	\	.. "'xxxxxxxx 123 x',"
11038055d173SBram Moolenaar	\	.. "'xxxxxxx 123 x',"
11048055d173SBram Moolenaar	\	.. "'xxxxxx 123 x',"
11058055d173SBram Moolenaar	\	.. "'xxxxx 123 x',"
11068055d173SBram Moolenaar	\	.. "'xxxx 123 xx',"
11078055d173SBram Moolenaar	\	.. "'xxx 123 xxx',"
11088055d173SBram Moolenaar	\	.. "'xx 123 xxxx',"
11098055d173SBram Moolenaar	\	.. "'x 123 xxxxx',"
11108055d173SBram Moolenaar	\	.. "' 123 xxxxxx',"
11118055d173SBram Moolenaar	\	.. "])",
11128055d173SBram Moolenaar	\ "hi SearchProp ctermbg=yellow",
11138055d173SBram Moolenaar	\ "call prop_type_add('search', {'highlight': 'SearchProp'})",
11148055d173SBram Moolenaar	\ "call prop_add(1, 11, {'length': 3, 'type': 'search'})",
11158055d173SBram Moolenaar	\ "call prop_add(2, 10, {'length': 3, 'type': 'search'})",
11168055d173SBram Moolenaar	\ "call prop_add(3, 9, {'length': 3, 'type': 'search'})",
11178055d173SBram Moolenaar	\ "call prop_add(4, 8, {'length': 3, 'type': 'search'})",
11188055d173SBram Moolenaar	\ "call prop_add(5, 7, {'length': 3, 'type': 'search'})",
11198055d173SBram Moolenaar	\ "call prop_add(6, 6, {'length': 3, 'type': 'search'})",
11208055d173SBram Moolenaar	\ "call prop_add(7, 5, {'length': 3, 'type': 'search'})",
11218055d173SBram Moolenaar	\ "call prop_add(8, 4, {'length': 3, 'type': 'search'})",
11228055d173SBram Moolenaar	\ "call prop_add(9, 3, {'length': 3, 'type': 'search'})",
11238055d173SBram Moolenaar	\ "call prop_add(10, 2, {'length': 3, 'type': 'search'})",
11248055d173SBram Moolenaar	\ "normal 1G6|\<C-V>" .. repeat('l', a:width - 1) .. "10jx",
11258055d173SBram Moolenaar	\], 'XtestPropVis')
11268055d173SBram Moolenaar  let buf = RunVimInTerminal('-S XtestPropVis', {'rows': 12})
11278055d173SBram Moolenaar  call VerifyScreenDump(buf, 'Test_textprop_vis_' .. a:dump, {})
11288055d173SBram Moolenaar
11298055d173SBram Moolenaar  " clean up
11308055d173SBram Moolenaar  call StopVimInTerminal(buf)
11318055d173SBram Moolenaar  call delete('XtestPropVis')
11328055d173SBram Moolenaarendfunc
11338055d173SBram Moolenaar
11348055d173SBram Moolenaar" screenshot test with Visual block mode operations
11358055d173SBram Moolenaarfunc Test_textprop_screenshot_visual()
11363439028cSBram Moolenaar  CheckScreendump
11378055d173SBram Moolenaar
11388055d173SBram Moolenaar  " Delete two columns while text props are three chars wide.
11398055d173SBram Moolenaar  call RunTestVisualBlock(2, '01')
11408055d173SBram Moolenaar
11418055d173SBram Moolenaar  " Same, but delete four columns
11428055d173SBram Moolenaar  call RunTestVisualBlock(4, '02')
11438055d173SBram Moolenaarendfunc
1144d79eef2eSBram Moolenaar
1145a956bf6cSBram Moolenaarfunc Test_textprop_after_tab()
11463439028cSBram Moolenaar  CheckScreendump
114737e66cf0SBram Moolenaar
1148a956bf6cSBram Moolenaar  let lines =<< trim END
1149a956bf6cSBram Moolenaar       call setline(1, [
1150a956bf6cSBram Moolenaar             \ "\txxx",
1151a956bf6cSBram Moolenaar             \ "x\txxx",
1152a956bf6cSBram Moolenaar             \ ])
1153a956bf6cSBram Moolenaar       hi SearchProp ctermbg=yellow
1154a956bf6cSBram Moolenaar       call prop_type_add('search', {'highlight': 'SearchProp'})
1155a956bf6cSBram Moolenaar       call prop_add(1, 2, {'length': 3, 'type': 'search'})
1156a956bf6cSBram Moolenaar       call prop_add(2, 3, {'length': 3, 'type': 'search'})
1157a956bf6cSBram Moolenaar  END
1158a956bf6cSBram Moolenaar  call writefile(lines, 'XtestPropTab')
1159a956bf6cSBram Moolenaar  let buf = RunVimInTerminal('-S XtestPropTab', {'rows': 6})
1160a956bf6cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_textprop_tab', {})
1161a956bf6cSBram Moolenaar
1162a956bf6cSBram Moolenaar  " clean up
1163a956bf6cSBram Moolenaar  call StopVimInTerminal(buf)
1164a956bf6cSBram Moolenaar  call delete('XtestPropTab')
1165a956bf6cSBram Moolenaarendfunc
1166a956bf6cSBram Moolenaar
1167f3fa1846SBram Moolenaarfunc Test_textprop_nowrap_scrolled()
1168f3fa1846SBram Moolenaar  CheckScreendump
1169f3fa1846SBram Moolenaar
1170f3fa1846SBram Moolenaar  let lines =<< trim END
1171f3fa1846SBram Moolenaar       vim9script
1172f3fa1846SBram Moolenaar       set nowrap
1173f3fa1846SBram Moolenaar       setline(1, 'The number 123 is smaller than 4567.' .. repeat('X', &columns))
1174f3fa1846SBram Moolenaar       prop_type_add('number', {'highlight': 'ErrorMsg'})
1175f3fa1846SBram Moolenaar       prop_add(1, 12, {'length': 3, 'type': 'number'})
1176f3fa1846SBram Moolenaar       prop_add(1, 32, {'length': 4, 'type': 'number'})
1177f3fa1846SBram Moolenaar       feedkeys('gg20zl', 'nxt')
1178f3fa1846SBram Moolenaar  END
1179f3fa1846SBram Moolenaar  call writefile(lines, 'XtestNowrap')
1180f3fa1846SBram Moolenaar  let buf = RunVimInTerminal('-S XtestNowrap', {'rows': 6})
1181f3fa1846SBram Moolenaar  call VerifyScreenDump(buf, 'Test_textprop_nowrap_01', {})
1182f3fa1846SBram Moolenaar
1183f3fa1846SBram Moolenaar  call term_sendkeys(buf, "$")
1184f3fa1846SBram Moolenaar  call VerifyScreenDump(buf, 'Test_textprop_nowrap_02', {})
1185f3fa1846SBram Moolenaar
1186f3fa1846SBram Moolenaar  " clean up
1187f3fa1846SBram Moolenaar  call StopVimInTerminal(buf)
1188f3fa1846SBram Moolenaar  call delete('XtestNowrap')
1189f3fa1846SBram Moolenaarendfunc
1190f3fa1846SBram Moolenaar
11913439028cSBram Moolenaarfunc Test_textprop_with_syntax()
11923439028cSBram Moolenaar  CheckScreendump
11933439028cSBram Moolenaar
11943439028cSBram Moolenaar  let lines =<< trim END
11953439028cSBram Moolenaar       call setline(1, [
11963439028cSBram Moolenaar             \ "(abc)",
11973439028cSBram Moolenaar             \ ])
11983439028cSBram Moolenaar       syn match csParens "[()]" display
11993439028cSBram Moolenaar       hi! link csParens MatchParen
12003439028cSBram Moolenaar
12013439028cSBram Moolenaar       call prop_type_add('TPTitle', #{ highlight: 'Title' })
12023439028cSBram Moolenaar       call prop_add(1, 2, #{type: 'TPTitle', end_col: 5})
12033439028cSBram Moolenaar  END
12043439028cSBram Moolenaar  call writefile(lines, 'XtestPropSyn')
12053439028cSBram Moolenaar  let buf = RunVimInTerminal('-S XtestPropSyn', {'rows': 6})
12063439028cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_textprop_syn_1', {})
12073439028cSBram Moolenaar
12083439028cSBram Moolenaar  " clean up
12093439028cSBram Moolenaar  call StopVimInTerminal(buf)
12103439028cSBram Moolenaar  call delete('XtestPropSyn')
12113439028cSBram Moolenaarendfunc
12123439028cSBram Moolenaar
1213d79eef2eSBram Moolenaar" Adding a text property to a new buffer should not fail
1214d79eef2eSBram Moolenaarfunc Test_textprop_empty_buffer()
1215d79eef2eSBram Moolenaar  call prop_type_add('comment', {'highlight': 'Search'})
1216d79eef2eSBram Moolenaar  new
1217d79eef2eSBram Moolenaar  call prop_add(1, 1, {'type': 'comment'})
1218d79eef2eSBram Moolenaar  close
1219adfde115SBram Moolenaar  call prop_type_delete('comment')
1220adfde115SBram Moolenaarendfunc
1221adfde115SBram Moolenaar
1222d74af422SBram Moolenaar" Adding a text property with invalid highlight should be ignored.
1223d74af422SBram Moolenaarfunc Test_textprop_invalid_highlight()
1224d74af422SBram Moolenaar  call assert_fails("call prop_type_add('dni', {'highlight': 'DoesNotExist'})", 'E970:')
1225d74af422SBram Moolenaar  new
1226d74af422SBram Moolenaar  call setline(1, ['asdf','asdf'])
1227d74af422SBram Moolenaar  call prop_add(1, 1, {'length': 4, 'type': 'dni'})
1228d74af422SBram Moolenaar  redraw
1229d74af422SBram Moolenaar  bwipe!
1230d74af422SBram Moolenaar  call prop_type_delete('dni')
1231d74af422SBram Moolenaarendfunc
1232d74af422SBram Moolenaar
1233adfde115SBram Moolenaar" Adding a text property to an empty buffer and then editing another
1234adfde115SBram Moolenaarfunc Test_textprop_empty_buffer_next()
1235adfde115SBram Moolenaar  call prop_type_add("xxx", {})
1236adfde115SBram Moolenaar  call prop_add(1, 1, {"type": "xxx"})
1237adfde115SBram Moolenaar  next X
1238adfde115SBram Moolenaar  call prop_type_delete('xxx')
1239d79eef2eSBram Moolenaarendfunc
1240f0884c5fSBram Moolenaar
1241f0884c5fSBram Moolenaarfunc Test_textprop_remove_from_buf()
1242f0884c5fSBram Moolenaar  new
1243f0884c5fSBram Moolenaar  let buf = bufnr('')
1244f0884c5fSBram Moolenaar  call prop_type_add('one', {'bufnr': buf})
1245f0884c5fSBram Moolenaar  call prop_add(1, 1, {'type': 'one', 'id': 234})
1246f0884c5fSBram Moolenaar  file x
1247f0884c5fSBram Moolenaar  edit y
1248f0884c5fSBram Moolenaar  call prop_remove({'id': 234, 'bufnr': buf}, 1)
1249f0884c5fSBram Moolenaar  call prop_type_delete('one', {'bufnr': buf})
1250f0884c5fSBram Moolenaar  bwipe! x
1251f0884c5fSBram Moolenaar  close
1252f0884c5fSBram Moolenaarendfunc
125345311b52SBram Moolenaar
125445311b52SBram Moolenaarfunc Test_textprop_in_unloaded_buf()
125545311b52SBram Moolenaar  edit Xaaa
125645311b52SBram Moolenaar  call setline(1, 'aaa')
125745311b52SBram Moolenaar  write
125845311b52SBram Moolenaar  edit Xbbb
125945311b52SBram Moolenaar  call setline(1, 'bbb')
126045311b52SBram Moolenaar  write
126145311b52SBram Moolenaar  let bnr = bufnr('')
126245311b52SBram Moolenaar  edit Xaaa
126345311b52SBram Moolenaar
126445311b52SBram Moolenaar  call prop_type_add('ErrorMsg', #{highlight:'ErrorMsg'})
126545311b52SBram Moolenaar  call assert_fails("call prop_add(1, 1, #{end_lnum: 1, endcol: 2, type: 'ErrorMsg', bufnr: bnr})", 'E275:')
126645311b52SBram Moolenaar  exe 'buf ' .. bnr
126745311b52SBram Moolenaar  call assert_equal('bbb', getline(1))
126845311b52SBram Moolenaar  call assert_equal(0, prop_list(1)->len())
126945311b52SBram Moolenaar
127045311b52SBram Moolenaar  bwipe! Xaaa
127145311b52SBram Moolenaar  bwipe! Xbbb
127245311b52SBram Moolenaar  cal delete('Xaaa')
127345311b52SBram Moolenaar  cal delete('Xbbb')
127445311b52SBram Moolenaarendfunc
12751fd30d7bSBram Moolenaar
12761fd30d7bSBram Moolenaarfunc Test_proptype_substitute2()
12771fd30d7bSBram Moolenaar  new
12781fd30d7bSBram Moolenaar  " text_prop.vim
12791fd30d7bSBram Moolenaar  call setline(1, [
12801fd30d7bSBram Moolenaar        \ 'The   num  123 is smaller than 4567.',
12811fd30d7bSBram Moolenaar        \ '123 The number 123 is smaller than 4567.',
12821fd30d7bSBram Moolenaar        \ '123 The number 123 is smaller than 4567.'])
12831fd30d7bSBram Moolenaar
12841fd30d7bSBram Moolenaar  call prop_type_add('number', {'highlight': 'ErrorMsg'})
12851fd30d7bSBram Moolenaar
12861fd30d7bSBram Moolenaar  call prop_add(1, 12, {'length': 3, 'type': 'number'})
12871fd30d7bSBram Moolenaar  call prop_add(2, 1, {'length': 3, 'type': 'number'})
12881fd30d7bSBram Moolenaar  call prop_add(3, 36, {'length': 4, 'type': 'number'})
12891fd30d7bSBram Moolenaar  set ul&
1290e2390c7fSMartin Tournoij  let expected = [
1291e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, col: 13, end: 1, type: 'number', length: 3, start: 1},
1292e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, col: 1,  end: 1, type: 'number', length: 3, start: 1},
1293e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, col: 50, end: 1, type: 'number', length: 4, start: 1}]
1294e2390c7fSMartin Tournoij
1295e2390c7fSMartin Tournoij  " TODO
1296e2390c7fSMartin Tournoij  return
12971fd30d7bSBram Moolenaar  " Add some text in between
12981fd30d7bSBram Moolenaar  %s/\s\+/   /g
12991fd30d7bSBram Moolenaar  call assert_equal(expected, prop_list(1) + prop_list(2) + prop_list(3))
13001fd30d7bSBram Moolenaar
13011fd30d7bSBram Moolenaar  " remove some text
13021fd30d7bSBram Moolenaar  :1s/[a-z]\{3\}//g
13031fd30d7bSBram Moolenaar  let expected = [{'id': 0, 'col': 10, 'end': 1, 'type': 'number', 'length': 3, 'start': 1}]
13041fd30d7bSBram Moolenaar  call assert_equal(expected, prop_list(1))
13051fd30d7bSBram Moolenaar  bwipe!
13061fd30d7bSBram Moolenaarendfunc
13075cb0b93dSBram Moolenaar
13088902b31fSBram Moolenaar" This was causing property corruption.
13098902b31fSBram Moolenaarfunc Test_proptype_substitute3()
13108902b31fSBram Moolenaar  new
13118902b31fSBram Moolenaar  call setline(1, ['abcxxx', 'def'])
13128902b31fSBram Moolenaar  call prop_type_add("test", {"highlight": "Search"})
13138902b31fSBram Moolenaar  call prop_add(1, 2, {"end_lnum": 2, "end_col": 2, "type": "test"})
13148902b31fSBram Moolenaar  %s/x\+$//
13158902b31fSBram Moolenaar  redraw
13168902b31fSBram Moolenaar
13178902b31fSBram Moolenaar  call prop_type_delete('test')
13188902b31fSBram Moolenaar  bwipe!
13198902b31fSBram Moolenaarendfunc
13208902b31fSBram Moolenaar
1321ac15fd8cSBram Moolenaarfunc SaveOptions()
1322ac15fd8cSBram Moolenaar  let d = #{tabstop: &tabstop,
1323ac15fd8cSBram Moolenaar	  \ softtabstop: &softtabstop,
1324ac15fd8cSBram Moolenaar	  \ shiftwidth: &shiftwidth,
1325ac15fd8cSBram Moolenaar	  \ expandtab: &expandtab,
1326ac15fd8cSBram Moolenaar	  \ foldmethod: '"' .. &foldmethod .. '"',
1327ac15fd8cSBram Moolenaar	  \ }
1328ac15fd8cSBram Moolenaar  return d
1329ac15fd8cSBram Moolenaarendfunc
1330ac15fd8cSBram Moolenaar
1331ac15fd8cSBram Moolenaarfunc RestoreOptions(dict)
1332ac15fd8cSBram Moolenaar  for name in keys(a:dict)
1333ac15fd8cSBram Moolenaar    exe 'let &' .. name .. ' = ' .. a:dict[name]
1334ac15fd8cSBram Moolenaar  endfor
1335ac15fd8cSBram Moolenaarendfunc
1336ac15fd8cSBram Moolenaar
13375cb0b93dSBram Moolenaarfunc Test_textprop_noexpandtab()
13385cb0b93dSBram Moolenaar  new
1339ac15fd8cSBram Moolenaar  let save_dict = SaveOptions()
1340ac15fd8cSBram Moolenaar
13415cb0b93dSBram Moolenaar  set tabstop=8
13425cb0b93dSBram Moolenaar  set softtabstop=4
13435cb0b93dSBram Moolenaar  set shiftwidth=4
13445cb0b93dSBram Moolenaar  set noexpandtab
13455cb0b93dSBram Moolenaar  set foldmethod=marker
1346ac15fd8cSBram Moolenaar
13475cb0b93dSBram Moolenaar  call feedkeys("\<esc>\<esc>0Ca\<cr>\<esc>\<up>", "tx")
13485cb0b93dSBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
13495cb0b93dSBram Moolenaar  call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
13505cb0b93dSBram Moolenaar  call feedkeys("0i\<tab>", "tx")
13515cb0b93dSBram Moolenaar  call prop_remove({'type': 'test'})
13525cb0b93dSBram Moolenaar  call prop_add(1, 2, {'end_col': 3, 'type': 'test'})
13535cb0b93dSBram Moolenaar  call feedkeys("A\<left>\<tab>", "tx")
13545cb0b93dSBram Moolenaar  call prop_remove({'type': 'test'})
13555cb0b93dSBram Moolenaar  try
13565cb0b93dSBram Moolenaar    " It is correct that this does not pass
13575cb0b93dSBram Moolenaar    call prop_add(1, 6, {'end_col': 7, 'type': 'test'})
13585cb0b93dSBram Moolenaar    " Has already collapsed here, start_col:6 does not result in an error
13595cb0b93dSBram Moolenaar    call feedkeys("A\<left>\<tab>", "tx")
13605cb0b93dSBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E964/
13615cb0b93dSBram Moolenaar  endtry
13625cb0b93dSBram Moolenaar  call prop_remove({'type': 'test'})
1363ac15fd8cSBram Moolenaar  call prop_type_delete('test')
1364ac15fd8cSBram Moolenaar
1365ac15fd8cSBram Moolenaar  call RestoreOptions(save_dict)
1366ac15fd8cSBram Moolenaar  bwipe!
1367ac15fd8cSBram Moolenaarendfunc
1368ac15fd8cSBram Moolenaar
1369ac15fd8cSBram Moolenaarfunc Test_textprop_noexpandtab_redraw()
1370ac15fd8cSBram Moolenaar  new
1371ac15fd8cSBram Moolenaar  let save_dict = SaveOptions()
1372ac15fd8cSBram Moolenaar
1373ac15fd8cSBram Moolenaar  set tabstop=8
1374ac15fd8cSBram Moolenaar  set softtabstop=4
1375ac15fd8cSBram Moolenaar  set shiftwidth=4
1376ac15fd8cSBram Moolenaar  set noexpandtab
1377ac15fd8cSBram Moolenaar  set foldmethod=marker
1378ac15fd8cSBram Moolenaar
1379ac15fd8cSBram Moolenaar  call feedkeys("\<esc>\<esc>0Ca\<cr>\<space>\<esc>\<up>", "tx")
1380ac15fd8cSBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
1381ac15fd8cSBram Moolenaar  call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
1382ac15fd8cSBram Moolenaar  call feedkeys("0i\<tab>", "tx")
1383ac15fd8cSBram Moolenaar  " Internally broken at the next line
1384ac15fd8cSBram Moolenaar  call feedkeys("A\<left>\<tab>", "tx")
1385ac15fd8cSBram Moolenaar  redraw
1386ac15fd8cSBram Moolenaar  " Index calculation failed internally on next line
1387ac15fd8cSBram Moolenaar  call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
1388ac15fd8cSBram Moolenaar  call prop_remove({'type': 'test', 'all': v:true})
1389ac15fd8cSBram Moolenaar  call prop_type_delete('test')
1390ac15fd8cSBram Moolenaar  call prop_type_delete('test')
1391ac15fd8cSBram Moolenaar
1392ac15fd8cSBram Moolenaar  call RestoreOptions(save_dict)
1393ac15fd8cSBram Moolenaar  bwipe!
1394ac15fd8cSBram Moolenaarendfunc
1395ac15fd8cSBram Moolenaar
1396ac15fd8cSBram Moolenaarfunc Test_textprop_ins_str()
1397ac15fd8cSBram Moolenaar  new
1398ac15fd8cSBram Moolenaar  call setline(1, 'just some text')
1399ac15fd8cSBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
1400ac15fd8cSBram Moolenaar  call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
1401e2390c7fSMartin Tournoij  call assert_equal([#{type_bufnr: 0, id: 0, col: 1, end: 1, type: 'test', length: 1, start: 1}], prop_list(1))
1402ac15fd8cSBram Moolenaar
1403ac15fd8cSBram Moolenaar  call feedkeys("foi\<F8>\<Esc>", "tx")
1404ac15fd8cSBram Moolenaar  call assert_equal('just s<F8>ome text', getline(1))
1405e2390c7fSMartin Tournoij  call assert_equal([#{type_bufnr: 0, id: 0, col: 1, end: 1, type: 'test', length: 1, start: 1}], prop_list(1))
1406ac15fd8cSBram Moolenaar
1407ac15fd8cSBram Moolenaar  bwipe!
1408ac15fd8cSBram Moolenaar  call prop_remove({'type': 'test'})
1409ac15fd8cSBram Moolenaar  call prop_type_delete('test')
14105cb0b93dSBram Moolenaarendfunc
141166b98854SBram Moolenaar
141266b98854SBram Moolenaarfunc Test_find_prop_later_in_line()
141366b98854SBram Moolenaar  new
141466b98854SBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
141566b98854SBram Moolenaar  call setline(1, 'just some text')
141666b98854SBram Moolenaar  call prop_add(1, 1, {'length': 4, 'type': 'test'})
141766b98854SBram Moolenaar  call prop_add(1, 10, {'length': 3, 'type': 'test'})
141866b98854SBram Moolenaar
1419e2390c7fSMartin Tournoij  call assert_equal(
1420e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, lnum: 1, col: 10, end: 1, type: 'test', length: 3, start: 1},
142166b98854SBram Moolenaar        \ prop_find(#{type: 'test', lnum: 1, col: 6}))
142266b98854SBram Moolenaar
142366b98854SBram Moolenaar  bwipe!
142466b98854SBram Moolenaar  call prop_type_delete('test')
142566b98854SBram Moolenaarendfunc
142666b98854SBram Moolenaar
142766b98854SBram Moolenaarfunc Test_find_zerowidth_prop_sol()
142866b98854SBram Moolenaar  new
142966b98854SBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
143066b98854SBram Moolenaar  call setline(1, 'just some text')
143166b98854SBram Moolenaar  call prop_add(1, 1, {'length': 0, 'type': 'test'})
143266b98854SBram Moolenaar
1433e2390c7fSMartin Tournoij  call assert_equal(
1434e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, lnum: 1, col: 1, end: 1, type: 'test', length: 0, start: 1},
143566b98854SBram Moolenaar        \ prop_find(#{type: 'test', lnum: 1}))
143666b98854SBram Moolenaar
143766b98854SBram Moolenaar  bwipe!
143866b98854SBram Moolenaar  call prop_type_delete('test')
143966b98854SBram Moolenaarendfunc
144099fa7219SBram Moolenaar
144199fa7219SBram Moolenaar" Test for passing invalid arguments to prop_xxx() functions
144299fa7219SBram Moolenaarfunc Test_prop_func_invalid_args()
144399fa7219SBram Moolenaar  call assert_fails('call prop_clear(1, 2, [])', 'E715:')
144499fa7219SBram Moolenaar  call assert_fails('call prop_clear(-1, 2)', 'E16:')
14455b73992dSYegappan Lakshmanan  call assert_fails('call prop_find(test_null_dict())', 'E715:')
14469b7bf9e9SBram Moolenaar  call assert_fails('call prop_find({"bufnr" : []})', 'E730:')
144799fa7219SBram Moolenaar  call assert_fails('call prop_find({})', 'E968:')
144899fa7219SBram Moolenaar  call assert_fails('call prop_find({}, "x")', 'E474:')
144999fa7219SBram Moolenaar  call assert_fails('call prop_find({"lnum" : -2})', 'E16:')
145099fa7219SBram Moolenaar  call assert_fails('call prop_list(1, [])', 'E715:')
145199fa7219SBram Moolenaar  call assert_fails('call prop_list(-1, {})', 'E16:')
145299fa7219SBram Moolenaar  call assert_fails('call prop_remove([])', 'E474:')
145399fa7219SBram Moolenaar  call assert_fails('call prop_remove({}, -2)', 'E16:')
145499fa7219SBram Moolenaar  call assert_fails('call prop_remove({})', 'E968:')
14559b7bf9e9SBram Moolenaar  call assert_fails('call prop_type_add([], {})', 'E730:')
145699fa7219SBram Moolenaar  call assert_fails("call prop_type_change('long', {'xyz' : 10})", 'E971:')
14579b7bf9e9SBram Moolenaar  call assert_fails("call prop_type_delete([])", 'E730:')
145899fa7219SBram Moolenaar  call assert_fails("call prop_type_delete('xyz', [])", 'E715:')
14599b7bf9e9SBram Moolenaar  call assert_fails("call prop_type_get([])", 'E730:')
146099fa7219SBram Moolenaar  call assert_fails("call prop_type_get('', [])", 'E474:')
146199fa7219SBram Moolenaar  call assert_fails("call prop_type_list([])", 'E715:')
14623dc3474fSBram Moolenaar  call assert_fails("call prop_type_add('yyy', 'not_a_dict')", 'E715:')
14633dc3474fSBram Moolenaar  call assert_fails("call prop_add(1, 5, {'type':'missing_type', 'length':1})", 'E971:')
14643dc3474fSBram Moolenaar  call assert_fails("call prop_add(1, 5, {'type': ''})", 'E971:')
14653dc3474fSBram Moolenaar  call assert_fails('call prop_add(1, 1, 0)', 'E715:')
14663dc3474fSBram Moolenaar
14673dc3474fSBram Moolenaar  new
14683dc3474fSBram Moolenaar  call setline(1, ['first', 'second'])
14693dc3474fSBram Moolenaar  call prop_type_add('xxx', {})
14703dc3474fSBram Moolenaar
14713dc3474fSBram Moolenaar  call assert_fails("call prop_type_add('xxx', {})", 'E969:')
14723dc3474fSBram Moolenaar  call assert_fails("call prop_add(2, 0, {'type': 'xxx'})", 'E964:')
14733dc3474fSBram Moolenaar  call assert_fails("call prop_add(2, 3, {'type': 'xxx', 'end_lnum':1})", 'E475:')
14743dc3474fSBram Moolenaar  call assert_fails("call prop_add(2, 3, {'type': 'xxx', 'end_lnum':3})", 'E966:')
14753dc3474fSBram Moolenaar  call assert_fails("call prop_add(2, 3, {'type': 'xxx', 'length':-1})", 'E475:')
14763dc3474fSBram Moolenaar  call assert_fails("call prop_add(2, 3, {'type': 'xxx', 'end_col':0})", 'E475:')
14773dc3474fSBram Moolenaar  call assert_fails("call prop_add(2, 3, {'length':1})", 'E965:')
14783dc3474fSBram Moolenaar
14793dc3474fSBram Moolenaar  call prop_type_delete('xxx')
14803dc3474fSBram Moolenaar  bwipe!
148199fa7219SBram Moolenaarendfunc
148299fa7219SBram Moolenaar
1483c8f12c98SBram Moolenaarfunc Test_prop_split_join()
148487be9be1SBram Moolenaar  new
148587be9be1SBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
148687be9be1SBram Moolenaar  call setline(1, 'just some text')
148787be9be1SBram Moolenaar  call prop_add(1, 6, {'length': 4, 'type': 'test'})
148887be9be1SBram Moolenaar
148987be9be1SBram Moolenaar  " Split in middle of "some"
149087be9be1SBram Moolenaar  execute "normal! 8|i\<CR>"
1491e2390c7fSMartin Tournoij  call assert_equal(
1492e2390c7fSMartin Tournoij        \ [#{type_bufnr: 0, id: 0, col: 6, end: 0, type: 'test', length: 2, start: 1}],
149387be9be1SBram Moolenaar        \ prop_list(1))
1494e2390c7fSMartin Tournoij  call assert_equal(
1495e2390c7fSMartin Tournoij        \ [#{type_bufnr: 0, id: 0, col: 1, end: 1, type: 'test', length: 2, start: 0}],
149687be9be1SBram Moolenaar        \ prop_list(2))
149787be9be1SBram Moolenaar
149887be9be1SBram Moolenaar  " Join the two lines back together
149987be9be1SBram Moolenaar  normal! 1GJ
1500e2390c7fSMartin Tournoij  call assert_equal([#{type_bufnr: 0, id: 0, col: 6, end: 1, type: 'test', length: 5, start: 1}], prop_list(1))
150187be9be1SBram Moolenaar
150287be9be1SBram Moolenaar  bwipe!
150387be9be1SBram Moolenaar  call prop_type_delete('test')
150487be9be1SBram Moolenaarendfunc
150587be9be1SBram Moolenaar
1506c8f12c98SBram Moolenaarfunc Test_prop_increment_decrement()
1507c8f12c98SBram Moolenaar  new
1508c8f12c98SBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
1509c8f12c98SBram Moolenaar  call setline(1, 'its 998 times')
1510c8f12c98SBram Moolenaar  call prop_add(1, 5, {'length': 3, 'type': 'test'})
1511c8f12c98SBram Moolenaar
1512c8f12c98SBram Moolenaar  exe "normal! 0f9\<C-A>"
1513c8f12c98SBram Moolenaar  eval getline(1)->assert_equal('its 999 times')
1514c8f12c98SBram Moolenaar  eval prop_list(1)->assert_equal([
1515e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, col: 5, end: 1, type: 'test', length: 3, start: 1}])
1516c8f12c98SBram Moolenaar
1517c8f12c98SBram Moolenaar  exe "normal! 0f9\<C-A>"
1518c8f12c98SBram Moolenaar  eval getline(1)->assert_equal('its 1000 times')
1519c8f12c98SBram Moolenaar  eval prop_list(1)->assert_equal([
1520e2390c7fSMartin Tournoij        \ #{type_bufnr: 0, id: 0, col: 5, end: 1, type: 'test', length: 4, start: 1}])
1521c8f12c98SBram Moolenaar
1522c8f12c98SBram Moolenaar  bwipe!
1523c8f12c98SBram Moolenaar  call prop_type_delete('test')
1524c8f12c98SBram Moolenaarendfunc
1525c8f12c98SBram Moolenaar
15268b51b7f0SBram Moolenaarfunc Test_prop_block_insert()
15278b51b7f0SBram Moolenaar  new
15288b51b7f0SBram Moolenaar  call prop_type_add('test', {'highlight': 'ErrorMsg'})
15298b51b7f0SBram Moolenaar  call setline(1, ['one ', 'two '])
15308b51b7f0SBram Moolenaar  call prop_add(1, 1, {'length': 3, 'type': 'test'})
15318b51b7f0SBram Moolenaar  call prop_add(2, 1, {'length': 3, 'type': 'test'})
15328b51b7f0SBram Moolenaar
15338b51b7f0SBram Moolenaar  " insert "xx" in the first column of both lines
15348b51b7f0SBram Moolenaar  exe "normal! gg0\<C-V>jIxx\<Esc>"
15358b51b7f0SBram Moolenaar  eval getline(1, 2)->assert_equal(['xxone ', 'xxtwo '])
1536e2390c7fSMartin Tournoij  let expected = [#{type_bufnr: 0, id: 0, col: 3, end: 1, type: 'test', length: 3, start: 1}]
15378b51b7f0SBram Moolenaar  eval prop_list(1)->assert_equal(expected)
15388b51b7f0SBram Moolenaar  eval prop_list(2)->assert_equal(expected)
15398b51b7f0SBram Moolenaar
15408b51b7f0SBram Moolenaar  " insert "yy" inside the text props to make them longer
15418b51b7f0SBram Moolenaar  exe "normal! gg03l\<C-V>jIyy\<Esc>"
15428b51b7f0SBram Moolenaar  eval getline(1, 2)->assert_equal(['xxoyyne ', 'xxtyywo '])
15438b51b7f0SBram Moolenaar  let expected[0].length = 5
15448b51b7f0SBram Moolenaar  eval prop_list(1)->assert_equal(expected)
15458b51b7f0SBram Moolenaar  eval prop_list(2)->assert_equal(expected)
15468b51b7f0SBram Moolenaar
15478b51b7f0SBram Moolenaar  " insert "zz" after the text props, text props don't change
15488b51b7f0SBram Moolenaar  exe "normal! gg07l\<C-V>jIzz\<Esc>"
15498b51b7f0SBram Moolenaar  eval getline(1, 2)->assert_equal(['xxoyynezz ', 'xxtyywozz '])
15508b51b7f0SBram Moolenaar  eval prop_list(1)->assert_equal(expected)
15518b51b7f0SBram Moolenaar  eval prop_list(2)->assert_equal(expected)
15528b51b7f0SBram Moolenaar
15538b51b7f0SBram Moolenaar  bwipe!
15548b51b7f0SBram Moolenaar  call prop_type_delete('test')
15558b51b7f0SBram Moolenaarendfunc
15568b51b7f0SBram Moolenaar
155723999d79SBram Moolenaar" this was causing an ml_get error because w_botline was wrong
155823999d79SBram Moolenaarfunc Test_prop_one_line_window()
155923999d79SBram Moolenaar  enew
156023999d79SBram Moolenaar  call range(2)->setline(1)
156123999d79SBram Moolenaar  call prop_type_add('testprop', {})
156223999d79SBram Moolenaar  call prop_add(1, 1, {'type': 'testprop'})
156323999d79SBram Moolenaar  call popup_create('popup', {'textprop': 'testprop'})
156423999d79SBram Moolenaar  $
156523999d79SBram Moolenaar  new
156623999d79SBram Moolenaar  wincmd _
156723999d79SBram Moolenaar  call feedkeys("\r", 'xt')
156823999d79SBram Moolenaar  redraw
156923999d79SBram Moolenaar
157023999d79SBram Moolenaar  call popup_clear()
157123999d79SBram Moolenaar  call prop_type_delete('testprop')
157223999d79SBram Moolenaar  close
157323999d79SBram Moolenaar  bwipe!
157423999d79SBram Moolenaarendfunc
157523999d79SBram Moolenaar
1576840f91f1SBram Moolenaar" This was calling ml_append_int() and copy a text property from a previous
1577840f91f1SBram Moolenaar" line at the wrong moment.  Exact text length matters.
1578840f91f1SBram Moolenaardef Test_prop_splits_data_block()
1579840f91f1SBram Moolenaar  new
1580840f91f1SBram Moolenaar  var lines: list<string> = [repeat('x', 35)]->repeat(41)
1581840f91f1SBram Moolenaar			+ [repeat('!', 35)]
1582840f91f1SBram Moolenaar			+ [repeat('x', 35)]->repeat(56)
1583840f91f1SBram Moolenaar  lines->setline(1)
1584840f91f1SBram Moolenaar  prop_type_add('someprop', {highlight: 'ErrorMsg'})
1585840f91f1SBram Moolenaar  prop_add(1, 27, {end_lnum: 1, end_col: 70, type: 'someprop'})
1586840f91f1SBram Moolenaar  prop_remove({type: 'someprop'}, 1)
1587840f91f1SBram Moolenaar  prop_add(35, 22, {end_lnum: 43, end_col: 43, type: 'someprop'})
1588840f91f1SBram Moolenaar  prop_remove({type: 'someprop'}, 35, 43)
1589840f91f1SBram Moolenaar  assert_equal([], prop_list(42))
1590840f91f1SBram Moolenaar
1591840f91f1SBram Moolenaar  bwipe!
1592840f91f1SBram Moolenaar  prop_type_delete('someprop')
1593840f91f1SBram Moolenaarenddef
1594840f91f1SBram Moolenaar
15954cd5c52dSBram Moolenaar" This was calling ml_delete_int() and try to change text properties.
15964cd5c52dSBram Moolenaardef Test_prop_add_delete_line()
15974cd5c52dSBram Moolenaar  new
15984cd5c52dSBram Moolenaar  var a = 10
15994cd5c52dSBram Moolenaar  var b = 20
16004cd5c52dSBram Moolenaar  repeat([''], a)->append('$')
16014cd5c52dSBram Moolenaar  prop_type_add('Test', {highlight: 'ErrorMsg'})
16024cd5c52dSBram Moolenaar  for lnum in range(1, a)
16034cd5c52dSBram Moolenaar    for col in range(1, b)
16044cd5c52dSBram Moolenaar      prop_add(1, 1, {end_lnum: lnum, end_col: col, type: 'Test'})
16054cd5c52dSBram Moolenaar    endfor
16064cd5c52dSBram Moolenaar  endfor
16074cd5c52dSBram Moolenaar
16084cd5c52dSBram Moolenaar  # check deleting lines is OK
16094cd5c52dSBram Moolenaar  :5del
16104cd5c52dSBram Moolenaar  :1del
16114cd5c52dSBram Moolenaar  :$del
16124cd5c52dSBram Moolenaar
16134cd5c52dSBram Moolenaar  prop_type_delete('Test')
16144cd5c52dSBram Moolenaar  bwipe!
16154cd5c52dSBram Moolenaarenddef
16164cd5c52dSBram Moolenaar
1617e2390c7fSMartin Tournoij" Buffer number of 0 should be ignored, as if the parameter wasn't passed.
1618e2390c7fSMartin Tournoijdef Test_prop_bufnr_zero()
1619e2390c7fSMartin Tournoij  new
1620e2390c7fSMartin Tournoij  try
1621e2390c7fSMartin Tournoij    var bufnr = bufnr('')
1622e2390c7fSMartin Tournoij    setline(1, 'hello')
1623e2390c7fSMartin Tournoij    prop_type_add('bufnr-global', {highlight: 'ErrorMsg'})
1624e2390c7fSMartin Tournoij    prop_type_add('bufnr-buffer', {highlight: 'StatusLine', bufnr: bufnr})
1625e2390c7fSMartin Tournoij
1626e2390c7fSMartin Tournoij    prop_add(1, 1, {type: 'bufnr-global', length: 1})
1627e2390c7fSMartin Tournoij    prop_add(1, 2, {type: 'bufnr-buffer', length: 1})
1628e2390c7fSMartin Tournoij
1629e2390c7fSMartin Tournoij    var list = prop_list(1)
1630e2390c7fSMartin Tournoij    assert_equal([
1631e2390c7fSMartin Tournoij       {id: 0, col: 1, type_bufnr: 0,         end: 1, type: 'bufnr-global', length: 1, start: 1},
1632e2390c7fSMartin Tournoij       {id: 0, col: 2, type_bufnr: bufnr, end: 1, type: 'bufnr-buffer', length: 1, start: 1},
1633e2390c7fSMartin Tournoij    ], list)
1634e2390c7fSMartin Tournoij
1635e2390c7fSMartin Tournoij    assert_equal(
1636e2390c7fSMartin Tournoij      {highlight: 'ErrorMsg', end_incl: 0, start_incl: 0, priority: 0, combine: 1},
1637e2390c7fSMartin Tournoij      prop_type_get('bufnr-global', {bufnr: list[0].type_bufnr}))
1638e2390c7fSMartin Tournoij
1639e2390c7fSMartin Tournoij    assert_equal(
1640e2390c7fSMartin Tournoij      {highlight: 'StatusLine', end_incl: 0, start_incl: 0, priority: 0, bufnr: bufnr, combine: 1},
1641e2390c7fSMartin Tournoij      prop_type_get('bufnr-buffer', {bufnr: list[1].type_bufnr}))
1642e2390c7fSMartin Tournoij  finally
1643e2390c7fSMartin Tournoij    bwipe!
1644e2390c7fSMartin Tournoij    prop_type_delete('bufnr-global')
1645e2390c7fSMartin Tournoij  endtry
1646e2390c7fSMartin Tournoijenddef
1647e2390c7fSMartin Tournoij
1648e2390c7fSMartin Tournoij
164923999d79SBram Moolenaar
165099fa7219SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1651