108243d26SBram Moolenaar" Tests for various functions.
26d91bcb4SBram Moolenaar
3f1c118beSBram Moolenaarsource shared.vim
48c5a278fSBram Moolenaarsource check.vim
5c2585490SBram Moolenaarsource term_util.vim
64132eb50SBram Moolenaarsource screendump.vim
7b54abeeaSBram Moolenaarsource vim9.vim
808243d26SBram Moolenaar
9c7d16dceSBram Moolenaar" Must be done first, since the alternate buffer must be unset.
10c7d16dceSBram Moolenaarfunc Test_00_bufexists()
11c7d16dceSBram Moolenaar  call assert_equal(0, bufexists('does_not_exist'))
12c7d16dceSBram Moolenaar  call assert_equal(1, bufexists(bufnr('%')))
13c7d16dceSBram Moolenaar  call assert_equal(0, bufexists(0))
14c7d16dceSBram Moolenaar  new Xfoo
15c7d16dceSBram Moolenaar  let bn = bufnr('%')
16c7d16dceSBram Moolenaar  call assert_equal(1, bufexists(bn))
17c7d16dceSBram Moolenaar  call assert_equal(1, bufexists('Xfoo'))
18c7d16dceSBram Moolenaar  call assert_equal(1, bufexists(getcwd() . '/Xfoo'))
19c7d16dceSBram Moolenaar  call assert_equal(1, bufexists(0))
20c7d16dceSBram Moolenaar  bw
21c7d16dceSBram Moolenaar  call assert_equal(0, bufexists(bn))
22c7d16dceSBram Moolenaar  call assert_equal(0, bufexists('Xfoo'))
23c7d16dceSBram Moolenaarendfunc
24c7d16dceSBram Moolenaar
257929651eSBram Moolenaarfunc Test_has()
267929651eSBram Moolenaar  call assert_equal(1, has('eval'))
277929651eSBram Moolenaar  call assert_equal(1, has('eval', 1))
287929651eSBram Moolenaar
290e05de46SBram Moolenaar  if has('unix')
300e05de46SBram Moolenaar    call assert_equal(1, or(has('ttyin'), 1))
310e05de46SBram Moolenaar    call assert_equal(0, and(has('ttyout'), 0))
320e05de46SBram Moolenaar    call assert_equal(1, has('multi_byte_encoding'))
330e05de46SBram Moolenaar  endif
3499fa7219SBram Moolenaar  call assert_equal(1, has('vcon', 1))
3599fa7219SBram Moolenaar  call assert_equal(1, has('mouse_gpm_enabled', 1))
360e05de46SBram Moolenaar
377929651eSBram Moolenaar  call assert_equal(0, has('nonexistent'))
387929651eSBram Moolenaar  call assert_equal(0, has('nonexistent', 1))
390e05de46SBram Moolenaar
400e05de46SBram Moolenaar  " Will we ever have patch 9999?
410e05de46SBram Moolenaar  let ver = 'patch-' .. v:version / 100 .. '.' .. v:version % 100 .. '.9999'
420e05de46SBram Moolenaar  call assert_equal(0, has(ver))
437929651eSBram Moolenaarendfunc
447929651eSBram Moolenaar
4524c2e48eSBram Moolenaarfunc Test_empty()
4624c2e48eSBram Moolenaar  call assert_equal(1, empty(''))
4724c2e48eSBram Moolenaar  call assert_equal(0, empty('a'))
4824c2e48eSBram Moolenaar
4924c2e48eSBram Moolenaar  call assert_equal(1, empty(0))
5024c2e48eSBram Moolenaar  call assert_equal(1, empty(-0))
5124c2e48eSBram Moolenaar  call assert_equal(0, empty(1))
5224c2e48eSBram Moolenaar  call assert_equal(0, empty(-1))
5324c2e48eSBram Moolenaar
545feabe00SBram Moolenaar  if has('float')
5524c2e48eSBram Moolenaar    call assert_equal(1, empty(0.0))
5624c2e48eSBram Moolenaar    call assert_equal(1, empty(-0.0))
5724c2e48eSBram Moolenaar    call assert_equal(0, empty(1.0))
5824c2e48eSBram Moolenaar    call assert_equal(0, empty(-1.0))
5924c2e48eSBram Moolenaar    call assert_equal(0, empty(1.0/0.0))
6024c2e48eSBram Moolenaar    call assert_equal(0, empty(0.0/0.0))
615feabe00SBram Moolenaar  endif
6224c2e48eSBram Moolenaar
6324c2e48eSBram Moolenaar  call assert_equal(1, empty([]))
6424c2e48eSBram Moolenaar  call assert_equal(0, empty(['a']))
6524c2e48eSBram Moolenaar
6624c2e48eSBram Moolenaar  call assert_equal(1, empty({}))
6724c2e48eSBram Moolenaar  call assert_equal(0, empty({'a':1}))
6824c2e48eSBram Moolenaar
6924c2e48eSBram Moolenaar  call assert_equal(1, empty(v:null))
7024c2e48eSBram Moolenaar  call assert_equal(1, empty(v:none))
7124c2e48eSBram Moolenaar  call assert_equal(1, empty(v:false))
7224c2e48eSBram Moolenaar  call assert_equal(0, empty(v:true))
7324c2e48eSBram Moolenaar
7441042f3cSBram Moolenaar  if has('channel')
7541042f3cSBram Moolenaar    call assert_equal(1, empty(test_null_channel()))
7641042f3cSBram Moolenaar  endif
7741042f3cSBram Moolenaar  if has('job')
7841042f3cSBram Moolenaar    call assert_equal(1, empty(test_null_job()))
7941042f3cSBram Moolenaar  endif
8041042f3cSBram Moolenaar
8124c2e48eSBram Moolenaar  call assert_equal(0, empty(function('Test_empty')))
8217aca707SBram Moolenaar  call assert_equal(0, empty(function('Test_empty', [0])))
837c215c58SBram Moolenaar
847c215c58SBram Moolenaar  call assert_fails("call empty(test_void())", 'E685:')
857c215c58SBram Moolenaar  call assert_fails("call empty(test_unknown())", 'E685:')
8624c2e48eSBram Moolenaarendfunc
8724c2e48eSBram Moolenaar
88dd58923cSBram Moolenaarfunc Test_test_void()
8961a417b7SBram Moolenaar  call assert_fails('echo 1 == test_void()', 'E1031:')
90dd58923cSBram Moolenaar  if has('float')
9161a417b7SBram Moolenaar    call assert_fails('echo 1.0 == test_void()', 'E1031:')
92dd58923cSBram Moolenaar  endif
93dd58923cSBram Moolenaar  call assert_fails('let x = json_encode(test_void())', 'E685:')
94dd58923cSBram Moolenaar  call assert_fails('let x = copy(test_void())', 'E685:')
9561a417b7SBram Moolenaar  call assert_fails('let x = copy([test_void()])', 'E1031:')
96dd58923cSBram Moolenaarendfunc
97dd58923cSBram Moolenaar
981840a7b4SBram Moolenaarfunc Test_islocked()
991840a7b4SBram Moolenaar  call assert_fails('call islocked(99)', 'E475:')
1001840a7b4SBram Moolenaar  call assert_fails('call islocked("s: x")', 'E488:')
1011840a7b4SBram Moolenaarendfunc
1021840a7b4SBram Moolenaar
10324c2e48eSBram Moolenaarfunc Test_len()
10424c2e48eSBram Moolenaar  call assert_equal(1, len(0))
10524c2e48eSBram Moolenaar  call assert_equal(2, len(12))
10624c2e48eSBram Moolenaar
10724c2e48eSBram Moolenaar  call assert_equal(0, len(''))
10824c2e48eSBram Moolenaar  call assert_equal(2, len('ab'))
10924c2e48eSBram Moolenaar
11024c2e48eSBram Moolenaar  call assert_equal(0, len([]))
11108f4157cSBram Moolenaar  call assert_equal(0, len(test_null_list()))
11224c2e48eSBram Moolenaar  call assert_equal(2, len([2, 1]))
11324c2e48eSBram Moolenaar
11424c2e48eSBram Moolenaar  call assert_equal(0, len({}))
11508f4157cSBram Moolenaar  call assert_equal(0, len(test_null_dict()))
11624c2e48eSBram Moolenaar  call assert_equal(2, len({'a': 1, 'b': 2}))
11724c2e48eSBram Moolenaar
11824c2e48eSBram Moolenaar  call assert_fails('call len(v:none)', 'E701:')
11924c2e48eSBram Moolenaar  call assert_fails('call len({-> 0})', 'E701:')
12024c2e48eSBram Moolenaarendfunc
12124c2e48eSBram Moolenaar
12224c2e48eSBram Moolenaarfunc Test_max()
12324c2e48eSBram Moolenaar  call assert_equal(0, max([]))
12424c2e48eSBram Moolenaar  call assert_equal(2, max([2]))
12524c2e48eSBram Moolenaar  call assert_equal(2, max([1, 2]))
12624c2e48eSBram Moolenaar  call assert_equal(2, max([1, 2, v:null]))
12724c2e48eSBram Moolenaar
12824c2e48eSBram Moolenaar  call assert_equal(0, max({}))
12924c2e48eSBram Moolenaar  call assert_equal(2, max({'a':1, 'b':2}))
13024c2e48eSBram Moolenaar
13124c2e48eSBram Moolenaar  call assert_fails('call max(1)', 'E712:')
13224c2e48eSBram Moolenaar  call assert_fails('call max(v:none)', 'E712:')
133ab65fc77SBram Moolenaar
134ab65fc77SBram Moolenaar  " check we only get one error
135ab65fc77SBram Moolenaar  call assert_fails('call max([#{}, [1]])', ['E728:', 'E728:'])
136ab65fc77SBram Moolenaar  call assert_fails('call max(#{a: {}, b: [1]})', ['E728:', 'E728:'])
13724c2e48eSBram Moolenaarendfunc
13824c2e48eSBram Moolenaar
13924c2e48eSBram Moolenaarfunc Test_min()
14024c2e48eSBram Moolenaar  call assert_equal(0, min([]))
14124c2e48eSBram Moolenaar  call assert_equal(2, min([2]))
14224c2e48eSBram Moolenaar  call assert_equal(1, min([1, 2]))
14324c2e48eSBram Moolenaar  call assert_equal(0, min([1, 2, v:null]))
14424c2e48eSBram Moolenaar
14524c2e48eSBram Moolenaar  call assert_equal(0, min({}))
14624c2e48eSBram Moolenaar  call assert_equal(1, min({'a':1, 'b':2}))
14724c2e48eSBram Moolenaar
14824c2e48eSBram Moolenaar  call assert_fails('call min(1)', 'E712:')
14924c2e48eSBram Moolenaar  call assert_fails('call min(v:none)', 'E712:')
15034fcb697SYegappan Lakshmanan  call assert_fails('call min([1, {}])', 'E728:')
151ab65fc77SBram Moolenaar
152ab65fc77SBram Moolenaar  " check we only get one error
153ab65fc77SBram Moolenaar  call assert_fails('call min([[1], #{}])', ['E745:', 'E745:'])
154ab65fc77SBram Moolenaar  call assert_fails('call min(#{a: [1], b: #{}})', ['E745:', 'E745:'])
15524c2e48eSBram Moolenaarendfunc
15624c2e48eSBram Moolenaar
15742ab17b8SBram Moolenaarfunc Test_strwidth()
15842ab17b8SBram Moolenaar  for aw in ['single', 'double']
15942ab17b8SBram Moolenaar    exe 'set ambiwidth=' . aw
16042ab17b8SBram Moolenaar    call assert_equal(0, strwidth(''))
16142ab17b8SBram Moolenaar    call assert_equal(1, strwidth("\t"))
16242ab17b8SBram Moolenaar    call assert_equal(3, strwidth('Vim'))
16342ab17b8SBram Moolenaar    call assert_equal(4, strwidth(1234))
16442ab17b8SBram Moolenaar    call assert_equal(5, strwidth(-1234))
16542ab17b8SBram Moolenaar
16642ab17b8SBram Moolenaar    call assert_equal(2, strwidth('��'))
16742ab17b8SBram Moolenaar    call assert_equal(17, strwidth('Eĥoŝanĝo ĉiuĵaŭde'))
16842ab17b8SBram Moolenaar    call assert_equal((aw == 'single') ? 6 : 7, strwidth('Straße'))
16942ab17b8SBram Moolenaar
17042ab17b8SBram Moolenaar    call assert_fails('call strwidth({->0})', 'E729:')
17142ab17b8SBram Moolenaar    call assert_fails('call strwidth([])', 'E730:')
17242ab17b8SBram Moolenaar    call assert_fails('call strwidth({})', 'E731:')
17342ab17b8SBram Moolenaar  endfor
17442ab17b8SBram Moolenaar
1753cfa5b16SBram Moolenaar  if has('float')
1763cfa5b16SBram Moolenaar    call assert_equal(3, strwidth(1.2))
1774490ec4eSYegappan Lakshmanan    call CheckDefAndScriptFailure2(['echo strwidth(1.2)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1174: String required for argument 1')
1783cfa5b16SBram Moolenaar  endif
1793cfa5b16SBram Moolenaar
18042ab17b8SBram Moolenaar  set ambiwidth&
18142ab17b8SBram Moolenaarendfunc
18242ab17b8SBram Moolenaar
18308243d26SBram Moolenaarfunc Test_str2nr()
18408243d26SBram Moolenaar  call assert_equal(0, str2nr(''))
18508243d26SBram Moolenaar  call assert_equal(1, str2nr('1'))
18608243d26SBram Moolenaar  call assert_equal(1, str2nr(' 1 '))
18708243d26SBram Moolenaar
18808243d26SBram Moolenaar  call assert_equal(1, str2nr('+1'))
18908243d26SBram Moolenaar  call assert_equal(1, str2nr('+ 1'))
19008243d26SBram Moolenaar  call assert_equal(1, str2nr(' + 1 '))
19108243d26SBram Moolenaar
19208243d26SBram Moolenaar  call assert_equal(-1, str2nr('-1'))
19308243d26SBram Moolenaar  call assert_equal(-1, str2nr('- 1'))
19408243d26SBram Moolenaar  call assert_equal(-1, str2nr(' - 1 '))
19508243d26SBram Moolenaar
19608243d26SBram Moolenaar  call assert_equal(123456789, str2nr('123456789'))
19708243d26SBram Moolenaar  call assert_equal(-123456789, str2nr('-123456789'))
19824c2e48eSBram Moolenaar
19924c2e48eSBram Moolenaar  call assert_equal(5, str2nr('101', 2))
200f6ed61e1SBram Moolenaar  call assert_equal(5, '0b101'->str2nr(2))
20124c2e48eSBram Moolenaar  call assert_equal(5, str2nr('0B101', 2))
20224c2e48eSBram Moolenaar  call assert_equal(-5, str2nr('-101', 2))
20324c2e48eSBram Moolenaar  call assert_equal(-5, str2nr('-0b101', 2))
20424c2e48eSBram Moolenaar  call assert_equal(-5, str2nr('-0B101', 2))
20524c2e48eSBram Moolenaar
20624c2e48eSBram Moolenaar  call assert_equal(65, str2nr('101', 8))
20724c2e48eSBram Moolenaar  call assert_equal(65, str2nr('0101', 8))
20824c2e48eSBram Moolenaar  call assert_equal(-65, str2nr('-101', 8))
20924c2e48eSBram Moolenaar  call assert_equal(-65, str2nr('-0101', 8))
210c17e66c5SBram Moolenaar  call assert_equal(65, str2nr('0o101', 8))
211c17e66c5SBram Moolenaar  call assert_equal(65, str2nr('0O0101', 8))
212c17e66c5SBram Moolenaar  call assert_equal(-65, str2nr('-0O101', 8))
213c17e66c5SBram Moolenaar  call assert_equal(-65, str2nr('-0o0101', 8))
21424c2e48eSBram Moolenaar
21524c2e48eSBram Moolenaar  call assert_equal(11259375, str2nr('abcdef', 16))
21624c2e48eSBram Moolenaar  call assert_equal(11259375, str2nr('ABCDEF', 16))
21724c2e48eSBram Moolenaar  call assert_equal(-11259375, str2nr('-ABCDEF', 16))
21824c2e48eSBram Moolenaar  call assert_equal(11259375, str2nr('0xabcdef', 16))
21924c2e48eSBram Moolenaar  call assert_equal(11259375, str2nr('0Xabcdef', 16))
22024c2e48eSBram Moolenaar  call assert_equal(11259375, str2nr('0XABCDEF', 16))
22124c2e48eSBram Moolenaar  call assert_equal(-11259375, str2nr('-0xABCDEF', 16))
22224c2e48eSBram Moolenaar
22360a8de28SBram Moolenaar  call assert_equal(1, str2nr("1'000'000", 10, 0))
22460a8de28SBram Moolenaar  call assert_equal(256, str2nr("1'0000'0000", 2, 1))
22560a8de28SBram Moolenaar  call assert_equal(262144, str2nr("1'000'000", 8, 1))
22660a8de28SBram Moolenaar  call assert_equal(1000000, str2nr("1'000'000", 10, 1))
227ea8dcf83SBram Moolenaar  call assert_equal(1000, str2nr("1'000''000", 10, 1))
22860a8de28SBram Moolenaar  call assert_equal(65536, str2nr("1'00'00", 16, 1))
22960a8de28SBram Moolenaar
23024c2e48eSBram Moolenaar  call assert_equal(0, str2nr('0x10'))
23124c2e48eSBram Moolenaar  call assert_equal(0, str2nr('0b10'))
232c17e66c5SBram Moolenaar  call assert_equal(0, str2nr('0o10'))
23324c2e48eSBram Moolenaar  call assert_equal(1, str2nr('12', 2))
23424c2e48eSBram Moolenaar  call assert_equal(1, str2nr('18', 8))
23524c2e48eSBram Moolenaar  call assert_equal(1, str2nr('1g', 16))
23624c2e48eSBram Moolenaar
23724c2e48eSBram Moolenaar  call assert_equal(0, str2nr(v:null))
23824c2e48eSBram Moolenaar  call assert_equal(0, str2nr(v:none))
23924c2e48eSBram Moolenaar
24024c2e48eSBram Moolenaar  call assert_fails('call str2nr([])', 'E730:')
24124c2e48eSBram Moolenaar  call assert_fails('call str2nr({->2})', 'E729:')
2425feabe00SBram Moolenaar  if has('float')
2433cfa5b16SBram Moolenaar    call assert_equal(1, str2nr(1.2))
2444490ec4eSYegappan Lakshmanan    call CheckDefAndScriptFailure2(['echo str2nr(1.2)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1174: String required for argument 1')
2455feabe00SBram Moolenaar  endif
2469b7bf9e9SBram Moolenaar  call assert_fails('call str2nr(10, [])', 'E745:')
24724c2e48eSBram Moolenaarendfunc
24824c2e48eSBram Moolenaar
24924c2e48eSBram Moolenaarfunc Test_strftime()
25010455d43SBram Moolenaar  CheckFunction strftime
25110455d43SBram Moolenaar
25224c2e48eSBram Moolenaar  " Format of strftime() depends on system. We assume
25324c2e48eSBram Moolenaar  " that basic formats tested here are available and
25424c2e48eSBram Moolenaar  " identical on all systems which support strftime().
25524c2e48eSBram Moolenaar  "
25624c2e48eSBram Moolenaar  " The 2nd parameter of strftime() is a local time, so the output day
25724c2e48eSBram Moolenaar  " of strftime() can be 17 or 18, depending on timezone.
25824c2e48eSBram Moolenaar  call assert_match('^2017-01-1[78]$', strftime('%Y-%m-%d', 1484695512))
25924c2e48eSBram Moolenaar  "
260f6ed61e1SBram Moolenaar  call assert_match('^\d\d\d\d-\(0\d\|1[012]\)-\([012]\d\|3[01]\) \([01]\d\|2[0-3]\):[0-5]\d:\([0-5]\d\|60\)$', '%Y-%m-%d %H:%M:%S'->strftime())
26124c2e48eSBram Moolenaar
26224c2e48eSBram Moolenaar  call assert_fails('call strftime([])', 'E730:')
26324c2e48eSBram Moolenaar  call assert_fails('call strftime("%Y", [])', 'E745:')
264db51730dSBram Moolenaar
265db51730dSBram Moolenaar  " Check that the time changes after we change the timezone
266db51730dSBram Moolenaar  " Save previous timezone value, if any
267db51730dSBram Moolenaar  if exists('$TZ')
268db51730dSBram Moolenaar    let tz = $TZ
269db51730dSBram Moolenaar  endif
270db51730dSBram Moolenaar
271db51730dSBram Moolenaar  " Force EST and then UTC, save the current hour (24-hour clock) for each
272db51730dSBram Moolenaar  let $TZ = 'EST' | let est = strftime('%H')
273db51730dSBram Moolenaar  let $TZ = 'UTC' | let utc = strftime('%H')
274db51730dSBram Moolenaar
275db51730dSBram Moolenaar  " Those hours should be two bytes long, and should not be the same; if they
276db51730dSBram Moolenaar  " are, a tzset(3) call may have failed somewhere
277db51730dSBram Moolenaar  call assert_equal(strlen(est), 2)
278db51730dSBram Moolenaar  call assert_equal(strlen(utc), 2)
27987652a7eSBram Moolenaar  " TODO: this fails on MS-Windows
28087652a7eSBram Moolenaar  if has('unix')
281db51730dSBram Moolenaar    call assert_notequal(est, utc)
28287652a7eSBram Moolenaar  endif
283db51730dSBram Moolenaar
284db51730dSBram Moolenaar  " If we cached a timezone value, put it back, otherwise clear it
285db51730dSBram Moolenaar  if exists('tz')
286db51730dSBram Moolenaar    let $TZ = tz
287db51730dSBram Moolenaar  else
288db51730dSBram Moolenaar    unlet $TZ
289db51730dSBram Moolenaar  endif
29010455d43SBram Moolenaarendfunc
291db51730dSBram Moolenaar
29210455d43SBram Moolenaarfunc Test_strptime()
29310455d43SBram Moolenaar  CheckFunction strptime
29410455d43SBram Moolenaar
29510455d43SBram Moolenaar  if exists('$TZ')
29610455d43SBram Moolenaar    let tz = $TZ
29710455d43SBram Moolenaar  endif
29810455d43SBram Moolenaar  let $TZ = 'UTC'
29910455d43SBram Moolenaar
3009a838fe5SBram Moolenaar  call assert_equal(1484653763, strptime('%Y-%m-%d %T', '2017-01-17 11:49:23'))
30110455d43SBram Moolenaar
302ea1233fcSBram Moolenaar  " Force DST and check that it's considered
303ea1233fcSBram Moolenaar  let $TZ = 'WINTER0SUMMER,J1,J365'
304ea1233fcSBram Moolenaar  call assert_equal(1484653763 - 3600, strptime('%Y-%m-%d %T', '2017-01-17 11:49:23'))
305ea1233fcSBram Moolenaar
30610455d43SBram Moolenaar  call assert_fails('call strptime()', 'E119:')
30710455d43SBram Moolenaar  call assert_fails('call strptime("xxx")', 'E119:')
30810455d43SBram Moolenaar  call assert_equal(0, strptime("%Y", ''))
30910455d43SBram Moolenaar  call assert_equal(0, strptime("%Y", "xxx"))
31010455d43SBram Moolenaar
31110455d43SBram Moolenaar  if exists('tz')
31210455d43SBram Moolenaar    let $TZ = tz
31310455d43SBram Moolenaar  else
31410455d43SBram Moolenaar    unlet $TZ
31510455d43SBram Moolenaar  endif
31624c2e48eSBram Moolenaarendfunc
31724c2e48eSBram Moolenaar
318dce1e89bSBram Moolenaarfunc Test_resolve_unix()
3196d91bcb4SBram Moolenaar  CheckUnix
32026109907SBram Moolenaar
32126109907SBram Moolenaar  " Xlink1 -> Xlink2
32226109907SBram Moolenaar  " Xlink2 -> Xlink3
32326109907SBram Moolenaar  silent !ln -s -f Xlink2 Xlink1
32426109907SBram Moolenaar  silent !ln -s -f Xlink3 Xlink2
32526109907SBram Moolenaar  call assert_equal('Xlink3', resolve('Xlink1'))
32626109907SBram Moolenaar  call assert_equal('./Xlink3', resolve('./Xlink1'))
32726109907SBram Moolenaar  call assert_equal('Xlink3/', resolve('Xlink2/'))
32826109907SBram Moolenaar  " FIXME: these tests result in things like "Xlink2/" instead of "Xlink3/"?!
32926109907SBram Moolenaar  "call assert_equal('Xlink3/', resolve('Xlink1/'))
33026109907SBram Moolenaar  "call assert_equal('./Xlink3/', resolve('./Xlink1/'))
33126109907SBram Moolenaar  "call assert_equal(getcwd() . '/Xlink3/', resolve(getcwd() . '/Xlink1/'))
33226109907SBram Moolenaar  call assert_equal(getcwd() . '/Xlink3', resolve(getcwd() . '/Xlink1'))
33326109907SBram Moolenaar
33426109907SBram Moolenaar  " Test resolve() with a symlink cycle.
33526109907SBram Moolenaar  " Xlink1 -> Xlink2
33626109907SBram Moolenaar  " Xlink2 -> Xlink3
33726109907SBram Moolenaar  " Xlink3 -> Xlink1
33826109907SBram Moolenaar  silent !ln -s -f Xlink1 Xlink3
33926109907SBram Moolenaar  call assert_fails('call resolve("Xlink1")',   'E655:')
34026109907SBram Moolenaar  call assert_fails('call resolve("./Xlink1")', 'E655:')
34126109907SBram Moolenaar  call assert_fails('call resolve("Xlink2")',   'E655:')
34226109907SBram Moolenaar  call assert_fails('call resolve("Xlink3")',   'E655:')
34326109907SBram Moolenaar  call delete('Xlink1')
34426109907SBram Moolenaar  call delete('Xlink2')
34526109907SBram Moolenaar  call delete('Xlink3')
34626109907SBram Moolenaar
34726109907SBram Moolenaar  silent !ln -s -f Xdir//Xfile Xlink
34826109907SBram Moolenaar  call assert_equal('Xdir/Xfile', resolve('Xlink'))
34926109907SBram Moolenaar  call delete('Xlink')
35026109907SBram Moolenaar
35126109907SBram Moolenaar  silent !ln -s -f Xlink2/ Xlink1
352a0d1fef4SBram Moolenaar  call assert_equal('Xlink2', 'Xlink1'->resolve())
35326109907SBram Moolenaar  call assert_equal('Xlink2/', resolve('Xlink1/'))
35426109907SBram Moolenaar  call delete('Xlink1')
35526109907SBram Moolenaar
35626109907SBram Moolenaar  silent !ln -s -f ./Xlink2 Xlink1
35726109907SBram Moolenaar  call assert_equal('Xlink2', resolve('Xlink1'))
35826109907SBram Moolenaar  call assert_equal('./Xlink2', resolve('./Xlink1'))
35926109907SBram Moolenaar  call delete('Xlink1')
36050c4e9e0SBram Moolenaar
36150c4e9e0SBram Moolenaar  call assert_equal('/', resolve('/'))
36226109907SBram Moolenaarendfunc
36326109907SBram Moolenaar
364dce1e89bSBram Moolenaarfunc s:normalize_fname(fname)
365dce1e89bSBram Moolenaar  let ret = substitute(a:fname, '\', '/', 'g')
366dce1e89bSBram Moolenaar  let ret = substitute(ret, '//', '/', 'g')
367f92e58caSBram Moolenaar  return ret->tolower()
368dce1e89bSBram Moolenaarendfunc
369dce1e89bSBram Moolenaar
370dce1e89bSBram Moolenaarfunc Test_resolve_win32()
3716d91bcb4SBram Moolenaar  CheckMSWindows
372dce1e89bSBram Moolenaar
373dce1e89bSBram Moolenaar  " test for shortcut file
374dce1e89bSBram Moolenaar  if executable('cscript')
375dce1e89bSBram Moolenaar    new Xfile
376dce1e89bSBram Moolenaar    wq
377e7eb9270SBram Moolenaar    let lines =<< trim END
378e7eb9270SBram Moolenaar	Set fs = CreateObject("Scripting.FileSystemObject")
379e7eb9270SBram Moolenaar	Set ws = WScript.CreateObject("WScript.Shell")
380e7eb9270SBram Moolenaar	Set shortcut = ws.CreateShortcut("Xlink.lnk")
381e7eb9270SBram Moolenaar	shortcut.TargetPath = fs.BuildPath(ws.CurrentDirectory, "Xfile")
382e7eb9270SBram Moolenaar	shortcut.Save
383e7eb9270SBram Moolenaar    END
384e7eb9270SBram Moolenaar    call writefile(lines, 'link.vbs')
385dce1e89bSBram Moolenaar    silent !cscript link.vbs
386dce1e89bSBram Moolenaar    call delete('link.vbs')
387dce1e89bSBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xfile'), s:normalize_fname(resolve('./Xlink.lnk')))
388dce1e89bSBram Moolenaar    call delete('Xfile')
389dce1e89bSBram Moolenaar
390dce1e89bSBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xfile'), s:normalize_fname(resolve('./Xlink.lnk')))
391dce1e89bSBram Moolenaar    call delete('Xlink.lnk')
392dce1e89bSBram Moolenaar  else
393dce1e89bSBram Moolenaar    echomsg 'skipped test for shortcut file'
394dce1e89bSBram Moolenaar  endif
395dce1e89bSBram Moolenaar
396dce1e89bSBram Moolenaar  " remove files
397dce1e89bSBram Moolenaar  call delete('Xlink')
398dce1e89bSBram Moolenaar  call delete('Xdir', 'd')
399dce1e89bSBram Moolenaar  call delete('Xfile')
400dce1e89bSBram Moolenaar
401dce1e89bSBram Moolenaar  " test for symbolic link to a file
402dce1e89bSBram Moolenaar  new Xfile
403dce1e89bSBram Moolenaar  wq
4044a792c87SBram Moolenaar  call assert_equal('Xfile', resolve('Xfile'))
405dce1e89bSBram Moolenaar  silent !mklink Xlink Xfile
406dce1e89bSBram Moolenaar  if !v:shell_error
407dce1e89bSBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xfile'), s:normalize_fname(resolve('./Xlink')))
408dce1e89bSBram Moolenaar    call delete('Xlink')
409dce1e89bSBram Moolenaar  else
410dce1e89bSBram Moolenaar    echomsg 'skipped test for symbolic link to a file'
411dce1e89bSBram Moolenaar  endif
412dce1e89bSBram Moolenaar  call delete('Xfile')
413dce1e89bSBram Moolenaar
414dce1e89bSBram Moolenaar  " test for junction to a directory
415dce1e89bSBram Moolenaar  call mkdir('Xdir')
416dce1e89bSBram Moolenaar  silent !mklink /J Xlink Xdir
417dce1e89bSBram Moolenaar  if !v:shell_error
418dce1e89bSBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xdir'), s:normalize_fname(resolve(getcwd() . '/Xlink')))
419dce1e89bSBram Moolenaar
420dce1e89bSBram Moolenaar    call delete('Xdir', 'd')
421dce1e89bSBram Moolenaar
422dce1e89bSBram Moolenaar    " test for junction already removed
423dce1e89bSBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xlink'), s:normalize_fname(resolve(getcwd() . '/Xlink')))
424dce1e89bSBram Moolenaar    call delete('Xlink')
425dce1e89bSBram Moolenaar  else
426dce1e89bSBram Moolenaar    echomsg 'skipped test for junction to a directory'
427dce1e89bSBram Moolenaar    call delete('Xdir', 'd')
428dce1e89bSBram Moolenaar  endif
429dce1e89bSBram Moolenaar
430dce1e89bSBram Moolenaar  " test for symbolic link to a directory
431dce1e89bSBram Moolenaar  call mkdir('Xdir')
432dce1e89bSBram Moolenaar  silent !mklink /D Xlink Xdir
433dce1e89bSBram Moolenaar  if !v:shell_error
434dce1e89bSBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xdir'), s:normalize_fname(resolve(getcwd() . '/Xlink')))
435dce1e89bSBram Moolenaar
436dce1e89bSBram Moolenaar    call delete('Xdir', 'd')
437dce1e89bSBram Moolenaar
438dce1e89bSBram Moolenaar    " test for symbolic link already removed
439dce1e89bSBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xlink'), s:normalize_fname(resolve(getcwd() . '/Xlink')))
440dce1e89bSBram Moolenaar    call delete('Xlink')
441dce1e89bSBram Moolenaar  else
442dce1e89bSBram Moolenaar    echomsg 'skipped test for symbolic link to a directory'
443dce1e89bSBram Moolenaar    call delete('Xdir', 'd')
444dce1e89bSBram Moolenaar  endif
445dce1e89bSBram Moolenaar
446dce1e89bSBram Moolenaar  " test for buffer name
447dce1e89bSBram Moolenaar  new Xfile
448dce1e89bSBram Moolenaar  wq
449dce1e89bSBram Moolenaar  silent !mklink Xlink Xfile
450dce1e89bSBram Moolenaar  if !v:shell_error
451dce1e89bSBram Moolenaar    edit Xlink
452dce1e89bSBram Moolenaar    call assert_equal('Xlink', bufname('%'))
453dce1e89bSBram Moolenaar    call delete('Xlink')
454dce1e89bSBram Moolenaar    bw!
455dce1e89bSBram Moolenaar  else
456dce1e89bSBram Moolenaar    echomsg 'skipped test for buffer name'
457dce1e89bSBram Moolenaar  endif
458dce1e89bSBram Moolenaar  call delete('Xfile')
4591bbebab5SBram Moolenaar
4601bbebab5SBram Moolenaar  " test for reparse point
4611bbebab5SBram Moolenaar  call mkdir('Xdir')
4624a792c87SBram Moolenaar  call assert_equal('Xdir', resolve('Xdir'))
4631bbebab5SBram Moolenaar  silent !mklink /D Xdirlink Xdir
4641bbebab5SBram Moolenaar  if !v:shell_error
4651bbebab5SBram Moolenaar    w Xdir/text.txt
4664a792c87SBram Moolenaar    call assert_equal('Xdir/text.txt', resolve('Xdir/text.txt'))
4671bbebab5SBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xdir\text.txt'), s:normalize_fname(resolve('Xdirlink\text.txt')))
4681bbebab5SBram Moolenaar    call assert_equal(s:normalize_fname(getcwd() . '\Xdir'), s:normalize_fname(resolve('Xdirlink')))
4694a792c87SBram Moolenaar    call delete('Xdirlink')
4701bbebab5SBram Moolenaar  else
4711bbebab5SBram Moolenaar    echomsg 'skipped test for reparse point'
4721bbebab5SBram Moolenaar  endif
4731bbebab5SBram Moolenaar
4741bbebab5SBram Moolenaar  call delete('Xdir', 'rf')
475dce1e89bSBram Moolenaarendfunc
476dce1e89bSBram Moolenaar
47724c2e48eSBram Moolenaarfunc Test_simplify()
47824c2e48eSBram Moolenaar  call assert_equal('',            simplify(''))
47924c2e48eSBram Moolenaar  call assert_equal('/',           simplify('/'))
48024c2e48eSBram Moolenaar  call assert_equal('/',           simplify('/.'))
48124c2e48eSBram Moolenaar  call assert_equal('/',           simplify('/..'))
48224c2e48eSBram Moolenaar  call assert_equal('/...',        simplify('/...'))
483fdcbe3c3SBram Moolenaar  call assert_equal('//path',      simplify('//path'))
484c70222d1SBram Moolenaar  if has('unix')
485fdcbe3c3SBram Moolenaar    call assert_equal('/path',       simplify('///path'))
486fdcbe3c3SBram Moolenaar    call assert_equal('/path',       simplify('////path'))
487c70222d1SBram Moolenaar  endif
488fdcbe3c3SBram Moolenaar
4897035fd9dSBram Moolenaar  call assert_equal('./dir/file',  './dir/file'->simplify())
49024c2e48eSBram Moolenaar  call assert_equal('./dir/file',  simplify('.///dir//file'))
49124c2e48eSBram Moolenaar  call assert_equal('./dir/file',  simplify('./dir/./file'))
49224c2e48eSBram Moolenaar  call assert_equal('./file',      simplify('./dir/../file'))
49324c2e48eSBram Moolenaar  call assert_equal('../dir/file', simplify('dir/../../dir/file'))
49424c2e48eSBram Moolenaar  call assert_equal('./file',      simplify('dir/.././file'))
495bdd2c290SBram Moolenaar  call assert_equal('../dir',      simplify('./../dir'))
496bdd2c290SBram Moolenaar  call assert_equal('..',          simplify('../testdir/..'))
497bdd2c290SBram Moolenaar  call mkdir('Xdir')
498bdd2c290SBram Moolenaar  call assert_equal('.',           simplify('Xdir/../.'))
499bdd2c290SBram Moolenaar  call delete('Xdir', 'd')
50024c2e48eSBram Moolenaar
50124c2e48eSBram Moolenaar  call assert_fails('call simplify({->0})', 'E729:')
50224c2e48eSBram Moolenaar  call assert_fails('call simplify([])', 'E730:')
50324c2e48eSBram Moolenaar  call assert_fails('call simplify({})', 'E731:')
5045feabe00SBram Moolenaar  if has('float')
5053cfa5b16SBram Moolenaar    call assert_equal('1.2', simplify(1.2))
5064490ec4eSYegappan Lakshmanan    call CheckDefAndScriptFailure2(['echo simplify(1.2)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1174: String required for argument 1')
5075feabe00SBram Moolenaar  endif
50808243d26SBram Moolenaarendfunc
509cc5b22b3SBram Moolenaar
510bfde0b48SBram Moolenaarfunc Test_pathshorten()
511bfde0b48SBram Moolenaar  call assert_equal('', pathshorten(''))
512bfde0b48SBram Moolenaar  call assert_equal('foo', pathshorten('foo'))
5133f4f3d8eSBram Moolenaar  call assert_equal('/foo', '/foo'->pathshorten())
514bfde0b48SBram Moolenaar  call assert_equal('f/', pathshorten('foo/'))
515bfde0b48SBram Moolenaar  call assert_equal('f/bar', pathshorten('foo/bar'))
5163f4f3d8eSBram Moolenaar  call assert_equal('f/b/foobar', 'foo/bar/foobar'->pathshorten())
517bfde0b48SBram Moolenaar  call assert_equal('/f/b/foobar', pathshorten('/foo/bar/foobar'))
518bfde0b48SBram Moolenaar  call assert_equal('.f/bar', pathshorten('.foo/bar'))
519bfde0b48SBram Moolenaar  call assert_equal('~f/bar', pathshorten('~foo/bar'))
520bfde0b48SBram Moolenaar  call assert_equal('~.f/bar', pathshorten('~.foo/bar'))
521bfde0b48SBram Moolenaar  call assert_equal('.~f/bar', pathshorten('.~foo/bar'))
522bfde0b48SBram Moolenaar  call assert_equal('~/f/bar', pathshorten('~/foo/bar'))
52392b83ccfSBram Moolenaar  call assert_fails('call pathshorten([])', 'E730:')
5246a33ef0dSBram Moolenaar
5256a33ef0dSBram Moolenaar  " test pathshorten with optional variable to set preferred size of shortening
5266a33ef0dSBram Moolenaar  call assert_equal('', pathshorten('', 2))
5276a33ef0dSBram Moolenaar  call assert_equal('foo', pathshorten('foo', 2))
5286a33ef0dSBram Moolenaar  call assert_equal('/foo', pathshorten('/foo', 2))
5296a33ef0dSBram Moolenaar  call assert_equal('fo/', pathshorten('foo/', 2))
5306a33ef0dSBram Moolenaar  call assert_equal('fo/bar', pathshorten('foo/bar', 2))
5316a33ef0dSBram Moolenaar  call assert_equal('fo/ba/foobar', pathshorten('foo/bar/foobar', 2))
5326a33ef0dSBram Moolenaar  call assert_equal('/fo/ba/foobar', pathshorten('/foo/bar/foobar', 2))
5336a33ef0dSBram Moolenaar  call assert_equal('.fo/bar', pathshorten('.foo/bar', 2))
5346a33ef0dSBram Moolenaar  call assert_equal('~fo/bar', pathshorten('~foo/bar', 2))
5356a33ef0dSBram Moolenaar  call assert_equal('~.fo/bar', pathshorten('~.foo/bar', 2))
5366a33ef0dSBram Moolenaar  call assert_equal('.~fo/bar', pathshorten('.~foo/bar', 2))
5376a33ef0dSBram Moolenaar  call assert_equal('~/fo/bar', pathshorten('~/foo/bar', 2))
5386a33ef0dSBram Moolenaar  call assert_fails('call pathshorten([],2)', 'E730:')
5396a33ef0dSBram Moolenaar  call assert_notequal('~/fo/bar', pathshorten('~/foo/bar', 3))
5406a33ef0dSBram Moolenaar  call assert_equal('~/foo/bar', pathshorten('~/foo/bar', 3))
5416a33ef0dSBram Moolenaar  call assert_equal('~/f/bar', pathshorten('~/foo/bar', 0))
542bfde0b48SBram Moolenaarendfunc
543bfde0b48SBram Moolenaar
544c7d16dceSBram Moolenaarfunc Test_strpart()
545c7d16dceSBram Moolenaar  call assert_equal('de', strpart('abcdefg', 3, 2))
546c7d16dceSBram Moolenaar  call assert_equal('ab', strpart('abcdefg', -2, 4))
547f6ed61e1SBram Moolenaar  call assert_equal('abcdefg', 'abcdefg'->strpart(-2))
548c7d16dceSBram Moolenaar  call assert_equal('fg', strpart('abcdefg', 5, 4))
549c7d16dceSBram Moolenaar  call assert_equal('defg', strpart('abcdefg', 3))
5500e05de46SBram Moolenaar  call assert_equal('', strpart('abcdefg', 10))
5510e05de46SBram Moolenaar  call assert_fails("let s=strpart('abcdef', [])", 'E745:')
552c7d16dceSBram Moolenaar
553c7d16dceSBram Moolenaar  call assert_equal('lép', strpart('éléphant', 2, 4))
554c7d16dceSBram Moolenaar  call assert_equal('léphant', strpart('éléphant', 2))
5556c53fca0SBram Moolenaar
5566c53fca0SBram Moolenaar  call assert_equal('é', strpart('éléphant', 0, 1, 1))
5576c53fca0SBram Moolenaar  call assert_equal('ép', strpart('éléphant', 3, 2, v:true))
5586c53fca0SBram Moolenaar  call assert_equal('ó', strpart('cómposed', 1, 1, 1))
559c7d16dceSBram Moolenaarendfunc
560c7d16dceSBram Moolenaar
561cc5b22b3SBram Moolenaarfunc Test_tolower()
562cc5b22b3SBram Moolenaar  call assert_equal("", tolower(""))
563cc5b22b3SBram Moolenaar
564cc5b22b3SBram Moolenaar  " Test with all printable ASCII characters.
565cc5b22b3SBram Moolenaar  call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~',
566cc5b22b3SBram Moolenaar          \ tolower(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'))
567cc5b22b3SBram Moolenaar
568cc5b22b3SBram Moolenaar  " Test with a few uppercase diacritics.
569cc5b22b3SBram Moolenaar  call assert_equal("aàáâãäåāăąǎǟǡả", tolower("AÀÁÂÃÄÅĀĂĄǍǞǠẢ"))
570cc5b22b3SBram Moolenaar  call assert_equal("bḃḇ", tolower("BḂḆ"))
571cc5b22b3SBram Moolenaar  call assert_equal("cçćĉċč", tolower("CÇĆĈĊČ"))
572cc5b22b3SBram Moolenaar  call assert_equal("dďđḋḏḑ", tolower("DĎĐḊḎḐ"))
573cc5b22b3SBram Moolenaar  call assert_equal("eèéêëēĕėęěẻẽ", tolower("EÈÉÊËĒĔĖĘĚẺẼ"))
574cc5b22b3SBram Moolenaar  call assert_equal("fḟ ", tolower("FḞ "))
575cc5b22b3SBram Moolenaar  call assert_equal("gĝğġģǥǧǵḡ", tolower("GĜĞĠĢǤǦǴḠ"))
576cc5b22b3SBram Moolenaar  call assert_equal("hĥħḣḧḩ", tolower("HĤĦḢḦḨ"))
577cc5b22b3SBram Moolenaar  call assert_equal("iìíîïĩīĭįiǐỉ", tolower("IÌÍÎÏĨĪĬĮİǏỈ"))
578cc5b22b3SBram Moolenaar  call assert_equal("jĵ", tolower("JĴ"))
579cc5b22b3SBram Moolenaar  call assert_equal("kķǩḱḵ", tolower("KĶǨḰḴ"))
580cc5b22b3SBram Moolenaar  call assert_equal("lĺļľŀłḻ", tolower("LĹĻĽĿŁḺ"))
581cc5b22b3SBram Moolenaar  call assert_equal("mḿṁ", tolower("MḾṀ"))
582cc5b22b3SBram Moolenaar  call assert_equal("nñńņňṅṉ", tolower("NÑŃŅŇṄṈ"))
583cc5b22b3SBram Moolenaar  call assert_equal("oòóôõöøōŏőơǒǫǭỏ", tolower("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ"))
584cc5b22b3SBram Moolenaar  call assert_equal("pṕṗ", tolower("PṔṖ"))
585cc5b22b3SBram Moolenaar  call assert_equal("q", tolower("Q"))
586cc5b22b3SBram Moolenaar  call assert_equal("rŕŗřṙṟ", tolower("RŔŖŘṘṞ"))
587cc5b22b3SBram Moolenaar  call assert_equal("sśŝşšṡ", tolower("SŚŜŞŠṠ"))
588cc5b22b3SBram Moolenaar  call assert_equal("tţťŧṫṯ", tolower("TŢŤŦṪṮ"))
589cc5b22b3SBram Moolenaar  call assert_equal("uùúûüũūŭůűųưǔủ", tolower("UÙÚÛÜŨŪŬŮŰŲƯǓỦ"))
590cc5b22b3SBram Moolenaar  call assert_equal("vṽ", tolower("VṼ"))
591cc5b22b3SBram Moolenaar  call assert_equal("wŵẁẃẅẇ", tolower("WŴẀẂẄẆ"))
592cc5b22b3SBram Moolenaar  call assert_equal("xẋẍ", tolower("XẊẌ"))
593cc5b22b3SBram Moolenaar  call assert_equal("yýŷÿẏỳỷỹ", tolower("YÝŶŸẎỲỶỸ"))
594cc5b22b3SBram Moolenaar  call assert_equal("zźżžƶẑẕ", tolower("ZŹŻŽƵẐẔ"))
595cc5b22b3SBram Moolenaar
596cc5b22b3SBram Moolenaar  " Test with a few lowercase diacritics, which should remain unchanged.
597cc5b22b3SBram Moolenaar  call assert_equal("aàáâãäåāăąǎǟǡả", tolower("aàáâãäåāăąǎǟǡả"))
598cc5b22b3SBram Moolenaar  call assert_equal("bḃḇ", tolower("bḃḇ"))
599cc5b22b3SBram Moolenaar  call assert_equal("cçćĉċč", tolower("cçćĉċč"))
600cc5b22b3SBram Moolenaar  call assert_equal("dďđḋḏḑ", tolower("dďđḋḏḑ"))
601cc5b22b3SBram Moolenaar  call assert_equal("eèéêëēĕėęěẻẽ", tolower("eèéêëēĕėęěẻẽ"))
602cc5b22b3SBram Moolenaar  call assert_equal("fḟ", tolower("fḟ"))
603cc5b22b3SBram Moolenaar  call assert_equal("gĝğġģǥǧǵḡ", tolower("gĝğġģǥǧǵḡ"))
604cc5b22b3SBram Moolenaar  call assert_equal("hĥħḣḧḩẖ", tolower("hĥħḣḧḩẖ"))
605cc5b22b3SBram Moolenaar  call assert_equal("iìíîïĩīĭįǐỉ", tolower("iìíîïĩīĭįǐỉ"))
606cc5b22b3SBram Moolenaar  call assert_equal("jĵǰ", tolower("jĵǰ"))
607cc5b22b3SBram Moolenaar  call assert_equal("kķǩḱḵ", tolower("kķǩḱḵ"))
608cc5b22b3SBram Moolenaar  call assert_equal("lĺļľŀłḻ", tolower("lĺļľŀłḻ"))
609cc5b22b3SBram Moolenaar  call assert_equal("mḿṁ ", tolower("mḿṁ "))
610cc5b22b3SBram Moolenaar  call assert_equal("nñńņňʼnṅṉ", tolower("nñńņňʼnṅṉ"))
611cc5b22b3SBram Moolenaar  call assert_equal("oòóôõöøōŏőơǒǫǭỏ", tolower("oòóôõöøōŏőơǒǫǭỏ"))
612cc5b22b3SBram Moolenaar  call assert_equal("pṕṗ", tolower("pṕṗ"))
613cc5b22b3SBram Moolenaar  call assert_equal("q", tolower("q"))
614cc5b22b3SBram Moolenaar  call assert_equal("rŕŗřṙṟ", tolower("rŕŗřṙṟ"))
615cc5b22b3SBram Moolenaar  call assert_equal("sśŝşšṡ", tolower("sśŝşšṡ"))
616cc5b22b3SBram Moolenaar  call assert_equal("tţťŧṫṯẗ", tolower("tţťŧṫṯẗ"))
617cc5b22b3SBram Moolenaar  call assert_equal("uùúûüũūŭůűųưǔủ", tolower("uùúûüũūŭůűųưǔủ"))
618cc5b22b3SBram Moolenaar  call assert_equal("vṽ", tolower("vṽ"))
619cc5b22b3SBram Moolenaar  call assert_equal("wŵẁẃẅẇẘ", tolower("wŵẁẃẅẇẘ"))
620cc5b22b3SBram Moolenaar  call assert_equal("ẋẍ", tolower("ẋẍ"))
621cc5b22b3SBram Moolenaar  call assert_equal("yýÿŷẏẙỳỷỹ", tolower("yýÿŷẏẙỳỷỹ"))
622cc5b22b3SBram Moolenaar  call assert_equal("zźżžƶẑẕ", tolower("zźżžƶẑẕ"))
623cc5b22b3SBram Moolenaar
624cc5b22b3SBram Moolenaar  " According to https://twitter.com/jifa/status/625776454479970304
625cc5b22b3SBram Moolenaar  " Ⱥ (U+023A) and Ⱦ (U+023E) are the *only* code points to increase
626cc5b22b3SBram Moolenaar  " in length (2 to 3 bytes) when lowercased. So let's test them.
627cc5b22b3SBram Moolenaar  call assert_equal("ⱥ ⱦ", tolower("Ⱥ Ⱦ"))
628e6640ad4SBram Moolenaar
629e6640ad4SBram Moolenaar  " This call to tolower with invalid utf8 sequence used to cause access to
630e6640ad4SBram Moolenaar  " invalid memory.
631e6640ad4SBram Moolenaar  call tolower("\xC0\x80\xC0")
632e6640ad4SBram Moolenaar  call tolower("123\xC0\x80\xC0")
6330ff5dedfSBram Moolenaar
6340ff5dedfSBram Moolenaar  " Test in latin1 encoding
6350ff5dedfSBram Moolenaar  let save_enc = &encoding
6360ff5dedfSBram Moolenaar  set encoding=latin1
6370ff5dedfSBram Moolenaar  call assert_equal("abc", tolower("ABC"))
6380ff5dedfSBram Moolenaar  let &encoding = save_enc
639cc5b22b3SBram Moolenaarendfunc
640cc5b22b3SBram Moolenaar
641cc5b22b3SBram Moolenaarfunc Test_toupper()
642cc5b22b3SBram Moolenaar  call assert_equal("", toupper(""))
643cc5b22b3SBram Moolenaar
644cc5b22b3SBram Moolenaar  " Test with all printable ASCII characters.
645cc5b22b3SBram Moolenaar  call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~',
646cc5b22b3SBram Moolenaar          \ toupper(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'))
647cc5b22b3SBram Moolenaar
648cc5b22b3SBram Moolenaar  " Test with a few lowercase diacritics.
649f92e58caSBram Moolenaar  call assert_equal("AÀÁÂÃÄÅĀĂĄǍǞǠẢ", "aàáâãäåāăąǎǟǡả"->toupper())
650cc5b22b3SBram Moolenaar  call assert_equal("BḂḆ", toupper("bḃḇ"))
651cc5b22b3SBram Moolenaar  call assert_equal("CÇĆĈĊČ", toupper("cçćĉċč"))
652cc5b22b3SBram Moolenaar  call assert_equal("DĎĐḊḎḐ", toupper("dďđḋḏḑ"))
653cc5b22b3SBram Moolenaar  call assert_equal("EÈÉÊËĒĔĖĘĚẺẼ", toupper("eèéêëēĕėęěẻẽ"))
654cc5b22b3SBram Moolenaar  call assert_equal("FḞ", toupper("fḟ"))
655cc5b22b3SBram Moolenaar  call assert_equal("GĜĞĠĢǤǦǴḠ", toupper("gĝğġģǥǧǵḡ"))
656cc5b22b3SBram Moolenaar  call assert_equal("HĤĦḢḦḨẖ", toupper("hĥħḣḧḩẖ"))
657cc5b22b3SBram Moolenaar  call assert_equal("IÌÍÎÏĨĪĬĮǏỈ", toupper("iìíîïĩīĭįǐỉ"))
658cc5b22b3SBram Moolenaar  call assert_equal("JĴǰ", toupper("jĵǰ"))
659cc5b22b3SBram Moolenaar  call assert_equal("KĶǨḰḴ", toupper("kķǩḱḵ"))
660cc5b22b3SBram Moolenaar  call assert_equal("LĹĻĽĿŁḺ", toupper("lĺļľŀłḻ"))
661cc5b22b3SBram Moolenaar  call assert_equal("MḾṀ ", toupper("mḿṁ "))
662cc5b22b3SBram Moolenaar  call assert_equal("NÑŃŅŇʼnṄṈ", toupper("nñńņňʼnṅṉ"))
663cc5b22b3SBram Moolenaar  call assert_equal("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ", toupper("oòóôõöøōŏőơǒǫǭỏ"))
664cc5b22b3SBram Moolenaar  call assert_equal("PṔṖ", toupper("pṕṗ"))
665cc5b22b3SBram Moolenaar  call assert_equal("Q", toupper("q"))
666cc5b22b3SBram Moolenaar  call assert_equal("RŔŖŘṘṞ", toupper("rŕŗřṙṟ"))
667cc5b22b3SBram Moolenaar  call assert_equal("SŚŜŞŠṠ", toupper("sśŝşšṡ"))
668cc5b22b3SBram Moolenaar  call assert_equal("TŢŤŦṪṮẗ", toupper("tţťŧṫṯẗ"))
669cc5b22b3SBram Moolenaar  call assert_equal("UÙÚÛÜŨŪŬŮŰŲƯǓỦ", toupper("uùúûüũūŭůűųưǔủ"))
670cc5b22b3SBram Moolenaar  call assert_equal("VṼ", toupper("vṽ"))
671cc5b22b3SBram Moolenaar  call assert_equal("WŴẀẂẄẆẘ", toupper("wŵẁẃẅẇẘ"))
672cc5b22b3SBram Moolenaar  call assert_equal("ẊẌ", toupper("ẋẍ"))
673cc5b22b3SBram Moolenaar  call assert_equal("YÝŸŶẎẙỲỶỸ", toupper("yýÿŷẏẙỳỷỹ"))
674cc5b22b3SBram Moolenaar  call assert_equal("ZŹŻŽƵẐẔ", toupper("zźżžƶẑẕ"))
675cc5b22b3SBram Moolenaar
676cc5b22b3SBram Moolenaar  " Test that uppercase diacritics, which should remain unchanged.
677cc5b22b3SBram Moolenaar  call assert_equal("AÀÁÂÃÄÅĀĂĄǍǞǠẢ", toupper("AÀÁÂÃÄÅĀĂĄǍǞǠẢ"))
678cc5b22b3SBram Moolenaar  call assert_equal("BḂḆ", toupper("BḂḆ"))
679cc5b22b3SBram Moolenaar  call assert_equal("CÇĆĈĊČ", toupper("CÇĆĈĊČ"))
680cc5b22b3SBram Moolenaar  call assert_equal("DĎĐḊḎḐ", toupper("DĎĐḊḎḐ"))
681cc5b22b3SBram Moolenaar  call assert_equal("EÈÉÊËĒĔĖĘĚẺẼ", toupper("EÈÉÊËĒĔĖĘĚẺẼ"))
682cc5b22b3SBram Moolenaar  call assert_equal("FḞ ", toupper("FḞ "))
683cc5b22b3SBram Moolenaar  call assert_equal("GĜĞĠĢǤǦǴḠ", toupper("GĜĞĠĢǤǦǴḠ"))
684cc5b22b3SBram Moolenaar  call assert_equal("HĤĦḢḦḨ", toupper("HĤĦḢḦḨ"))
685cc5b22b3SBram Moolenaar  call assert_equal("IÌÍÎÏĨĪĬĮİǏỈ", toupper("IÌÍÎÏĨĪĬĮİǏỈ"))
686cc5b22b3SBram Moolenaar  call assert_equal("JĴ", toupper("JĴ"))
687cc5b22b3SBram Moolenaar  call assert_equal("KĶǨḰḴ", toupper("KĶǨḰḴ"))
688cc5b22b3SBram Moolenaar  call assert_equal("LĹĻĽĿŁḺ", toupper("LĹĻĽĿŁḺ"))
689cc5b22b3SBram Moolenaar  call assert_equal("MḾṀ", toupper("MḾṀ"))
690cc5b22b3SBram Moolenaar  call assert_equal("NÑŃŅŇṄṈ", toupper("NÑŃŅŇṄṈ"))
691cc5b22b3SBram Moolenaar  call assert_equal("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ", toupper("OÒÓÔÕÖØŌŎŐƠǑǪǬỎ"))
692cc5b22b3SBram Moolenaar  call assert_equal("PṔṖ", toupper("PṔṖ"))
693cc5b22b3SBram Moolenaar  call assert_equal("Q", toupper("Q"))
694cc5b22b3SBram Moolenaar  call assert_equal("RŔŖŘṘṞ", toupper("RŔŖŘṘṞ"))
695cc5b22b3SBram Moolenaar  call assert_equal("SŚŜŞŠṠ", toupper("SŚŜŞŠṠ"))
696cc5b22b3SBram Moolenaar  call assert_equal("TŢŤŦṪṮ", toupper("TŢŤŦṪṮ"))
697cc5b22b3SBram Moolenaar  call assert_equal("UÙÚÛÜŨŪŬŮŰŲƯǓỦ", toupper("UÙÚÛÜŨŪŬŮŰŲƯǓỦ"))
698cc5b22b3SBram Moolenaar  call assert_equal("VṼ", toupper("VṼ"))
699cc5b22b3SBram Moolenaar  call assert_equal("WŴẀẂẄẆ", toupper("WŴẀẂẄẆ"))
700cc5b22b3SBram Moolenaar  call assert_equal("XẊẌ", toupper("XẊẌ"))
701cc5b22b3SBram Moolenaar  call assert_equal("YÝŶŸẎỲỶỸ", toupper("YÝŶŸẎỲỶỸ"))
702cc5b22b3SBram Moolenaar  call assert_equal("ZŹŻŽƵẐẔ", toupper("ZŹŻŽƵẐẔ"))
703cc5b22b3SBram Moolenaar
70424c2e48eSBram Moolenaar  call assert_equal("Ⱥ Ⱦ", toupper("ⱥ ⱦ"))
705e6640ad4SBram Moolenaar
706e6640ad4SBram Moolenaar  " This call to toupper with invalid utf8 sequence used to cause access to
707e6640ad4SBram Moolenaar  " invalid memory.
708e6640ad4SBram Moolenaar  call toupper("\xC0\x80\xC0")
709e6640ad4SBram Moolenaar  call toupper("123\xC0\x80\xC0")
7100ff5dedfSBram Moolenaar
7110ff5dedfSBram Moolenaar  " Test in latin1 encoding
7120ff5dedfSBram Moolenaar  let save_enc = &encoding
7130ff5dedfSBram Moolenaar  set encoding=latin1
7140ff5dedfSBram Moolenaar  call assert_equal("ABC", toupper("abc"))
7150ff5dedfSBram Moolenaar  let &encoding = save_enc
716cc5b22b3SBram Moolenaarendfunc
717cc5b22b3SBram Moolenaar
718f92e58caSBram Moolenaarfunc Test_tr()
719f92e58caSBram Moolenaar  call assert_equal('foo', tr('bar', 'bar', 'foo'))
720f92e58caSBram Moolenaar  call assert_equal('zxy', 'cab'->tr('abc', 'xyz'))
7210e05de46SBram Moolenaar  call assert_fails("let s=tr([], 'abc', 'def')", 'E730:')
7220e05de46SBram Moolenaar  call assert_fails("let s=tr('abc', [], 'def')", 'E730:')
7230e05de46SBram Moolenaar  call assert_fails("let s=tr('abc', 'abc', [])", 'E730:')
7240e05de46SBram Moolenaar  call assert_fails("let s=tr('abcd', 'abcd', 'def')", 'E475:')
7250e05de46SBram Moolenaar  set encoding=latin1
7260e05de46SBram Moolenaar  call assert_fails("let s=tr('abcd', 'abcd', 'def')", 'E475:')
7270e05de46SBram Moolenaar  call assert_equal('hEllO', tr('hello', 'eo', 'EO'))
7280e05de46SBram Moolenaar  call assert_equal('hello', tr('hello', 'xy', 'ab'))
72934fcb697SYegappan Lakshmanan  call assert_fails('call tr("abc", "123", "₁₂")', 'E475:')
7300e05de46SBram Moolenaar  set encoding=utf8
731f92e58caSBram Moolenaarendfunc
732f92e58caSBram Moolenaar
733e90858d0SBram Moolenaar" Tests for the mode() function
734e90858d0SBram Moolenaarlet current_modes = ''
735ffea8c99SBram Moolenaarfunc Save_mode()
736e90858d0SBram Moolenaar  let g:current_modes = mode(0) . '-' . mode(1)
737e90858d0SBram Moolenaar  return ''
738e90858d0SBram Moolenaarendfunc
739cc5b22b3SBram Moolenaar
740cde0ff39SBram Moolenaar" Test for the mode() function
741ffea8c99SBram Moolenaarfunc Test_mode()
742e90858d0SBram Moolenaar  new
743e90858d0SBram Moolenaar  call append(0, ["Blue Ball Black", "Brown Band Bowl", ""])
744e90858d0SBram Moolenaar
745ffea8c99SBram Moolenaar  " Only complete from the current buffer.
746ffea8c99SBram Moolenaar  set complete=.
747ffea8c99SBram Moolenaar
748e90858d0SBram Moolenaar  inoremap <F2> <C-R>=Save_mode()<CR>
749eaf3f361Szeertzjq  xnoremap <F2> <Cmd>call Save_mode()<CR>
750e90858d0SBram Moolenaar
751e90858d0SBram Moolenaar  normal! 3G
752e90858d0SBram Moolenaar  exe "normal i\<F2>\<Esc>"
753e90858d0SBram Moolenaar  call assert_equal('i-i', g:current_modes)
754e971df39SBram Moolenaar  " i_CTRL-P: Multiple matches
755e90858d0SBram Moolenaar  exe "normal i\<C-G>uBa\<C-P>\<F2>\<Esc>u"
756e90858d0SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
757e971df39SBram Moolenaar  " i_CTRL-P: Single match
758e90858d0SBram Moolenaar  exe "normal iBro\<C-P>\<F2>\<Esc>u"
759e90858d0SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
760e971df39SBram Moolenaar  " i_CTRL-X
761e90858d0SBram Moolenaar  exe "normal iBa\<C-X>\<F2>\<Esc>u"
762e90858d0SBram Moolenaar  call assert_equal('i-ix', g:current_modes)
763e971df39SBram Moolenaar  " i_CTRL-X CTRL-P: Multiple matches
764e90858d0SBram Moolenaar  exe "normal iBa\<C-X>\<C-P>\<F2>\<Esc>u"
765e90858d0SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
766e971df39SBram Moolenaar  " i_CTRL-X CTRL-P: Single match
767e90858d0SBram Moolenaar  exe "normal iBro\<C-X>\<C-P>\<F2>\<Esc>u"
768e90858d0SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
769e971df39SBram Moolenaar  " i_CTRL-X CTRL-P + CTRL-P: Single match
770e90858d0SBram Moolenaar  exe "normal iBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
771e90858d0SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
772e971df39SBram Moolenaar  " i_CTRL-X CTRL-L: Multiple matches
773e971df39SBram Moolenaar  exe "normal i\<C-X>\<C-L>\<F2>\<Esc>u"
774e971df39SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
775e971df39SBram Moolenaar  " i_CTRL-X CTRL-L: Single match
776e971df39SBram Moolenaar  exe "normal iBlu\<C-X>\<C-L>\<F2>\<Esc>u"
777e971df39SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
778e971df39SBram Moolenaar  " i_CTRL-P: No match
779e90858d0SBram Moolenaar  exe "normal iCom\<C-P>\<F2>\<Esc>u"
780e90858d0SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
781e971df39SBram Moolenaar  " i_CTRL-X CTRL-P: No match
782e90858d0SBram Moolenaar  exe "normal iCom\<C-X>\<C-P>\<F2>\<Esc>u"
783e90858d0SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
784e971df39SBram Moolenaar  " i_CTRL-X CTRL-L: No match
785e971df39SBram Moolenaar  exe "normal iabc\<C-X>\<C-L>\<F2>\<Esc>u"
786e971df39SBram Moolenaar  call assert_equal('i-ic', g:current_modes)
787e90858d0SBram Moolenaar
788cc8cd445Szeertzjq  exe "normal R\<F2>\<Esc>"
789cc8cd445Szeertzjq  call assert_equal('R-R', g:current_modes)
790e971df39SBram Moolenaar  " R_CTRL-P: Multiple matches
791e90858d0SBram Moolenaar  exe "normal RBa\<C-P>\<F2>\<Esc>u"
792e90858d0SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
793e971df39SBram Moolenaar  " R_CTRL-P: Single match
794e90858d0SBram Moolenaar  exe "normal RBro\<C-P>\<F2>\<Esc>u"
795e90858d0SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
796e971df39SBram Moolenaar  " R_CTRL-X
797e90858d0SBram Moolenaar  exe "normal RBa\<C-X>\<F2>\<Esc>u"
798e90858d0SBram Moolenaar  call assert_equal('R-Rx', g:current_modes)
799e971df39SBram Moolenaar  " R_CTRL-X CTRL-P: Multiple matches
800e90858d0SBram Moolenaar  exe "normal RBa\<C-X>\<C-P>\<F2>\<Esc>u"
801e90858d0SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
802e971df39SBram Moolenaar  " R_CTRL-X CTRL-P: Single match
803e90858d0SBram Moolenaar  exe "normal RBro\<C-X>\<C-P>\<F2>\<Esc>u"
804e90858d0SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
805e971df39SBram Moolenaar  " R_CTRL-X CTRL-P + CTRL-P: Single match
806e90858d0SBram Moolenaar  exe "normal RBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
807e90858d0SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
808e971df39SBram Moolenaar  " R_CTRL-X CTRL-L: Multiple matches
809e971df39SBram Moolenaar  exe "normal R\<C-X>\<C-L>\<F2>\<Esc>u"
810e971df39SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
811e971df39SBram Moolenaar  " R_CTRL-X CTRL-L: Single match
812e971df39SBram Moolenaar  exe "normal RBlu\<C-X>\<C-L>\<F2>\<Esc>u"
813e971df39SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
814e971df39SBram Moolenaar  " R_CTRL-P: No match
815e90858d0SBram Moolenaar  exe "normal RCom\<C-P>\<F2>\<Esc>u"
816e90858d0SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
817e971df39SBram Moolenaar  " R_CTRL-X CTRL-P: No match
818e90858d0SBram Moolenaar  exe "normal RCom\<C-X>\<C-P>\<F2>\<Esc>u"
819e90858d0SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
820e971df39SBram Moolenaar  " R_CTRL-X CTRL-L: No match
821e971df39SBram Moolenaar  exe "normal Rabc\<C-X>\<C-L>\<F2>\<Esc>u"
822e971df39SBram Moolenaar  call assert_equal('R-Rc', g:current_modes)
823e90858d0SBram Moolenaar
824cc8cd445Szeertzjq  exe "normal gR\<F2>\<Esc>"
825cc8cd445Szeertzjq  call assert_equal('R-Rv', g:current_modes)
826cc8cd445Szeertzjq  " gR_CTRL-P: Multiple matches
827cc8cd445Szeertzjq  exe "normal gRBa\<C-P>\<F2>\<Esc>u"
828cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
829cc8cd445Szeertzjq  " gR_CTRL-P: Single match
830cc8cd445Szeertzjq  exe "normal gRBro\<C-P>\<F2>\<Esc>u"
831cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
832cc8cd445Szeertzjq  " gR_CTRL-X
833cc8cd445Szeertzjq  exe "normal gRBa\<C-X>\<F2>\<Esc>u"
834cc8cd445Szeertzjq  call assert_equal('R-Rvx', g:current_modes)
835cc8cd445Szeertzjq  " gR_CTRL-X CTRL-P: Multiple matches
836cc8cd445Szeertzjq  exe "normal gRBa\<C-X>\<C-P>\<F2>\<Esc>u"
837cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
838cc8cd445Szeertzjq  " gR_CTRL-X CTRL-P: Single match
839cc8cd445Szeertzjq  exe "normal gRBro\<C-X>\<C-P>\<F2>\<Esc>u"
840cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
841cc8cd445Szeertzjq  " gR_CTRL-X CTRL-P + CTRL-P: Single match
842cc8cd445Szeertzjq  exe "normal gRBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
843cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
844cc8cd445Szeertzjq  " gR_CTRL-X CTRL-L: Multiple matches
845cc8cd445Szeertzjq  exe "normal gR\<C-X>\<C-L>\<F2>\<Esc>u"
846cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
847cc8cd445Szeertzjq  " gR_CTRL-X CTRL-L: Single match
848cc8cd445Szeertzjq  exe "normal gRBlu\<C-X>\<C-L>\<F2>\<Esc>u"
849cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
850cc8cd445Szeertzjq  " gR_CTRL-P: No match
851cc8cd445Szeertzjq  exe "normal gRCom\<C-P>\<F2>\<Esc>u"
852cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
853cc8cd445Szeertzjq  " gR_CTRL-X CTRL-P: No match
854cc8cd445Szeertzjq  exe "normal gRCom\<C-X>\<C-P>\<F2>\<Esc>u"
855cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
856cc8cd445Szeertzjq  " gR_CTRL-X CTRL-L: No match
857cc8cd445Szeertzjq  exe "normal gRabc\<C-X>\<C-L>\<F2>\<Esc>u"
858cc8cd445Szeertzjq  call assert_equal('R-Rvc', g:current_modes)
859cc8cd445Szeertzjq
860a1449836SBram Moolenaar  call assert_equal('n', 0->mode())
861a1449836SBram Moolenaar  call assert_equal('n', 1->mode())
862e90858d0SBram Moolenaar
863612cc388SBram Moolenaar  " i_CTRL-O
864612cc388SBram Moolenaar  exe "normal i\<C-O>:call Save_mode()\<Cr>\<Esc>"
865612cc388SBram Moolenaar  call assert_equal("n-niI", g:current_modes)
866612cc388SBram Moolenaar
867612cc388SBram Moolenaar  " R_CTRL-O
868612cc388SBram Moolenaar  exe "normal R\<C-O>:call Save_mode()\<Cr>\<Esc>"
869612cc388SBram Moolenaar  call assert_equal("n-niR", g:current_modes)
870612cc388SBram Moolenaar
871612cc388SBram Moolenaar  " gR_CTRL-O
872612cc388SBram Moolenaar  exe "normal gR\<C-O>:call Save_mode()\<Cr>\<Esc>"
873612cc388SBram Moolenaar  call assert_equal("n-niV", g:current_modes)
874612cc388SBram Moolenaar
875e90858d0SBram Moolenaar  " How to test operator-pending mode?
876e90858d0SBram Moolenaar
877e90858d0SBram Moolenaar  call feedkeys("v", 'xt')
878e90858d0SBram Moolenaar  call assert_equal('v', mode())
879e90858d0SBram Moolenaar  call assert_equal('v', mode(1))
880e90858d0SBram Moolenaar  call feedkeys("\<Esc>V", 'xt')
881e90858d0SBram Moolenaar  call assert_equal('V', mode())
882e90858d0SBram Moolenaar  call assert_equal('V', mode(1))
883e90858d0SBram Moolenaar  call feedkeys("\<Esc>\<C-V>", 'xt')
884e90858d0SBram Moolenaar  call assert_equal("\<C-V>", mode())
885e90858d0SBram Moolenaar  call assert_equal("\<C-V>", mode(1))
886e90858d0SBram Moolenaar  call feedkeys("\<Esc>", 'xt')
887e90858d0SBram Moolenaar
888e90858d0SBram Moolenaar  call feedkeys("gh", 'xt')
889e90858d0SBram Moolenaar  call assert_equal('s', mode())
890e90858d0SBram Moolenaar  call assert_equal('s', mode(1))
891e90858d0SBram Moolenaar  call feedkeys("\<Esc>gH", 'xt')
892e90858d0SBram Moolenaar  call assert_equal('S', mode())
893e90858d0SBram Moolenaar  call assert_equal('S', mode(1))
894e90858d0SBram Moolenaar  call feedkeys("\<Esc>g\<C-H>", 'xt')
895e90858d0SBram Moolenaar  call assert_equal("\<C-S>", mode())
896e90858d0SBram Moolenaar  call assert_equal("\<C-S>", mode(1))
897e90858d0SBram Moolenaar  call feedkeys("\<Esc>", 'xt')
898e90858d0SBram Moolenaar
899eaf3f361Szeertzjq  " v_CTRL-O
900eaf3f361Szeertzjq  exe "normal gh\<C-O>\<F2>\<Esc>"
901eaf3f361Szeertzjq  call assert_equal("v-vs", g:current_modes)
902eaf3f361Szeertzjq  exe "normal gH\<C-O>\<F2>\<Esc>"
903eaf3f361Szeertzjq  call assert_equal("V-Vs", g:current_modes)
904eaf3f361Szeertzjq  exe "normal g\<C-H>\<C-O>\<F2>\<Esc>"
905eaf3f361Szeertzjq  call assert_equal("\<C-V>-\<C-V>s", g:current_modes)
906eaf3f361Szeertzjq
907e90858d0SBram Moolenaar  call feedkeys(":echo \<C-R>=Save_mode()\<C-U>\<CR>", 'xt')
908e90858d0SBram Moolenaar  call assert_equal('c-c', g:current_modes)
909e90858d0SBram Moolenaar  call feedkeys("gQecho \<C-R>=Save_mode()\<CR>\<CR>vi\<CR>", 'xt')
910e90858d0SBram Moolenaar  call assert_equal('c-cv', g:current_modes)
911cde0ff39SBram Moolenaar  call feedkeys("Qcall Save_mode()\<CR>vi\<CR>", 'xt')
912cde0ff39SBram Moolenaar  call assert_equal('c-ce', g:current_modes)
913e90858d0SBram Moolenaar  " How to test Ex mode?
914e90858d0SBram Moolenaar
915*75c30e96Snaohiro ono  " Test mode in operatorfunc (it used to be Operator-pending).
916*75c30e96Snaohiro ono  set operatorfunc=OperatorFunc
917*75c30e96Snaohiro ono  function OperatorFunc(_)
918*75c30e96Snaohiro ono    call Save_mode()
919*75c30e96Snaohiro ono  endfunction
920*75c30e96Snaohiro ono  execute "normal! g@l\<Esc>"
921*75c30e96Snaohiro ono  call assert_equal('n-n', g:current_modes)
922*75c30e96Snaohiro ono  execute "normal! i\<C-o>g@l\<Esc>"
923*75c30e96Snaohiro ono  call assert_equal('n-niI', g:current_modes)
924*75c30e96Snaohiro ono  execute "normal! R\<C-o>g@l\<Esc>"
925*75c30e96Snaohiro ono  call assert_equal('n-niR', g:current_modes)
926*75c30e96Snaohiro ono  execute "normal! gR\<C-o>g@l\<Esc>"
927*75c30e96Snaohiro ono  call assert_equal('n-niV', g:current_modes)
928*75c30e96Snaohiro ono
92972406a4bSBram Moolenaar  if has('terminal')
93072406a4bSBram Moolenaar    term
93172406a4bSBram Moolenaar    call feedkeys("\<C-W>N", 'xt')
93272406a4bSBram Moolenaar    call assert_equal('n', mode())
93372406a4bSBram Moolenaar    call assert_equal('nt', mode(1))
93472406a4bSBram Moolenaar    call feedkeys("aexit\<CR>", 'xt')
93572406a4bSBram Moolenaar  endif
93672406a4bSBram Moolenaar
937e90858d0SBram Moolenaar  bwipe!
938e90858d0SBram Moolenaar  iunmap <F2>
939eaf3f361Szeertzjq  xunmap <F2>
940ffea8c99SBram Moolenaar  set complete&
941*75c30e96Snaohiro ono  set operatorfunc&
942*75c30e96Snaohiro ono  delfunction OperatorFunc
943e90858d0SBram Moolenaarendfunc
94479518e2aSBram Moolenaar
945ad48e6c1SBram Moolenaar" Test for append()
946d2007027SBram Moolenaarfunc Test_append()
947d2007027SBram Moolenaar  enew!
948d2007027SBram Moolenaar  split
949d2007027SBram Moolenaar  call append(0, ["foo"])
950ad48e6c1SBram Moolenaar  call append(1, [])
951ad48e6c1SBram Moolenaar  call append(1, test_null_list())
952ad48e6c1SBram Moolenaar  call assert_equal(['foo', ''], getline(1, '$'))
953d2007027SBram Moolenaar  split
954d2007027SBram Moolenaar  only
955d2007027SBram Moolenaar  undo
956ad48e6c1SBram Moolenaar  undo
95708f4157cSBram Moolenaar
95808f4157cSBram Moolenaar  " Using $ instead of '$' must give an error
95908f4157cSBram Moolenaar  call assert_fails("call append($, 'foobar')", 'E116:')
960d2007027SBram Moolenaarendfunc
961d2007027SBram Moolenaar
962ad48e6c1SBram Moolenaar" Test for setline()
963ad48e6c1SBram Moolenaarfunc Test_setline()
964ad48e6c1SBram Moolenaar  new
965ad48e6c1SBram Moolenaar  call setline(0, ["foo"])
966ad48e6c1SBram Moolenaar  call setline(0, [])
967ad48e6c1SBram Moolenaar  call setline(0, test_null_list())
968ad48e6c1SBram Moolenaar  call setline(1, ["bar"])
969ad48e6c1SBram Moolenaar  call setline(1, [])
970ad48e6c1SBram Moolenaar  call setline(1, test_null_list())
971ad48e6c1SBram Moolenaar  call setline(2, [])
972ad48e6c1SBram Moolenaar  call setline(2, test_null_list())
973ad48e6c1SBram Moolenaar  call setline(3, [])
974ad48e6c1SBram Moolenaar  call setline(3, test_null_list())
975ad48e6c1SBram Moolenaar  call setline(2, ["baz"])
976ad48e6c1SBram Moolenaar  call assert_equal(['bar', 'baz'], getline(1, '$'))
977ad48e6c1SBram Moolenaar  close!
978ad48e6c1SBram Moolenaarendfunc
979ad48e6c1SBram Moolenaar
98079518e2aSBram Moolenaarfunc Test_getbufvar()
98179518e2aSBram Moolenaar  let bnr = bufnr('%')
98279518e2aSBram Moolenaar  let b:var_num = '1234'
98379518e2aSBram Moolenaar  let def_num = '5678'
98479518e2aSBram Moolenaar  call assert_equal('1234', getbufvar(bnr, 'var_num'))
98579518e2aSBram Moolenaar  call assert_equal('1234', getbufvar(bnr, 'var_num', def_num))
98679518e2aSBram Moolenaar
98779518e2aSBram Moolenaar  let bd = getbufvar(bnr, '')
98879518e2aSBram Moolenaar  call assert_equal('1234', bd['var_num'])
98979518e2aSBram Moolenaar  call assert_true(exists("bd['changedtick']"))
99079518e2aSBram Moolenaar  call assert_equal(2, len(bd))
99179518e2aSBram Moolenaar
99279518e2aSBram Moolenaar  let bd2 = getbufvar(bnr, '', def_num)
99379518e2aSBram Moolenaar  call assert_equal(bd, bd2)
99479518e2aSBram Moolenaar
99579518e2aSBram Moolenaar  unlet b:var_num
99679518e2aSBram Moolenaar  call assert_equal(def_num, getbufvar(bnr, 'var_num', def_num))
99779518e2aSBram Moolenaar  call assert_equal('', getbufvar(bnr, 'var_num'))
99879518e2aSBram Moolenaar
99979518e2aSBram Moolenaar  let bd = getbufvar(bnr, '')
100079518e2aSBram Moolenaar  call assert_equal(1, len(bd))
100179518e2aSBram Moolenaar  let bd = getbufvar(bnr, '',def_num)
100279518e2aSBram Moolenaar  call assert_equal(1, len(bd))
100379518e2aSBram Moolenaar
10044520d440SBram Moolenaar  call assert_equal('', getbufvar(9999, ''))
10054520d440SBram Moolenaar  call assert_equal(def_num, getbufvar(9999, '', def_num))
100679518e2aSBram Moolenaar  unlet def_num
100779518e2aSBram Moolenaar
1008507647daSBram Moolenaar  call assert_equal(0, getbufvar(bnr, '&autoindent'))
1009507647daSBram Moolenaar  call assert_equal(0, getbufvar(bnr, '&autoindent', 1))
101079518e2aSBram Moolenaar
10118dfcce3aSBram Moolenaar  " Set and get a buffer-local variable
10128dfcce3aSBram Moolenaar  call setbufvar(bnr, 'bufvar_test', ['one', 'two'])
10138dfcce3aSBram Moolenaar  call assert_equal(['one', 'two'], getbufvar(bnr, 'bufvar_test'))
10148dfcce3aSBram Moolenaar
101579518e2aSBram Moolenaar  " Open new window with forced option values
101679518e2aSBram Moolenaar  set fileformats=unix,dos
101779518e2aSBram Moolenaar  new ++ff=dos ++bin ++enc=iso-8859-2
101879518e2aSBram Moolenaar  call assert_equal('dos', getbufvar(bufnr('%'), '&fileformat'))
101979518e2aSBram Moolenaar  call assert_equal(1, getbufvar(bufnr('%'), '&bin'))
102079518e2aSBram Moolenaar  call assert_equal('iso-8859-2', getbufvar(bufnr('%'), '&fenc'))
102179518e2aSBram Moolenaar  close
102279518e2aSBram Moolenaar
102352592753SBram Moolenaar  " Get the b: dict.
102452592753SBram Moolenaar  let b:testvar = 'one'
102552592753SBram Moolenaar  new
102652592753SBram Moolenaar  let b:testvar = 'two'
102752592753SBram Moolenaar  let thebuf = bufnr()
102852592753SBram Moolenaar  wincmd w
102952592753SBram Moolenaar  call assert_equal('two', getbufvar(thebuf, 'testvar'))
103052592753SBram Moolenaar  call assert_equal('two', getbufvar(thebuf, '').testvar)
103152592753SBram Moolenaar  bwipe!
103252592753SBram Moolenaar
103379518e2aSBram Moolenaar  set fileformats&
103479518e2aSBram Moolenaarendfunc
1035caf6434aSBram Moolenaar
103641042f3cSBram Moolenaarfunc Test_last_buffer_nr()
103741042f3cSBram Moolenaar  call assert_equal(bufnr('$'), last_buffer_nr())
103841042f3cSBram Moolenaarendfunc
103941042f3cSBram Moolenaar
104041042f3cSBram Moolenaarfunc Test_stridx()
104141042f3cSBram Moolenaar  call assert_equal(-1, stridx('', 'l'))
104241042f3cSBram Moolenaar  call assert_equal(0,  stridx('', ''))
1043f6ed61e1SBram Moolenaar  call assert_equal(0,  'hello'->stridx(''))
104441042f3cSBram Moolenaar  call assert_equal(-1, stridx('hello', 'L'))
104541042f3cSBram Moolenaar  call assert_equal(2,  stridx('hello', 'l', -1))
104641042f3cSBram Moolenaar  call assert_equal(2,  stridx('hello', 'l', 0))
1047f6ed61e1SBram Moolenaar  call assert_equal(2,  'hello'->stridx('l', 1))
104841042f3cSBram Moolenaar  call assert_equal(3,  stridx('hello', 'l', 3))
104941042f3cSBram Moolenaar  call assert_equal(-1, stridx('hello', 'l', 4))
105041042f3cSBram Moolenaar  call assert_equal(-1, stridx('hello', 'l', 10))
105141042f3cSBram Moolenaar  call assert_equal(2,  stridx('hello', 'll'))
105241042f3cSBram Moolenaar  call assert_equal(-1, stridx('hello', 'hello world'))
10530e05de46SBram Moolenaar  call assert_fails("let n=stridx('hello', [])", 'E730:')
10540e05de46SBram Moolenaar  call assert_fails("let n=stridx([], 'l')", 'E730:')
105541042f3cSBram Moolenaarendfunc
105641042f3cSBram Moolenaar
105741042f3cSBram Moolenaarfunc Test_strridx()
105841042f3cSBram Moolenaar  call assert_equal(-1, strridx('', 'l'))
105941042f3cSBram Moolenaar  call assert_equal(0,  strridx('', ''))
106041042f3cSBram Moolenaar  call assert_equal(5,  strridx('hello', ''))
106141042f3cSBram Moolenaar  call assert_equal(-1, strridx('hello', 'L'))
1062f6ed61e1SBram Moolenaar  call assert_equal(3,  'hello'->strridx('l'))
106341042f3cSBram Moolenaar  call assert_equal(3,  strridx('hello', 'l', 10))
106441042f3cSBram Moolenaar  call assert_equal(3,  strridx('hello', 'l', 3))
106541042f3cSBram Moolenaar  call assert_equal(2,  strridx('hello', 'l', 2))
106641042f3cSBram Moolenaar  call assert_equal(-1, strridx('hello', 'l', 1))
106741042f3cSBram Moolenaar  call assert_equal(-1, strridx('hello', 'l', 0))
106841042f3cSBram Moolenaar  call assert_equal(-1, strridx('hello', 'l', -1))
106941042f3cSBram Moolenaar  call assert_equal(2,  strridx('hello', 'll'))
107041042f3cSBram Moolenaar  call assert_equal(-1, strridx('hello', 'hello world'))
10710e05de46SBram Moolenaar  call assert_fails("let n=strridx('hello', [])", 'E730:')
10720e05de46SBram Moolenaar  call assert_fails("let n=strridx([], 'l')", 'E730:')
107341042f3cSBram Moolenaarendfunc
107441042f3cSBram Moolenaar
10751190cf68SBram Moolenaarfunc Test_match_func()
10761190cf68SBram Moolenaar  call assert_equal(4,  match('testing', 'ing'))
1077a1449836SBram Moolenaar  call assert_equal(4,  'testing'->match('ing', 2))
10781190cf68SBram Moolenaar  call assert_equal(-1, match('testing', 'ing', 5))
10791190cf68SBram Moolenaar  call assert_equal(-1, match('testing', 'ing', 8))
10801190cf68SBram Moolenaar  call assert_equal(1, match(['vim', 'testing', 'execute'], 'ing'))
10811190cf68SBram Moolenaar  call assert_equal(-1, match(['vim', 'testing', 'execute'], 'img'))
10820e05de46SBram Moolenaar  call assert_fails("let x=match('vim', [])", 'E730:')
10830e05de46SBram Moolenaar  call assert_equal(3, match(['a', 'b', 'c', 'a'], 'a', 1))
10840e05de46SBram Moolenaar  call assert_equal(-1, match(['a', 'b', 'c', 'a'], 'a', 5))
10850e05de46SBram Moolenaar  call assert_equal(4,  match('testing', 'ing', -1))
10860e05de46SBram Moolenaar  call assert_fails("let x=match('testing', 'ing', 0, [])", 'E745:')
1087ad48e6c1SBram Moolenaar  call assert_equal(-1, match(test_null_list(), 2))
1088531be47aSBram Moolenaar  call assert_equal(-1, match('abc', '\\%('))
10891190cf68SBram Moolenaarendfunc
10901190cf68SBram Moolenaar
109141042f3cSBram Moolenaarfunc Test_matchend()
109241042f3cSBram Moolenaar  call assert_equal(7,  matchend('testing', 'ing'))
1093a1449836SBram Moolenaar  call assert_equal(7,  'testing'->matchend('ing', 2))
109441042f3cSBram Moolenaar  call assert_equal(-1, matchend('testing', 'ing', 5))
10951190cf68SBram Moolenaar  call assert_equal(-1, matchend('testing', 'ing', 8))
10961190cf68SBram Moolenaar  call assert_equal(match(['vim', 'testing', 'execute'], 'ing'), matchend(['vim', 'testing', 'execute'], 'ing'))
10971190cf68SBram Moolenaar  call assert_equal(match(['vim', 'testing', 'execute'], 'img'), matchend(['vim', 'testing', 'execute'], 'img'))
10981190cf68SBram Moolenaarendfunc
10991190cf68SBram Moolenaar
11001190cf68SBram Moolenaarfunc Test_matchlist()
11011190cf68SBram Moolenaar  call assert_equal(['acd', 'a', '', 'c', 'd', '', '', '', '', ''],  matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)'))
1102a1449836SBram Moolenaar  call assert_equal(['d', '', '', '', 'd', '', '', '', '', ''],  'acd'->matchlist('\(a\)\?\(b\)\?\(c\)\?\(.*\)', 2))
11031190cf68SBram Moolenaar  call assert_equal([],  matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)', 4))
11041190cf68SBram Moolenaarendfunc
11051190cf68SBram Moolenaar
11061190cf68SBram Moolenaarfunc Test_matchstr()
11071190cf68SBram Moolenaar  call assert_equal('ing',  matchstr('testing', 'ing'))
1108a1449836SBram Moolenaar  call assert_equal('ing',  'testing'->matchstr('ing', 2))
11091190cf68SBram Moolenaar  call assert_equal('', matchstr('testing', 'ing', 5))
11101190cf68SBram Moolenaar  call assert_equal('', matchstr('testing', 'ing', 8))
11111190cf68SBram Moolenaar  call assert_equal('testing', matchstr(['vim', 'testing', 'execute'], 'ing'))
11121190cf68SBram Moolenaar  call assert_equal('', matchstr(['vim', 'testing', 'execute'], 'img'))
11131190cf68SBram Moolenaarendfunc
11141190cf68SBram Moolenaar
11151190cf68SBram Moolenaarfunc Test_matchstrpos()
11161190cf68SBram Moolenaar  call assert_equal(['ing', 4, 7], matchstrpos('testing', 'ing'))
1117a1449836SBram Moolenaar  call assert_equal(['ing', 4, 7], 'testing'->matchstrpos('ing', 2))
11181190cf68SBram Moolenaar  call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 5))
11191190cf68SBram Moolenaar  call assert_equal(['', -1, -1], matchstrpos('testing', 'ing', 8))
11201190cf68SBram Moolenaar  call assert_equal(['ing', 1, 4, 7], matchstrpos(['vim', 'testing', 'execute'], 'ing'))
11211190cf68SBram Moolenaar  call assert_equal(['', -1, -1, -1], matchstrpos(['vim', 'testing', 'execute'], 'img'))
112292b83ccfSBram Moolenaar  call assert_equal(['', -1, -1], matchstrpos(test_null_list(), '\a'))
112341042f3cSBram Moolenaarendfunc
112441042f3cSBram Moolenaar
112541042f3cSBram Moolenaarfunc Test_nextnonblank_prevnonblank()
112641042f3cSBram Moolenaar  new
112741042f3cSBram Moolenaarinsert
112841042f3cSBram MoolenaarThis
112941042f3cSBram Moolenaar
113041042f3cSBram Moolenaar
113141042f3cSBram Moolenaaris
113241042f3cSBram Moolenaar
113341042f3cSBram Moolenaara
113441042f3cSBram MoolenaarTest
113541042f3cSBram Moolenaar.
113641042f3cSBram Moolenaar  call assert_equal(0, nextnonblank(-1))
113741042f3cSBram Moolenaar  call assert_equal(0, nextnonblank(0))
113841042f3cSBram Moolenaar  call assert_equal(1, nextnonblank(1))
11393f4f3d8eSBram Moolenaar  call assert_equal(4, 2->nextnonblank())
114041042f3cSBram Moolenaar  call assert_equal(4, nextnonblank(3))
114141042f3cSBram Moolenaar  call assert_equal(4, nextnonblank(4))
114241042f3cSBram Moolenaar  call assert_equal(6, nextnonblank(5))
114341042f3cSBram Moolenaar  call assert_equal(6, nextnonblank(6))
114441042f3cSBram Moolenaar  call assert_equal(7, nextnonblank(7))
11453f4f3d8eSBram Moolenaar  call assert_equal(0, 8->nextnonblank())
114641042f3cSBram Moolenaar
114741042f3cSBram Moolenaar  call assert_equal(0, prevnonblank(-1))
114841042f3cSBram Moolenaar  call assert_equal(0, prevnonblank(0))
11493f4f3d8eSBram Moolenaar  call assert_equal(1, 1->prevnonblank())
115041042f3cSBram Moolenaar  call assert_equal(1, prevnonblank(2))
115141042f3cSBram Moolenaar  call assert_equal(1, prevnonblank(3))
115241042f3cSBram Moolenaar  call assert_equal(4, prevnonblank(4))
11533f4f3d8eSBram Moolenaar  call assert_equal(4, 5->prevnonblank())
115441042f3cSBram Moolenaar  call assert_equal(6, prevnonblank(6))
115541042f3cSBram Moolenaar  call assert_equal(7, prevnonblank(7))
115641042f3cSBram Moolenaar  call assert_equal(0, prevnonblank(8))
115741042f3cSBram Moolenaar  bw!
115841042f3cSBram Moolenaarendfunc
115941042f3cSBram Moolenaar
116041042f3cSBram Moolenaarfunc Test_byte2line_line2byte()
116141042f3cSBram Moolenaar  new
1162c26f7c60SBram Moolenaar  set endofline
116341042f3cSBram Moolenaar  call setline(1, ['a', 'bc', 'd'])
116441042f3cSBram Moolenaar
116541042f3cSBram Moolenaar  set fileformat=unix
116641042f3cSBram Moolenaar  call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1],
116741042f3cSBram Moolenaar  \                 map(range(-1, 8), 'byte2line(v:val)'))
116841042f3cSBram Moolenaar  call assert_equal([-1, -1, 1, 3, 6, 8, -1],
116941042f3cSBram Moolenaar  \                 map(range(-1, 5), 'line2byte(v:val)'))
117041042f3cSBram Moolenaar
117141042f3cSBram Moolenaar  set fileformat=mac
117241042f3cSBram Moolenaar  call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1],
117364b4d735SBram Moolenaar  \                 map(range(-1, 8), 'v:val->byte2line()'))
117441042f3cSBram Moolenaar  call assert_equal([-1, -1, 1, 3, 6, 8, -1],
117502b31110SBram Moolenaar  \                 map(range(-1, 5), 'v:val->line2byte()'))
117641042f3cSBram Moolenaar
117741042f3cSBram Moolenaar  set fileformat=dos
117841042f3cSBram Moolenaar  call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1],
117941042f3cSBram Moolenaar  \                 map(range(-1, 11), 'byte2line(v:val)'))
118041042f3cSBram Moolenaar  call assert_equal([-1, -1, 1, 4, 8, 11, -1],
118141042f3cSBram Moolenaar  \                 map(range(-1, 5), 'line2byte(v:val)'))
118241042f3cSBram Moolenaar
1183c26f7c60SBram Moolenaar  bw!
1184c26f7c60SBram Moolenaar  set noendofline nofixendofline
1185c26f7c60SBram Moolenaar  normal a-
1186c26f7c60SBram Moolenaar  for ff in ["unix", "mac", "dos"]
1187c26f7c60SBram Moolenaar    let &fileformat = ff
1188c26f7c60SBram Moolenaar    call assert_equal(1, line2byte(1))
1189c26f7c60SBram Moolenaar    call assert_equal(2, line2byte(2))  " line2byte(line("$") + 1) is the buffer size plus one (as per :help line2byte).
1190c26f7c60SBram Moolenaar  endfor
1191c26f7c60SBram Moolenaar
1192c26f7c60SBram Moolenaar  set endofline& fixendofline& fileformat&
119341042f3cSBram Moolenaar  bw!
119441042f3cSBram Moolenaarendfunc
119541042f3cSBram Moolenaar
11960e05de46SBram Moolenaar" Test for byteidx() and byteidxcomp() functions
119764b4d735SBram Moolenaarfunc Test_byteidx()
119864b4d735SBram Moolenaar  let a = '.é.' " one char of two bytes
119964b4d735SBram Moolenaar  call assert_equal(0, byteidx(a, 0))
120064b4d735SBram Moolenaar  call assert_equal(0, byteidxcomp(a, 0))
120164b4d735SBram Moolenaar  call assert_equal(1, byteidx(a, 1))
120264b4d735SBram Moolenaar  call assert_equal(1, byteidxcomp(a, 1))
120364b4d735SBram Moolenaar  call assert_equal(3, byteidx(a, 2))
120464b4d735SBram Moolenaar  call assert_equal(3, byteidxcomp(a, 2))
120564b4d735SBram Moolenaar  call assert_equal(4, byteidx(a, 3))
120664b4d735SBram Moolenaar  call assert_equal(4, byteidxcomp(a, 3))
120764b4d735SBram Moolenaar  call assert_equal(-1, byteidx(a, 4))
120864b4d735SBram Moolenaar  call assert_equal(-1, byteidxcomp(a, 4))
120964b4d735SBram Moolenaar
121064b4d735SBram Moolenaar  let b = '.é.' " normal e with composing char
121164b4d735SBram Moolenaar  call assert_equal(0, b->byteidx(0))
121264b4d735SBram Moolenaar  call assert_equal(1, b->byteidx(1))
121364b4d735SBram Moolenaar  call assert_equal(4, b->byteidx(2))
121464b4d735SBram Moolenaar  call assert_equal(5, b->byteidx(3))
121564b4d735SBram Moolenaar  call assert_equal(-1, b->byteidx(4))
12160e05de46SBram Moolenaar  call assert_fails("call byteidx([], 0)", 'E730:')
121764b4d735SBram Moolenaar
121864b4d735SBram Moolenaar  call assert_equal(0, b->byteidxcomp(0))
121964b4d735SBram Moolenaar  call assert_equal(1, b->byteidxcomp(1))
122064b4d735SBram Moolenaar  call assert_equal(2, b->byteidxcomp(2))
122164b4d735SBram Moolenaar  call assert_equal(4, b->byteidxcomp(3))
122264b4d735SBram Moolenaar  call assert_equal(5, b->byteidxcomp(4))
122364b4d735SBram Moolenaar  call assert_equal(-1, b->byteidxcomp(5))
12240e05de46SBram Moolenaar  call assert_fails("call byteidxcomp([], 0)", 'E730:')
122564b4d735SBram Moolenaarendfunc
122664b4d735SBram Moolenaar
122717793ef2SBram Moolenaar" Test for charidx()
122817793ef2SBram Moolenaarfunc Test_charidx()
122917793ef2SBram Moolenaar  let a = 'xáb́y'
123017793ef2SBram Moolenaar  call assert_equal(0, charidx(a, 0))
123117793ef2SBram Moolenaar  call assert_equal(1, charidx(a, 3))
123217793ef2SBram Moolenaar  call assert_equal(2, charidx(a, 4))
123317793ef2SBram Moolenaar  call assert_equal(3, charidx(a, 7))
123417793ef2SBram Moolenaar  call assert_equal(-1, charidx(a, 8))
12356d37e8e3SDominique Pelle  call assert_equal(-1, charidx(a, -1))
123617793ef2SBram Moolenaar  call assert_equal(-1, charidx('', 0))
12376d37e8e3SDominique Pelle  call assert_equal(-1, charidx(test_null_string(), 0))
123817793ef2SBram Moolenaar
123917793ef2SBram Moolenaar  " count composing characters
124017793ef2SBram Moolenaar  call assert_equal(0, charidx(a, 0, 1))
124117793ef2SBram Moolenaar  call assert_equal(2, charidx(a, 2, 1))
124217793ef2SBram Moolenaar  call assert_equal(3, charidx(a, 4, 1))
124317793ef2SBram Moolenaar  call assert_equal(5, charidx(a, 7, 1))
124417793ef2SBram Moolenaar  call assert_equal(-1, charidx(a, 8, 1))
124517793ef2SBram Moolenaar  call assert_equal(-1, charidx('', 0, 1))
124617793ef2SBram Moolenaar
124717793ef2SBram Moolenaar  call assert_fails('let x = charidx([], 1)', 'E474:')
124817793ef2SBram Moolenaar  call assert_fails('let x = charidx("abc", [])', 'E474:')
124917793ef2SBram Moolenaar  call assert_fails('let x = charidx("abc", 1, [])', 'E474:')
125017793ef2SBram Moolenaar  call assert_fails('let x = charidx("abc", 1, -1)', 'E1023:')
125117793ef2SBram Moolenaar  call assert_fails('let x = charidx("abc", 1, 2)', 'E1023:')
125217793ef2SBram Moolenaarendfunc
125317793ef2SBram Moolenaar
125441042f3cSBram Moolenaarfunc Test_count()
125541042f3cSBram Moolenaar  let l = ['a', 'a', 'A', 'b']
125641042f3cSBram Moolenaar  call assert_equal(2, count(l, 'a'))
125741042f3cSBram Moolenaar  call assert_equal(1, count(l, 'A'))
125841042f3cSBram Moolenaar  call assert_equal(1, count(l, 'b'))
125941042f3cSBram Moolenaar  call assert_equal(0, count(l, 'B'))
126041042f3cSBram Moolenaar
126141042f3cSBram Moolenaar  call assert_equal(2, count(l, 'a', 0))
126241042f3cSBram Moolenaar  call assert_equal(1, count(l, 'A', 0))
126341042f3cSBram Moolenaar  call assert_equal(1, count(l, 'b', 0))
126441042f3cSBram Moolenaar  call assert_equal(0, count(l, 'B', 0))
126541042f3cSBram Moolenaar
126641042f3cSBram Moolenaar  call assert_equal(3, count(l, 'a', 1))
126741042f3cSBram Moolenaar  call assert_equal(3, count(l, 'A', 1))
126841042f3cSBram Moolenaar  call assert_equal(1, count(l, 'b', 1))
126941042f3cSBram Moolenaar  call assert_equal(1, count(l, 'B', 1))
127041042f3cSBram Moolenaar  call assert_equal(0, count(l, 'c', 1))
127141042f3cSBram Moolenaar
127241042f3cSBram Moolenaar  call assert_equal(1, count(l, 'a', 0, 1))
127341042f3cSBram Moolenaar  call assert_equal(2, count(l, 'a', 1, 1))
127441042f3cSBram Moolenaar  call assert_fails('call count(l, "a", 0, 10)', 'E684:')
127517aca707SBram Moolenaar  call assert_fails('call count(l, "a", [])', 'E745:')
127641042f3cSBram Moolenaar
127741042f3cSBram Moolenaar  let d = {1: 'a', 2: 'a', 3: 'A', 4: 'b'}
127841042f3cSBram Moolenaar  call assert_equal(2, count(d, 'a'))
127941042f3cSBram Moolenaar  call assert_equal(1, count(d, 'A'))
128041042f3cSBram Moolenaar  call assert_equal(1, count(d, 'b'))
128141042f3cSBram Moolenaar  call assert_equal(0, count(d, 'B'))
128241042f3cSBram Moolenaar
128341042f3cSBram Moolenaar  call assert_equal(2, count(d, 'a', 0))
128441042f3cSBram Moolenaar  call assert_equal(1, count(d, 'A', 0))
128541042f3cSBram Moolenaar  call assert_equal(1, count(d, 'b', 0))
128641042f3cSBram Moolenaar  call assert_equal(0, count(d, 'B', 0))
128741042f3cSBram Moolenaar
128841042f3cSBram Moolenaar  call assert_equal(3, count(d, 'a', 1))
128941042f3cSBram Moolenaar  call assert_equal(3, count(d, 'A', 1))
129041042f3cSBram Moolenaar  call assert_equal(1, count(d, 'b', 1))
129141042f3cSBram Moolenaar  call assert_equal(1, count(d, 'B', 1))
129241042f3cSBram Moolenaar  call assert_equal(0, count(d, 'c', 1))
129341042f3cSBram Moolenaar
129441042f3cSBram Moolenaar  call assert_fails('call count(d, "a", 0, 1)', 'E474:')
12959966b21aSBram Moolenaar
12969966b21aSBram Moolenaar  call assert_equal(0, count("foo", "bar"))
12979966b21aSBram Moolenaar  call assert_equal(1, count("foo", "oo"))
12989966b21aSBram Moolenaar  call assert_equal(2, count("foo", "o"))
12999966b21aSBram Moolenaar  call assert_equal(0, count("foo", "O"))
13009966b21aSBram Moolenaar  call assert_equal(2, count("foo", "O", 1))
13019966b21aSBram Moolenaar  call assert_equal(2, count("fooooo", "oo"))
1302338e47fdSBram Moolenaar  call assert_equal(0, count("foo", ""))
130317aca707SBram Moolenaar
130417aca707SBram Moolenaar  call assert_fails('call count(0, 0)', 'E712:')
130541042f3cSBram Moolenaarendfunc
130641042f3cSBram Moolenaar
130741042f3cSBram Moolenaarfunc Test_changenr()
130841042f3cSBram Moolenaar  new Xchangenr
130941042f3cSBram Moolenaar  call assert_equal(0, changenr())
131041042f3cSBram Moolenaar  norm ifoo
131141042f3cSBram Moolenaar  call assert_equal(1, changenr())
131241042f3cSBram Moolenaar  set undolevels=10
131341042f3cSBram Moolenaar  norm Sbar
131441042f3cSBram Moolenaar  call assert_equal(2, changenr())
131541042f3cSBram Moolenaar  undo
131641042f3cSBram Moolenaar  call assert_equal(1, changenr())
131741042f3cSBram Moolenaar  redo
131841042f3cSBram Moolenaar  call assert_equal(2, changenr())
131941042f3cSBram Moolenaar  bw!
132041042f3cSBram Moolenaar  set undolevels&
132141042f3cSBram Moolenaarendfunc
132241042f3cSBram Moolenaar
132341042f3cSBram Moolenaarfunc Test_filewritable()
132441042f3cSBram Moolenaar  new Xfilewritable
132541042f3cSBram Moolenaar  write!
132641042f3cSBram Moolenaar  call assert_equal(1, filewritable('Xfilewritable'))
132741042f3cSBram Moolenaar
132841042f3cSBram Moolenaar  call assert_notequal(0, setfperm('Xfilewritable', 'r--r-----'))
132941042f3cSBram Moolenaar  call assert_equal(0, filewritable('Xfilewritable'))
133041042f3cSBram Moolenaar
133141042f3cSBram Moolenaar  call assert_notequal(0, setfperm('Xfilewritable', 'rw-r-----'))
1332a4208966SBram Moolenaar  call assert_equal(1, 'Xfilewritable'->filewritable())
133341042f3cSBram Moolenaar
133441042f3cSBram Moolenaar  call assert_equal(0, filewritable('doesnotexist'))
133541042f3cSBram Moolenaar
13360ff5dedfSBram Moolenaar  call mkdir('Xdir')
13370ff5dedfSBram Moolenaar  call assert_equal(2, filewritable('Xdir'))
13380ff5dedfSBram Moolenaar  call delete('Xdir', 'd')
13390ff5dedfSBram Moolenaar
134041042f3cSBram Moolenaar  call delete('Xfilewritable')
134141042f3cSBram Moolenaar  bw!
134241042f3cSBram Moolenaarendfunc
134341042f3cSBram Moolenaar
13448295666dSBram Moolenaarfunc Test_Executable()
13458295666dSBram Moolenaar  if has('win32')
13468295666dSBram Moolenaar    call assert_equal(1, executable('notepad'))
1347a4208966SBram Moolenaar    call assert_equal(1, 'notepad.exe'->executable())
13488295666dSBram Moolenaar    call assert_equal(0, executable('notepad.exe.exe'))
13498295666dSBram Moolenaar    call assert_equal(0, executable('shell32.dll'))
13508295666dSBram Moolenaar    call assert_equal(0, executable('win.ini'))
135195da1361SBram Moolenaar
135295da1361SBram Moolenaar    " get "notepad" path and remove the leading drive and sep. (ex. 'C:\')
135395da1361SBram Moolenaar    let notepadcmd = exepath('notepad.exe')
135495da1361SBram Moolenaar    let driveroot = notepadcmd[:2]
135595da1361SBram Moolenaar    let notepadcmd = notepadcmd[3:]
135695da1361SBram Moolenaar    new
135795da1361SBram Moolenaar    " check that the relative path works in /
135895da1361SBram Moolenaar    execute 'lcd' driveroot
135995da1361SBram Moolenaar    call assert_equal(1, executable(notepadcmd))
136095da1361SBram Moolenaar    call assert_equal(driveroot .. notepadcmd, notepadcmd->exepath())
136195da1361SBram Moolenaar    bwipe
136295da1361SBram Moolenaar
136395da1361SBram Moolenaar    " create "notepad.bat"
136495da1361SBram Moolenaar    call mkdir('Xdir')
136595da1361SBram Moolenaar    let notepadbat = fnamemodify('Xdir/notepad.bat', ':p')
136695da1361SBram Moolenaar    call writefile([], notepadbat)
136795da1361SBram Moolenaar    new
136895da1361SBram Moolenaar    " check that the path and the pathext order is valid
136995da1361SBram Moolenaar    lcd Xdir
137095da1361SBram Moolenaar    let [pathext, $PATHEXT] = [$PATHEXT, '.com;.exe;.bat;.cmd']
137195da1361SBram Moolenaar    call assert_equal(notepadbat, exepath('notepad'))
137295da1361SBram Moolenaar    let $PATHEXT = pathext
137395da1361SBram Moolenaar    bwipe
137495da1361SBram Moolenaar    eval 'Xdir'->delete('rf')
13758295666dSBram Moolenaar  elseif has('unix')
1376a4208966SBram Moolenaar    call assert_equal(1, 'cat'->executable())
1377a05a0d32SBram Moolenaar    call assert_equal(0, executable('nodogshere'))
1378d08b8c4cSBram Moolenaar
1379d08b8c4cSBram Moolenaar    " get "cat" path and remove the leading /
1380d08b8c4cSBram Moolenaar    let catcmd = exepath('cat')[1:]
1381d08b8c4cSBram Moolenaar    new
1382a4208966SBram Moolenaar    " check that the relative path works in /
1383d08b8c4cSBram Moolenaar    lcd /
1384d08b8c4cSBram Moolenaar    call assert_equal(1, executable(catcmd))
1385a387083bSBram Moolenaar    let result = catcmd->exepath()
1386a387083bSBram Moolenaar    " when using chroot looking for sbin/cat can return bin/cat, that is OK
1387a387083bSBram Moolenaar    if catcmd =~ '\<sbin\>' && result =~ '\<bin\>'
1388a387083bSBram Moolenaar      call assert_equal('/' .. substitute(catcmd, '\<sbin\>', 'bin', ''), result)
1389a387083bSBram Moolenaar    else
1390bf634a0aSBram Moolenaar      " /bin/cat and /usr/bin/cat may be hard linked, we could get either
1391bf634a0aSBram Moolenaar      let result = substitute(result, '/usr/bin/cat', '/bin/cat', '')
1392bf634a0aSBram Moolenaar      let catcmd = substitute(catcmd, 'usr/bin/cat', 'bin/cat', '')
1393a387083bSBram Moolenaar      call assert_equal('/' .. catcmd, result)
1394a387083bSBram Moolenaar    endif
1395d08b8c4cSBram Moolenaar    bwipe
13966d91bcb4SBram Moolenaar  else
13976d91bcb4SBram Moolenaar    throw 'Skipped: does not work on this platform'
13988295666dSBram Moolenaar  endif
13998295666dSBram Moolenaarendfunc
14008295666dSBram Moolenaar
140186621897SBram Moolenaarfunc Test_executable_longname()
14026d91bcb4SBram Moolenaar  CheckMSWindows
140386621897SBram Moolenaar
1404f637bcebSBram Moolenaar  " Create a temporary .bat file with 205 characters in the name.
1405f637bcebSBram Moolenaar  " Maximum length of a filename (including the path) on MS-Windows is 259
1406f637bcebSBram Moolenaar  " characters.
1407f637bcebSBram Moolenaar  " See https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation
1408f637bcebSBram Moolenaar  let len = 259 - getcwd()->len() - 6
1409f637bcebSBram Moolenaar  if len > 200
1410f637bcebSBram Moolenaar    let len = 200
1411f637bcebSBram Moolenaar  endif
1412f637bcebSBram Moolenaar
1413f637bcebSBram Moolenaar  let fname = 'X' . repeat('あ', len) . '.bat'
141486621897SBram Moolenaar  call writefile([], fname)
141586621897SBram Moolenaar  call assert_equal(1, executable(fname))
141686621897SBram Moolenaar  call delete(fname)
141786621897SBram Moolenaarendfunc
141886621897SBram Moolenaar
141941042f3cSBram Moolenaarfunc Test_hostname()
142041042f3cSBram Moolenaar  let hostname_vim = hostname()
142141042f3cSBram Moolenaar  if has('unix')
142241042f3cSBram Moolenaar    let hostname_system = systemlist('uname -n')[0]
142341042f3cSBram Moolenaar    call assert_equal(hostname_vim, hostname_system)
142441042f3cSBram Moolenaar  endif
142541042f3cSBram Moolenaarendfunc
142641042f3cSBram Moolenaar
142741042f3cSBram Moolenaarfunc Test_getpid()
142841042f3cSBram Moolenaar  " getpid() always returns the same value within a vim instance.
142941042f3cSBram Moolenaar  call assert_equal(getpid(), getpid())
143041042f3cSBram Moolenaar  if has('unix')
143141042f3cSBram Moolenaar    call assert_equal(systemlist('echo $PPID')[0], string(getpid()))
143241042f3cSBram Moolenaar  endif
143341042f3cSBram Moolenaarendfunc
143441042f3cSBram Moolenaar
143541042f3cSBram Moolenaarfunc Test_hlexists()
143641042f3cSBram Moolenaar  call assert_equal(0, hlexists('does_not_exist'))
1437f9f24ce7SBram Moolenaar  call assert_equal(0, 'Number'->hlexists())
143841042f3cSBram Moolenaar  call assert_equal(0, highlight_exists('does_not_exist'))
143941042f3cSBram Moolenaar  call assert_equal(0, highlight_exists('Number'))
144041042f3cSBram Moolenaar  syntax on
144141042f3cSBram Moolenaar  call assert_equal(0, hlexists('does_not_exist'))
144241042f3cSBram Moolenaar  call assert_equal(1, hlexists('Number'))
144341042f3cSBram Moolenaar  call assert_equal(0, highlight_exists('does_not_exist'))
144441042f3cSBram Moolenaar  call assert_equal(1, highlight_exists('Number'))
144541042f3cSBram Moolenaar  syntax off
144641042f3cSBram Moolenaarendfunc
144741042f3cSBram Moolenaar
144892b83ccfSBram Moolenaar" Test for the col() function
144941042f3cSBram Moolenaarfunc Test_col()
145041042f3cSBram Moolenaar  new
145141042f3cSBram Moolenaar  call setline(1, 'abcdef')
145241042f3cSBram Moolenaar  norm gg4|mx6|mY2|
145341042f3cSBram Moolenaar  call assert_equal(2, col('.'))
145441042f3cSBram Moolenaar  call assert_equal(7, col('$'))
14558b633135SBram Moolenaar  call assert_equal(2, col('v'))
145641042f3cSBram Moolenaar  call assert_equal(4, col("'x"))
145741042f3cSBram Moolenaar  call assert_equal(6, col("'Y"))
14581a3a8916SBram Moolenaar  call assert_equal(2, [1, 2]->col())
145941042f3cSBram Moolenaar  call assert_equal(7, col([1, '$']))
146041042f3cSBram Moolenaar
146141042f3cSBram Moolenaar  call assert_equal(0, col(''))
146241042f3cSBram Moolenaar  call assert_equal(0, col('x'))
146341042f3cSBram Moolenaar  call assert_equal(0, col([2, '$']))
146441042f3cSBram Moolenaar  call assert_equal(0, col([1, 100]))
146541042f3cSBram Moolenaar  call assert_equal(0, col([1]))
14669d8d0b5cSBram Moolenaar  call assert_equal(0, col(test_null_list()))
14679d8d0b5cSBram Moolenaar  call assert_fails('let c = col({})', 'E731:')
14688b633135SBram Moolenaar
14698b633135SBram Moolenaar  " test for getting the visual start column
14708b633135SBram Moolenaar  func T()
14718b633135SBram Moolenaar    let g:Vcol = col('v')
14728b633135SBram Moolenaar    return ''
14738b633135SBram Moolenaar  endfunc
14748b633135SBram Moolenaar  let g:Vcol = 0
14758b633135SBram Moolenaar  xmap <expr> <F2> T()
14768b633135SBram Moolenaar  exe "normal gg3|ve\<F2>"
14778b633135SBram Moolenaar  call assert_equal(3, g:Vcol)
14788b633135SBram Moolenaar  xunmap <F2>
14798b633135SBram Moolenaar  delfunc T
14808b633135SBram Moolenaar
14810e05de46SBram Moolenaar  " Test for the visual line start and end marks '< and '>
14820e05de46SBram Moolenaar  call setline(1, ['one', 'one two', 'one two three'])
14830e05de46SBram Moolenaar  "normal! ggVG
14840e05de46SBram Moolenaar  call feedkeys("ggVG\<Esc>", 'xt')
14850e05de46SBram Moolenaar  call assert_equal(1, col("'<"))
14860e05de46SBram Moolenaar  call assert_equal(14, col("'>"))
14870e05de46SBram Moolenaar  " Delete the last line of the visually selected region
14880e05de46SBram Moolenaar  $d
14890e05de46SBram Moolenaar  call assert_notequal(14, col("'>"))
14900e05de46SBram Moolenaar
14910e05de46SBram Moolenaar  " Test with 'virtualedit'
14920e05de46SBram Moolenaar  set virtualedit=all
14930e05de46SBram Moolenaar  call cursor(1, 10)
14940e05de46SBram Moolenaar  call assert_equal(4, col('.'))
14950e05de46SBram Moolenaar  set virtualedit&
14960e05de46SBram Moolenaar
149741042f3cSBram Moolenaar  bw!
149841042f3cSBram Moolenaarendfunc
149941042f3cSBram Moolenaar
15008d588cceSBram Moolenaar" Test for input()
15018d588cceSBram Moolenaarfunc Test_input_func()
15028d588cceSBram Moolenaar  " Test for prompt with multiple lines
15038d588cceSBram Moolenaar  redir => v
15048d588cceSBram Moolenaar  call feedkeys(":let c = input(\"A\\nB\\nC\\n? \")\<CR>B\<CR>", 'xt')
15058d588cceSBram Moolenaar  redir END
15068d588cceSBram Moolenaar  call assert_equal("B", c)
15078d588cceSBram Moolenaar  call assert_equal(['A', 'B', 'C'], split(v, "\n"))
15088d588cceSBram Moolenaar
15098d588cceSBram Moolenaar  " Test for default value
15108d588cceSBram Moolenaar  call feedkeys(":let c = input('color? ', 'red')\<CR>\<CR>", 'xt')
15118d588cceSBram Moolenaar  call assert_equal('red', c)
15128d588cceSBram Moolenaar
15138d588cceSBram Moolenaar  " Test for completion at the input prompt
15148d588cceSBram Moolenaar  func! Tcomplete(arglead, cmdline, pos)
15158d588cceSBram Moolenaar    return "item1\nitem2\nitem3"
15168d588cceSBram Moolenaar  endfunc
15178d588cceSBram Moolenaar  call feedkeys(":let c = input('Q? ', '', 'custom,Tcomplete')\<CR>"
15188d588cceSBram Moolenaar        \ .. "\<C-A>\<CR>", 'xt')
15198d588cceSBram Moolenaar  delfunc Tcomplete
15208d588cceSBram Moolenaar  call assert_equal('item1 item2 item3', c)
1521578fe947SBram Moolenaar
1522f4fcedc5SBram Moolenaar  " Test for using special characters as default input
15231f448d90SBram Moolenaar  call feedkeys(":let c = input('name? ', \"x\\<BS>y\")\<CR>\<CR>", 'xt')
1524f4fcedc5SBram Moolenaar  call assert_equal('y', c)
1525f4fcedc5SBram Moolenaar
1526f4fcedc5SBram Moolenaar  " Test for using <CR> as default input
1527f4fcedc5SBram Moolenaar  call feedkeys(":let c = input('name? ', \"\\<CR>\")\<CR>x\<CR>", 'xt')
1528f4fcedc5SBram Moolenaar  call assert_equal(' x', c)
1529f4fcedc5SBram Moolenaar
1530578fe947SBram Moolenaar  call assert_fails("call input('F:', '', 'invalid')", 'E180:')
1531578fe947SBram Moolenaar  call assert_fails("call input('F:', '', [])", 'E730:')
1532578fe947SBram Moolenaarendfunc
1533578fe947SBram Moolenaar
1534578fe947SBram Moolenaar" Test for the inputdialog() function
1535578fe947SBram Moolenaarfunc Test_inputdialog()
1536fdcbe3c3SBram Moolenaar  set timeout timeoutlen=10
153799fa7219SBram Moolenaar  if has('gui_running')
153899fa7219SBram Moolenaar    call assert_fails('let v=inputdialog([], "xx")', 'E730:')
153999fa7219SBram Moolenaar    call assert_fails('let v=inputdialog("Q", [])', 'E730:')
154099fa7219SBram Moolenaar  else
1541578fe947SBram Moolenaar    call feedkeys(":let v=inputdialog('Q:', 'xx', 'yy')\<CR>\<CR>", 'xt')
1542578fe947SBram Moolenaar    call assert_equal('xx', v)
1543578fe947SBram Moolenaar    call feedkeys(":let v=inputdialog('Q:', 'xx', 'yy')\<CR>\<Esc>", 'xt')
1544578fe947SBram Moolenaar    call assert_equal('yy', v)
154599fa7219SBram Moolenaar  endif
1546fdcbe3c3SBram Moolenaar  set timeout& timeoutlen&
15478d588cceSBram Moolenaarendfunc
15488d588cceSBram Moolenaar
15498d588cceSBram Moolenaar" Test for inputlist()
1550947b39e7SBram Moolenaarfunc Test_inputlist()
1551947b39e7SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>1\<cr>", 'tx')
1552947b39e7SBram Moolenaar  call assert_equal(1, c)
1553f9f24ce7SBram Moolenaar  call feedkeys(":let c = ['Select color:', '1. red', '2. green', '3. blue']->inputlist()\<cr>2\<cr>", 'tx')
1554947b39e7SBram Moolenaar  call assert_equal(2, c)
1555947b39e7SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>3\<cr>", 'tx')
1556947b39e7SBram Moolenaar  call assert_equal(3, c)
1557947b39e7SBram Moolenaar
1558eebd5557SBram Moolenaar  " CR to cancel
1559eebd5557SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>\<cr>", 'tx')
1560eebd5557SBram Moolenaar  call assert_equal(0, c)
1561eebd5557SBram Moolenaar
1562eebd5557SBram Moolenaar  " Esc to cancel
1563eebd5557SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>\<Esc>", 'tx')
1564eebd5557SBram Moolenaar  call assert_equal(0, c)
1565eebd5557SBram Moolenaar
1566eebd5557SBram Moolenaar  " q to cancel
1567eebd5557SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>q", 'tx')
1568eebd5557SBram Moolenaar  call assert_equal(0, c)
1569eebd5557SBram Moolenaar
15705cf94577S=?UTF-8?q?Luka=20Marku=C5=A1i=C4=87?=  " Cancel after inputting a number
15715cf94577S=?UTF-8?q?Luka=20Marku=C5=A1i=C4=87?=  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>5q", 'tx')
15725cf94577S=?UTF-8?q?Luka=20Marku=C5=A1i=C4=87?=  call assert_equal(0, c)
15735cf94577S=?UTF-8?q?Luka=20Marku=C5=A1i=C4=87?=
1574cde0ff39SBram Moolenaar  " Use backspace to delete characters in the prompt
1575cde0ff39SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>1\<BS>3\<BS>2\<cr>", 'tx')
1576cde0ff39SBram Moolenaar  call assert_equal(2, c)
1577cde0ff39SBram Moolenaar
1578cde0ff39SBram Moolenaar  " Use mouse to make a selection
1579cde0ff39SBram Moolenaar  call test_setmouse(&lines - 3, 2)
1580cde0ff39SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>\<LeftMouse>", 'tx')
1581cde0ff39SBram Moolenaar  call assert_equal(1, c)
1582cde0ff39SBram Moolenaar  " Mouse click outside of the list
1583cde0ff39SBram Moolenaar  call test_setmouse(&lines - 6, 2)
1584cde0ff39SBram Moolenaar  call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>\<LeftMouse>", 'tx')
1585cde0ff39SBram Moolenaar  call assert_equal(-2, c)
1586cde0ff39SBram Moolenaar
1587947b39e7SBram Moolenaar  call assert_fails('call inputlist("")', 'E686:')
158892b83ccfSBram Moolenaar  call assert_fails('call inputlist(test_null_list())', 'E686:')
1589947b39e7SBram Moolenaarendfunc
1590947b39e7SBram Moolenaar
1591caf6434aSBram Moolenaarfunc Test_balloon_show()
15926d91bcb4SBram Moolenaar  CheckFeature balloon_eval
1593b47bed2fSBram Moolenaar
1594caf6434aSBram Moolenaar  " This won't do anything but must not crash either.
1595caf6434aSBram Moolenaar  call balloon_show('hi!')
15967d8ea0b2SBram Moolenaar  if !has('gui_running')
159750985eb1SBram Moolenaar    call balloon_show(range(3))
159899fa7219SBram Moolenaar    call balloon_show([])
1599a0107bdfSBram Moolenaar  endif
1600caf6434aSBram Moolenaarendfunc
16012c90d511SBram Moolenaar
16022c90d511SBram Moolenaarfunc Test_setbufvar_options()
16032c90d511SBram Moolenaar  " This tests that aucmd_prepbuf() and aucmd_restbuf() properly restore the
16042c90d511SBram Moolenaar  " window layout.
16052c90d511SBram Moolenaar  call assert_equal(1, winnr('$'))
16062c90d511SBram Moolenaar  split dummy_preview
16072c90d511SBram Moolenaar  resize 2
16082c90d511SBram Moolenaar  set winfixheight winfixwidth
16092c90d511SBram Moolenaar  let prev_id = win_getid()
16102c90d511SBram Moolenaar
16112c90d511SBram Moolenaar  wincmd j
1612c05d1c04SBram Moolenaar  let wh = winheight(0)
16132c90d511SBram Moolenaar  let dummy_buf = bufnr('dummy_buf1', v:true)
16142c90d511SBram Moolenaar  call setbufvar(dummy_buf, '&buftype', 'nofile')
16152c90d511SBram Moolenaar  execute 'belowright vertical split #' . dummy_buf
1616c05d1c04SBram Moolenaar  call assert_equal(wh, winheight(0))
16172c90d511SBram Moolenaar  let dum1_id = win_getid()
16182c90d511SBram Moolenaar
16192c90d511SBram Moolenaar  wincmd h
1620c05d1c04SBram Moolenaar  let wh = winheight(0)
16212c90d511SBram Moolenaar  let dummy_buf = bufnr('dummy_buf2', v:true)
1622196b4664SBram Moolenaar  eval 'nofile'->setbufvar(dummy_buf, '&buftype')
16232c90d511SBram Moolenaar  execute 'belowright vertical split #' . dummy_buf
1624c05d1c04SBram Moolenaar  call assert_equal(wh, winheight(0))
16252c90d511SBram Moolenaar
16262c90d511SBram Moolenaar  bwipe!
16272c90d511SBram Moolenaar  call win_gotoid(prev_id)
16282c90d511SBram Moolenaar  bwipe!
16292c90d511SBram Moolenaar  call win_gotoid(dum1_id)
16302c90d511SBram Moolenaar  bwipe!
16312c90d511SBram Moolenaarendfunc
1632d4863aa9SBram Moolenaar
1633d4863aa9SBram Moolenaarfunc Test_redo_in_nested_functions()
1634d4863aa9SBram Moolenaar  nnoremap g. :set opfunc=Operator<CR>g@
1635d4863aa9SBram Moolenaar  function Operator( type, ... )
1636d4863aa9SBram Moolenaar     let @x = 'XXX'
1637d4863aa9SBram Moolenaar     execute 'normal! g`[' . (a:type ==# 'line' ? 'V' : 'v') . 'g`]' . '"xp'
1638d4863aa9SBram Moolenaar  endfunction
1639d4863aa9SBram Moolenaar
1640d4863aa9SBram Moolenaar  function! Apply()
1641d4863aa9SBram Moolenaar      5,6normal! .
1642d4863aa9SBram Moolenaar  endfunction
1643d4863aa9SBram Moolenaar
1644d4863aa9SBram Moolenaar  new
1645d4863aa9SBram Moolenaar  call setline(1, repeat(['some "quoted" text', 'more "quoted" text'], 3))
1646d4863aa9SBram Moolenaar  1normal g.i"
1647d4863aa9SBram Moolenaar  call assert_equal('some "XXX" text', getline(1))
1648d4863aa9SBram Moolenaar  3,4normal .
1649d4863aa9SBram Moolenaar  call assert_equal('some "XXX" text', getline(3))
1650d4863aa9SBram Moolenaar  call assert_equal('more "XXX" text', getline(4))
1651d4863aa9SBram Moolenaar  call Apply()
1652d4863aa9SBram Moolenaar  call assert_equal('some "XXX" text', getline(5))
1653d4863aa9SBram Moolenaar  call assert_equal('more "XXX" text', getline(6))
1654d4863aa9SBram Moolenaar  bwipe!
1655d4863aa9SBram Moolenaar
1656d4863aa9SBram Moolenaar  nunmap g.
1657d4863aa9SBram Moolenaar  delfunc Operator
1658d4863aa9SBram Moolenaar  delfunc Apply
1659d4863aa9SBram Moolenaarendfunc
166020615528SBram Moolenaar
1661295ac5abSBram Moolenaarfunc Test_trim()
1662295ac5abSBram Moolenaar  call assert_equal("Testing", trim("  \t\r\r\x0BTesting  \t\n\r\n\t\x0B\x0B"))
1663f92e58caSBram Moolenaar  call assert_equal("Testing", "  \t  \r\r\n\n\x0BTesting  \t\n\r\n\t\x0B\x0B"->trim())
1664295ac5abSBram Moolenaar  call assert_equal("RESERVE", trim("xyz \twwRESERVEzyww \t\t", " wxyz\t"))
1665295ac5abSBram Moolenaar  call assert_equal("wRE    \tSERVEzyww", trim("wRE    \tSERVEzyww"))
1666295ac5abSBram Moolenaar  call assert_equal("abcd\t     xxxx   tail", trim(" \tabcd\t     xxxx   tail"))
1667295ac5abSBram Moolenaar  call assert_equal("\tabcd\t     xxxx   tail", trim(" \tabcd\t     xxxx   tail", " "))
1668295ac5abSBram Moolenaar  call assert_equal(" \tabcd\t     xxxx   tail", trim(" \tabcd\t     xxxx   tail", "abx"))
1669295ac5abSBram Moolenaar  call assert_equal("RESERVE", trim("你RESERVE好", "你好"))
1670295ac5abSBram Moolenaar  call assert_equal("您R E SER V E早", trim("你好您R E SER V E早好你你", "你好"))
1671295ac5abSBram Moolenaar  call assert_equal("你好您R E SER V E早好你你", trim(" \n\r\r   你好您R E SER V E早好你你    \t  \x0B", ))
1672295ac5abSBram Moolenaar  call assert_equal("您R E SER V E早好你你    \t  \x0B", trim("    你好您R E SER V E早好你你    \t  \x0B", " 你好"))
1673295ac5abSBram Moolenaar  call assert_equal("您R E SER V E早好你你    \t  \x0B", trim("    tteesstttt你好您R E SER V E早好你你    \t  \x0B ttestt", " 你好tes"))
1674295ac5abSBram Moolenaar  call assert_equal("您R E SER V E早好你你    \t  \x0B", trim("    tteesstttt你好您R E SER V E早好你你    \t  \x0B ttestt", "   你你你好好好tttsses"))
1675295ac5abSBram Moolenaar  call assert_equal("留下", trim("这些些不要这些留下这些", "这些不要"))
1676295ac5abSBram Moolenaar  call assert_equal("", trim("", ""))
1677295ac5abSBram Moolenaar  call assert_equal("a", trim("a", ""))
1678295ac5abSBram Moolenaar  call assert_equal("", trim("", "a"))
1679295ac5abSBram Moolenaar
16802245ae18SBram Moolenaar  call assert_equal("vim", trim("  vim  ", " ", 0))
16812245ae18SBram Moolenaar  call assert_equal("vim  ", trim("  vim  ", " ", 1))
16822245ae18SBram Moolenaar  call assert_equal("  vim", trim("  vim  ", " ", 2))
16832245ae18SBram Moolenaar  call assert_fails('eval trim("  vim  ", " ", [])', 'E745:')
16842245ae18SBram Moolenaar  call assert_fails('eval trim("  vim  ", " ", -1)', 'E475:')
16852245ae18SBram Moolenaar  call assert_fails('eval trim("  vim  ", " ", 3)', 'E475:')
1686d176ca3dSDominique Pelle  call assert_fails('eval trim("  vim  ", 0)', 'E475:')
16872245ae18SBram Moolenaar
16883f4f3d8eSBram Moolenaar  let chars = join(map(range(1, 0x20) + [0xa0], {n -> n->nr2char()}), '')
1689295ac5abSBram Moolenaar  call assert_equal("x", trim(chars . "x" . chars))
16900e05de46SBram Moolenaar
16910e05de46SBram Moolenaar  call assert_fails('let c=trim([])', 'E730:')
1692295ac5abSBram Moolenaarendfunc
16930b6d911eSBram Moolenaar
16940b6d911eSBram Moolenaar" Test for reg_recording() and reg_executing()
16950b6d911eSBram Moolenaarfunc Test_reg_executing_and_recording()
16960b6d911eSBram Moolenaar  let s:reg_stat = ''
16970b6d911eSBram Moolenaar  func s:save_reg_stat()
16980b6d911eSBram Moolenaar    let s:reg_stat = reg_recording() . ':' . reg_executing()
16990b6d911eSBram Moolenaar    return ''
17000b6d911eSBram Moolenaar  endfunc
17010b6d911eSBram Moolenaar
17020b6d911eSBram Moolenaar  new
17030b6d911eSBram Moolenaar  call s:save_reg_stat()
17040b6d911eSBram Moolenaar  call assert_equal(':', s:reg_stat)
17050b6d911eSBram Moolenaar  call feedkeys("qa\"=s:save_reg_stat()\<CR>pq", 'xt')
17060b6d911eSBram Moolenaar  call assert_equal('a:', s:reg_stat)
17070b6d911eSBram Moolenaar  call feedkeys("@a", 'xt')
17080b6d911eSBram Moolenaar  call assert_equal(':a', s:reg_stat)
17090b6d911eSBram Moolenaar  call feedkeys("qb@aq", 'xt')
17100b6d911eSBram Moolenaar  call assert_equal('b:a', s:reg_stat)
17110b6d911eSBram Moolenaar  call feedkeys("q\"\"=s:save_reg_stat()\<CR>pq", 'xt')
17120b6d911eSBram Moolenaar  call assert_equal('":', s:reg_stat)
17130b6d911eSBram Moolenaar
1714cce713ddSBram Moolenaar  " :normal command saves and restores reg_executing
1715f0fab304SBram Moolenaar  let s:reg_stat = ''
1716cce713ddSBram Moolenaar  let @q = ":call TestFunc()\<CR>:call s:save_reg_stat()\<CR>"
1717cce713ddSBram Moolenaar  func TestFunc() abort
1718cce713ddSBram Moolenaar    normal! ia
1719cce713ddSBram Moolenaar  endfunc
1720cce713ddSBram Moolenaar  call feedkeys("@q", 'xt')
1721cce713ddSBram Moolenaar  call assert_equal(':q', s:reg_stat)
1722cce713ddSBram Moolenaar  delfunc TestFunc
1723cce713ddSBram Moolenaar
1724f0fab304SBram Moolenaar  " getchar() command saves and restores reg_executing
1725f0fab304SBram Moolenaar  map W :call TestFunc()<CR>
1726f0fab304SBram Moolenaar  let @q = "W"
17279a2c091aSBram Moolenaar  let g:typed = ''
17289a2c091aSBram Moolenaar  let g:regs = []
1729f0fab304SBram Moolenaar  func TestFunc() abort
17309a2c091aSBram Moolenaar    let g:regs += [reg_executing()]
1731f0fab304SBram Moolenaar    let g:typed = getchar(0)
17329a2c091aSBram Moolenaar    let g:regs += [reg_executing()]
1733f0fab304SBram Moolenaar  endfunc
1734f0fab304SBram Moolenaar  call feedkeys("@qy", 'xt')
1735f0fab304SBram Moolenaar  call assert_equal(char2nr("y"), g:typed)
17369a2c091aSBram Moolenaar  call assert_equal(['q', 'q'], g:regs)
1737f0fab304SBram Moolenaar  delfunc TestFunc
1738f0fab304SBram Moolenaar  unmap W
1739f0fab304SBram Moolenaar  unlet g:typed
17409a2c091aSBram Moolenaar  unlet g:regs
17419a2c091aSBram Moolenaar
17429a2c091aSBram Moolenaar  " input() command saves and restores reg_executing
17439a2c091aSBram Moolenaar  map W :call TestFunc()<CR>
17449a2c091aSBram Moolenaar  let @q = "W"
17459a2c091aSBram Moolenaar  let g:typed = ''
17469a2c091aSBram Moolenaar  let g:regs = []
17479a2c091aSBram Moolenaar  func TestFunc() abort
17489a2c091aSBram Moolenaar    let g:regs += [reg_executing()]
1749f9f24ce7SBram Moolenaar    let g:typed = '?'->input()
17509a2c091aSBram Moolenaar    let g:regs += [reg_executing()]
17519a2c091aSBram Moolenaar  endfunc
17529a2c091aSBram Moolenaar  call feedkeys("@qy\<CR>", 'xt')
17539a2c091aSBram Moolenaar  call assert_equal("y", g:typed)
17549a2c091aSBram Moolenaar  call assert_equal(['q', 'q'], g:regs)
17559a2c091aSBram Moolenaar  delfunc TestFunc
17569a2c091aSBram Moolenaar  unmap W
17579a2c091aSBram Moolenaar  unlet g:typed
17589a2c091aSBram Moolenaar  unlet g:regs
1759f0fab304SBram Moolenaar
17600b6d911eSBram Moolenaar  bwipe!
17610b6d911eSBram Moolenaar  delfunc s:save_reg_stat
17620b6d911eSBram Moolenaar  unlet s:reg_stat
17630b6d911eSBram Moolenaarendfunc
17641ceebb4eSBram Moolenaar
1765f9f24ce7SBram Moolenaarfunc Test_inputsecret()
1766f9f24ce7SBram Moolenaar  map W :call TestFunc()<CR>
1767f9f24ce7SBram Moolenaar  let @q = "W"
1768f9f24ce7SBram Moolenaar  let g:typed1 = ''
1769f9f24ce7SBram Moolenaar  let g:typed2 = ''
1770f9f24ce7SBram Moolenaar  let g:regs = []
1771f9f24ce7SBram Moolenaar  func TestFunc() abort
1772f9f24ce7SBram Moolenaar    let g:typed1 = '?'->inputsecret()
1773f9f24ce7SBram Moolenaar    let g:typed2 = inputsecret('password: ')
1774f9f24ce7SBram Moolenaar  endfunc
1775f9f24ce7SBram Moolenaar  call feedkeys("@qsomething\<CR>else\<CR>", 'xt')
1776f9f24ce7SBram Moolenaar  call assert_equal("something", g:typed1)
1777f9f24ce7SBram Moolenaar  call assert_equal("else", g:typed2)
1778f9f24ce7SBram Moolenaar  delfunc TestFunc
1779f9f24ce7SBram Moolenaar  unmap W
1780f9f24ce7SBram Moolenaar  unlet g:typed1
1781f9f24ce7SBram Moolenaar  unlet g:typed2
1782f9f24ce7SBram Moolenaarendfunc
1783f9f24ce7SBram Moolenaar
17845d712e46SBram Moolenaarfunc Test_getchar()
17855d712e46SBram Moolenaar  call feedkeys('a', '')
17865d712e46SBram Moolenaar  call assert_equal(char2nr('a'), getchar())
17873a7503c3SBram Moolenaar  call assert_equal(0, getchar(0))
17883a7503c3SBram Moolenaar  call assert_equal(0, getchar(1))
17893a7503c3SBram Moolenaar
17903a7503c3SBram Moolenaar  call feedkeys('a', '')
17913a7503c3SBram Moolenaar  call assert_equal('a', getcharstr())
17923a7503c3SBram Moolenaar  call assert_equal('', getcharstr(0))
17933a7503c3SBram Moolenaar  call assert_equal('', getcharstr(1))
17945d712e46SBram Moolenaar
1795db3a2051SBram Moolenaar  call setline(1, 'xxxx')
17965d712e46SBram Moolenaar  call test_setmouse(1, 3)
17975d712e46SBram Moolenaar  let v:mouse_win = 9
17985d712e46SBram Moolenaar  let v:mouse_winid = 9
17995d712e46SBram Moolenaar  let v:mouse_lnum = 9
18005d712e46SBram Moolenaar  let v:mouse_col = 9
18015d712e46SBram Moolenaar  call feedkeys("\<S-LeftMouse>", '')
18025d712e46SBram Moolenaar  call assert_equal("\<S-LeftMouse>", getchar())
18035d712e46SBram Moolenaar  call assert_equal(1, v:mouse_win)
18045d712e46SBram Moolenaar  call assert_equal(win_getid(1), v:mouse_winid)
18055d712e46SBram Moolenaar  call assert_equal(1, v:mouse_lnum)
18065d712e46SBram Moolenaar  call assert_equal(3, v:mouse_col)
1807db3a2051SBram Moolenaar  enew!
18085d712e46SBram Moolenaarendfunc
18095d712e46SBram Moolenaar
18101ceebb4eSBram Moolenaarfunc Test_libcall_libcallnr()
18116d91bcb4SBram Moolenaar  CheckFeature libcall
18121ceebb4eSBram Moolenaar
18131ceebb4eSBram Moolenaar  if has('win32')
18141ceebb4eSBram Moolenaar    let libc = 'msvcrt.dll'
18151ceebb4eSBram Moolenaar  elseif has('mac')
18161ceebb4eSBram Moolenaar    let libc = 'libSystem.B.dylib'
181739536dd5SBram Moolenaar  elseif executable('ldd')
181839536dd5SBram Moolenaar    let libc = matchstr(split(system('ldd ' . GetVimProg())), '/libc\.so\>')
181939536dd5SBram Moolenaar  endif
182039536dd5SBram Moolenaar  if get(l:, 'libc', '') ==# ''
182139536dd5SBram Moolenaar    " On Unix, libc.so can be in various places.
182239536dd5SBram Moolenaar    if has('linux')
182339536dd5SBram Moolenaar      " There is not documented but regarding the 1st argument of glibc's
182439536dd5SBram Moolenaar      " dlopen an empty string and nullptr are equivalent, so using an empty
182539536dd5SBram Moolenaar      " string for the 1st argument of libcall allows to call functions.
182639536dd5SBram Moolenaar      let libc = ''
182739536dd5SBram Moolenaar    elseif has('sun')
1828f1c118beSBram Moolenaar      " Set the path to libc.so according to the architecture.
1829f1c118beSBram Moolenaar      let test_bits = system('file ' . GetVimProg())
1830f1c118beSBram Moolenaar      let test_arch = system('uname -p')
1831f1c118beSBram Moolenaar      if test_bits =~ '64-bit' && test_arch =~ 'sparc'
1832f1c118beSBram Moolenaar        let libc = '/usr/lib/sparcv9/libc.so'
1833f1c118beSBram Moolenaar      elseif test_bits =~ '64-bit' && test_arch =~ 'i386'
1834f1c118beSBram Moolenaar        let libc = '/usr/lib/amd64/libc.so'
1835f1c118beSBram Moolenaar      else
1836f1c118beSBram Moolenaar        let libc = '/usr/lib/libc.so'
1837f1c118beSBram Moolenaar      endif
18381ceebb4eSBram Moolenaar    else
183939536dd5SBram Moolenaar      " Unfortunately skip this test until a good way is found.
184039536dd5SBram Moolenaar      return
184139536dd5SBram Moolenaar    endif
18421ceebb4eSBram Moolenaar  endif
18431ceebb4eSBram Moolenaar
18441ceebb4eSBram Moolenaar  if has('win32')
184502b31110SBram Moolenaar    call assert_equal($USERPROFILE, 'USERPROFILE'->libcall(libc, 'getenv'))
18461ceebb4eSBram Moolenaar  else
184702b31110SBram Moolenaar    call assert_equal($HOME, 'HOME'->libcall(libc, 'getenv'))
18481ceebb4eSBram Moolenaar  endif
18491ceebb4eSBram Moolenaar
18501ceebb4eSBram Moolenaar  " If function returns NULL, libcall() should return an empty string.
18511ceebb4eSBram Moolenaar  call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT'))
18521ceebb4eSBram Moolenaar
18531ceebb4eSBram Moolenaar  " Test libcallnr() with string and integer argument.
185402b31110SBram Moolenaar  call assert_equal(4, 'abcd'->libcallnr(libc, 'strlen'))
185502b31110SBram Moolenaar  call assert_equal(char2nr('A'), char2nr('a')->libcallnr(libc, 'toupper'))
18561ceebb4eSBram Moolenaar
18579b7bf9e9SBram Moolenaar  call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", ['', 'E364:'])
18589b7bf9e9SBram Moolenaar  call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", ['', 'E364:'])
18591ceebb4eSBram Moolenaar
18609b7bf9e9SBram Moolenaar  call assert_fails("call libcall('Xdoesnotexist_', 'getenv', 'HOME')", ['', 'E364:'])
18619b7bf9e9SBram Moolenaar  call assert_fails("call libcallnr('Xdoesnotexist_', 'strlen', 'abcd')", ['', 'E364:'])
18621ceebb4eSBram Moolenaarendfunc
1863d90a144eSBram Moolenaar
1864d90a144eSBram Moolenaarsandbox function Fsandbox()
1865d90a144eSBram Moolenaar  normal ix
1866d90a144eSBram Moolenaarendfunc
1867d90a144eSBram Moolenaar
1868d90a144eSBram Moolenaarfunc Test_func_sandbox()
1869d90a144eSBram Moolenaar  sandbox let F = {-> 'hello'}
1870d90a144eSBram Moolenaar  call assert_equal('hello', F())
1871d90a144eSBram Moolenaar
1872a4208966SBram Moolenaar  sandbox let F = {-> "normal ix\<Esc>"->execute()}
1873d90a144eSBram Moolenaar  call assert_fails('call F()', 'E48:')
1874d90a144eSBram Moolenaar  unlet F
1875d90a144eSBram Moolenaar
1876d90a144eSBram Moolenaar  call assert_fails('call Fsandbox()', 'E48:')
1877d90a144eSBram Moolenaar  delfunc Fsandbox
18788dfcce3aSBram Moolenaar
18798dfcce3aSBram Moolenaar  " From a sandbox try to set a predefined variable (which cannot be modified
18808dfcce3aSBram Moolenaar  " from a sandbox)
18818dfcce3aSBram Moolenaar  call assert_fails('sandbox let v:lnum = 10', 'E794:')
1882d90a144eSBram Moolenaarendfunc
18839e353b52SBram Moolenaar
18849e353b52SBram Moolenaarfunc EditAnotherFile()
18859e353b52SBram Moolenaar  let word = expand('<cword>')
18869e353b52SBram Moolenaar  edit Xfuncrange2
18879e353b52SBram Moolenaarendfunc
18889e353b52SBram Moolenaar
18899e353b52SBram Moolenaarfunc Test_func_range_with_edit()
18909e353b52SBram Moolenaar  " Define a function that edits another buffer, then call it with a range that
18919e353b52SBram Moolenaar  " is invalid in that buffer.
18929e353b52SBram Moolenaar  call writefile(['just one line'], 'Xfuncrange2')
18939e353b52SBram Moolenaar  new
1894196b4664SBram Moolenaar  eval 10->range()->setline(1)
18959e353b52SBram Moolenaar  write Xfuncrange1
18969e353b52SBram Moolenaar  call assert_fails('5,8call EditAnotherFile()', 'E16:')
18979e353b52SBram Moolenaar
18989e353b52SBram Moolenaar  call delete('Xfuncrange1')
18999e353b52SBram Moolenaar  call delete('Xfuncrange2')
19009e353b52SBram Moolenaar  bwipe!
19019e353b52SBram Moolenaarendfunc
1902ded5f1beSBram Moolenaar
1903ded5f1beSBram Moolenaarfunc Test_func_exists_on_reload()
1904ded5f1beSBram Moolenaar  call writefile(['func ExistingFunction()', 'echo "yes"', 'endfunc'], 'Xfuncexists')
1905ded5f1beSBram Moolenaar  call assert_equal(0, exists('*ExistingFunction'))
1906ded5f1beSBram Moolenaar  source Xfuncexists
1907a4208966SBram Moolenaar  call assert_equal(1, '*ExistingFunction'->exists())
1908ded5f1beSBram Moolenaar  " Redefining a function when reloading a script is OK.
1909ded5f1beSBram Moolenaar  source Xfuncexists
1910ded5f1beSBram Moolenaar  call assert_equal(1, exists('*ExistingFunction'))
1911ded5f1beSBram Moolenaar
1912ded5f1beSBram Moolenaar  " But redefining in another script is not OK.
1913ded5f1beSBram Moolenaar  call writefile(['func ExistingFunction()', 'echo "yes"', 'endfunc'], 'Xfuncexists2')
1914ded5f1beSBram Moolenaar  call assert_fails('source Xfuncexists2', 'E122:')
1915ded5f1beSBram Moolenaar
1916611728f8SYegappan Lakshmanan  " Defining a new function from the cmdline should fail if the function is
1917611728f8SYegappan Lakshmanan  " already defined
1918611728f8SYegappan Lakshmanan  call assert_fails('call feedkeys(":func ExistingFunction()\<CR>", "xt")', 'E122:')
1919611728f8SYegappan Lakshmanan
1920ded5f1beSBram Moolenaar  delfunc ExistingFunction
1921ded5f1beSBram Moolenaar  call assert_equal(0, exists('*ExistingFunction'))
1922ded5f1beSBram Moolenaar  call writefile([
1923ded5f1beSBram Moolenaar	\ 'func ExistingFunction()', 'echo "yes"', 'endfunc',
1924ded5f1beSBram Moolenaar	\ 'func ExistingFunction()', 'echo "no"', 'endfunc',
1925ded5f1beSBram Moolenaar	\ ], 'Xfuncexists')
1926ded5f1beSBram Moolenaar  call assert_fails('source Xfuncexists', 'E122:')
1927ded5f1beSBram Moolenaar  call assert_equal(1, exists('*ExistingFunction'))
1928ded5f1beSBram Moolenaar
1929ded5f1beSBram Moolenaar  call delete('Xfuncexists2')
1930ded5f1beSBram Moolenaar  call delete('Xfuncexists')
1931ded5f1beSBram Moolenaar  delfunc ExistingFunction
1932ded5f1beSBram Moolenaarendfunc
19332e050092SBram Moolenaar
19342e050092SBram Moolenaar" Test confirm({msg} [, {choices} [, {default} [, {type}]]])
19352e050092SBram Moolenaarfunc Test_confirm()
19368c5a278fSBram Moolenaar  CheckUnix
19378c5a278fSBram Moolenaar  CheckNotGui
19382e050092SBram Moolenaar
19392e050092SBram Moolenaar  call feedkeys('o', 'L')
19402e050092SBram Moolenaar  let a = confirm('Press O to proceed')
19412e050092SBram Moolenaar  call assert_equal(1, a)
19422e050092SBram Moolenaar
19432e050092SBram Moolenaar  call feedkeys('y', 'L')
19441a3a8916SBram Moolenaar  let a = 'Are you sure?'->confirm("&Yes\n&No")
19452e050092SBram Moolenaar  call assert_equal(1, a)
19462e050092SBram Moolenaar
19472e050092SBram Moolenaar  call feedkeys('n', 'L')
19482e050092SBram Moolenaar  let a = confirm('Are you sure?', "&Yes\n&No")
19492e050092SBram Moolenaar  call assert_equal(2, a)
19502e050092SBram Moolenaar
19512e050092SBram Moolenaar  " confirm() should return 0 when pressing CTRL-C.
19527929651eSBram Moolenaar  call feedkeys("\<C-C>", 'L')
19532e050092SBram Moolenaar  let a = confirm('Are you sure?', "&Yes\n&No")
19542e050092SBram Moolenaar  call assert_equal(0, a)
19552e050092SBram Moolenaar
19562e050092SBram Moolenaar  " <Esc> requires another character to avoid it being seen as the start of an
19572e050092SBram Moolenaar  " escape sequence.  Zero should be harmless.
1958a4208966SBram Moolenaar  eval "\<Esc>0"->feedkeys('L')
19592e050092SBram Moolenaar  let a = confirm('Are you sure?', "&Yes\n&No")
19602e050092SBram Moolenaar  call assert_equal(0, a)
19612e050092SBram Moolenaar
19622e050092SBram Moolenaar  " Default choice is returned when pressing <CR>.
19632e050092SBram Moolenaar  call feedkeys("\<CR>", 'L')
19642e050092SBram Moolenaar  let a = confirm('Are you sure?', "&Yes\n&No")
19652e050092SBram Moolenaar  call assert_equal(1, a)
19662e050092SBram Moolenaar
19672e050092SBram Moolenaar  call feedkeys("\<CR>", 'L')
19682e050092SBram Moolenaar  let a = confirm('Are you sure?', "&Yes\n&No", 2)
19692e050092SBram Moolenaar  call assert_equal(2, a)
19702e050092SBram Moolenaar
19712e050092SBram Moolenaar  call feedkeys("\<CR>", 'L')
19722e050092SBram Moolenaar  let a = confirm('Are you sure?', "&Yes\n&No", 0)
19732e050092SBram Moolenaar  call assert_equal(0, a)
19742e050092SBram Moolenaar
19752e050092SBram Moolenaar  " Test with the {type} 4th argument
19762e050092SBram Moolenaar  for type in ['Error', 'Question', 'Info', 'Warning', 'Generic']
19772e050092SBram Moolenaar    call feedkeys('y', 'L')
19782e050092SBram Moolenaar    let a = confirm('Are you sure?', "&Yes\n&No\n", 1, type)
19792e050092SBram Moolenaar    call assert_equal(1, a)
19802e050092SBram Moolenaar  endfor
19812e050092SBram Moolenaar
19822e050092SBram Moolenaar  call assert_fails('call confirm([])', 'E730:')
19832e050092SBram Moolenaar  call assert_fails('call confirm("Are you sure?", [])', 'E730:')
19842e050092SBram Moolenaar  call assert_fails('call confirm("Are you sure?", "&Yes\n&No\n", [])', 'E745:')
19852e050092SBram Moolenaar  call assert_fails('call confirm("Are you sure?", "&Yes\n&No\n", 0, [])', 'E730:')
19862e050092SBram Moolenaarendfunc
198739536dd5SBram Moolenaar
198839536dd5SBram Moolenaarfunc Test_platform_name()
198939536dd5SBram Moolenaar  " The system matches at most only one name.
1990041c7107SBram Moolenaar  let names = ['amiga', 'bsd', 'hpux', 'linux', 'mac', 'qnx', 'sun', 'vms', 'win32', 'win32unix']
199139536dd5SBram Moolenaar  call assert_inrange(0, 1, len(filter(copy(names), 'has(v:val)')))
199239536dd5SBram Moolenaar
199339536dd5SBram Moolenaar  " Is Unix?
199439536dd5SBram Moolenaar  call assert_equal(has('bsd'), has('bsd') && has('unix'))
199539536dd5SBram Moolenaar  call assert_equal(has('hpux'), has('hpux') && has('unix'))
199639536dd5SBram Moolenaar  call assert_equal(has('linux'), has('linux') && has('unix'))
199739536dd5SBram Moolenaar  call assert_equal(has('mac'), has('mac') && has('unix'))
199839536dd5SBram Moolenaar  call assert_equal(has('qnx'), has('qnx') && has('unix'))
199939536dd5SBram Moolenaar  call assert_equal(has('sun'), has('sun') && has('unix'))
200039536dd5SBram Moolenaar  call assert_equal(has('win32'), has('win32') && !has('unix'))
200139536dd5SBram Moolenaar  call assert_equal(has('win32unix'), has('win32unix') && has('unix'))
200239536dd5SBram Moolenaar
200339536dd5SBram Moolenaar  if has('unix') && executable('uname')
200439536dd5SBram Moolenaar    let uname = system('uname')
2005a02e3f65SBram Moolenaar    " GNU userland on BSD kernels (e.g., GNU/kFreeBSD) don't have BSD defined
2006a02e3f65SBram Moolenaar    call assert_equal(uname =~? '\%(GNU/k\w\+\)\@<!BSD\|DragonFly', has('bsd'))
200739536dd5SBram Moolenaar    call assert_equal(uname =~? 'HP-UX', has('hpux'))
200839536dd5SBram Moolenaar    call assert_equal(uname =~? 'Linux', has('linux'))
200939536dd5SBram Moolenaar    call assert_equal(uname =~? 'Darwin', has('mac'))
201039536dd5SBram Moolenaar    call assert_equal(uname =~? 'QNX', has('qnx'))
201139536dd5SBram Moolenaar    call assert_equal(uname =~? 'SunOS', has('sun'))
201239536dd5SBram Moolenaar    call assert_equal(uname =~? 'CYGWIN\|MSYS', has('win32unix'))
201339536dd5SBram Moolenaar  endif
201439536dd5SBram Moolenaarendfunc
2015543c9b19SBram Moolenaar
2016543c9b19SBram Moolenaarfunc Test_readdir()
2017543c9b19SBram Moolenaar  call mkdir('Xdir')
2018543c9b19SBram Moolenaar  call writefile([], 'Xdir/foo.txt')
2019543c9b19SBram Moolenaar  call writefile([], 'Xdir/bar.txt')
2020543c9b19SBram Moolenaar  call mkdir('Xdir/dir')
2021543c9b19SBram Moolenaar
2022543c9b19SBram Moolenaar  " All results
2023543c9b19SBram Moolenaar  let files = readdir('Xdir')
2024543c9b19SBram Moolenaar  call assert_equal(['bar.txt', 'dir', 'foo.txt'], sort(files))
2025543c9b19SBram Moolenaar
2026543c9b19SBram Moolenaar  " Only results containing "f"
2027a0d1fef4SBram Moolenaar  let files = 'Xdir'->readdir({ x -> stridx(x, 'f') != -1 })
2028543c9b19SBram Moolenaar  call assert_equal(['foo.txt'], sort(files))
2029543c9b19SBram Moolenaar
2030543c9b19SBram Moolenaar  " Only .txt files
2031543c9b19SBram Moolenaar  let files = readdir('Xdir', { x -> x =~ '.txt$' })
2032543c9b19SBram Moolenaar  call assert_equal(['bar.txt', 'foo.txt'], sort(files))
2033543c9b19SBram Moolenaar
2034543c9b19SBram Moolenaar  " Only .txt files with string
2035543c9b19SBram Moolenaar  let files = readdir('Xdir', 'v:val =~ ".txt$"')
2036543c9b19SBram Moolenaar  call assert_equal(['bar.txt', 'foo.txt'], sort(files))
2037543c9b19SBram Moolenaar
2038543c9b19SBram Moolenaar  " Limit to 1 result.
2039543c9b19SBram Moolenaar  let l = []
2040543c9b19SBram Moolenaar  let files = readdir('Xdir', {x -> len(add(l, x)) == 2 ? -1 : 1})
2041543c9b19SBram Moolenaar  call assert_equal(1, len(files))
2042543c9b19SBram Moolenaar
204327da7de7SBram Moolenaar  " Nested readdir() must not crash
204427da7de7SBram Moolenaar  let files = readdir('Xdir', 'readdir("Xdir", "1") != []')
20456c9ba042SBram Moolenaar  call sort(files)->assert_equal(['bar.txt', 'dir', 'foo.txt'])
20466c9ba042SBram Moolenaar
20476c9ba042SBram Moolenaar  eval 'Xdir'->delete('rf')
20486c9ba042SBram Moolenaarendfunc
20496c9ba042SBram Moolenaar
20506c9ba042SBram Moolenaarfunc Test_readdirex()
20516c9ba042SBram Moolenaar  call mkdir('Xdir')
2052441d60efSBram Moolenaar  call writefile(['foo'], 'Xdir/foo.txt')
2053441d60efSBram Moolenaar  call writefile(['barbar'], 'Xdir/bar.txt')
20546c9ba042SBram Moolenaar  call mkdir('Xdir/dir')
20556c9ba042SBram Moolenaar
20566c9ba042SBram Moolenaar  " All results
20576c9ba042SBram Moolenaar  let files = readdirex('Xdir')->map({-> v:val.name})
20586c9ba042SBram Moolenaar  call assert_equal(['bar.txt', 'dir', 'foo.txt'], sort(files))
2059441d60efSBram Moolenaar  let sizes = readdirex('Xdir')->map({-> v:val.size})
2060441d60efSBram Moolenaar  call assert_equal([0, 4, 7], sort(sizes))
20616c9ba042SBram Moolenaar
20626c9ba042SBram Moolenaar  " Only results containing "f"
20636c9ba042SBram Moolenaar  let files = 'Xdir'->readdirex({ e -> stridx(e.name, 'f') != -1 })
20646c9ba042SBram Moolenaar			  \ ->map({-> v:val.name})
20656c9ba042SBram Moolenaar  call assert_equal(['foo.txt'], sort(files))
20666c9ba042SBram Moolenaar
20676c9ba042SBram Moolenaar  " Only .txt files
20686c9ba042SBram Moolenaar  let files = readdirex('Xdir', { e -> e.name =~ '.txt$' })
20696c9ba042SBram Moolenaar			  \ ->map({-> v:val.name})
20706c9ba042SBram Moolenaar  call assert_equal(['bar.txt', 'foo.txt'], sort(files))
20716c9ba042SBram Moolenaar
20726c9ba042SBram Moolenaar  " Only .txt files with string
20736c9ba042SBram Moolenaar  let files = readdirex('Xdir', 'v:val.name =~ ".txt$"')
20746c9ba042SBram Moolenaar			  \ ->map({-> v:val.name})
20756c9ba042SBram Moolenaar  call assert_equal(['bar.txt', 'foo.txt'], sort(files))
20766c9ba042SBram Moolenaar
20776c9ba042SBram Moolenaar  " Limit to 1 result.
20786c9ba042SBram Moolenaar  let l = []
20796c9ba042SBram Moolenaar  let files = readdirex('Xdir', {e -> len(add(l, e.name)) == 2 ? -1 : 1})
20806c9ba042SBram Moolenaar			  \ ->map({-> v:val.name})
20816c9ba042SBram Moolenaar  call assert_equal(1, len(files))
20826c9ba042SBram Moolenaar
20836c9ba042SBram Moolenaar  " Nested readdirex() must not crash
20846c9ba042SBram Moolenaar  let files = readdirex('Xdir', 'readdirex("Xdir", "1") != []')
20856c9ba042SBram Moolenaar			  \ ->map({-> v:val.name})
208627da7de7SBram Moolenaar  call sort(files)->assert_equal(['bar.txt', 'dir', 'foo.txt'])
208727da7de7SBram Moolenaar
2088fdcbe3c3SBram Moolenaar  " report broken link correctly
2089ab54032fSBram Moolenaar  if has("unix")
2090ab54032fSBram Moolenaar    call writefile([], 'Xdir/abc.txt')
2091ab54032fSBram Moolenaar    call system("ln -s Xdir/abc.txt Xdir/link")
2092ab54032fSBram Moolenaar    call delete('Xdir/abc.txt')
2093ab54032fSBram Moolenaar    let files = readdirex('Xdir', 'readdirex("Xdir", "1") != []')
2094ab54032fSBram Moolenaar			  \ ->map({-> v:val.name .. '_' .. v:val.type})
2095ab54032fSBram Moolenaar    call sort(files)->assert_equal(
2096ab54032fSBram Moolenaar        \ ['bar.txt_file', 'dir_dir', 'foo.txt_file', 'link_link'])
2097ab54032fSBram Moolenaar  endif
20981a3a8916SBram Moolenaar  eval 'Xdir'->delete('rf')
2099aab9fadaSBram Moolenaar
2100aab9fadaSBram Moolenaar  call assert_fails('call readdirex("doesnotexist")', 'E484:')
2101543c9b19SBram Moolenaarendfunc
210217aca707SBram Moolenaar
210384cf6bd8SBram Moolenaarfunc Test_readdirex_sort()
210484cf6bd8SBram Moolenaar  CheckUnix
210584cf6bd8SBram Moolenaar  " Skip tests on Mac OS X and Cygwin (does not allow several files with different casing)
210684cf6bd8SBram Moolenaar  if has("osxdarwin") || has("osx") || has("macunix") || has("win32unix")
210784cf6bd8SBram Moolenaar    throw 'Skipped: Test_readdirex_sort on systems that do not allow this using the default filesystem'
210884cf6bd8SBram Moolenaar  endif
210984cf6bd8SBram Moolenaar  let _collate = v:collate
211084cf6bd8SBram Moolenaar  call mkdir('Xdir2')
211184cf6bd8SBram Moolenaar  call writefile(['1'], 'Xdir2/README.txt')
211284cf6bd8SBram Moolenaar  call writefile(['2'], 'Xdir2/Readme.txt')
211384cf6bd8SBram Moolenaar  call writefile(['3'], 'Xdir2/readme.txt')
211484cf6bd8SBram Moolenaar
211584cf6bd8SBram Moolenaar  " 1) default
211684cf6bd8SBram Moolenaar  let files = readdirex('Xdir2')->map({-> v:val.name})
211784cf6bd8SBram Moolenaar  let default = copy(files)
211884cf6bd8SBram Moolenaar  call assert_equal(['README.txt', 'Readme.txt', 'readme.txt'], files, 'sort using default')
211984cf6bd8SBram Moolenaar
212084cf6bd8SBram Moolenaar  " 2) no sorting
212184cf6bd8SBram Moolenaar  let files = readdirex('Xdir2', 1, #{sort: 'none'})->map({-> v:val.name})
212284cf6bd8SBram Moolenaar  let unsorted = copy(files)
212384cf6bd8SBram Moolenaar  call assert_equal(['README.txt', 'Readme.txt', 'readme.txt'], sort(files), 'unsorted')
2124a1bc6f12SBram Moolenaar  call assert_fails("call readdirex('Xdir2', 1, #{slort: 'none'})", 'E857: Dictionary key "sort" required')
212584cf6bd8SBram Moolenaar
212684cf6bd8SBram Moolenaar  " 3) sort by case (same as default)
212784cf6bd8SBram Moolenaar  let files = readdirex('Xdir2', 1, #{sort: 'case'})->map({-> v:val.name})
212884cf6bd8SBram Moolenaar  call assert_equal(default, files, 'sort by case')
212984cf6bd8SBram Moolenaar
213084cf6bd8SBram Moolenaar  " 4) sort by ignoring case
213184cf6bd8SBram Moolenaar  let files = readdirex('Xdir2', 1, #{sort: 'icase'})->map({-> v:val.name})
213284cf6bd8SBram Moolenaar  call assert_equal(unsorted->sort('i'), files, 'sort by icase')
213384cf6bd8SBram Moolenaar
213484cf6bd8SBram Moolenaar  " 5) Default Collation
213584cf6bd8SBram Moolenaar  let collate = v:collate
213684cf6bd8SBram Moolenaar  lang collate C
213784cf6bd8SBram Moolenaar  let files = readdirex('Xdir2', 1, #{sort: 'collate'})->map({-> v:val.name})
213884cf6bd8SBram Moolenaar  call assert_equal(['README.txt', 'Readme.txt', 'readme.txt'], files, 'sort by C collation')
213984cf6bd8SBram Moolenaar
214084cf6bd8SBram Moolenaar  " 6) Collation de_DE
214184cf6bd8SBram Moolenaar  " Switch locale, this may not work on the CI system, if the locale isn't
214284cf6bd8SBram Moolenaar  " available
214384cf6bd8SBram Moolenaar  try
214484cf6bd8SBram Moolenaar    lang collate de_DE
214584cf6bd8SBram Moolenaar    let files = readdirex('Xdir2', 1, #{sort: 'collate'})->map({-> v:val.name})
214684cf6bd8SBram Moolenaar    call assert_equal(['readme.txt', 'Readme.txt', 'README.txt'], files, 'sort by de_DE collation')
214784cf6bd8SBram Moolenaar  catch
214884cf6bd8SBram Moolenaar    throw 'Skipped: de_DE collation is not available'
214984cf6bd8SBram Moolenaar
215084cf6bd8SBram Moolenaar  finally
215184cf6bd8SBram Moolenaar    exe 'lang collate' collate
215284cf6bd8SBram Moolenaar    eval 'Xdir2'->delete('rf')
215384cf6bd8SBram Moolenaar  endtry
215484cf6bd8SBram Moolenaarendfunc
215584cf6bd8SBram Moolenaar
215684cf6bd8SBram Moolenaarfunc Test_readdir_sort()
215784cf6bd8SBram Moolenaar  " some more cases for testing sorting for readdirex
215884cf6bd8SBram Moolenaar  let dir = 'Xdir3'
215984cf6bd8SBram Moolenaar  call mkdir(dir)
216084cf6bd8SBram Moolenaar  call writefile(['1'], dir .. '/README.txt')
216184cf6bd8SBram Moolenaar  call writefile(['2'], dir .. '/Readm.txt')
216284cf6bd8SBram Moolenaar  call writefile(['3'], dir .. '/read.txt')
216384cf6bd8SBram Moolenaar  call writefile(['4'], dir .. '/Z.txt')
216484cf6bd8SBram Moolenaar  call writefile(['5'], dir .. '/a.txt')
216584cf6bd8SBram Moolenaar  call writefile(['6'], dir .. '/b.txt')
216684cf6bd8SBram Moolenaar
216784cf6bd8SBram Moolenaar  " 1) default
216884cf6bd8SBram Moolenaar  let files = readdir(dir)
216984cf6bd8SBram Moolenaar  let default = copy(files)
217084cf6bd8SBram Moolenaar  call assert_equal(default->sort(), files, 'sort using default')
217184cf6bd8SBram Moolenaar
217284cf6bd8SBram Moolenaar  " 2) sort by case (same as default)
217384cf6bd8SBram Moolenaar  let files = readdir(dir, '1', #{sort: 'case'})
217484cf6bd8SBram Moolenaar  call assert_equal(default, files, 'sort using default')
217584cf6bd8SBram Moolenaar
217684cf6bd8SBram Moolenaar  " 3) sort by ignoring case
217784cf6bd8SBram Moolenaar  let files = readdir(dir, '1', #{sort: 'icase'})
217884cf6bd8SBram Moolenaar  call assert_equal(default->sort('i'), files, 'sort by ignoring case')
217984cf6bd8SBram Moolenaar
2180e17f8817SBram Moolenaar  " 4) collation
2181e17f8817SBram Moolenaar  let collate = v:collate
2182e17f8817SBram Moolenaar  lang collate C
2183e17f8817SBram Moolenaar  let files = readdir(dir, 1, #{sort: 'collate'})
2184e17f8817SBram Moolenaar  call assert_equal(default->sort(), files, 'sort by C collation')
2185e17f8817SBram Moolenaar  exe "lang collate" collate
2186e17f8817SBram Moolenaar
2187e17f8817SBram Moolenaar  " 5) Errors
2188e2e4075fSBram Moolenaar  call assert_fails('call readdir(dir, 1, 1)', 'E715:')
2189e17f8817SBram Moolenaar  call assert_fails('call readdir(dir, 1, #{sorta: 1})')
2190e17f8817SBram Moolenaar  call assert_fails('call readdirex(dir, 1, #{sorta: 1})')
2191e17f8817SBram Moolenaar
2192e17f8817SBram Moolenaar  " 6) ignore other values in dict
2193e17f8817SBram Moolenaar  let files = readdir(dir, '1', #{sort: 'c'})
2194e17f8817SBram Moolenaar  call assert_equal(default, files, 'sort using default2')
2195e17f8817SBram Moolenaar
2196e17f8817SBram Moolenaar  " Cleanup
2197e17f8817SBram Moolenaar  exe "lang collate" collate
2198e17f8817SBram Moolenaar
219984cf6bd8SBram Moolenaar  eval dir->delete('rf')
220084cf6bd8SBram Moolenaarendfunc
220184cf6bd8SBram Moolenaar
2202701ff0a3SBram Moolenaarfunc Test_delete_rf()
2203701ff0a3SBram Moolenaar  call mkdir('Xdir')
2204701ff0a3SBram Moolenaar  call writefile([], 'Xdir/foo.txt')
2205701ff0a3SBram Moolenaar  call writefile([], 'Xdir/bar.txt')
2206701ff0a3SBram Moolenaar  call mkdir('Xdir/[a-1]')  " issue #696
2207701ff0a3SBram Moolenaar  call writefile([], 'Xdir/[a-1]/foo.txt')
2208701ff0a3SBram Moolenaar  call writefile([], 'Xdir/[a-1]/bar.txt')
2209701ff0a3SBram Moolenaar  call assert_true(filereadable('Xdir/foo.txt'))
2210a4208966SBram Moolenaar  call assert_true('Xdir/[a-1]/foo.txt'->filereadable())
2211701ff0a3SBram Moolenaar
2212701ff0a3SBram Moolenaar  call assert_equal(0, delete('Xdir', 'rf'))
2213701ff0a3SBram Moolenaar  call assert_false(filereadable('Xdir/foo.txt'))
2214701ff0a3SBram Moolenaar  call assert_false(filereadable('Xdir/[a-1]/foo.txt'))
2215701ff0a3SBram Moolenaarendfunc
2216701ff0a3SBram Moolenaar
221717aca707SBram Moolenaarfunc Test_call()
221817aca707SBram Moolenaar  call assert_equal(3, call('len', [123]))
221964b4d735SBram Moolenaar  call assert_equal(3, 'len'->call([123]))
222017aca707SBram Moolenaar  call assert_fails("call call('len', 123)", 'E714:')
222117aca707SBram Moolenaar  call assert_equal(0, call('', []))
2222ad48e6c1SBram Moolenaar  call assert_equal(0, call('len', test_null_list()))
222317aca707SBram Moolenaar
222417aca707SBram Moolenaar  function Mylen() dict
222517aca707SBram Moolenaar     return len(self.data)
222617aca707SBram Moolenaar  endfunction
222717aca707SBram Moolenaar  let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
222864b4d735SBram Moolenaar  eval mydict.len->call([], mydict)->assert_equal(4)
222917aca707SBram Moolenaar  call assert_fails("call call('Mylen', [], 0)", 'E715:')
223067322bf7SBram Moolenaar  call assert_fails('call foo', 'E107:')
2231fe8ebdbeSDominique Pelle
223222db0d54SBram Moolenaar  " These once caused a crash.
2233fe8ebdbeSDominique Pelle  call call(test_null_function(), [])
2234fe8ebdbeSDominique Pelle  call call(test_null_partial(), [])
223522db0d54SBram Moolenaar  call assert_fails('call test_null_function()()', 'E1192:')
223622db0d54SBram Moolenaar  call assert_fails('call test_null_partial()()', 'E117:')
223717aca707SBram Moolenaarendfunc
223817aca707SBram Moolenaar
223917aca707SBram Moolenaarfunc Test_char2nr()
224017aca707SBram Moolenaar  call assert_equal(12354, char2nr('あ', 1))
22411a3a8916SBram Moolenaar  call assert_equal(120, 'x'->char2nr())
22420e05de46SBram Moolenaar  set encoding=latin1
22430e05de46SBram Moolenaar  call assert_equal(120, 'x'->char2nr())
22440e05de46SBram Moolenaar  set encoding=utf-8
224517aca707SBram Moolenaarendfunc
224617aca707SBram Moolenaar
22474e4473c9SBram Moolenaarfunc Test_charclass()
22484e4473c9SBram Moolenaar  call assert_equal(0, charclass(' '))
22494e4473c9SBram Moolenaar  call assert_equal(1, charclass('.'))
22504e4473c9SBram Moolenaar  call assert_equal(2, charclass('x'))
22514e4473c9SBram Moolenaar  call assert_equal(3, charclass("\u203c"))
225272463f88SChristian Brabandt  " this used to crash vim
225372463f88SChristian Brabandt  call assert_equal(0, "xxx"[-1]->charclass())
22544e4473c9SBram Moolenaarendfunc
22554e4473c9SBram Moolenaar
225617aca707SBram Moolenaarfunc Test_eventhandler()
225717aca707SBram Moolenaar  call assert_equal(0, eventhandler())
225817aca707SBram Moolenaarendfunc
225915e248e3SBram Moolenaar
226015e248e3SBram Moolenaarfunc Test_bufadd_bufload()
226115e248e3SBram Moolenaar  call assert_equal(0, bufexists('someName'))
226215e248e3SBram Moolenaar  let buf = bufadd('someName')
226315e248e3SBram Moolenaar  call assert_notequal(0, buf)
226415e248e3SBram Moolenaar  call assert_equal(1, bufexists('someName'))
226515e248e3SBram Moolenaar  call assert_equal(0, getbufvar(buf, '&buflisted'))
226615e248e3SBram Moolenaar  call assert_equal(0, bufloaded(buf))
226715e248e3SBram Moolenaar  call bufload(buf)
226815e248e3SBram Moolenaar  call assert_equal(1, bufloaded(buf))
226915e248e3SBram Moolenaar  call assert_equal([''], getbufline(buf, 1, '$'))
227015e248e3SBram Moolenaar
227115e248e3SBram Moolenaar  let curbuf = bufnr('')
2272f92e58caSBram Moolenaar  eval ['some', 'text']->writefile('XotherName')
2273073e4b92SBram Moolenaar  let buf = 'XotherName'->bufadd()
227415e248e3SBram Moolenaar  call assert_notequal(0, buf)
2275073e4b92SBram Moolenaar  eval 'XotherName'->bufexists()->assert_equal(1)
227615e248e3SBram Moolenaar  call assert_equal(0, getbufvar(buf, '&buflisted'))
227715e248e3SBram Moolenaar  call assert_equal(0, bufloaded(buf))
2278073e4b92SBram Moolenaar  eval buf->bufload()
227915e248e3SBram Moolenaar  call assert_equal(1, bufloaded(buf))
228015e248e3SBram Moolenaar  call assert_equal(['some', 'text'], getbufline(buf, 1, '$'))
228115e248e3SBram Moolenaar  call assert_equal(curbuf, bufnr(''))
228215e248e3SBram Moolenaar
2283892ae723SBram Moolenaar  let buf1 = bufadd('')
2284892ae723SBram Moolenaar  let buf2 = bufadd('')
2285892ae723SBram Moolenaar  call assert_notequal(0, buf1)
2286892ae723SBram Moolenaar  call assert_notequal(0, buf2)
2287892ae723SBram Moolenaar  call assert_notequal(buf1, buf2)
2288892ae723SBram Moolenaar  call assert_equal(1, bufexists(buf1))
2289892ae723SBram Moolenaar  call assert_equal(1, bufexists(buf2))
2290892ae723SBram Moolenaar  call assert_equal(0, bufloaded(buf1))
2291892ae723SBram Moolenaar  exe 'bwipe ' .. buf1
2292892ae723SBram Moolenaar  call assert_equal(0, bufexists(buf1))
2293892ae723SBram Moolenaar  call assert_equal(1, bufexists(buf2))
2294892ae723SBram Moolenaar  exe 'bwipe ' .. buf2
2295892ae723SBram Moolenaar  call assert_equal(0, bufexists(buf2))
2296892ae723SBram Moolenaar
229715e248e3SBram Moolenaar  bwipe someName
22983940ec6dSBram Moolenaar  bwipe XotherName
229915e248e3SBram Moolenaar  call assert_equal(0, bufexists('someName'))
23003940ec6dSBram Moolenaar  call delete('XotherName')
230115e248e3SBram Moolenaarendfunc
2302c2585490SBram Moolenaar
2303c2585490SBram Moolenaarfunc Test_state()
2304c2585490SBram Moolenaar  CheckRunVimInTerminal
2305f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
2306c2585490SBram Moolenaar
23073ed9efc2SBram Moolenaar  let getstate = ":echo 'state: ' .. g:state .. '; mode: ' .. g:mode\<CR>"
23083ed9efc2SBram Moolenaar
2309c2585490SBram Moolenaar  let lines =<< trim END
2310c2585490SBram Moolenaar	call setline(1, ['one', 'two', 'three'])
2311c2585490SBram Moolenaar	map ;; gg
2312b7a97ef3SBram Moolenaar	set complete=.
2313c2585490SBram Moolenaar	func RunTimer()
2314c2585490SBram Moolenaar	  call timer_start(10, {id -> execute('let g:state = state()') .. execute('let g:mode = mode()')})
2315c2585490SBram Moolenaar	endfunc
2316c2585490SBram Moolenaar	au Filetype foobar let g:state = state()|let g:mode = mode()
2317c2585490SBram Moolenaar  END
2318c2585490SBram Moolenaar  call writefile(lines, 'XState')
2319c2585490SBram Moolenaar  let buf = RunVimInTerminal('-S XState', #{rows: 6})
2320c2585490SBram Moolenaar
2321c2585490SBram Moolenaar  " Using a ":" command Vim is busy, thus "S" is returned
2322c2585490SBram Moolenaar  call term_sendkeys(buf, ":echo 'state: ' .. state() .. '; mode: ' .. mode()\<CR>")
2323c2585490SBram Moolenaar  call WaitForAssert({-> assert_match('state: S; mode: n', term_getline(buf, 6))}, 1000)
2324c2585490SBram Moolenaar  call term_sendkeys(buf, ":\<CR>")
2325c2585490SBram Moolenaar
2326c2585490SBram Moolenaar  " Using a timer callback
2327c2585490SBram Moolenaar  call term_sendkeys(buf, ":call RunTimer()\<CR>")
23286a2c5a7dSBram Moolenaar  call TermWait(buf, 25)
2329c2585490SBram Moolenaar  call term_sendkeys(buf, getstate)
2330c2585490SBram Moolenaar  call WaitForAssert({-> assert_match('state: c; mode: n', term_getline(buf, 6))}, 1000)
2331c2585490SBram Moolenaar
2332c2585490SBram Moolenaar  " Halfway a mapping
2333c2585490SBram Moolenaar  call term_sendkeys(buf, ":call RunTimer()\<CR>;")
23346a2c5a7dSBram Moolenaar  call TermWait(buf, 25)
2335c2585490SBram Moolenaar  call term_sendkeys(buf, ";")
2336c2585490SBram Moolenaar  call term_sendkeys(buf, getstate)
2337c2585490SBram Moolenaar  call WaitForAssert({-> assert_match('state: mSc; mode: n', term_getline(buf, 6))}, 1000)
2338c2585490SBram Moolenaar
2339b7a97ef3SBram Moolenaar  " Insert mode completion (bit slower on Mac)
2340c2585490SBram Moolenaar  call term_sendkeys(buf, ":call RunTimer()\<CR>Got\<C-N>")
23416a2c5a7dSBram Moolenaar  call TermWait(buf, 25)
2342c2585490SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
2343c2585490SBram Moolenaar  call term_sendkeys(buf, getstate)
2344c2585490SBram Moolenaar  call WaitForAssert({-> assert_match('state: aSc; mode: i', term_getline(buf, 6))}, 1000)
2345c2585490SBram Moolenaar
2346c2585490SBram Moolenaar  " Autocommand executing
2347c2585490SBram Moolenaar  call term_sendkeys(buf, ":set filetype=foobar\<CR>")
23486a2c5a7dSBram Moolenaar  call TermWait(buf, 25)
2349c2585490SBram Moolenaar  call term_sendkeys(buf, getstate)
2350c2585490SBram Moolenaar  call WaitForAssert({-> assert_match('state: xS; mode: n', term_getline(buf, 6))}, 1000)
2351c2585490SBram Moolenaar
2352c2585490SBram Moolenaar  " Todo: "w" - waiting for ch_evalexpr()
2353c2585490SBram Moolenaar
2354c2585490SBram Moolenaar  " messages scrolled
2355c2585490SBram Moolenaar  call term_sendkeys(buf, ":call RunTimer()\<CR>:echo \"one\\ntwo\\nthree\"\<CR>")
23566a2c5a7dSBram Moolenaar  call TermWait(buf, 25)
2357c2585490SBram Moolenaar  call term_sendkeys(buf, "\<CR>")
2358c2585490SBram Moolenaar  call term_sendkeys(buf, getstate)
2359c2585490SBram Moolenaar  call WaitForAssert({-> assert_match('state: Scs; mode: r', term_getline(buf, 6))}, 1000)
2360c2585490SBram Moolenaar
2361c2585490SBram Moolenaar  call StopVimInTerminal(buf)
2362c2585490SBram Moolenaar  call delete('XState')
2363c2585490SBram Moolenaarendfunc
236450985eb1SBram Moolenaar
236550985eb1SBram Moolenaarfunc Test_range()
236650985eb1SBram Moolenaar  " destructuring
236750985eb1SBram Moolenaar  let [x, y] = range(2)
236850985eb1SBram Moolenaar  call assert_equal([0, 1], [x, y])
236950985eb1SBram Moolenaar
237050985eb1SBram Moolenaar  " index
237150985eb1SBram Moolenaar  call assert_equal(4, range(1, 10)[3])
237250985eb1SBram Moolenaar
237350985eb1SBram Moolenaar  " add()
237450985eb1SBram Moolenaar  call assert_equal([0, 1, 2, 3], add(range(3), 3))
237550985eb1SBram Moolenaar  call assert_equal([0, 1, 2, [0, 1, 2]], add([0, 1, 2], range(3)))
237650985eb1SBram Moolenaar  call assert_equal([0, 1, 2, [0, 1, 2]], add(range(3), range(3)))
237750985eb1SBram Moolenaar
237850985eb1SBram Moolenaar  " append()
237950985eb1SBram Moolenaar  new
238050985eb1SBram Moolenaar  call append('.', range(5))
238150985eb1SBram Moolenaar  call assert_equal(['', '0', '1', '2', '3', '4'], getline(1, '$'))
238250985eb1SBram Moolenaar  bwipe!
238350985eb1SBram Moolenaar
238450985eb1SBram Moolenaar  " appendbufline()
238550985eb1SBram Moolenaar  new
238650985eb1SBram Moolenaar  call appendbufline(bufnr(''), '.', range(5))
238750985eb1SBram Moolenaar  call assert_equal(['0', '1', '2', '3', '4', ''], getline(1, '$'))
238850985eb1SBram Moolenaar  bwipe!
238950985eb1SBram Moolenaar
239050985eb1SBram Moolenaar  " call()
239150985eb1SBram Moolenaar  func TwoArgs(a, b)
239250985eb1SBram Moolenaar    return [a:a, a:b]
239350985eb1SBram Moolenaar  endfunc
239450985eb1SBram Moolenaar  call assert_equal([0, 1], call('TwoArgs', range(2)))
239550985eb1SBram Moolenaar
239650985eb1SBram Moolenaar  " col()
239750985eb1SBram Moolenaar  new
239850985eb1SBram Moolenaar  call setline(1, ['foo', 'bar'])
239950985eb1SBram Moolenaar  call assert_equal(2, col(range(1, 2)))
240050985eb1SBram Moolenaar  bwipe!
240150985eb1SBram Moolenaar
240250985eb1SBram Moolenaar  " complete()
240350985eb1SBram Moolenaar  execute "normal! a\<C-r>=[complete(col('.'), range(10)), ''][1]\<CR>"
240450985eb1SBram Moolenaar  " complete_info()
240550985eb1SBram Moolenaar  execute "normal! a\<C-r>=[complete(col('.'), range(10)), ''][1]\<CR>\<C-r>=[complete_info(range(5)), ''][1]\<CR>"
240650985eb1SBram Moolenaar
240750985eb1SBram Moolenaar  " copy()
240850985eb1SBram Moolenaar  call assert_equal([1, 2, 3], copy(range(1, 3)))
240950985eb1SBram Moolenaar
241050985eb1SBram Moolenaar  " count()
241150985eb1SBram Moolenaar  call assert_equal(0, count(range(0), 3))
241250985eb1SBram Moolenaar  call assert_equal(0, count(range(2), 3))
241350985eb1SBram Moolenaar  call assert_equal(1, count(range(5), 3))
241450985eb1SBram Moolenaar
241550985eb1SBram Moolenaar  " cursor()
241650985eb1SBram Moolenaar  new
241750985eb1SBram Moolenaar  call setline(1, ['aaa', 'bbb', 'ccc'])
241850985eb1SBram Moolenaar  call cursor(range(1, 2))
241950985eb1SBram Moolenaar  call assert_equal([2, 1], [col('.'), line('.')])
242050985eb1SBram Moolenaar  bwipe!
242150985eb1SBram Moolenaar
242250985eb1SBram Moolenaar  " deepcopy()
242350985eb1SBram Moolenaar  call assert_equal([1, 2, 3], deepcopy(range(1, 3)))
242450985eb1SBram Moolenaar
242550985eb1SBram Moolenaar  " empty()
242650985eb1SBram Moolenaar  call assert_true(empty(range(0)))
242750985eb1SBram Moolenaar  call assert_false(empty(range(2)))
242850985eb1SBram Moolenaar
242950985eb1SBram Moolenaar  " execute()
243050985eb1SBram Moolenaar  new
243150985eb1SBram Moolenaar  call setline(1, ['aaa', 'bbb', 'ccc'])
243250985eb1SBram Moolenaar  call execute(range(3))
243350985eb1SBram Moolenaar  call assert_equal(2, line('.'))
243450985eb1SBram Moolenaar  bwipe!
243550985eb1SBram Moolenaar
243650985eb1SBram Moolenaar  " extend()
243750985eb1SBram Moolenaar  call assert_equal([1, 2, 3, 4], extend([1], range(2, 4)))
243850985eb1SBram Moolenaar  call assert_equal([1, 2, 3, 4], extend(range(1, 1), range(2, 4)))
243950985eb1SBram Moolenaar  call assert_equal([1, 2, 3, 4], extend(range(1, 1), [2, 3, 4]))
244050985eb1SBram Moolenaar
244150985eb1SBram Moolenaar  " filter()
244250985eb1SBram Moolenaar  call assert_equal([1, 3], filter(range(5), 'v:val % 2'))
2443f8ca03bfSBram Moolenaar  call assert_equal([1, 5, 7, 11, 13], filter(filter(range(15), 'v:val % 2'), 'v:val % 3'))
244450985eb1SBram Moolenaar
244550985eb1SBram Moolenaar  " funcref()
244650985eb1SBram Moolenaar  call assert_equal([0, 1], funcref('TwoArgs', range(2))())
244750985eb1SBram Moolenaar
244850985eb1SBram Moolenaar  " function()
244950985eb1SBram Moolenaar  call assert_equal([0, 1], function('TwoArgs', range(2))())
245050985eb1SBram Moolenaar
245150985eb1SBram Moolenaar  " garbagecollect()
245250985eb1SBram Moolenaar  let thelist = [1, range(2), 3]
245350985eb1SBram Moolenaar  let otherlist = range(3)
245450985eb1SBram Moolenaar  call test_garbagecollect_now()
245550985eb1SBram Moolenaar
245650985eb1SBram Moolenaar  " get()
245750985eb1SBram Moolenaar  call assert_equal(4, get(range(1, 10), 3))
245850985eb1SBram Moolenaar  call assert_equal(-1, get(range(1, 10), 42, -1))
245950985eb1SBram Moolenaar
246050985eb1SBram Moolenaar  " index()
246150985eb1SBram Moolenaar  call assert_equal(1, index(range(1, 5), 2))
24620e05de46SBram Moolenaar  call assert_fails("echo index([1, 2], 1, [])", 'E745:')
246350985eb1SBram Moolenaar
246450985eb1SBram Moolenaar  " inputlist()
2465272ca95fSBram Moolenaar  call feedkeys(":let result = inputlist(range(10))\<CR>1\<CR>", 'x')
2466272ca95fSBram Moolenaar  call assert_equal(1, result)
2467272ca95fSBram Moolenaar  call feedkeys(":let result = inputlist(range(3, 10))\<CR>1\<CR>", 'x')
2468272ca95fSBram Moolenaar  call assert_equal(1, result)
246950985eb1SBram Moolenaar
247050985eb1SBram Moolenaar  " insert()
247150985eb1SBram Moolenaar  call assert_equal([42, 1, 2, 3, 4, 5], insert(range(1, 5), 42))
247250985eb1SBram Moolenaar  call assert_equal([42, 1, 2, 3, 4, 5], insert(range(1, 5), 42, 0))
247350985eb1SBram Moolenaar  call assert_equal([1, 42, 2, 3, 4, 5], insert(range(1, 5), 42, 1))
247450985eb1SBram Moolenaar  call assert_equal([1, 2, 3, 4, 42, 5], insert(range(1, 5), 42, 4))
247550985eb1SBram Moolenaar  call assert_equal([1, 2, 3, 4, 42, 5], insert(range(1, 5), 42, -1))
247650985eb1SBram Moolenaar  call assert_equal([1, 2, 3, 4, 5, 42], insert(range(1, 5), 42, 5))
247750985eb1SBram Moolenaar
247850985eb1SBram Moolenaar  " join()
247950985eb1SBram Moolenaar  call assert_equal('0 1 2 3 4', join(range(5)))
248050985eb1SBram Moolenaar
2481272ca95fSBram Moolenaar  " json_encode()
2482272ca95fSBram Moolenaar  call assert_equal('[0,1,2,3]', json_encode(range(4)))
2483272ca95fSBram Moolenaar
248450985eb1SBram Moolenaar  " len()
248550985eb1SBram Moolenaar  call assert_equal(0, len(range(0)))
248650985eb1SBram Moolenaar  call assert_equal(2, len(range(2)))
248750985eb1SBram Moolenaar  call assert_equal(5, len(range(0, 12, 3)))
248850985eb1SBram Moolenaar  call assert_equal(4, len(range(3, 0, -1)))
248950985eb1SBram Moolenaar
249050985eb1SBram Moolenaar  " list2str()
249150985eb1SBram Moolenaar  call assert_equal('ABC', list2str(range(65, 67)))
249208f4157cSBram Moolenaar  call assert_fails('let s = list2str(5)', 'E474:')
249350985eb1SBram Moolenaar
249450985eb1SBram Moolenaar  " lock()
249550985eb1SBram Moolenaar  let thelist = range(5)
249650985eb1SBram Moolenaar  lockvar thelist
249750985eb1SBram Moolenaar
249850985eb1SBram Moolenaar  " map()
249950985eb1SBram Moolenaar  call assert_equal([0, 2, 4, 6, 8], map(range(5), 'v:val * 2'))
2500f8ca03bfSBram Moolenaar  call assert_equal([3, 5, 7, 9, 11], map(map(range(5), 'v:val * 2'), 'v:val + 3'))
2501f8ca03bfSBram Moolenaar  call assert_equal([2, 6], map(filter(range(5), 'v:val % 2'), 'v:val * 2'))
2502f8ca03bfSBram Moolenaar  call assert_equal([2, 4, 8], filter(map(range(5), 'v:val * 2'), 'v:val % 3'))
250350985eb1SBram Moolenaar
250450985eb1SBram Moolenaar  " match()
250550985eb1SBram Moolenaar  call assert_equal(3, match(range(5), 3))
250650985eb1SBram Moolenaar
250750985eb1SBram Moolenaar  " matchaddpos()
250850985eb1SBram Moolenaar  highlight MyGreenGroup ctermbg=green guibg=green
250950985eb1SBram Moolenaar  call matchaddpos('MyGreenGroup', range(line('.'), line('.')))
251050985eb1SBram Moolenaar
251150985eb1SBram Moolenaar  " matchend()
251250985eb1SBram Moolenaar  call assert_equal(4, matchend(range(5), '4'))
251350985eb1SBram Moolenaar  call assert_equal(3, matchend(range(1, 5), '4'))
251450985eb1SBram Moolenaar  call assert_equal(-1, matchend(range(1, 5), '42'))
251550985eb1SBram Moolenaar
251650985eb1SBram Moolenaar  " matchstrpos()
251750985eb1SBram Moolenaar  call assert_equal(['4', 4, 0, 1], matchstrpos(range(5), '4'))
251850985eb1SBram Moolenaar  call assert_equal(['4', 3, 0, 1], matchstrpos(range(1, 5), '4'))
251950985eb1SBram Moolenaar  call assert_equal(['', -1, -1, -1], matchstrpos(range(1, 5), '42'))
252050985eb1SBram Moolenaar
252150985eb1SBram Moolenaar  " max() reverse()
252250985eb1SBram Moolenaar  call assert_equal(0, max(range(0)))
252350985eb1SBram Moolenaar  call assert_equal(0, max(range(10, 9)))
252450985eb1SBram Moolenaar  call assert_equal(9, max(range(10)))
252550985eb1SBram Moolenaar  call assert_equal(18, max(range(0, 20, 3)))
252650985eb1SBram Moolenaar  call assert_equal(20, max(range(20, 0, -3)))
252750985eb1SBram Moolenaar  call assert_equal(99999, max(range(100000)))
252850985eb1SBram Moolenaar  call assert_equal(99999, max(range(99999, 0, -1)))
252950985eb1SBram Moolenaar  call assert_equal(99999, max(reverse(range(100000))))
253050985eb1SBram Moolenaar  call assert_equal(99999, max(reverse(range(99999, 0, -1))))
253150985eb1SBram Moolenaar
253250985eb1SBram Moolenaar  " min() reverse()
253350985eb1SBram Moolenaar  call assert_equal(0, min(range(0)))
253450985eb1SBram Moolenaar  call assert_equal(0, min(range(10, 9)))
253550985eb1SBram Moolenaar  call assert_equal(5, min(range(5, 10)))
253650985eb1SBram Moolenaar  call assert_equal(5, min(range(5, 10, 3)))
253750985eb1SBram Moolenaar  call assert_equal(2, min(range(20, 0, -3)))
253850985eb1SBram Moolenaar  call assert_equal(0, min(range(100000)))
253950985eb1SBram Moolenaar  call assert_equal(0, min(range(99999, 0, -1)))
254050985eb1SBram Moolenaar  call assert_equal(0, min(reverse(range(100000))))
254150985eb1SBram Moolenaar  call assert_equal(0, min(reverse(range(99999, 0, -1))))
254250985eb1SBram Moolenaar
254350985eb1SBram Moolenaar  " remove()
254450985eb1SBram Moolenaar  call assert_equal(1, remove(range(1, 10), 0))
254550985eb1SBram Moolenaar  call assert_equal(2, remove(range(1, 10), 1))
254650985eb1SBram Moolenaar  call assert_equal(9, remove(range(1, 10), 8))
254750985eb1SBram Moolenaar  call assert_equal(10, remove(range(1, 10), 9))
254850985eb1SBram Moolenaar  call assert_equal(10, remove(range(1, 10), -1))
254950985eb1SBram Moolenaar  call assert_equal([3, 4, 5], remove(range(1, 10), 2, 4))
255050985eb1SBram Moolenaar
255150985eb1SBram Moolenaar  " repeat()
255250985eb1SBram Moolenaar  call assert_equal([0, 1, 2, 0, 1, 2], repeat(range(3), 2))
255350985eb1SBram Moolenaar  call assert_equal([0, 1, 2], repeat(range(3), 1))
255450985eb1SBram Moolenaar  call assert_equal([], repeat(range(3), 0))
255550985eb1SBram Moolenaar  call assert_equal([], repeat(range(5, 4), 2))
255650985eb1SBram Moolenaar  call assert_equal([], repeat(range(5, 4), 0))
255750985eb1SBram Moolenaar
255850985eb1SBram Moolenaar  " reverse()
255950985eb1SBram Moolenaar  call assert_equal([2, 1, 0], reverse(range(3)))
256050985eb1SBram Moolenaar  call assert_equal([0, 1, 2, 3], reverse(range(3, 0, -1)))
256150985eb1SBram Moolenaar  call assert_equal([9, 8, 7, 6, 5, 4, 3, 2, 1, 0], reverse(range(10)))
256250985eb1SBram Moolenaar  call assert_equal([20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10], reverse(range(10, 20)))
256350985eb1SBram Moolenaar  call assert_equal([16, 13, 10], reverse(range(10, 18, 3)))
256450985eb1SBram Moolenaar  call assert_equal([19, 16, 13, 10], reverse(range(10, 19, 3)))
256550985eb1SBram Moolenaar  call assert_equal([19, 16, 13, 10], reverse(range(10, 20, 3)))
256650985eb1SBram Moolenaar  call assert_equal([11, 14, 17, 20], reverse(range(20, 10, -3)))
256750985eb1SBram Moolenaar  call assert_equal([], reverse(range(0)))
256850985eb1SBram Moolenaar
256950985eb1SBram Moolenaar  " TODO: setpos()
257050985eb1SBram Moolenaar  " new
257150985eb1SBram Moolenaar  " call setline(1, repeat([''], bufnr('')))
257250985eb1SBram Moolenaar  " call setline(bufnr('') + 1, repeat('x', bufnr('') * 2 + 6))
257350985eb1SBram Moolenaar  " call setpos('x', range(bufnr(''), bufnr('') + 3))
257450985eb1SBram Moolenaar  " bwipe!
257550985eb1SBram Moolenaar
257650985eb1SBram Moolenaar  " setreg()
257750985eb1SBram Moolenaar  call setreg('a', range(3))
257850985eb1SBram Moolenaar  call assert_equal("0\n1\n2\n", getreg('a'))
257950985eb1SBram Moolenaar
2580b0992020SBram Moolenaar  " settagstack()
2581b0992020SBram Moolenaar  call settagstack(1, #{items : range(4)})
2582b0992020SBram Moolenaar
2583b0992020SBram Moolenaar  " sign_define()
2584b0992020SBram Moolenaar  call assert_fails("call sign_define(range(5))", "E715:")
2585b0992020SBram Moolenaar  call assert_fails("call sign_placelist(range(5))", "E715:")
2586b0992020SBram Moolenaar
2587b0992020SBram Moolenaar  " sign_undefine()
2588b0992020SBram Moolenaar  call assert_fails("call sign_undefine(range(5))", "E908:")
2589b0992020SBram Moolenaar
2590b0992020SBram Moolenaar  " sign_unplacelist()
2591b0992020SBram Moolenaar  call assert_fails("call sign_unplacelist(range(5))", "E715:")
2592b0992020SBram Moolenaar
259350985eb1SBram Moolenaar  " sort()
259450985eb1SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4, 5], sort(range(5, 0, -1)))
259550985eb1SBram Moolenaar
259650985eb1SBram Moolenaar  " string()
259750985eb1SBram Moolenaar  call assert_equal('[0, 1, 2, 3, 4]', string(range(5)))
259850985eb1SBram Moolenaar
2599b0992020SBram Moolenaar  " taglist() with 'tagfunc'
2600b0992020SBram Moolenaar  func TagFunc(pattern, flags, info)
2601b0992020SBram Moolenaar    return range(10)
2602b0992020SBram Moolenaar  endfunc
2603b0992020SBram Moolenaar  set tagfunc=TagFunc
2604b0992020SBram Moolenaar  call assert_fails("call taglist('asdf')", 'E987:')
2605b0992020SBram Moolenaar  set tagfunc=
2606b0992020SBram Moolenaar
2607b0992020SBram Moolenaar  " term_start()
2608705724e4SBram Moolenaar  if has('terminal') && has('termguicolors')
2609b0992020SBram Moolenaar    call assert_fails('call term_start(range(3, 4))', 'E474:')
2610b0992020SBram Moolenaar    let g:terminal_ansi_colors = range(16)
261194255df0SBram Moolenaar    if has('win32')
261294255df0SBram Moolenaar      let cmd = "cmd /c dir"
261394255df0SBram Moolenaar    else
261494255df0SBram Moolenaar      let cmd = "ls"
261594255df0SBram Moolenaar    endif
261694255df0SBram Moolenaar    call assert_fails('call term_start("' .. cmd .. '", #{term_finish: "close"})', 'E475:')
2617b0992020SBram Moolenaar    unlet g:terminal_ansi_colors
2618b0992020SBram Moolenaar  endif
2619b0992020SBram Moolenaar
262050985eb1SBram Moolenaar  " type()
262150985eb1SBram Moolenaar  call assert_equal(v:t_list, type(range(5)))
262250985eb1SBram Moolenaar
262350985eb1SBram Moolenaar  " uniq()
262450985eb1SBram Moolenaar  call assert_equal([0, 1, 2, 3, 4], uniq(range(5)))
26250e05de46SBram Moolenaar
26260e05de46SBram Moolenaar  " errors
26270e05de46SBram Moolenaar  call assert_fails('let x=range(2, 8, 0)', 'E726:')
26280e05de46SBram Moolenaar  call assert_fails('let x=range(3, 1)', 'E727:')
26290e05de46SBram Moolenaar  call assert_fails('let x=range(1, 3, -2)', 'E727:')
263099fa7219SBram Moolenaar  call assert_fails('let x=range([])', 'E745:')
263199fa7219SBram Moolenaar  call assert_fails('let x=range(1, [])', 'E745:')
263299fa7219SBram Moolenaar  call assert_fails('let x=range(1, 4, [])', 'E745:')
263350985eb1SBram Moolenaarendfunc
26344132eb50SBram Moolenaar
26354132eb50SBram Moolenaarfunc Test_echoraw()
26364132eb50SBram Moolenaar  CheckScreendump
26374132eb50SBram Moolenaar
26384132eb50SBram Moolenaar  " Normally used for escape codes, but let's test with a CR.
26394132eb50SBram Moolenaar  let lines =<< trim END
26404132eb50SBram Moolenaar    call echoraw("hello\<CR>x")
26414132eb50SBram Moolenaar  END
26424132eb50SBram Moolenaar  call writefile(lines, 'XTest_echoraw')
26434132eb50SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_echoraw', {'rows': 5, 'cols': 40})
26444132eb50SBram Moolenaar  call VerifyScreenDump(buf, 'Test_functions_echoraw', {})
26454132eb50SBram Moolenaar
26464132eb50SBram Moolenaar  " clean up
26474132eb50SBram Moolenaar  call StopVimInTerminal(buf)
26484132eb50SBram Moolenaar  call delete('XTest_echoraw')
26494132eb50SBram Moolenaarendfunc
26508d588cceSBram Moolenaar
265192b83ccfSBram Moolenaar" Test for echo highlighting
265292b83ccfSBram Moolenaarfunc Test_echohl()
265392b83ccfSBram Moolenaar  echohl Search
265492b83ccfSBram Moolenaar  echo 'Vim'
265592b83ccfSBram Moolenaar  call assert_equal('Vim', Screenline(&lines))
265692b83ccfSBram Moolenaar  " TODO: How to check the highlight group used by echohl?
265792b83ccfSBram Moolenaar  " ScreenAttrs() returns all zeros.
265892b83ccfSBram Moolenaar  echohl None
265992b83ccfSBram Moolenaarendfunc
266092b83ccfSBram Moolenaar
26610e05de46SBram Moolenaar" Test for the eval() function
26620e05de46SBram Moolenaarfunc Test_eval()
26630e05de46SBram Moolenaar  call assert_fails("call eval('5 a')", 'E488:')
26640e05de46SBram Moolenaarendfunc
26650e05de46SBram Moolenaar
26660e05de46SBram Moolenaar" Test for the nr2char() function
26670e05de46SBram Moolenaarfunc Test_nr2char()
26680e05de46SBram Moolenaar  set encoding=latin1
26690e05de46SBram Moolenaar  call assert_equal('@', nr2char(64))
26700e05de46SBram Moolenaar  set encoding=utf8
26710e05de46SBram Moolenaar  call assert_equal('a', nr2char(97, 1))
26720e05de46SBram Moolenaar  call assert_equal('a', nr2char(97, 0))
2673f7271e83SBram Moolenaar
2674f7271e83SBram Moolenaar  call assert_equal("\x80\xfc\b\xf4\x80\xfeX\x80\xfeX\x80\xfeX", eval('"\<M-' .. nr2char(0x100000) .. '>"'))
26751919371bSBram Moolenaar  call assert_equal("\x80\xfc\b\xfd\x80\xfeX\x80\xfeX\x80\xfeX\x80\xfeX\x80\xfeX", eval('"\<M-' .. nr2char(0x40000000) .. '>"'))
26760e05de46SBram Moolenaarendfunc
26770e05de46SBram Moolenaar
26780e05de46SBram Moolenaar" Test for screenattr(), screenchar() and screenchars() functions
26790e05de46SBram Moolenaarfunc Test_screen_functions()
26800e05de46SBram Moolenaar  call assert_equal(-1, screenattr(-1, -1))
26810e05de46SBram Moolenaar  call assert_equal(-1, screenchar(-1, -1))
26820e05de46SBram Moolenaar  call assert_equal([], screenchars(-1, -1))
26830e05de46SBram Moolenaarendfunc
26840e05de46SBram Moolenaar
268508f4157cSBram Moolenaar" Test for getcurpos() and setpos()
268608f4157cSBram Moolenaarfunc Test_getcurpos_setpos()
268708f4157cSBram Moolenaar  new
268808f4157cSBram Moolenaar  call setline(1, ['012345678', '012345678'])
268908f4157cSBram Moolenaar  normal gg6l
269008f4157cSBram Moolenaar  let sp = getcurpos()
269108f4157cSBram Moolenaar  normal 0
269208f4157cSBram Moolenaar  call setpos('.', sp)
269308f4157cSBram Moolenaar  normal jyl
269408f4157cSBram Moolenaar  call assert_equal('6', @")
269592b83ccfSBram Moolenaar  call assert_equal(-1, setpos('.', test_null_list()))
269692b83ccfSBram Moolenaar  call assert_equal(-1, setpos('.', {}))
269799ca9c48SBram Moolenaar
269899ca9c48SBram Moolenaar  let winid = win_getid()
269999ca9c48SBram Moolenaar  normal G$
270099ca9c48SBram Moolenaar  let pos = getcurpos()
270199ca9c48SBram Moolenaar  wincmd w
270299ca9c48SBram Moolenaar  call assert_equal(pos, getcurpos(winid))
270399ca9c48SBram Moolenaar
270499ca9c48SBram Moolenaar  wincmd w
270508f4157cSBram Moolenaar  close!
270699ca9c48SBram Moolenaar
270799ca9c48SBram Moolenaar  call assert_equal(getcurpos(), getcurpos(0))
270899ca9c48SBram Moolenaar  call assert_equal([0, 0, 0, 0, 0], getcurpos(-1))
270999ca9c48SBram Moolenaar  call assert_equal([0, 0, 0, 0, 0], getcurpos(1999))
271008f4157cSBram Moolenaarendfunc
271108f4157cSBram Moolenaar
271292b83ccfSBram Moolenaar" Test for glob()
271392b83ccfSBram Moolenaarfunc Test_glob()
271492b83ccfSBram Moolenaar  call assert_equal('', glob(test_null_string()))
271592b83ccfSBram Moolenaar  call assert_equal('', globpath(test_null_string(), test_null_string()))
271646aa6f93SYegappan Lakshmanan  call assert_fails("let x = globpath(&rtp, 'syntax/c.vim', [])", 'E745:')
27171b04ce2dSBram Moolenaar
27181b04ce2dSBram Moolenaar  call writefile([], 'Xglob1')
27191b04ce2dSBram Moolenaar  call writefile([], 'XGLOB2')
27201b04ce2dSBram Moolenaar  set wildignorecase
27211b04ce2dSBram Moolenaar  " Sort output of glob() otherwise we end up with different
27221b04ce2dSBram Moolenaar  " ordering depending on whether file system is case-sensitive.
27231b04ce2dSBram Moolenaar  call assert_equal(['XGLOB2', 'Xglob1'], sort(glob('Xglob[12]', 0, 1)))
27241b04ce2dSBram Moolenaar  set wildignorecase&
27251b04ce2dSBram Moolenaar
27261b04ce2dSBram Moolenaar  call delete('Xglob1')
27271b04ce2dSBram Moolenaar  call delete('XGLOB2')
27281b04ce2dSBram Moolenaar
27291b04ce2dSBram Moolenaar  call assert_fails("call glob('*', 0, {})", 'E728:')
273092b83ccfSBram Moolenaarendfunc
273192b83ccfSBram Moolenaar
273292b83ccfSBram Moolenaar" Test for browse()
273392b83ccfSBram Moolenaarfunc Test_browse()
273492b83ccfSBram Moolenaar  CheckFeature browse
273592b83ccfSBram Moolenaar  call assert_fails('call browse([], "open", "x", "a.c")', 'E745:')
273692b83ccfSBram Moolenaarendfunc
273792b83ccfSBram Moolenaar
273892b83ccfSBram Moolenaar" Test for browsedir()
273992b83ccfSBram Moolenaarfunc Test_browsedir()
274092b83ccfSBram Moolenaar  CheckFeature browse
274192b83ccfSBram Moolenaar  call assert_fails('call browsedir("open", [])', 'E730:')
274292b83ccfSBram Moolenaarendfunc
274392b83ccfSBram Moolenaar
2744b47bed2fSBram Moolenaarfunc HasDefault(msg = 'msg')
2745b47bed2fSBram Moolenaar  return a:msg
2746b47bed2fSBram Moolenaarendfunc
2747b47bed2fSBram Moolenaar
2748b47bed2fSBram Moolenaarfunc Test_default_arg_value()
2749b47bed2fSBram Moolenaar  call assert_equal('msg', HasDefault())
2750b47bed2fSBram Moolenaarendfunc
2751b47bed2fSBram Moolenaar
275234fcb697SYegappan Lakshmanan" Test for gettext()
275334fcb697SYegappan Lakshmananfunc Test_gettext()
275434fcb697SYegappan Lakshmanan  call assert_fails('call gettext(1)', 'E475:')
275534fcb697SYegappan Lakshmananendfunc
275634fcb697SYegappan Lakshmanan
27573d9c4eefSBram Moolenaarfunc Test_builtin_check()
27583d9c4eefSBram Moolenaar  call assert_fails('let g:["trim"] = {x -> " " .. x}', 'E704:')
27593d9c4eefSBram Moolenaar  call assert_fails('let g:.trim = {x -> " " .. x}', 'E704:')
2760b54abeeaSBram Moolenaar  call assert_fails('let l:["trim"] = {x -> " " .. x}', 'E704:')
2761b54abeeaSBram Moolenaar  call assert_fails('let l:.trim = {x -> " " .. x}', 'E704:')
2762b54abeeaSBram Moolenaar  let lines =<< trim END
2763b54abeeaSBram Moolenaar    vim9script
2764b54abeeaSBram Moolenaar    var s:trim = (x) => " " .. x
2765b54abeeaSBram Moolenaar  END
2766b54abeeaSBram Moolenaar  call CheckScriptFailure(lines, 'E704:')
27676f1d2aa4SBram Moolenaar
27686f1d2aa4SBram Moolenaar  call assert_fails('call extend(g:, #{foo: { -> "foo" }})', 'E704:')
27696f1d2aa4SBram Moolenaar  let g:bar = 123
27706f1d2aa4SBram Moolenaar  call extend(g:, #{bar: { -> "foo" }}, "keep")
27716f1d2aa4SBram Moolenaar  call assert_fails('call extend(g:, #{bar: { -> "foo" }}, "force")', 'E704:')
27723d9c4eefSBram Moolenaarendfunc
27733d9c4eefSBram Moolenaar
27743d9c4eefSBram Moolenaar
27758d588cceSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
2776