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