xref: /vim-8.2.3635/src/testdir/test_const.vim (revision 611728f8)
19937a055SBram Moolenaar" Test for :const
29937a055SBram Moolenaar
39937a055SBram Moolenaarfunc s:noop()
49937a055SBram Moolenaarendfunc
59937a055SBram Moolenaar
69937a055SBram Moolenaarfunc Test_define_var_with_lock()
79937a055SBram Moolenaar    const i = 1
89937a055SBram Moolenaar    const f = 1.1
99937a055SBram Moolenaar    const s = 'vim'
109937a055SBram Moolenaar    const F = funcref('s:noop')
119937a055SBram Moolenaar    const l = [1, 2, 3]
129937a055SBram Moolenaar    const d = {'foo': 10}
139937a055SBram Moolenaar    if has('channel')
149937a055SBram Moolenaar      const j = test_null_job()
159937a055SBram Moolenaar      const c = test_null_channel()
169937a055SBram Moolenaar    endif
179937a055SBram Moolenaar    const b = v:true
189937a055SBram Moolenaar    const n = v:null
199937a055SBram Moolenaar    const bl = 0zC0FFEE
209937a055SBram Moolenaar    const here =<< trim EOS
219937a055SBram Moolenaar      hello
229937a055SBram Moolenaar    EOS
239937a055SBram Moolenaar
241c196e7bSBram Moolenaar    call assert_true(exists('i'))
251c196e7bSBram Moolenaar    call assert_true(exists('f'))
261c196e7bSBram Moolenaar    call assert_true(exists('s'))
271c196e7bSBram Moolenaar    call assert_true(exists('F'))
281c196e7bSBram Moolenaar    call assert_true(exists('l'))
291c196e7bSBram Moolenaar    call assert_true(exists('d'))
301c196e7bSBram Moolenaar    if has('channel')
311c196e7bSBram Moolenaar        call assert_true(exists('j'))
321c196e7bSBram Moolenaar        call assert_true(exists('c'))
331c196e7bSBram Moolenaar    endif
341c196e7bSBram Moolenaar    call assert_true(exists('b'))
351c196e7bSBram Moolenaar    call assert_true(exists('n'))
361c196e7bSBram Moolenaar    call assert_true(exists('bl'))
371c196e7bSBram Moolenaar    call assert_true(exists('here'))
381c196e7bSBram Moolenaar
399937a055SBram Moolenaar    call assert_fails('let i = 1', 'E741:')
409937a055SBram Moolenaar    call assert_fails('let f = 1.1', 'E741:')
419937a055SBram Moolenaar    call assert_fails('let s = "vim"', 'E741:')
429937a055SBram Moolenaar    call assert_fails('let F = funcref("s:noop")', 'E741:')
439937a055SBram Moolenaar    call assert_fails('let l = [1, 2, 3]', 'E741:')
4424157279SBram Moolenaar    call assert_fails('call filter(l, "v:val % 2 == 0")', 'E741:')
459937a055SBram Moolenaar    call assert_fails('let d = {"foo": 10}', 'E741:')
469937a055SBram Moolenaar    if has('channel')
479937a055SBram Moolenaar      call assert_fails('let j = test_null_job()', 'E741:')
489937a055SBram Moolenaar      call assert_fails('let c = test_null_channel()', 'E741:')
499937a055SBram Moolenaar    endif
509937a055SBram Moolenaar    call assert_fails('let b = v:true', 'E741:')
519937a055SBram Moolenaar    call assert_fails('let n = v:null', 'E741:')
529937a055SBram Moolenaar    call assert_fails('let bl = 0zC0FFEE', 'E741:')
539937a055SBram Moolenaar    call assert_fails('let here = "xxx"', 'E741:')
549937a055SBram Moolenaar
559937a055SBram Moolenaar    " Unlet
569937a055SBram Moolenaar    unlet i
579937a055SBram Moolenaar    unlet f
589937a055SBram Moolenaar    unlet s
599937a055SBram Moolenaar    unlet F
609937a055SBram Moolenaar    unlet l
619937a055SBram Moolenaar    unlet d
62b6e3b88eSBram Moolenaar    if has('channel')
639937a055SBram Moolenaar      unlet j
649937a055SBram Moolenaar      unlet c
65b6e3b88eSBram Moolenaar    endif
669937a055SBram Moolenaar    unlet b
679937a055SBram Moolenaar    unlet n
689937a055SBram Moolenaar    unlet bl
699937a055SBram Moolenaar    unlet here
709937a055SBram Moolenaarendfunc
719937a055SBram Moolenaar
729937a055SBram Moolenaarfunc Test_define_l_var_with_lock()
739937a055SBram Moolenaar    " With l: prefix
749937a055SBram Moolenaar    const l:i = 1
759937a055SBram Moolenaar    const l:f = 1.1
769937a055SBram Moolenaar    const l:s = 'vim'
779937a055SBram Moolenaar    const l:F = funcref('s:noop')
789937a055SBram Moolenaar    const l:l = [1, 2, 3]
799937a055SBram Moolenaar    const l:d = {'foo': 10}
809937a055SBram Moolenaar    if has('channel')
819937a055SBram Moolenaar      const l:j = test_null_job()
829937a055SBram Moolenaar      const l:c = test_null_channel()
839937a055SBram Moolenaar    endif
849937a055SBram Moolenaar    const l:b = v:true
859937a055SBram Moolenaar    const l:n = v:null
869937a055SBram Moolenaar    const l:bl = 0zC0FFEE
879937a055SBram Moolenaar    const l:here =<< trim EOS
889937a055SBram Moolenaar      hello
899937a055SBram Moolenaar    EOS
909937a055SBram Moolenaar
919937a055SBram Moolenaar    call assert_fails('let l:i = 1', 'E741:')
929937a055SBram Moolenaar    call assert_fails('let l:f = 1.1', 'E741:')
939937a055SBram Moolenaar    call assert_fails('let l:s = "vim"', 'E741:')
949937a055SBram Moolenaar    call assert_fails('let l:F = funcref("s:noop")', 'E741:')
959937a055SBram Moolenaar    call assert_fails('let l:l = [1, 2, 3]', 'E741:')
969937a055SBram Moolenaar    call assert_fails('let l:d = {"foo": 10}', 'E741:')
979937a055SBram Moolenaar    if has('channel')
989937a055SBram Moolenaar      call assert_fails('let l:j = test_null_job()', 'E741:')
999937a055SBram Moolenaar      call assert_fails('let l:c = test_null_channel()', 'E741:')
1009937a055SBram Moolenaar    endif
1019937a055SBram Moolenaar    call assert_fails('let l:b = v:true', 'E741:')
1029937a055SBram Moolenaar    call assert_fails('let l:n = v:null', 'E741:')
1039937a055SBram Moolenaar    call assert_fails('let l:bl = 0zC0FFEE', 'E741:')
1049937a055SBram Moolenaar    call assert_fails('let l:here = "xxx"', 'E741:')
1059937a055SBram Moolenaar
1069937a055SBram Moolenaar    " Unlet
1079937a055SBram Moolenaar    unlet l:i
1089937a055SBram Moolenaar    unlet l:f
1099937a055SBram Moolenaar    unlet l:s
1109937a055SBram Moolenaar    unlet l:F
1119937a055SBram Moolenaar    unlet l:l
1129937a055SBram Moolenaar    unlet l:d
113b6e3b88eSBram Moolenaar    if has('channel')
1149937a055SBram Moolenaar      unlet l:j
1159937a055SBram Moolenaar      unlet l:c
116b6e3b88eSBram Moolenaar    endif
1179937a055SBram Moolenaar    unlet l:b
1189937a055SBram Moolenaar    unlet l:n
1199937a055SBram Moolenaar    unlet l:bl
1209937a055SBram Moolenaar    unlet l:here
1219937a055SBram Moolenaarendfunc
1229937a055SBram Moolenaar
1239937a055SBram Moolenaarfunc Test_define_script_var_with_lock()
1249937a055SBram Moolenaar    const s:x = 0
1259937a055SBram Moolenaar    call assert_fails('let s:x = 1', 'E741:')
1269937a055SBram Moolenaar    unlet s:x
1279937a055SBram Moolenaarendfunc
1289937a055SBram Moolenaar
1291bc353b6SBram Moolenaarfunc Test_destructuring_with_lock()
1309937a055SBram Moolenaar    const [a, b, c] = [1, 1.1, 'vim']
1319937a055SBram Moolenaar
1329937a055SBram Moolenaar    call assert_fails('let a = 1', 'E741:')
1339937a055SBram Moolenaar    call assert_fails('let b = 1.1', 'E741:')
1349937a055SBram Moolenaar    call assert_fails('let c = "vim"', 'E741:')
1359937a055SBram Moolenaar
1369937a055SBram Moolenaar    const [d; e] = [1, 1.1, 'vim']
1379937a055SBram Moolenaar    call assert_fails('let d = 1', 'E741:')
1389937a055SBram Moolenaar    call assert_fails('let e = [2.2, "a"]', 'E741:')
1399937a055SBram Moolenaarendfunc
1409937a055SBram Moolenaar
1419937a055SBram Moolenaarfunc Test_cannot_modify_existing_variable()
1429937a055SBram Moolenaar    let i = 1
1439937a055SBram Moolenaar    let f = 1.1
1449937a055SBram Moolenaar    let s = 'vim'
1459937a055SBram Moolenaar    let F = funcref('s:noop')
1469937a055SBram Moolenaar    let l = [1, 2, 3]
1479937a055SBram Moolenaar    let d = {'foo': 10}
1489937a055SBram Moolenaar    if has('channel')
1499937a055SBram Moolenaar      let j = test_null_job()
1509937a055SBram Moolenaar      let c = test_null_channel()
1519937a055SBram Moolenaar    endif
1529937a055SBram Moolenaar    let b = v:true
1539937a055SBram Moolenaar    let n = v:null
1549937a055SBram Moolenaar    let bl = 0zC0FFEE
1559937a055SBram Moolenaar
1569937a055SBram Moolenaar    call assert_fails('const i = 1', 'E995:')
1579937a055SBram Moolenaar    call assert_fails('const f = 1.1', 'E995:')
1589937a055SBram Moolenaar    call assert_fails('const s = "vim"', 'E995:')
1599937a055SBram Moolenaar    call assert_fails('const F = funcref("s:noop")', 'E995:')
1609937a055SBram Moolenaar    call assert_fails('const l = [1, 2, 3]', 'E995:')
1619937a055SBram Moolenaar    call assert_fails('const d = {"foo": 10}', 'E995:')
1629937a055SBram Moolenaar    if has('channel')
1639937a055SBram Moolenaar      call assert_fails('const j = test_null_job()', 'E995:')
1649937a055SBram Moolenaar      call assert_fails('const c = test_null_channel()', 'E995:')
1659937a055SBram Moolenaar    endif
1669937a055SBram Moolenaar    call assert_fails('const b = v:true', 'E995:')
1679937a055SBram Moolenaar    call assert_fails('const n = v:null', 'E995:')
1689937a055SBram Moolenaar    call assert_fails('const bl = 0zC0FFEE', 'E995:')
1699937a055SBram Moolenaar    call assert_fails('const [i, f, s] = [1, 1.1, "vim"]', 'E995:')
1709937a055SBram Moolenaar
1719937a055SBram Moolenaar    const i2 = 1
1729937a055SBram Moolenaar    const f2 = 1.1
1739937a055SBram Moolenaar    const s2 = 'vim'
1749937a055SBram Moolenaar    const F2 = funcref('s:noop')
1759937a055SBram Moolenaar    const l2 = [1, 2, 3]
1769937a055SBram Moolenaar    const d2 = {'foo': 10}
1779937a055SBram Moolenaar    if has('channel')
1789937a055SBram Moolenaar      const j2 = test_null_job()
1799937a055SBram Moolenaar      const c2 = test_null_channel()
1809937a055SBram Moolenaar    endif
1819937a055SBram Moolenaar    const b2 = v:true
1829937a055SBram Moolenaar    const n2 = v:null
1839937a055SBram Moolenaar    const bl2 = 0zC0FFEE
1849937a055SBram Moolenaar
1859937a055SBram Moolenaar    call assert_fails('const i2 = 1', 'E995:')
1869937a055SBram Moolenaar    call assert_fails('const f2 = 1.1', 'E995:')
1879937a055SBram Moolenaar    call assert_fails('const s2 = "vim"', 'E995:')
1889937a055SBram Moolenaar    call assert_fails('const F2 = funcref("s:noop")', 'E995:')
1899937a055SBram Moolenaar    call assert_fails('const l2 = [1, 2, 3]', 'E995:')
1909937a055SBram Moolenaar    call assert_fails('const d2 = {"foo": 10}', 'E995:')
1919937a055SBram Moolenaar    if has('channel')
1929937a055SBram Moolenaar      call assert_fails('const j2 = test_null_job()', 'E995:')
1939937a055SBram Moolenaar      call assert_fails('const c2 = test_null_channel()', 'E995:')
1949937a055SBram Moolenaar    endif
1959937a055SBram Moolenaar    call assert_fails('const b2 = v:true', 'E995:')
1969937a055SBram Moolenaar    call assert_fails('const n2 = v:null', 'E995:')
1979937a055SBram Moolenaar    call assert_fails('const bl2 = 0zC0FFEE', 'E995:')
1989937a055SBram Moolenaar    call assert_fails('const [i2, f2, s2] = [1, 1.1, "vim"]', 'E995:')
1999937a055SBram Moolenaarendfunc
2009937a055SBram Moolenaar
2018f76e6b1SBram Moolenaarfunc Test_const_with_condition()
2028f76e6b1SBram Moolenaar  const x = 0
2038f76e6b1SBram Moolenaar  if 0 | const x = 1 | endif
2048f76e6b1SBram Moolenaar  call assert_equal(0, x)
2058f76e6b1SBram Moolenaarendfunc
2068f76e6b1SBram Moolenaar
207cc4423aeSBram Moolenaarfunc Test_lockvar()
208cc4423aeSBram Moolenaar  let x = 'hello'
209cc4423aeSBram Moolenaar  lockvar x
210e2e4075fSBram Moolenaar  call assert_fails('let x = "there"', 'E741:')
211cc4423aeSBram Moolenaar  if 0 | unlockvar x | endif
212e2e4075fSBram Moolenaar  call assert_fails('let x = "there"', 'E741:')
213cc4423aeSBram Moolenaar  unlockvar x
214cc4423aeSBram Moolenaar  let x = 'there'
215cc4423aeSBram Moolenaar
216cc4423aeSBram Moolenaar  if 0 | lockvar x | endif
217cc4423aeSBram Moolenaar  let x = 'again'
218a187c43cSBram Moolenaar
219a187c43cSBram Moolenaar  let val = [1, 2, 3]
220a187c43cSBram Moolenaar  lockvar 0 val
221a187c43cSBram Moolenaar  let val[0] = 9
222a187c43cSBram Moolenaar  call assert_equal([9, 2, 3], val)
223a187c43cSBram Moolenaar  call add(val, 4)
224a187c43cSBram Moolenaar  call assert_equal([9, 2, 3, 4], val)
225a187c43cSBram Moolenaar  call assert_fails('let val = [4, 5, 6]', 'E1122:')
226cc4423aeSBram Moolenaar
227*611728f8SYegappan Lakshmanan  let l =<< trim END
228*611728f8SYegappan Lakshmanan    let d = {}
229*611728f8SYegappan Lakshmanan    lockvar d
230*611728f8SYegappan Lakshmanan    func d.fn()
231*611728f8SYegappan Lakshmanan      return 1
232*611728f8SYegappan Lakshmanan    endfunc
233*611728f8SYegappan Lakshmanan  END
234*611728f8SYegappan Lakshmanan  let @a = l->join("\n")
235*611728f8SYegappan Lakshmanan  call assert_fails('exe @a', 'E741:')
236*611728f8SYegappan Lakshmanan
237*611728f8SYegappan Lakshmanan  let l =<< trim END
238*611728f8SYegappan Lakshmanan    let d = {}
239*611728f8SYegappan Lakshmanan    let d.fn = function("min")
240*611728f8SYegappan Lakshmanan    lockvar d.fn
241*611728f8SYegappan Lakshmanan    func! d.fn()
242*611728f8SYegappan Lakshmanan      return 1
243*611728f8SYegappan Lakshmanan    endfunc
244*611728f8SYegappan Lakshmanan  END
245*611728f8SYegappan Lakshmanan  let @a = l->join("\n")
246*611728f8SYegappan Lakshmanan  call assert_fails('exe @a', 'E741:')
247*611728f8SYegappan Lakshmananendfunc
248cc4423aeSBram Moolenaar
2499937a055SBram Moolenaarfunc Test_const_with_index_access()
2509937a055SBram Moolenaar    let l = [1, 2, 3]
2519937a055SBram Moolenaar    call assert_fails('const l[0] = 4', 'E996:')
2529937a055SBram Moolenaar    call assert_fails('const l[0:1] = [1, 2]', 'E996:')
2539937a055SBram Moolenaar
2549937a055SBram Moolenaar    let d = {'aaa': 0}
2559937a055SBram Moolenaar    call assert_fails("const d['aaa'] = 4", 'E996:')
2569937a055SBram Moolenaar    call assert_fails("const d.aaa = 4", 'E996:')
2579937a055SBram Moolenaarendfunc
2589937a055SBram Moolenaar
2599937a055SBram Moolenaarfunc Test_const_with_compound_assign()
2609937a055SBram Moolenaar    let i = 0
2619937a055SBram Moolenaar    call assert_fails('const i += 4', 'E995:')
2629937a055SBram Moolenaar    call assert_fails('const i -= 4', 'E995:')
2639937a055SBram Moolenaar    call assert_fails('const i *= 4', 'E995:')
2649937a055SBram Moolenaar    call assert_fails('const i /= 4', 'E995:')
2659937a055SBram Moolenaar    call assert_fails('const i %= 4', 'E995:')
2669937a055SBram Moolenaar
2679937a055SBram Moolenaar    let s = 'a'
2689937a055SBram Moolenaar    call assert_fails('const s .= "b"', 'E995:')
2699937a055SBram Moolenaar
2709937a055SBram Moolenaar    let [a, b, c] = [1, 2, 3]
2719937a055SBram Moolenaar    call assert_fails('const [a, b, c] += [4, 5, 6]', 'E995:')
2729937a055SBram Moolenaar
2739937a055SBram Moolenaar    let [d; e] = [1, 2, 3]
2749937a055SBram Moolenaar    call assert_fails('const [d; e] += [4, 5, 6]', 'E995:')
2759937a055SBram Moolenaarendfunc
2769937a055SBram Moolenaar
2779937a055SBram Moolenaarfunc Test_const_with_special_variables()
2789937a055SBram Moolenaar    call assert_fails('const $FOO = "hello"', 'E996:')
2799937a055SBram Moolenaar    call assert_fails('const @a = "hello"', 'E996:')
2809937a055SBram Moolenaar    call assert_fails('const &filetype = "vim"', 'E996:')
2819937a055SBram Moolenaar    call assert_fails('const &l:filetype = "vim"', 'E996:')
2829937a055SBram Moolenaar    call assert_fails('const &g:encoding = "utf-8"', 'E996:')
2838dfcce3aSBram Moolenaar
2848dfcce3aSBram Moolenaar    call assert_fails('const [a, $CONST_FOO] = [369, "abc"]', 'E996:')
2858dfcce3aSBram Moolenaar    call assert_equal(369, a)
2868dfcce3aSBram Moolenaar    call assert_equal(v:null, getenv("CONST_FOO"))
2878dfcce3aSBram Moolenaar
2888dfcce3aSBram Moolenaar    call assert_fails('const [b; $CONST_FOO] = [246, 2, "abc"]', 'E996:')
2898dfcce3aSBram Moolenaar    call assert_equal(246, b)
2908dfcce3aSBram Moolenaar    call assert_equal(v:null, getenv("CONST_FOO"))
2919937a055SBram Moolenaarendfunc
2929937a055SBram Moolenaar
2931c196e7bSBram Moolenaarfunc Test_const_with_eval_name()
2941c196e7bSBram Moolenaar    let s = 'foo'
2951c196e7bSBram Moolenaar
2961c196e7bSBram Moolenaar    " eval name with :const should work
2971c196e7bSBram Moolenaar    const abc_{s} = 1
2981c196e7bSBram Moolenaar    const {s}{s} = 1
2991c196e7bSBram Moolenaar
3001c196e7bSBram Moolenaar    let s2 = 'abc_foo'
3011c196e7bSBram Moolenaar    call assert_fails('const {s2} = "bar"', 'E995:')
3021c196e7bSBram Moolenaarendfunc
3031c196e7bSBram Moolenaar
304021bda56SBram Moolenaarfunc Test_lock_depth_is_2()
305021bda56SBram Moolenaar    " Modify list - error when changing item or adding/removing items
306021bda56SBram Moolenaar    const l = [1, 2, [3, 4]]
307021bda56SBram Moolenaar    call assert_fails('let l[0] = 42', 'E741:')
308021bda56SBram Moolenaar    call assert_fails('let l[2][0] = 42', 'E741:')
30924157279SBram Moolenaar    call assert_fails('call add(l, 4)', 'E741:')
31024157279SBram Moolenaar    call assert_fails('unlet l[1]', 'E741:')
3119937a055SBram Moolenaar
312021bda56SBram Moolenaar    " Modify blob - error when changing
313021bda56SBram Moolenaar    const b = 0z001122
314021bda56SBram Moolenaar    call assert_fails('let b[0] = 42', 'E741:')
315021bda56SBram Moolenaar
316021bda56SBram Moolenaar    " Modify dict - error when changing item or adding/removing items
317021bda56SBram Moolenaar    const d = {'foo': 10}
318021bda56SBram Moolenaar    call assert_fails("let d['foo'] = 'hello'", 'E741:')
319021bda56SBram Moolenaar    call assert_fails("let d.foo = 'hello'", 'E741:')
32024157279SBram Moolenaar    call assert_fails("let d['bar'] = 'hello'", 'E741:')
32124157279SBram Moolenaar    call assert_fails("unlet d['foo']", 'E741:')
322021bda56SBram Moolenaar
323021bda56SBram Moolenaar    " Modifying list or dict item contents is OK.
324021bda56SBram Moolenaar    let lvar = ['a', 'b']
325021bda56SBram Moolenaar    let bvar = 0z1122
326021bda56SBram Moolenaar    const l2 = [0, lvar, bvar]
327021bda56SBram Moolenaar    let l2[1][0] = 'c'
328021bda56SBram Moolenaar    let l2[2][1] = 0x33
329021bda56SBram Moolenaar    call assert_equal([0, ['c', 'b'], 0z1133], l2)
330021bda56SBram Moolenaar
331021bda56SBram Moolenaar    const d2 = #{a: 0, b: lvar, c: 4}
332021bda56SBram Moolenaar    let d2.b[1] = 'd'
3339937a055SBram Moolenaarendfunc
3348dfcce3aSBram Moolenaar
3358dfcce3aSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
336