0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.3856: Vim9: not enough tests

Problem:    Vim9: not enough tests.
Solution:   Run more expression tests also with Vim9. Fix an uncovered
            problem.
This commit is contained in:
Bram Moolenaar
2021-12-19 21:34:05 +00:00
parent bc404bfb32
commit fea43e44c0
4 changed files with 556 additions and 466 deletions

View File

@@ -1,6 +1,7 @@
" Tests for expressions. " Tests for expressions.
source check.vim source check.vim
source vim9.vim
func Test_equal() func Test_equal()
let base = {} let base = {}
@@ -43,22 +44,29 @@ func Test_version()
endfunc endfunc
func Test_op_trinary() func Test_op_trinary()
let lines =<< trim END
call assert_equal('yes', 1 ? 'yes' : 'no') call assert_equal('yes', 1 ? 'yes' : 'no')
call assert_equal('no', 0 ? 'yes' : 'no') call assert_equal('no', 0 ? 'yes' : 'no')
call assert_equal('no', 'x' ? 'yes' : 'no')
call assert_equal('yes', '1x' ? 'yes' : 'no')
call assert_fails('echo [1] ? "yes" : "no"', 'E745:') call assert_fails('echo [1] ? "yes" : "no"', 'E745:')
call assert_fails('echo {} ? "yes" : "no"', 'E728:') call assert_fails('echo {} ? "yes" : "no"', 'E728:')
END
call CheckLegacyAndVim9Success(lines)
call assert_equal('no', 'x' ? 'yes' : 'no')
call CheckDefAndScriptFailure(["'x' ? 'yes' : 'no'"], 'E1135:')
call assert_equal('yes', '1x' ? 'yes' : 'no')
call CheckDefAndScriptFailure(["'1x' ? 'yes' : 'no'"], 'E1135:')
endfunc endfunc
func Test_op_falsy() func Test_op_falsy()
let lines =<< trim END
call assert_equal(v:true, v:true ?? 456) call assert_equal(v:true, v:true ?? 456)
call assert_equal(123, 123 ?? 456) call assert_equal(123, 123 ?? 456)
call assert_equal('yes', 'yes' ?? 456) call assert_equal('yes', 'yes' ?? 456)
call assert_equal(0z00, 0z00 ?? 456) call assert_equal(0z00, 0z00 ?? 456)
call assert_equal([1], [1] ?? 456) call assert_equal([1], [1] ?? 456)
call assert_equal(#{one: 1}, #{one: 1} ?? 456) call assert_equal({'one': 1}, {'one': 1} ?? 456)
if has('float') if has('float')
call assert_equal(0.1, 0.1 ?? 456) call assert_equal(0.1, 0.1 ?? 456)
endif endif
@@ -72,27 +80,34 @@ func Test_op_falsy()
if has('float') if has('float')
call assert_equal(456, 0.0 ?? 456) call assert_equal(456, 0.0 ?? 456)
endif endif
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
func Test_dict() func Test_dict()
let d = {'': 'empty', 'a': 'a', 0: 'zero'} let lines =<< trim END
VAR d = {'': 'empty', 'a': 'a', 0: 'zero'}
call assert_equal('empty', d['']) call assert_equal('empty', d[''])
call assert_equal('a', d['a']) call assert_equal('a', d['a'])
call assert_equal('zero', d[0]) call assert_equal('zero', d[0])
call assert_true(has_key(d, '')) call assert_true(has_key(d, ''))
call assert_true(has_key(d, 'a')) call assert_true(has_key(d, 'a'))
call assert_fails("let i = has_key([], 'a')", 'E715:')
let d[''] = 'none' LET d[''] = 'none'
let d['a'] = 'aaa' LET d['a'] = 'aaa'
call assert_equal('none', d['']) call assert_equal('none', d[''])
call assert_equal('aaa', d['a']) call assert_equal('aaa', d['a'])
let d[ 'b' ] = 'bbb' LET d[ 'b' ] = 'bbb'
call assert_equal('bbb', d[ 'b' ]) call assert_equal('bbb', d[ 'b' ])
END
call CheckLegacyAndVim9Success(lines)
call CheckLegacyAndVim9Failure(["VAR i = has_key([], 'a')"], ['E715:', 'E1013:', 'E1206:'])
endfunc endfunc
func Test_strgetchar() func Test_strgetchar()
let lines =<< trim END
call assert_equal(char2nr('a'), strgetchar('axb', 0)) call assert_equal(char2nr('a'), strgetchar('axb', 0))
call assert_equal(char2nr('x'), 'axb'->strgetchar(1)) call assert_equal(char2nr('x'), 'axb'->strgetchar(1))
call assert_equal(char2nr('b'), strgetchar('axb', 2)) call assert_equal(char2nr('b'), strgetchar('axb', 2))
@@ -100,11 +115,15 @@ func Test_strgetchar()
call assert_equal(-1, strgetchar('axb', -1)) call assert_equal(-1, strgetchar('axb', -1))
call assert_equal(-1, strgetchar('axb', 3)) call assert_equal(-1, strgetchar('axb', 3))
call assert_equal(-1, strgetchar('', 0)) call assert_equal(-1, strgetchar('', 0))
call assert_fails("let c=strgetchar([], 1)", 'E730:') END
call assert_fails("let c=strgetchar('axb', [])", 'E745:') call CheckLegacyAndVim9Success(lines)
call CheckLegacyAndVim9Failure(["VAR c = strgetchar([], 1)"], ['E730:', 'E1013:', 'E1174:'])
call CheckLegacyAndVim9Failure(["VAR c = strgetchar('axb', [])"], ['E745:', 'E1013:', 'E1210:'])
endfunc endfunc
func Test_strcharpart() func Test_strcharpart()
let lines =<< trim END
call assert_equal('a', strcharpart('axb', 0, 1)) call assert_equal('a', strcharpart('axb', 0, 1))
call assert_equal('x', 'axb'->strcharpart(1, 1)) call assert_equal('x', 'axb'->strcharpart(1, 1))
call assert_equal('b', strcharpart('axb', 2, 1)) call assert_equal('b', strcharpart('axb', 2, 1))
@@ -118,55 +137,75 @@ func Test_strcharpart()
call assert_equal('a', strcharpart('axb', -1, 2)) call assert_equal('a', strcharpart('axb', -1, 2))
call assert_equal('edit', "editor"[-10 : 3]) call assert_equal('edit', "editor"[-10 : 3])
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
func Test_getreg_empty_list() func Test_getreg_empty_list()
let lines =<< trim END
call assert_equal('', getreg('x')) call assert_equal('', getreg('x'))
call assert_equal([], getreg('x', 1, 1)) call assert_equal([], getreg('x', 1, 1))
let x = getreg('x', 1, 1) VAR x = getreg('x', 1, 1)
let y = x VAR y = x
call add(x, 'foo') call add(x, 'foo')
call assert_equal(['foo'], y) call assert_equal(['foo'], y)
call assert_fails('call getreg([])', 'E730:') END
call CheckLegacyAndVim9Success(lines)
call CheckLegacyAndVim9Failure(['call getreg([])'], ['E730:', 'E1013:', 'E1174:'])
endfunc endfunc
func Test_loop_over_null_list() func Test_loop_over_null_list()
let null_list = test_null_list() let lines =<< trim END
VAR null_list = test_null_list()
for i in null_list for i in null_list
call assert_report('should not get here') call assert_report('should not get here')
endfor endfor
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
func Test_setreg_null_list() func Test_setreg_null_list()
let lines =<< trim END
call setreg('x', test_null_list()) call setreg('x', test_null_list())
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
func Test_special_char() func Test_special_char()
" The failure is only visible using valgrind. " The failure is only visible using valgrind.
call assert_fails('echo "\<C-">') call CheckLegacyAndVim9Failure(['echo "\<C-">'], ['E15:', 'E1004:', 'E1004:'])
endfunc endfunc
func Test_method_with_prefix() func Test_method_with_prefix()
call assert_equal(1, !range(5)->empty()) let lines =<< trim END
call assert_equal(TRUE, !range(5)->empty())
call assert_equal(FALSE, !-3)
END
call CheckLegacyAndVim9Success(lines)
call assert_equal([0, 1, 2], --3->range()) call assert_equal([0, 1, 2], --3->range())
call assert_equal(0, !-3) call CheckDefAndScriptFailure(['eval --3->range()'], 'E15')
call assert_equal(1, !+-+0) call assert_equal(1, !+-+0)
call CheckDefAndScriptFailure(['eval !+-+0'], 'E15')
endfunc endfunc
func Test_option_value() func Test_option_value()
" boolean let lines =<< trim END
#" boolean
set bri set bri
call assert_equal(1, &bri) call assert_equal(TRUE, &bri)
set nobri set nobri
call assert_equal(0, &bri) call assert_equal(FALSE, &bri)
" number #" number
set ts=1 set ts=1
call assert_equal(1, &ts) call assert_equal(1, &ts)
set ts=8 set ts=8
call assert_equal(8, &ts) call assert_equal(8, &ts)
" string #" string
exe "set cedit=\<Esc>" exe "set cedit=\<Esc>"
call assert_equal("\<Esc>", &cedit) call assert_equal("\<Esc>", &cedit)
set cpo= set cpo=
@@ -174,11 +213,13 @@ func Test_option_value()
set cpo=abcdefgi set cpo=abcdefgi
call assert_equal("abcdefgi", &cpo) call assert_equal("abcdefgi", &cpo)
set cpo&vim set cpo&vim
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
function Test_printf_misc() func Test_printf_misc()
let lines =<< trim END
call assert_equal('123', printf('123')) call assert_equal('123', printf('123'))
call assert_fails("call printf('123', 3)", "E767:")
call assert_equal('123', printf('%d', 123)) call assert_equal('123', printf('%d', 123))
call assert_equal('123', printf('%i', 123)) call assert_equal('123', printf('%i', 123))
@@ -228,7 +269,7 @@ function Test_printf_misc()
call assert_equal(' 123', printf('% 6d', 123)) call assert_equal(' 123', printf('% 6d', 123))
call assert_equal(' -123', printf('% 6d', -123)) call assert_equal(' -123', printf('% 6d', -123))
" Test left adjusted. #" Test left adjusted.
call assert_equal('123 ', printf('%-6d', 123)) call assert_equal('123 ', printf('%-6d', 123))
call assert_equal('+123 ', printf('%-+6d', 123)) call assert_equal('+123 ', printf('%-+6d', 123))
call assert_equal(' 123 ', printf('%- 6d', 123)) call assert_equal(' 123 ', printf('%- 6d', 123))
@@ -237,7 +278,8 @@ function Test_printf_misc()
call assert_equal(' 00123', printf('%7.5d', 123)) call assert_equal(' 00123', printf('%7.5d', 123))
call assert_equal(' -00123', printf('%7.5d', -123)) call assert_equal(' -00123', printf('%7.5d', -123))
call assert_equal(' +00123', printf('%+7.5d', 123)) call assert_equal(' +00123', printf('%+7.5d', 123))
" Precision field should not be used when combined with %0
#" Precision field should not be used when combined with %0
call assert_equal(' 00123', printf('%07.5d', 123)) call assert_equal(' 00123', printf('%07.5d', 123))
call assert_equal(' -00123', printf('%07.5d', -123)) call assert_equal(' -00123', printf('%07.5d', -123))
@@ -252,13 +294,13 @@ function Test_printf_misc()
call assert_equal('', printf('%.*s', 0, 'foobar')) call assert_equal('', printf('%.*s', 0, 'foobar'))
call assert_equal('foobar', printf('%.*s', -1, 'foobar')) call assert_equal('foobar', printf('%.*s', -1, 'foobar'))
" Simple quote (thousand grouping char) is ignored. #" Simple quote (thousand grouping char) is ignored.
call assert_equal('+00123456', printf("%+'09d", 123456)) call assert_equal('+00123456', printf("%+'09d", 123456))
" Unrecognized format specifier kept as-is. #" Unrecognized format specifier kept as-is.
call assert_equal('_123', printf("%_%d", 123)) call assert_equal('_123', printf("%_%d", 123))
" Test alternate forms. #" Test alternate forms.
call assert_equal('0x7b', printf('%#x', 123)) call assert_equal('0x7b', printf('%#x', 123))
call assert_equal('0X7B', printf('%#X', 123)) call assert_equal('0X7B', printf('%#X', 123))
call assert_equal('0173', printf('%#o', 123)) call assert_equal('0173', printf('%#o', 123))
@@ -363,10 +405,15 @@ function Test_printf_misc()
call assert_equal('[00000あiう]', printf('[%010.7S]', 'あiう')) call assert_equal('[00000あiう]', printf('[%010.7S]', 'あiう'))
call assert_equal('1%', printf('%d%%', 1)) call assert_equal('1%', printf('%d%%', 1))
END
call CheckLegacyAndVim9Success(lines)
call CheckLegacyAndVim9Failure(["call printf('123', 3)"], "E767:")
endfunc endfunc
function Test_printf_float() func Test_printf_float()
if has('float') if has('float')
let lines =<< trim END
call assert_equal('1.000000', printf('%f', 1)) call assert_equal('1.000000', printf('%f', 1))
call assert_equal('1.230000', printf('%f', 1.23)) call assert_equal('1.230000', printf('%f', 1.23))
call assert_equal('1.230000', printf('%F', 1.23)) call assert_equal('1.230000', printf('%F', 1.23))
@@ -394,12 +441,12 @@ function Test_printf_float()
call assert_equal('+03.33e-01', printf('%+010.2e', 1.0 / 3.0)) call assert_equal('+03.33e-01', printf('%+010.2e', 1.0 / 3.0))
call assert_equal('-03.33e-01', printf('%010.2e', -1.0 / 3.0)) call assert_equal('-03.33e-01', printf('%010.2e', -1.0 / 3.0))
" When precision is 0, the dot should be omitted. #" When precision is 0, the dot should be omitted.
call assert_equal(' 2', printf('%3.f', 7.0 / 3.0)) call assert_equal(' 2', printf('%3.f', 7.0 / 3.0))
call assert_equal(' 2', printf('%3.g', 7.0 / 3.0)) call assert_equal(' 2', printf('%3.g', 7.0 / 3.0))
call assert_equal(' 2e+00', printf('%7.e', 7.0 / 3.0)) call assert_equal(' 2e+00', printf('%7.e', 7.0 / 3.0))
" Float zero can be signed. #" Float zero can be signed.
call assert_equal('+0.000000', printf('%+f', 0.0)) call assert_equal('+0.000000', printf('%+f', 0.0))
call assert_equal('0.000000', printf('%f', 1.0 / (1.0 / 0.0))) call assert_equal('0.000000', printf('%f', 1.0 / (1.0 / 0.0)))
call assert_equal('-0.000000', printf('%f', 1.0 / (-1.0 / 0.0))) call assert_equal('-0.000000', printf('%f', 1.0 / (-1.0 / 0.0)))
@@ -408,7 +455,7 @@ function Test_printf_float()
call assert_equal('0.0', printf('%S', 1.0 / (1.0 / 0.0))) call assert_equal('0.0', printf('%S', 1.0 / (1.0 / 0.0)))
call assert_equal('-0.0', printf('%S', 1.0 / (-1.0 / 0.0))) call assert_equal('-0.0', printf('%S', 1.0 / (-1.0 / 0.0)))
" Float infinity can be signed. #" Float infinity can be signed.
call assert_equal('inf', printf('%f', 1.0 / 0.0)) call assert_equal('inf', printf('%f', 1.0 / 0.0))
call assert_equal('-inf', printf('%f', -1.0 / 0.0)) call assert_equal('-inf', printf('%f', -1.0 / 0.0))
call assert_equal('inf', printf('%g', 1.0 / 0.0)) call assert_equal('inf', printf('%g', 1.0 / 0.0))
@@ -445,12 +492,12 @@ function Test_printf_float()
call assert_equal('inf', printf('%s', 1.0 / 0.0)) call assert_equal('inf', printf('%s', 1.0 / 0.0))
call assert_equal('-inf', printf('%s', -1.0 / 0.0)) call assert_equal('-inf', printf('%s', -1.0 / 0.0))
" Test special case where max precision is truncated at 340. #" Test special case where max precision is truncated at 340.
call assert_equal('1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.330f', 1.0)) call assert_equal('1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.330f', 1.0))
call assert_equal('1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.340f', 1.0)) call assert_equal('1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.340f', 1.0))
call assert_equal('1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.350f', 1.0)) call assert_equal('1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', printf('%.350f', 1.0))
" Float nan (not a number) has no sign. #" Float nan (not a number) has no sign.
call assert_equal('nan', printf('%f', sqrt(-1.0))) call assert_equal('nan', printf('%f', sqrt(-1.0)))
call assert_equal('nan', printf('%f', 0.0 / 0.0)) call assert_equal('nan', printf('%f', 0.0 / 0.0))
call assert_equal('nan', printf('%f', -0.0 / 0.0)) call assert_equal('nan', printf('%f', -0.0 / 0.0))
@@ -470,62 +517,64 @@ function Test_printf_float()
call assert_equal('nan', printf('%s', -0.0 / 0.0)) call assert_equal('nan', printf('%s', -0.0 / 0.0))
call assert_equal('nan', printf('%S', 0.0 / 0.0)) call assert_equal('nan', printf('%S', 0.0 / 0.0))
call assert_equal('nan', printf('%S', -0.0 / 0.0)) call assert_equal('nan', printf('%S', -0.0 / 0.0))
END
call CheckLegacyAndVim9Success(lines)
call assert_fails('echo printf("%f", "a")', 'E807:') call CheckLegacyAndVim9Failure(['echo printf("%f", "a")'], 'E807:')
endif endif
endfunc endfunc
function Test_printf_errors() func Test_printf_errors()
call assert_fails('echo printf("%d", {})', 'E728:') call CheckLegacyAndVim9Failure(['echo printf("%d", {})'], 'E728:')
call assert_fails('echo printf("%d", [])', 'E745:') call CheckLegacyAndVim9Failure(['echo printf("%d", [])'], 'E745:')
call assert_fails('echo printf("%d", 1, 2)', 'E767:') call CheckLegacyAndVim9Failure(['echo printf("%d", 1, 2)'], 'E767:')
call assert_fails('echo printf("%*d", 1)', 'E766:') call CheckLegacyAndVim9Failure(['echo printf("%*d", 1)'], 'E766:')
call assert_fails('echo printf("%s")', 'E766:') call CheckLegacyAndVim9Failure(['echo printf("%s")'], 'E766:')
if has('float') if has('float')
call assert_fails('echo printf("%d", 1.2)', 'E805:') call CheckLegacyAndVim9Failure(['echo printf("%d", 1.2)'], 'E805:')
call assert_fails('echo printf("%f")') call CheckLegacyAndVim9Failure(['echo printf("%f")'], 'E766:')
endif endif
endfunc endfunc
function Test_max_min_errors() func Test_printf_64bit()
call assert_fails('call max(v:true)', 'E712:') let lines =<< trim END
call assert_fails('call max(v:true)', 'max()')
call assert_fails('call min(v:true)', 'E712:')
call assert_fails('call min(v:true)', 'min()')
endfunc
function Test_printf_64bit()
call assert_equal("123456789012345", printf('%d', 123456789012345)) call assert_equal("123456789012345", printf('%d', 123456789012345))
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
function Test_printf_spec_s() func Test_printf_spec_s()
" number let lines =<< trim END
#" number
call assert_equal("1234567890", printf('%s', 1234567890)) call assert_equal("1234567890", printf('%s', 1234567890))
" string #" string
call assert_equal("abcdefgi", printf('%s', "abcdefgi")) call assert_equal("abcdefgi", printf('%s', "abcdefgi"))
" float #" float
if has('float') if has('float')
call assert_equal("1.23", printf('%s', 1.23)) call assert_equal("1.23", printf('%s', 1.23))
endif endif
" list #" list
let value = [1, 'two', ['three', 4]] VAR lvalue = [1, 'two', ['three', 4]]
call assert_equal(string(value), printf('%s', value)) call assert_equal(string(lvalue), printf('%s', lvalue))
" dict #" dict
let value = {'key1' : 'value1', 'key2' : ['list', 'value'], 'key3' : {'dict' : 'value'}} VAR dvalue = {'key1': 'value1', 'key2': ['list', 'lvalue'], 'key3': {'dict': 'lvalue'}}
call assert_equal(string(value), printf('%s', value)) call assert_equal(string(dvalue), printf('%s', dvalue))
" funcref #" funcref
call assert_equal('printf', printf('%s', 'printf'->function())) call assert_equal('printf', printf('%s', 'printf'->function()))
" partial #" partial
call assert_equal(string(function('printf', ['%s'])), printf('%s', function('printf', ['%s']))) call assert_equal(string(function('printf', ['%s'])), printf('%s', function('printf', ['%s'])))
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
function Test_printf_spec_b() func Test_printf_spec_b()
let lines =<< trim END
call assert_equal("0", printf('%b', 0)) call assert_equal("0", printf('%b', 0))
call assert_equal("00001100", printf('%08b', 12)) call assert_equal("00001100", printf('%08b', 12))
call assert_equal("11111111", printf('%08b', 0xff)) call assert_equal("11111111", printf('%08b', 0xff))
@@ -536,24 +585,38 @@ function Test_printf_spec_b()
call assert_equal("1001001100101100000001011010010", printf('%b', 1234567890)) call assert_equal("1001001100101100000001011010010", printf('%b', 1234567890))
call assert_equal("11100000100100010000110000011011101111101111001", printf('%b', 123456789012345)) call assert_equal("11100000100100010000110000011011101111101111001", printf('%b', 123456789012345))
call assert_equal("1111111111111111111111111111111111111111111111111111111111111111", printf('%b', -1)) call assert_equal("1111111111111111111111111111111111111111111111111111111111111111", printf('%b', -1))
END
call CheckLegacyAndVim9Success(lines)
endfunc
func Test_max_min_errors()
call CheckLegacyAndVim9Failure(['call max(v:true)'], ['E712:', 'E1013:', 'E1227:'])
call CheckLegacyAndVim9Failure(['call max(v:true)'], ['max()', 'E1013:', 'E1227:'])
call CheckLegacyAndVim9Failure(['call min(v:true)'], ['E712:', 'E1013:', 'E1227:'])
call CheckLegacyAndVim9Failure(['call min(v:true)'], ['min()', 'E1013:', 'E1227:'])
endfunc endfunc
func Test_function_with_funcref() func Test_function_with_funcref()
let s:f = function('type') let lines =<< trim END
let s:fref = function(s:f) VAR s:F = function('type')
call assert_equal(v:t_string, s:fref('x')) VAR s:Fref = function(s:F)
call assert_fails("call function('s:f')", 'E700:') call assert_equal(v:t_string, s:Fref('x'))
call assert_fails("call function('s:F')", 'E700:')
call assert_fails("call function('foo()')", 'E475:') call assert_fails("call function('foo()')", 'E475:')
call assert_fails("call function('foo()')", 'foo()') call assert_fails("call function('foo()')", 'foo()')
call assert_fails("function('')", 'E129:') call assert_fails("function('')", 'E129:')
let Len = {s -> strlen(s)} legacy let s:Len = {s -> strlen(s)}
call assert_equal(6, Len('foobar')) call assert_equal(6, s:Len('foobar'))
let name = string(Len) VAR name = string(s:Len)
" can evaluate "function('<lambda>99')" #" can evaluate "function('<lambda>99')"
call execute('let Ref = ' .. name) call execute('VAR Ref = ' .. name)
call assert_equal(4, Ref('text')) call assert_equal(4, Ref('text'))
END
call CheckTransLegacySuccess(lines)
" cannot create s: variable in :def function
call CheckTransVim9Success(lines)
endfunc endfunc
func Test_funcref() func Test_funcref()
@@ -577,33 +640,41 @@ func Test_funcref()
endfunc endfunc
func Test_setmatches() func Test_setmatches()
let lines =<< trim END
hi def link 1 Comment hi def link 1 Comment
hi def link 2 PreProc hi def link 2 PreProc
let set = [{"group": 1, "pattern": 2, "id": 3, "priority": 4}] VAR set = [{"group": 1, "pattern": 2, "id": 3, "priority": 4}]
let exp = [{"group": '1', "pattern": '2', "id": 3, "priority": 4}] VAR exp = [{"group": '1', "pattern": '2', "id": 3, "priority": 4}]
if has('conceal') if has('conceal')
let set[0]['conceal'] = 5 LET set[0]['conceal'] = 5
let exp[0]['conceal'] = '5' LET exp[0]['conceal'] = '5'
endif endif
eval set->setmatches() eval set->setmatches()
call assert_equal(exp, getmatches()) call assert_equal(exp, getmatches())
call assert_fails('let m = setmatches([], [])', 'E745:') END
call CheckLegacyAndVim9Success(lines)
call CheckLegacyAndVim9Failure(['VAR m = setmatches([], [])'], ['E745:', 'E1013:', 'E1210:'])
endfunc endfunc
func Test_empty_concatenate() func Test_empty_concatenate()
call assert_equal('b', 'a'[4:0] . 'b') let lines =<< trim END
call assert_equal('b', 'b' . 'a'[4:0]) call assert_equal('b', 'a'[4 : 0] .. 'b')
call assert_equal('b', 'b' .. 'a'[4 : 0])
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
func Test_broken_number() func Test_broken_number()
let X = 'bad' call CheckLegacyAndVim9Failure(['VAR X = "bad"', 'echo 1X'], 'E15:')
call assert_fails('echo 1X', 'E15:') call CheckLegacyAndVim9Failure(['VAR X = "bad"', 'echo 0b1X'], 'E15:')
call assert_fails('echo 0b1X', 'E15:') call CheckLegacyAndVim9Failure(['echo 0b12'], 'E15:')
call assert_fails('echo 0b12', 'E15:') call CheckLegacyAndVim9Failure(['VAR X = "bad"', 'echo 0x1X'], 'E15:')
call assert_fails('echo 0x1X', 'E15:') call CheckLegacyAndVim9Failure(['VAR X = "bad"', 'echo 011X'], 'E15:')
call assert_fails('echo 011X', 'E15:')
call assert_equal(2, str2nr('2a')) call CheckLegacyAndVim9Success(['call assert_equal(2, str2nr("2a"))'])
call assert_fails('inoremap <Char-0b1z> b', 'E474:')
call CheckLegacyAndVim9Failure(['inoremap <Char-0b1z> b'], 'E474:')
endfunc endfunc
func Test_eval_after_if() func Test_eval_after_if()
@@ -696,21 +767,32 @@ endfunc
" Test for errors in expression evaluation " Test for errors in expression evaluation
func Test_expr_eval_error() func Test_expr_eval_error()
call assert_fails("let i = 'abc' . []", 'E730:') call CheckLegacyAndVim9Failure(["VAR i = 'abc' .. []"], ['E730:', 'E1105:', 'E730:'])
call assert_fails("let l = [] + 10", 'E745:') call CheckLegacyAndVim9Failure(["VAR l = [] + 10"], ['E745:', 'E1051:', 'E745'])
call assert_fails("let v = 10 + []", 'E745:') call CheckLegacyAndVim9Failure(["VAR v = 10 + []"], ['E745:', 'E1051:', 'E745:'])
call assert_fails("let v = 10 / []", 'E745:') call CheckLegacyAndVim9Failure(["VAR v = 10 / []"], ['E745:', 'E1036:', 'E745:'])
call assert_fails("let v = -{}", 'E728:') call CheckLegacyAndVim9Failure(["VAR v = -{}"], ['E728:', 'E1012:', 'E728:'])
endfunc endfunc
func Test_white_in_function_call() func Test_white_in_function_call()
let text = substitute ( 'some text' , 't' , 'T' , 'g' ) let lines =<< trim END
VAR text = substitute ( 'some text' , 't' , 'T' , 'g' )
call assert_equal('some TexT', text) call assert_equal('some TexT', text)
END
call CheckTransLegacySuccess(lines)
let lines =<< trim END
var text = substitute ( 'some text' , 't' , 'T' , 'g' )
call assert_equal('some TexT', text)
END
call CheckDefAndScriptFailure(lines, ['E1001:', 'E121:'])
endfunc endfunc
" Test for float value comparison " Test for float value comparison
func Test_float_compare() func Test_float_compare()
CheckFeature float CheckFeature float
let lines =<< trim END
call assert_true(1.2 == 1.2) call assert_true(1.2 == 1.2)
call assert_true(1.0 != 1.2) call assert_true(1.0 != 1.2)
call assert_true(1.2 > 1.0) call assert_true(1.2 > 1.0)
@@ -718,14 +800,16 @@ func Test_float_compare()
call assert_true(1.0 < 1.2) call assert_true(1.0 < 1.2)
call assert_true(1.2 <= 1.2) call assert_true(1.2 <= 1.2)
call assert_true(+0.0 == -0.0) call assert_true(+0.0 == -0.0)
" two NaNs (not a number) are not equal #" two NaNs (not a number) are not equal
call assert_true(sqrt(-4.01) != (0.0 / 0.0)) call assert_true(sqrt(-4.01) != (0.0 / 0.0))
" two inf (infinity) are equal #" two inf (infinity) are equal
call assert_true((1.0 / 0) == (2.0 / 0)) call assert_true((1.0 / 0) == (2.0 / 0))
" two -inf (infinity) are equal #" two -inf (infinity) are equal
call assert_true(-(1.0 / 0) == -(2.0 / 0)) call assert_true(-(1.0 / 0) == -(2.0 / 0))
" +infinity != -infinity #" +infinity != -infinity
call assert_true((1.0 / 0) != -(2.0 / 0)) call assert_true((1.0 / 0) != -(2.0 / 0))
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -185,32 +185,33 @@ def CheckTransLegacySuccess(lines: list<string>)
->substitute('\<LSTART\>', '{', 'g') ->substitute('\<LSTART\>', '{', 'g')
->substitute('\<LMIDDLE\>', '->', 'g') ->substitute('\<LMIDDLE\>', '->', 'g')
->substitute('\<LEND\>', '}', 'g') ->substitute('\<LEND\>', '}', 'g')
->substitute('\<TRUE\>', '1', 'g')
->substitute('\<FALSE\>', '0', 'g')
->substitute('#"', ' "', 'g')) ->substitute('#"', ' "', 'g'))
CheckLegacySuccess(legacylines) CheckLegacySuccess(legacylines)
enddef enddef
def Vim9Trans(lines: list<string>): list<string>
return lines->mapnew((_, v) =>
v->substitute('\<VAR\>', 'var', 'g')
->substitute('\<LET ', '', 'g')
->substitute('\<LSTART\>', '(', 'g')
->substitute('\<LMIDDLE\>', ') =>', 'g')
->substitute(' *\<LEND\> *', '', 'g')
->substitute('\<TRUE\>', 'true', 'g')
->substitute('\<FALSE\>', 'false', 'g'))
enddef
" Execute "lines" in a :def function, translated as in " Execute "lines" in a :def function, translated as in
" CheckLegacyAndVim9Success() " CheckLegacyAndVim9Success()
def CheckTransDefSuccess(lines: list<string>) def CheckTransDefSuccess(lines: list<string>)
var vim9lines = lines->mapnew((_, v) => CheckDefSuccess(Vim9Trans(lines))
v->substitute('\<VAR\>', 'var', 'g')
->substitute('\<LET ', '', 'g')
->substitute('\<LSTART\>', '(', 'g')
->substitute('\<LMIDDLE\>', ') =>', 'g')
->substitute(' *\<LEND\> *', '', 'g'))
CheckDefSuccess(vim9lines)
enddef enddef
" Execute "lines" in a Vim9 script, translated as in " Execute "lines" in a Vim9 script, translated as in
" CheckLegacyAndVim9Success() " CheckLegacyAndVim9Success()
def CheckTransVim9Success(lines: list<string>) def CheckTransVim9Success(lines: list<string>)
var vim9lines = lines->mapnew((_, v) => CheckScriptSuccess(['vim9script'] + Vim9Trans(lines))
v->substitute('\<VAR\>', 'var', 'g')
->substitute('\<LET ', '', 'g')
->substitute('\<LSTART\>', '(', 'g')
->substitute('\<LMIDDLE\>', ') =>', 'g')
->substitute(' *\<LEND\> *', '', 'g'))
CheckScriptSuccess(['vim9script'] + vim9lines)
enddef enddef
" Execute "lines" in a legacy function, :def function and Vim9 script. " Execute "lines" in a legacy function, :def function and Vim9 script.
@@ -218,6 +219,8 @@ enddef
" Use 'LET' for an assignment " Use 'LET' for an assignment
" Use ' #"' for a comment " Use ' #"' for a comment
" Use LSTART arg LMIDDLE expr LEND for lambda " Use LSTART arg LMIDDLE expr LEND for lambda
" Use 'TRUE' for 1 in legacy, true in Vim9
" Use 'FALSE' for 0 in legacy, false in Vim9
def CheckLegacyAndVim9Success(lines: list<string>) def CheckLegacyAndVim9Success(lines: list<string>)
CheckTransLegacySuccess(lines) CheckTransLegacySuccess(lines)
CheckTransDefSuccess(lines) CheckTransDefSuccess(lines)

View File

@@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3856,
/**/ /**/
3855, 3855,
/**/ /**/

View File

@@ -4308,7 +4308,8 @@ compile_leader(cctx_T *cctx, int numeric_only, char_u *start, char_u **end)
type_T *type; type_T *type;
type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
if (need_type(type, &t_number, -1, 0, cctx, FALSE, FALSE) == FAIL) if (type != &t_float && need_type(type, &t_number,
-1, 0, cctx, FALSE, FALSE) == FAIL)
return FAIL; return FAIL;
while (p > start && (p[-1] == '-' || p[-1] == '+')) while (p > start && (p[-1] == '-' || p[-1] == '+'))