xref: /vim-8.2.3635/src/testdir/test_expr.vim (revision 6100d02a)
1f0e86a0dSBram Moolenaar" Tests for expressions.
2f0e86a0dSBram Moolenaar
3f0e86a0dSBram Moolenaarfunc Test_equal()
4f0e86a0dSBram Moolenaar  let base = {}
5f0e86a0dSBram Moolenaar  func base.method()
6f0e86a0dSBram Moolenaar    return 1
7f0e86a0dSBram Moolenaar  endfunc
8f0e86a0dSBram Moolenaar  func base.other() dict
9f0e86a0dSBram Moolenaar    return 1
10f0e86a0dSBram Moolenaar  endfunc
11f0e86a0dSBram Moolenaar  let instance = copy(base)
12f0e86a0dSBram Moolenaar  call assert_true(base.method == instance.method)
13f0e86a0dSBram Moolenaar  call assert_true([base.method] == [instance.method])
14f0e86a0dSBram Moolenaar  call assert_true(base.other == instance.other)
15f0e86a0dSBram Moolenaar  call assert_true([base.other] == [instance.other])
16f0e86a0dSBram Moolenaar
17f0e86a0dSBram Moolenaar  call assert_false(base.method == base.other)
18f0e86a0dSBram Moolenaar  call assert_false([base.method] == [base.other])
19f0e86a0dSBram Moolenaar  call assert_false(base.method == instance.other)
20f0e86a0dSBram Moolenaar  call assert_false([base.method] == [instance.other])
21f0e86a0dSBram Moolenaar
22f0e86a0dSBram Moolenaar  call assert_fails('echo base.method > instance.method')
23f0e86a0dSBram Moolenaarendfunc
24819821c5SBram Moolenaar
25819821c5SBram Moolenaarfunc Test_version()
26819821c5SBram Moolenaar  call assert_true(has('patch-7.4.001'))
27819821c5SBram Moolenaar  call assert_true(has('patch-7.4.01'))
28819821c5SBram Moolenaar  call assert_true(has('patch-7.4.1'))
29819821c5SBram Moolenaar  call assert_true(has('patch-6.9.999'))
30819821c5SBram Moolenaar  call assert_true(has('patch-7.1.999'))
31819821c5SBram Moolenaar  call assert_true(has('patch-7.4.123'))
32819821c5SBram Moolenaar
33819821c5SBram Moolenaar  call assert_false(has('patch-7'))
34819821c5SBram Moolenaar  call assert_false(has('patch-7.4'))
35819821c5SBram Moolenaar  call assert_false(has('patch-7.4.'))
36819821c5SBram Moolenaar  call assert_false(has('patch-9.1.0'))
37819821c5SBram Moolenaar  call assert_false(has('patch-9.9.1'))
38819821c5SBram Moolenaarendfunc
390921ecffSBram Moolenaar
400921ecffSBram Moolenaarfunc Test_dict()
410921ecffSBram Moolenaar  let d = {'': 'empty', 'a': 'a', 0: 'zero'}
420921ecffSBram Moolenaar  call assert_equal('empty', d[''])
430921ecffSBram Moolenaar  call assert_equal('a', d['a'])
440921ecffSBram Moolenaar  call assert_equal('zero', d[0])
450921ecffSBram Moolenaar  call assert_true(has_key(d, ''))
460921ecffSBram Moolenaar  call assert_true(has_key(d, 'a'))
470921ecffSBram Moolenaar
480921ecffSBram Moolenaar  let d[''] = 'none'
490921ecffSBram Moolenaar  let d['a'] = 'aaa'
500921ecffSBram Moolenaar  call assert_equal('none', d[''])
510921ecffSBram Moolenaar  call assert_equal('aaa', d['a'])
520921ecffSBram Moolenaarendfunc
5358de0e2dSBram Moolenaar
5458de0e2dSBram Moolenaarfunc Test_strgetchar()
5558de0e2dSBram Moolenaar  call assert_equal(char2nr('a'), strgetchar('axb', 0))
5658de0e2dSBram Moolenaar  call assert_equal(char2nr('x'), strgetchar('axb', 1))
5758de0e2dSBram Moolenaar  call assert_equal(char2nr('b'), strgetchar('axb', 2))
5858de0e2dSBram Moolenaar
5958de0e2dSBram Moolenaar  call assert_equal(-1, strgetchar('axb', -1))
6058de0e2dSBram Moolenaar  call assert_equal(-1, strgetchar('axb', 3))
6158de0e2dSBram Moolenaar  call assert_equal(-1, strgetchar('', 0))
6258de0e2dSBram Moolenaarendfunc
6358de0e2dSBram Moolenaar
6458de0e2dSBram Moolenaarfunc Test_strcharpart()
6558de0e2dSBram Moolenaar  call assert_equal('a', strcharpart('axb', 0, 1))
6658de0e2dSBram Moolenaar  call assert_equal('x', strcharpart('axb', 1, 1))
6758de0e2dSBram Moolenaar  call assert_equal('b', strcharpart('axb', 2, 1))
6858de0e2dSBram Moolenaar  call assert_equal('xb', strcharpart('axb', 1))
6958de0e2dSBram Moolenaar
7058de0e2dSBram Moolenaar  call assert_equal('', strcharpart('axb', 1, 0))
7158de0e2dSBram Moolenaar  call assert_equal('', strcharpart('axb', 1, -1))
7258de0e2dSBram Moolenaar  call assert_equal('', strcharpart('axb', -1, 1))
7358de0e2dSBram Moolenaar  call assert_equal('', strcharpart('axb', -2, 2))
7458de0e2dSBram Moolenaar
7558de0e2dSBram Moolenaar  call assert_equal('a', strcharpart('axb', -1, 2))
7658de0e2dSBram Moolenaarendfunc
77517ffbeeSBram Moolenaar
78517ffbeeSBram Moolenaarfunc Test_getreg_empty_list()
79517ffbeeSBram Moolenaar  call assert_equal('', getreg('x'))
80517ffbeeSBram Moolenaar  call assert_equal([], getreg('x', 1, 1))
81517ffbeeSBram Moolenaar  let x = getreg('x', 1, 1)
82517ffbeeSBram Moolenaar  let y = x
83517ffbeeSBram Moolenaar  call add(x, 'foo')
84517ffbeeSBram Moolenaar  call assert_equal(['foo'], y)
85517ffbeeSBram Moolenaarendfunc
86d8585edeSBram Moolenaar
87d8585edeSBram Moolenaarfunc Test_loop_over_null_list()
88574860b5SBram Moolenaar  let null_list = test_null_list()
89d8585edeSBram Moolenaar  for i in null_list
90d8585edeSBram Moolenaar    call assert_true(0, 'should not get here')
91d8585edeSBram Moolenaar  endfor
92d8585edeSBram Moolenaarendfunc
9313ddc5c3SBram Moolenaar
9413ddc5c3SBram Moolenaarfunc Test_compare_null_dict()
9513ddc5c3SBram Moolenaar  call assert_fails('let x = test_null_dict()[10]')
9613ddc5c3SBram Moolenaar  call assert_equal({}, {})
9713ddc5c3SBram Moolenaar  call assert_equal(test_null_dict(), test_null_dict())
9813ddc5c3SBram Moolenaar  call assert_notequal({}, test_null_dict())
9913ddc5c3SBram Moolenaarendfunc
10013ddc5c3SBram Moolenaar
10113ddc5c3SBram Moolenaarfunc Test_set_reg_null_list()
10213ddc5c3SBram Moolenaar  call setreg('x', test_null_list())
10313ddc5c3SBram Moolenaarendfunc
1041d90a5a5SBram Moolenaar
1051d90a5a5SBram Moolenaarfunc Test_special_char()
1061d90a5a5SBram Moolenaar  " The failure is only visible using valgrind.
1071d90a5a5SBram Moolenaar  call assert_fails('echo "\<C-">')
1081d90a5a5SBram Moolenaarendfunc
1092acfbed9SBram Moolenaar
1102acfbed9SBram Moolenaarfunc Test_option_value()
1112acfbed9SBram Moolenaar  " boolean
1122acfbed9SBram Moolenaar  set bri
1132acfbed9SBram Moolenaar  call assert_equal(1, &bri)
1142acfbed9SBram Moolenaar  set nobri
1152acfbed9SBram Moolenaar  call assert_equal(0, &bri)
1162acfbed9SBram Moolenaar
1172acfbed9SBram Moolenaar  " number
1182acfbed9SBram Moolenaar  set ts=1
1192acfbed9SBram Moolenaar  call assert_equal(1, &ts)
1202acfbed9SBram Moolenaar  set ts=8
1212acfbed9SBram Moolenaar  call assert_equal(8, &ts)
1222acfbed9SBram Moolenaar
1232acfbed9SBram Moolenaar  " string
1242acfbed9SBram Moolenaar  exe "set cedit=\<Esc>"
1252acfbed9SBram Moolenaar  call assert_equal("\<Esc>", &cedit)
1262acfbed9SBram Moolenaar  set cpo=
1272acfbed9SBram Moolenaar  call assert_equal("", &cpo)
1282acfbed9SBram Moolenaar  set cpo=abcdefgi
1292acfbed9SBram Moolenaar  call assert_equal("abcdefgi", &cpo)
1302acfbed9SBram Moolenaar  set cpo&vim
1312acfbed9SBram Moolenaarendfunc
13238ee6b04SBram Moolenaar
13376efafbaSBram Moolenaarfunction Test_printf_misc()
13476efafbaSBram Moolenaar  call assert_equal('123', printf('%d', 123))
13576efafbaSBram Moolenaar  call assert_equal('123', printf('%i', 123))
13676efafbaSBram Moolenaar  call assert_equal('123', printf('%D', 123))
13776efafbaSBram Moolenaar  call assert_equal('123', printf('%U', 123))
13876efafbaSBram Moolenaar  call assert_equal('173', printf('%o', 123))
13976efafbaSBram Moolenaar  call assert_equal('173', printf('%O', 123))
14076efafbaSBram Moolenaar  call assert_equal('7b', printf('%x', 123))
14176efafbaSBram Moolenaar  call assert_equal('7B', printf('%X', 123))
14276efafbaSBram Moolenaar  if has('ebcdic')
14376efafbaSBram Moolenaar    call assert_equal('#', printf('%c', 123))
14476efafbaSBram Moolenaar  else
14576efafbaSBram Moolenaar    call assert_equal('{', printf('%c', 123))
14676efafbaSBram Moolenaar  endif
14776efafbaSBram Moolenaar  call assert_equal('abc', printf('%s', 'abc'))
14876efafbaSBram Moolenaar  call assert_equal('abc', printf('%S', 'abc'))
14976efafbaSBram Moolenaar
15076efafbaSBram Moolenaar  call assert_equal('+123', printf('%+d', 123))
15176efafbaSBram Moolenaar  call assert_equal('-123', printf('%+d', -123))
15276efafbaSBram Moolenaar  call assert_equal('+123', printf('%+ d', 123))
15376efafbaSBram Moolenaar  call assert_equal(' 123', printf('% d', 123))
15476efafbaSBram Moolenaar  call assert_equal(' 123', printf('%  d', 123))
15576efafbaSBram Moolenaar  call assert_equal('-123', printf('% d', -123))
15676efafbaSBram Moolenaar
157e999782eSBram Moolenaar  call assert_equal('123', printf('%2d', 123))
158e999782eSBram Moolenaar  call assert_equal('   123', printf('%6d', 123))
159e999782eSBram Moolenaar  call assert_equal('000123', printf('%06d', 123))
160e999782eSBram Moolenaar  call assert_equal('+00123', printf('%+06d', 123))
161e999782eSBram Moolenaar  call assert_equal(' 00123', printf('% 06d', 123))
162e999782eSBram Moolenaar  call assert_equal('  +123', printf('%+6d', 123))
163e999782eSBram Moolenaar  call assert_equal('   123', printf('% 6d', 123))
164e999782eSBram Moolenaar  call assert_equal('  -123', printf('% 6d', -123))
16504186095SBram Moolenaar
16604186095SBram Moolenaar  " Test left adjusted.
16704186095SBram Moolenaar  call assert_equal('123   ', printf('%-6d', 123))
168e999782eSBram Moolenaar  call assert_equal('+123  ', printf('%-+6d', 123))
169e999782eSBram Moolenaar  call assert_equal(' 123  ', printf('%- 6d', 123))
170e999782eSBram Moolenaar  call assert_equal('-123  ', printf('%- 6d', -123))
171e999782eSBram Moolenaar
17204186095SBram Moolenaar  call assert_equal('  00123', printf('%7.5d', 123))
17304186095SBram Moolenaar  call assert_equal(' -00123', printf('%7.5d', -123))
17404186095SBram Moolenaar  call assert_equal(' +00123', printf('%+7.5d', 123))
17504186095SBram Moolenaar  " Precision field should not be used when combined with %0
17604186095SBram Moolenaar  call assert_equal('  00123', printf('%07.5d', 123))
17704186095SBram Moolenaar  call assert_equal(' -00123', printf('%07.5d', -123))
17804186095SBram Moolenaar
17904186095SBram Moolenaar  call assert_equal('  123', printf('%*d', 5, 123))
18004186095SBram Moolenaar  call assert_equal('123  ', printf('%*d', -5, 123))
18176efafbaSBram Moolenaar  call assert_equal('00123', printf('%.*d', 5, 123))
18276efafbaSBram Moolenaar  call assert_equal('  123', printf('% *d', 5, 123))
18376efafbaSBram Moolenaar  call assert_equal(' +123', printf('%+ *d', 5, 123))
18476efafbaSBram Moolenaar
18504186095SBram Moolenaar  " Simple quote (thousand grouping char) is ignored.
18604186095SBram Moolenaar  call assert_equal('+00123456', printf("%+'09d", 123456))
18704186095SBram Moolenaar
18804186095SBram Moolenaar  " Unrecognized format specifier kept as-is.
18904186095SBram Moolenaar  call assert_equal('_123', printf("%_%d", 123))
19004186095SBram Moolenaar
19104186095SBram Moolenaar  " Test alternate forms.
19276efafbaSBram Moolenaar  call assert_equal('0x7b', printf('%#x', 123))
19376efafbaSBram Moolenaar  call assert_equal('0X7B', printf('%#X', 123))
19476efafbaSBram Moolenaar  call assert_equal('0173', printf('%#o', 123))
19576efafbaSBram Moolenaar  call assert_equal('0173', printf('%#O', 123))
19676efafbaSBram Moolenaar  call assert_equal('abc', printf('%#s', 'abc'))
19776efafbaSBram Moolenaar  call assert_equal('abc', printf('%#S', 'abc'))
19804186095SBram Moolenaar  call assert_equal('  0173', printf('%#6o', 123))
19904186095SBram Moolenaar  call assert_equal(' 00173', printf('%#6.5o', 123))
20004186095SBram Moolenaar  call assert_equal('  0173', printf('%#6.2o', 123))
20104186095SBram Moolenaar  call assert_equal('  0173', printf('%#6.2o', 123))
20204186095SBram Moolenaar  call assert_equal('0173', printf('%#2.2o', 123))
20376efafbaSBram Moolenaar
20476efafbaSBram Moolenaar  call assert_equal(' 00123', printf('%6.5d', 123))
20576efafbaSBram Moolenaar  call assert_equal(' 0007b', printf('%6.5x', 123))
20676efafbaSBram Moolenaar
20776efafbaSBram Moolenaar  call assert_equal('abc', printf('%2s', 'abc'))
20876efafbaSBram Moolenaar  call assert_equal('abc', printf('%2S', 'abc'))
20976efafbaSBram Moolenaar  call assert_equal('abc', printf('%.4s', 'abc'))
21076efafbaSBram Moolenaar  call assert_equal('abc', printf('%.4S', 'abc'))
21176efafbaSBram Moolenaar  call assert_equal('ab', printf('%.2s', 'abc'))
21276efafbaSBram Moolenaar  call assert_equal('ab', printf('%.2S', 'abc'))
21376efafbaSBram Moolenaar  call assert_equal('', printf('%.0s', 'abc'))
21476efafbaSBram Moolenaar  call assert_equal('', printf('%.s', 'abc'))
21576efafbaSBram Moolenaar  call assert_equal(' abc', printf('%4s', 'abc'))
21676efafbaSBram Moolenaar  call assert_equal(' abc', printf('%4S', 'abc'))
21776efafbaSBram Moolenaar  call assert_equal('0abc', printf('%04s', 'abc'))
21876efafbaSBram Moolenaar  call assert_equal('0abc', printf('%04S', 'abc'))
21976efafbaSBram Moolenaar  call assert_equal('abc ', printf('%-4s', 'abc'))
22076efafbaSBram Moolenaar  call assert_equal('abc ', printf('%-4S', 'abc'))
22176efafbaSBram Moolenaar
22276efafbaSBram Moolenaar  call assert_equal('1%', printf('%d%%', 1))
22376efafbaSBram Moolenaarendfunc
22476efafbaSBram Moolenaar
22576efafbaSBram Moolenaarfunction Test_printf_float()
22676efafbaSBram Moolenaar  if has('float')
22704186095SBram Moolenaar    call assert_equal('1.000000', printf('%f', 1))
22876efafbaSBram Moolenaar    call assert_equal('1.230000', printf('%f', 1.23))
22976efafbaSBram Moolenaar    call assert_equal('1.230000', printf('%F', 1.23))
230e999782eSBram Moolenaar    call assert_equal('9999999.9', printf('%g', 9999999.9))
231e999782eSBram Moolenaar    call assert_equal('9999999.9', printf('%G', 9999999.9))
232e999782eSBram Moolenaar    call assert_equal('1.00000001e7', printf('%.8g', 10000000.1))
233e999782eSBram Moolenaar    call assert_equal('1.00000001E7', printf('%.8G', 10000000.1))
23476efafbaSBram Moolenaar    call assert_equal('1.230000e+00', printf('%e', 1.23))
23576efafbaSBram Moolenaar    call assert_equal('1.230000E+00', printf('%E', 1.23))
23676efafbaSBram Moolenaar    call assert_equal('1.200000e-02', printf('%e', 0.012))
23776efafbaSBram Moolenaar    call assert_equal('-1.200000e-02', printf('%e', -0.012))
238e999782eSBram Moolenaar    call assert_equal('0.33', printf('%.2f', 1.0/3.0))
239e999782eSBram Moolenaar    call assert_equal('  0.33', printf('%6.2f', 1.0/3.0))
240e999782eSBram Moolenaar    call assert_equal(' -0.33', printf('%6.2f', -1.0/3.0))
241e999782eSBram Moolenaar    call assert_equal('000.33', printf('%06.2f', 1.0/3.0))
24204186095SBram Moolenaar    call assert_equal('-00.33', printf('%06.2f', -1.0/3.0))
24304186095SBram Moolenaar    call assert_equal('-00.33', printf('%+06.2f', -1.0/3.0))
24404186095SBram Moolenaar    call assert_equal('+00.33', printf('%+06.2f', 1.0/3.0))
24504186095SBram Moolenaar    call assert_equal(' 00.33', printf('% 06.2f', 1.0/3.0))
24604186095SBram Moolenaar    call assert_equal('000.33', printf('%06.2g', 1.0/3.0))
24704186095SBram Moolenaar    call assert_equal('-00.33', printf('%06.2g', -1.0/3.0))
24804186095SBram Moolenaar    call assert_equal('0.33', printf('%3.2f', 1.0/3.0))
24904186095SBram Moolenaar    call assert_equal('003.33e-01', printf('%010.2e', 1.0/3.0))
25004186095SBram Moolenaar    call assert_equal(' 03.33e-01', printf('% 010.2e', 1.0/3.0))
25104186095SBram Moolenaar    call assert_equal('+03.33e-01', printf('%+010.2e', 1.0/3.0))
25204186095SBram Moolenaar    call assert_equal('-03.33e-01', printf('%010.2e', -1.0/3.0))
25304186095SBram Moolenaar
25404186095SBram Moolenaar    " When precision is 0, the dot should be omitted.
25504186095SBram Moolenaar    call assert_equal('  2', printf('%3.f', 7.0/3.0))
25604186095SBram Moolenaar    call assert_equal('  2', printf('%3.g', 7.0/3.0))
25704186095SBram Moolenaar    call assert_equal('  2e+00', printf('%7.e', 7.0/3.0))
25804186095SBram Moolenaar
25904186095SBram Moolenaar    " Float zero can be signed.
26004186095SBram Moolenaar    call assert_equal('+0.000000', printf('%+f', 0.0))
26104186095SBram Moolenaar    call assert_equal('0.000000', printf('%f', 1.0/(1.0/0.0)))
26204186095SBram Moolenaar    call assert_equal('-0.000000', printf('%f', 1.0/(-1.0/0.0)))
26304186095SBram Moolenaar    call assert_equal('0.0', printf('%s', 1.0/(1.0/0.0)))
26404186095SBram Moolenaar    call assert_equal('-0.0', printf('%s', 1.0/(-1.0/0.0)))
26504186095SBram Moolenaar    call assert_equal('0.0', printf('%S', 1.0/(1.0/0.0)))
26604186095SBram Moolenaar    call assert_equal('-0.0', printf('%S', 1.0/(-1.0/0.0)))
26776efafbaSBram Moolenaar
268e999782eSBram Moolenaar    " Float infinity can be signed.
26976efafbaSBram Moolenaar    call assert_equal('inf', printf('%f', 1.0/0.0))
270e999782eSBram Moolenaar    call assert_equal('-inf', printf('%f', -1.0/0.0))
271e999782eSBram Moolenaar    call assert_equal('inf', printf('%g', 1.0/0.0))
272e999782eSBram Moolenaar    call assert_equal('-inf', printf('%g', -1.0/0.0))
273e999782eSBram Moolenaar    call assert_equal('inf', printf('%e', 1.0/0.0))
274e999782eSBram Moolenaar    call assert_equal('-inf', printf('%e', -1.0/0.0))
27504186095SBram Moolenaar    call assert_equal('INF', printf('%F', 1.0/0.0))
27604186095SBram Moolenaar    call assert_equal('-INF', printf('%F', -1.0/0.0))
277e999782eSBram Moolenaar    call assert_equal('INF', printf('%E', 1.0/0.0))
278e999782eSBram Moolenaar    call assert_equal('-INF', printf('%E', -1.0/0.0))
279e999782eSBram Moolenaar    call assert_equal('INF', printf('%E', 1.0/0.0))
280e999782eSBram Moolenaar    call assert_equal('-INF', printf('%G', -1.0/0.0))
281e999782eSBram Moolenaar    call assert_equal('+inf', printf('%+f', 1.0/0.0))
282e999782eSBram Moolenaar    call assert_equal('-inf', printf('%+f', -1.0/0.0))
283e999782eSBram Moolenaar    call assert_equal(' inf', printf('% f',  1.0/0.0))
284e999782eSBram Moolenaar    call assert_equal('   inf', printf('%6f', 1.0/0.0))
285e999782eSBram Moolenaar    call assert_equal('  -inf', printf('%6f', -1.0/0.0))
286e999782eSBram Moolenaar    call assert_equal('   inf', printf('%6g', 1.0/0.0))
287e999782eSBram Moolenaar    call assert_equal('  -inf', printf('%6g', -1.0/0.0))
288e999782eSBram Moolenaar    call assert_equal('  +inf', printf('%+6f', 1.0/0.0))
289e999782eSBram Moolenaar    call assert_equal('   inf', printf('% 6f', 1.0/0.0))
290e999782eSBram Moolenaar    call assert_equal('  +inf', printf('%+06f', 1.0/0.0))
291e999782eSBram Moolenaar    call assert_equal('inf   ', printf('%-6f', 1.0/0.0))
292e999782eSBram Moolenaar    call assert_equal('-inf  ', printf('%-6f', -1.0/0.0))
293e999782eSBram Moolenaar    call assert_equal('+inf  ', printf('%-+6f', 1.0/0.0))
294e999782eSBram Moolenaar    call assert_equal(' inf  ', printf('%- 6f', 1.0/0.0))
29504186095SBram Moolenaar    call assert_equal('-INF  ', printf('%-6F', -1.0/0.0))
29604186095SBram Moolenaar    call assert_equal('+INF  ', printf('%-+6F', 1.0/0.0))
29704186095SBram Moolenaar    call assert_equal(' INF  ', printf('%- 6F', 1.0/0.0))
298e999782eSBram Moolenaar    call assert_equal('INF   ', printf('%-6G', 1.0/0.0))
299e999782eSBram Moolenaar    call assert_equal('-INF  ', printf('%-6G', -1.0/0.0))
300e999782eSBram Moolenaar    call assert_equal('INF   ', printf('%-6E', 1.0/0.0))
301e999782eSBram Moolenaar    call assert_equal('-INF  ', printf('%-6E', -1.0/0.0))
302e999782eSBram Moolenaar    call assert_equal('inf', printf('%s', 1.0/0.0))
303e999782eSBram Moolenaar    call assert_equal('-inf', printf('%s', -1.0/0.0))
30476efafbaSBram Moolenaar
305e999782eSBram Moolenaar    " Float nan (not a number) has no sign.
306e999782eSBram Moolenaar    call assert_equal('nan', printf('%f', sqrt(-1.0)))
307e999782eSBram Moolenaar    call assert_equal('nan', printf('%f', 0.0/0.0))
308e999782eSBram Moolenaar    call assert_equal('nan', printf('%f', -0.0/0.0))
309e999782eSBram Moolenaar    call assert_equal('nan', printf('%g', 0.0/0.0))
310e999782eSBram Moolenaar    call assert_equal('nan', printf('%e', 0.0/0.0))
31104186095SBram Moolenaar    call assert_equal('NAN', printf('%F', 0.0/0.0))
312e999782eSBram Moolenaar    call assert_equal('NAN', printf('%G', 0.0/0.0))
313e999782eSBram Moolenaar    call assert_equal('NAN', printf('%E', 0.0/0.0))
31404186095SBram Moolenaar    call assert_equal('NAN', printf('%F', -0.0/0.0))
315e999782eSBram Moolenaar    call assert_equal('NAN', printf('%G', -0.0/0.0))
316e999782eSBram Moolenaar    call assert_equal('NAN', printf('%E', -0.0/0.0))
317e999782eSBram Moolenaar    call assert_equal('   nan', printf('%6f', 0.0/0.0))
318e999782eSBram Moolenaar    call assert_equal('   nan', printf('%06f', 0.0/0.0))
319e999782eSBram Moolenaar    call assert_equal('nan   ', printf('%-6f', 0.0/0.0))
320e999782eSBram Moolenaar    call assert_equal('nan   ', printf('%- 6f', 0.0/0.0))
321e999782eSBram Moolenaar    call assert_equal('nan', printf('%s', 0.0/0.0))
322e999782eSBram Moolenaar    call assert_equal('nan', printf('%s', -0.0/0.0))
323e999782eSBram Moolenaar    call assert_equal('nan', printf('%S', 0.0/0.0))
324e999782eSBram Moolenaar    call assert_equal('nan', printf('%S', -0.0/0.0))
32576efafbaSBram Moolenaar
32676efafbaSBram Moolenaar    call assert_fails('echo printf("%f", "a")', 'E807:')
32776efafbaSBram Moolenaar  endif
32876efafbaSBram Moolenaarendfunc
32976efafbaSBram Moolenaar
33076efafbaSBram Moolenaarfunction Test_printf_errors()
33176efafbaSBram Moolenaar  call assert_fails('echo printf("%d", {})', 'E728:')
33276efafbaSBram Moolenaar  call assert_fails('echo printf("%d", [])', 'E745:')
33376efafbaSBram Moolenaar  call assert_fails('echo printf("%d", 1, 2)', 'E767:')
33476efafbaSBram Moolenaar  call assert_fails('echo printf("%*d", 1)', 'E766:')
33576efafbaSBram Moolenaar  call assert_fails('echo printf("%d", 1.2)', 'E805:')
33676efafbaSBram Moolenaarendfunc
33776efafbaSBram Moolenaar
33826b84339SBram Moolenaarfunction Test_max_min_errors()
33926b84339SBram Moolenaar  call assert_fails('call max(v:true)', 'E712:')
34026b84339SBram Moolenaar  call assert_fails('call max(v:true)', 'max()')
34126b84339SBram Moolenaar  call assert_fails('call min(v:true)', 'E712:')
34226b84339SBram Moolenaar  call assert_fails('call min(v:true)', 'min()')
34326b84339SBram Moolenaarendfunc
34426b84339SBram Moolenaar
34538ee6b04SBram Moolenaarfunction Test_printf_64bit()
34638ee6b04SBram Moolenaar  if has('num64')
34738ee6b04SBram Moolenaar    call assert_equal("123456789012345", printf('%d', 123456789012345))
34838ee6b04SBram Moolenaar  endif
34938ee6b04SBram Moolenaarendfunc
35072ab729cSBram Moolenaar
351e5a8f35bSBram Moolenaarfunction Test_printf_spec_s()
352e5a8f35bSBram Moolenaar  " number
353e5a8f35bSBram Moolenaar  call assert_equal("1234567890", printf('%s', 1234567890))
354e5a8f35bSBram Moolenaar
355e5a8f35bSBram Moolenaar  " string
356e5a8f35bSBram Moolenaar  call assert_equal("abcdefgi", printf('%s', "abcdefgi"))
357e5a8f35bSBram Moolenaar
358e5a8f35bSBram Moolenaar  " float
359e5a8f35bSBram Moolenaar  if has('float')
360e5a8f35bSBram Moolenaar    call assert_equal("1.23", printf('%s', 1.23))
361e5a8f35bSBram Moolenaar  endif
362e5a8f35bSBram Moolenaar
363e5a8f35bSBram Moolenaar  " list
364e5a8f35bSBram Moolenaar  let value = [1, 'two', ['three', 4]]
365e5a8f35bSBram Moolenaar  call assert_equal(string(value), printf('%s', value))
366e5a8f35bSBram Moolenaar
367e5a8f35bSBram Moolenaar  " dict
368e5a8f35bSBram Moolenaar  let value = {'key1' : 'value1', 'key2' : ['list', 'value'], 'key3' : {'dict' : 'value'}}
369e5a8f35bSBram Moolenaar  call assert_equal(string(value), printf('%s', value))
370e5a8f35bSBram Moolenaar
371e5a8f35bSBram Moolenaar  " funcref
372e5a8f35bSBram Moolenaar  call assert_equal('printf', printf('%s', function('printf')))
373e5a8f35bSBram Moolenaar
374e5a8f35bSBram Moolenaar  " partial
375e5a8f35bSBram Moolenaar  call assert_equal(string(function('printf', ['%s'])), printf('%s', function('printf', ['%s'])))
376e5a8f35bSBram Moolenaarendfunc
377e5a8f35bSBram Moolenaar
37891984b90SBram Moolenaarfunction Test_printf_spec_b()
37991984b90SBram Moolenaar  call assert_equal("0", printf('%b', 0))
38091984b90SBram Moolenaar  call assert_equal("00001100", printf('%08b', 12))
38191984b90SBram Moolenaar  call assert_equal("11111111", printf('%08b', 0xff))
38291984b90SBram Moolenaar  call assert_equal("   1111011", printf('%10b', 123))
38391984b90SBram Moolenaar  call assert_equal("0001111011", printf('%010b', 123))
38491984b90SBram Moolenaar  call assert_equal(" 0b1111011", printf('%#10b', 123))
38591984b90SBram Moolenaar  call assert_equal("0B01111011", printf('%#010B', 123))
38691984b90SBram Moolenaar  call assert_equal("1001001100101100000001011010010", printf('%b', 1234567890))
38791984b90SBram Moolenaar  if has('num64')
38891984b90SBram Moolenaar    call assert_equal("11100000100100010000110000011011101111101111001", printf('%b', 123456789012345))
38991984b90SBram Moolenaar    call assert_equal("1111111111111111111111111111111111111111111111111111111111111111", printf('%b', -1))
39091984b90SBram Moolenaar  else
39191984b90SBram Moolenaar    call assert_equal("11111111111111111111111111111111", printf('%b', -1))
39291984b90SBram Moolenaar  endif
39391984b90SBram Moolenaarendfunc
39491984b90SBram Moolenaar
39572ab729cSBram Moolenaarfunc Test_substitute_expr()
39672ab729cSBram Moolenaar  let g:val = 'XXX'
39772ab729cSBram Moolenaar  call assert_equal('XXX', substitute('yyy', 'y*', '\=g:val', ''))
39872ab729cSBram Moolenaar  call assert_equal('XXX', substitute('yyy', 'y*', {-> g:val}, ''))
39972ab729cSBram Moolenaar  call assert_equal("-\u1b \uf2-", substitute("-%1b %f2-", '%\(\x\x\)',
40072ab729cSBram Moolenaar			   \ '\=nr2char("0x" . submatch(1))', 'g'))
40172ab729cSBram Moolenaar  call assert_equal("-\u1b \uf2-", substitute("-%1b %f2-", '%\(\x\x\)',
40272ab729cSBram Moolenaar			   \ {-> nr2char("0x" . submatch(1))}, 'g'))
40372ab729cSBram Moolenaar
40472ab729cSBram Moolenaar  call assert_equal('231', substitute('123', '\(.\)\(.\)\(.\)',
40572ab729cSBram Moolenaar	\ {-> submatch(2) . submatch(3) . submatch(1)}, ''))
40672ab729cSBram Moolenaar
40772ab729cSBram Moolenaar  func Recurse()
408*6100d02aSBram Moolenaar    return substitute('yyy', 'y\(.\)y', {-> submatch(1)}, '')
40972ab729cSBram Moolenaar  endfunc
410*6100d02aSBram Moolenaar  " recursive call works
411*6100d02aSBram Moolenaar  call assert_equal('-y-x-', substitute('xxx', 'x\(.\)x', {-> '-' . Recurse() . '-' . submatch(1) . '-'}, ''))
41272ab729cSBram Moolenaarendfunc
413df48fb45SBram Moolenaar
414989f592fSBram Moolenaarfunc Test_invalid_submatch()
415989f592fSBram Moolenaar  " This was causing invalid memory access in Vim-7.4.2232 and older
416989f592fSBram Moolenaar  call assert_fails("call substitute('x', '.', {-> submatch(10)}, '')", 'E935:')
417989f592fSBram Moolenaarendfunc
418989f592fSBram Moolenaar
419df48fb45SBram Moolenaarfunc Test_substitute_expr_arg()
420df48fb45SBram Moolenaar  call assert_equal('123456789-123456789=', substitute('123456789',
421df48fb45SBram Moolenaar	\ '\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)',
422df48fb45SBram Moolenaar	\ {m -> m[0] . '-' . m[1] . m[2] . m[3] . m[4] . m[5] . m[6] . m[7] . m[8] . m[9] . '='}, ''))
423df48fb45SBram Moolenaar
424df48fb45SBram Moolenaar  call assert_equal('123456-123456=789', substitute('123456789',
425df48fb45SBram Moolenaar	\ '\(.\)\(.\)\(.\)\(a*\)\(n*\)\(.\)\(.\)\(.\)\(x*\)',
426df48fb45SBram Moolenaar	\ {m -> m[0] . '-' . m[1] . m[2] . m[3] . m[4] . m[5] . m[6] . m[7] . m[8] . m[9] . '='}, ''))
427df48fb45SBram Moolenaar
428df48fb45SBram Moolenaar  call assert_equal('123456789-123456789x=', substitute('123456789',
429df48fb45SBram Moolenaar	\ '\(.\)\(.\)\(.*\)',
430df48fb45SBram Moolenaar	\ {m -> m[0] . '-' . m[1] . m[2] . m[3] . 'x' . m[4] . m[5] . m[6] . m[7] . m[8] . m[9] . '='}, ''))
431df48fb45SBram Moolenaar
432df48fb45SBram Moolenaar  call assert_fails("call substitute('xxx', '.', {m -> string(add(m, 'x'))}, '')", 'E742:')
433df48fb45SBram Moolenaar  call assert_fails("call substitute('xxx', '.', {m -> string(insert(m, 'x'))}, '')", 'E742:')
434df48fb45SBram Moolenaar  call assert_fails("call substitute('xxx', '.', {m -> string(extend(m, ['x']))}, '')", 'E742:')
435df48fb45SBram Moolenaar  call assert_fails("call substitute('xxx', '.', {m -> string(remove(m, 1))}, '')", 'E742:')
436df48fb45SBram Moolenaarendfunc
437b54c3ff3SBram Moolenaar
438b54c3ff3SBram Moolenaarfunc Test_function_with_funcref()
439b54c3ff3SBram Moolenaar  let s:f = function('type')
440b54c3ff3SBram Moolenaar  let s:fref = function(s:f)
441b54c3ff3SBram Moolenaar  call assert_equal(v:t_string, s:fref('x'))
442b54c3ff3SBram Moolenaar  call assert_fails("call function('s:f')", 'E700:')
4435582ef14SBram Moolenaar
4445582ef14SBram Moolenaar  call assert_fails("call function('foo()')", 'E475:')
4455582ef14SBram Moolenaar  call assert_fails("call function('foo()')", 'foo()')
446b54c3ff3SBram Moolenaarendfunc
447437bafe4SBram Moolenaar
448437bafe4SBram Moolenaarfunc Test_funcref()
449437bafe4SBram Moolenaar  func! One()
450437bafe4SBram Moolenaar    return 1
451437bafe4SBram Moolenaar  endfunc
452437bafe4SBram Moolenaar  let OneByName = function('One')
453437bafe4SBram Moolenaar  let OneByRef = funcref('One')
454437bafe4SBram Moolenaar  func! One()
455437bafe4SBram Moolenaar    return 2
456437bafe4SBram Moolenaar  endfunc
457437bafe4SBram Moolenaar  call assert_equal(2, OneByName())
458437bafe4SBram Moolenaar  call assert_equal(1, OneByRef())
459437bafe4SBram Moolenaar  let OneByRef = funcref('One')
460437bafe4SBram Moolenaar  call assert_equal(2, OneByRef())
461843b8844SBram Moolenaar  call assert_fails('echo funcref("{")', 'E475:')
462437bafe4SBram Moolenaarendfunc
4637dc5e2e4SBram Moolenaar
4647dc5e2e4SBram Moolenaarfunc Test_setmatches()
4657dc5e2e4SBram Moolenaar  hi def link 1 Comment
4667dc5e2e4SBram Moolenaar  hi def link 2 PreProc
4677ab6defcSBram Moolenaar  let set = [{"group": 1, "pattern": 2, "id": 3, "priority": 4}]
4687ab6defcSBram Moolenaar  let exp = [{"group": '1', "pattern": '2', "id": 3, "priority": 4}]
4697ab6defcSBram Moolenaar  if has('conceal')
4707ab6defcSBram Moolenaar    let set[0]['conceal'] = 5
4717ab6defcSBram Moolenaar    let exp[0]['conceal'] = '5'
4727ab6defcSBram Moolenaar  endif
4737dc5e2e4SBram Moolenaar  call setmatches(set)
4747dc5e2e4SBram Moolenaar  call assert_equal(exp, getmatches())
4757dc5e2e4SBram Moolenaarendfunc
476