vim-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.

fea43e44c0

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2023-04-15 16:40:22 +08:00
parent 700152fbf8
commit f04125a935
2 changed files with 594 additions and 490 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 = {}
@@ -45,22 +46,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
@@ -74,27 +82,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))
@@ -102,11 +117,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))
@@ -120,55 +139,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 = v:_null_list let lines =<< trim END
VAR null_list = v:_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', v:_null_list) call setreg('x', v:_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=
@@ -176,53 +215,13 @@ func Test_option_value()
set cpo=abcdefi set cpo=abcdefi
call assert_equal("abcdefi", &cpo) call assert_equal("abcdefi", &cpo)
set cpo&vim set cpo&vim
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
function Test_printf_64bit() func Test_printf_misc()
call assert_equal("123456789012345", printf('%d', 123456789012345)) let lines =<< trim END
endfunc
function Test_printf_spec_s()
" number
call assert_equal("1234567890", printf('%s', 1234567890))
" string
call assert_equal("abcdefgi", printf('%s', "abcdefgi"))
" float
call assert_equal("1.23", printf('%s', 1.23))
" list
let value = [1, 'two', ['three', 4]]
call assert_equal(string(value), printf('%s', value))
" dict
let value = {'key1' : 'value1', 'key2' : ['list', 'value'], 'key3' : {'dict' : 'value'}}
call assert_equal(string(value), printf('%s', value))
" funcref
call assert_equal('printf', printf('%s', 'printf'->function()))
" partial
call assert_equal(string(function('printf', ['%s'])), printf('%s', function('printf', ['%s'])))
endfunc
function Test_printf_spec_b()
call assert_equal("0", printf('%b', 0))
call assert_equal("00001100", printf('%08b', 12))
call assert_equal("11111111", printf('%08b', 0xff))
call assert_equal(" 1111011", printf('%10b', 123))
call assert_equal("0001111011", printf('%010b', 123))
call assert_equal(" 0b1111011", printf('%#10b', 123))
call assert_equal("0B01111011", printf('%#010B', 123))
call assert_equal("1001001100101100000001011010010", printf('%b', 1234567890))
call assert_equal("11100000100100010000110000011011101111101111001", printf('%b', 123456789012345))
call assert_equal("1111111111111111111111111111111111111111111111111111111111111111", printf('%b', -1))
endfunc
function Test_printf_misc()
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))
@@ -268,7 +267,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))
@@ -277,7 +276,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))
@@ -292,13 +292,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))
@@ -403,9 +403,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')
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))
@@ -433,12 +439,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)))
@@ -447,7 +453,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))
@@ -484,12 +490,12 @@ function Test_printf_float()
call assert_equal("str2float('inf')", printf('%s', 1.0 / 0.0)) call assert_equal("str2float('inf')", printf('%s', 1.0 / 0.0))
call assert_equal("-str2float('inf')", printf('%s', -1.0 / 0.0)) call assert_equal("-str2float('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))
@@ -509,45 +515,106 @@ function Test_printf_float()
call assert_equal("str2float('nan')", printf('%s', -0.0 / 0.0)) call assert_equal("str2float('nan')", printf('%s', -0.0 / 0.0))
call assert_equal("str2float('nan')", printf('%S', 0.0 / 0.0)) call assert_equal("str2float('nan')", printf('%S', 0.0 / 0.0))
call assert_equal("str2float('nan')", printf('%S', -0.0 / 0.0)) call assert_equal("str2float('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:')
endfunc
function Test_printf_errors()
call assert_fails('echo printf("%d", {})', 'E728:')
call assert_fails('echo printf("%d", [])', 'E745:')
call assert_fails('echo printf("%d", 1, 2)', 'E767:')
call assert_fails('echo printf("%*d", 1)', 'E766:')
call assert_fails('echo printf("%s")', 'E766:')
if has('float')
call assert_fails('echo printf("%d", 1.2)', 'E805:')
call assert_fails('echo printf("%f")')
endif endif
endfunc endfunc
function Test_max_min_errors() func Test_printf_errors()
call assert_fails('call max(v:true)', 'E712:') call CheckLegacyAndVim9Failure(['echo printf("%d", {})'], 'E728:')
call assert_fails('call max(v:true)', 'max()') call CheckLegacyAndVim9Failure(['echo printf("%d", [])'], 'E745:')
call assert_fails('call min(v:true)', 'E712:') call CheckLegacyAndVim9Failure(['echo printf("%d", 1, 2)'], 'E767:')
call assert_fails('call min(v:true)', 'min()') call CheckLegacyAndVim9Failure(['echo printf("%*d", 1)'], 'E766:')
call CheckLegacyAndVim9Failure(['echo printf("%s")'], 'E766:')
if has('float')
call CheckLegacyAndVim9Failure(['echo printf("%d", 1.2)'], 'E805:')
call CheckLegacyAndVim9Failure(['echo printf("%f")'], 'E766:')
endif
endfunc
func Test_printf_64bit()
let lines =<< trim END
call assert_equal("123456789012345", printf('%d', 123456789012345))
END
call CheckLegacyAndVim9Success(lines)
endfunc
func Test_printf_spec_s()
let lines =<< trim END
#" number
call assert_equal("1234567890", printf('%s', 1234567890))
#" string
call assert_equal("abcdefgi", printf('%s', "abcdefgi"))
#" float
if has('float')
call assert_equal("1.23", printf('%s', 1.23))
endif
#" list
VAR lvalue = [1, 'two', ['three', 4]]
call assert_equal(string(lvalue), printf('%s', lvalue))
#" dict
VAR dvalue = {'key1': 'value1', 'key2': ['list', 'lvalue'], 'key3': {'dict': 'lvalue'}}
call assert_equal(string(dvalue), printf('%s', dvalue))
#" funcref
call assert_equal('printf', printf('%s', 'printf'->function()))
#" partial
call assert_equal(string(function('printf', ['%s'])), printf('%s', function('printf', ['%s'])))
END
call CheckLegacyAndVim9Success(lines)
endfunc
func Test_printf_spec_b()
let lines =<< trim END
call assert_equal("0", printf('%b', 0))
call assert_equal("00001100", printf('%08b', 12))
call assert_equal("11111111", printf('%08b', 0xff))
call assert_equal(" 1111011", printf('%10b', 123))
call assert_equal("0001111011", printf('%010b', 123))
call assert_equal(" 0b1111011", printf('%#10b', 123))
call assert_equal("0B01111011", printf('%#010B', 123))
call assert_equal("1001001100101100000001011010010", printf('%b', 1234567890))
call assert_equal("11100000100100010000110000011011101111101111001", printf('%b', 123456789012345))
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()
@@ -585,33 +652,41 @@ func Test_function_outside_script()
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()
@@ -710,21 +785,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)
@@ -732,14 +818,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

@@ -34,6 +34,14 @@ func CheckScriptSuccess(lines)
endtry endtry
endfunc endfunc
func CheckDefAndScriptSuccess(lines)
return
endfunc
func CheckDefAndScriptFailure(lines, error, lnum = -3)
return
endfunc
func CheckDefExecAndScriptFailure(lines, error, lnum = -3) func CheckDefExecAndScriptFailure(lines, error, lnum = -3)
return return
endfunc endfunc
@@ -85,6 +93,14 @@ func CheckTransLegacySuccess(lines)
call CheckLegacySuccess(legacylines) call CheckLegacySuccess(legacylines)
endfunc endfunc
func CheckTransDefSuccess(lines)
return
endfunc
func CheckTransVim9Success(lines)
return
endfunc
" Execute "lines" in a legacy function " Execute "lines" in a legacy function
" Use 'VAR' for a declaration. " Use 'VAR' for a declaration.
" Use 'LET' for an assignment " Use 'LET' for an assignment