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