xref: /vim-8.2.3635/src/testdir/test_const.vim (revision b6e3b88e)
1" Test for :const
2
3func s:noop()
4endfunc
5
6func Test_define_var_with_lock()
7    const i = 1
8    const f = 1.1
9    const s = 'vim'
10    const F = funcref('s:noop')
11    const l = [1, 2, 3]
12    const d = {'foo': 10}
13    if has('channel')
14      const j = test_null_job()
15      const c = test_null_channel()
16    endif
17    const b = v:true
18    const n = v:null
19    const bl = 0zC0FFEE
20    const here =<< trim EOS
21    hello
22    EOS
23
24    call assert_fails('let i = 1', 'E741:')
25    call assert_fails('let f = 1.1', 'E741:')
26    call assert_fails('let s = "vim"', 'E741:')
27    call assert_fails('let F = funcref("s:noop")', 'E741:')
28    call assert_fails('let l = [1, 2, 3]', 'E741:')
29    call assert_fails('let d = {"foo": 10}', 'E741:')
30    if has('channel')
31      call assert_fails('let j = test_null_job()', 'E741:')
32      call assert_fails('let c = test_null_channel()', 'E741:')
33    endif
34    call assert_fails('let b = v:true', 'E741:')
35    call assert_fails('let n = v:null', 'E741:')
36    call assert_fails('let bl = 0zC0FFEE', 'E741:')
37    call assert_fails('let here = "xxx"', 'E741:')
38
39    " Unlet
40    unlet i
41    unlet f
42    unlet s
43    unlet F
44    unlet l
45    unlet d
46    if has('channel')
47      unlet j
48      unlet c
49    endif
50    unlet b
51    unlet n
52    unlet bl
53    unlet here
54endfunc
55
56func Test_define_l_var_with_lock()
57    " With l: prefix
58    const l:i = 1
59    const l:f = 1.1
60    const l:s = 'vim'
61    const l:F = funcref('s:noop')
62    const l:l = [1, 2, 3]
63    const l:d = {'foo': 10}
64    if has('channel')
65      const l:j = test_null_job()
66      const l:c = test_null_channel()
67    endif
68    const l:b = v:true
69    const l:n = v:null
70    const l:bl = 0zC0FFEE
71    const l:here =<< trim EOS
72    hello
73    EOS
74
75    call assert_fails('let l:i = 1', 'E741:')
76    call assert_fails('let l:f = 1.1', 'E741:')
77    call assert_fails('let l:s = "vim"', 'E741:')
78    call assert_fails('let l:F = funcref("s:noop")', 'E741:')
79    call assert_fails('let l:l = [1, 2, 3]', 'E741:')
80    call assert_fails('let l:d = {"foo": 10}', 'E741:')
81    if has('channel')
82      call assert_fails('let l:j = test_null_job()', 'E741:')
83      call assert_fails('let l:c = test_null_channel()', 'E741:')
84    endif
85    call assert_fails('let l:b = v:true', 'E741:')
86    call assert_fails('let l:n = v:null', 'E741:')
87    call assert_fails('let l:bl = 0zC0FFEE', 'E741:')
88    call assert_fails('let l:here = "xxx"', 'E741:')
89
90    " Unlet
91    unlet l:i
92    unlet l:f
93    unlet l:s
94    unlet l:F
95    unlet l:l
96    unlet l:d
97    if has('channel')
98      unlet l:j
99      unlet l:c
100    endif
101    unlet l:b
102    unlet l:n
103    unlet l:bl
104    unlet l:here
105endfunc
106
107func Test_define_script_var_with_lock()
108    const s:x = 0
109    call assert_fails('let s:x = 1', 'E741:')
110    unlet s:x
111endfunc
112
113func Test_descructuring_with_lock()
114    const [a, b, c] = [1, 1.1, 'vim']
115
116    call assert_fails('let a = 1', 'E741:')
117    call assert_fails('let b = 1.1', 'E741:')
118    call assert_fails('let c = "vim"', 'E741:')
119
120    const [d; e] = [1, 1.1, 'vim']
121    call assert_fails('let d = 1', 'E741:')
122    call assert_fails('let e = [2.2, "a"]', 'E741:')
123endfunc
124
125func Test_cannot_modify_existing_variable()
126    let i = 1
127    let f = 1.1
128    let s = 'vim'
129    let F = funcref('s:noop')
130    let l = [1, 2, 3]
131    let d = {'foo': 10}
132    if has('channel')
133      let j = test_null_job()
134      let c = test_null_channel()
135    endif
136    let b = v:true
137    let n = v:null
138    let bl = 0zC0FFEE
139
140    call assert_fails('const i = 1', 'E995:')
141    call assert_fails('const f = 1.1', 'E995:')
142    call assert_fails('const s = "vim"', 'E995:')
143    call assert_fails('const F = funcref("s:noop")', 'E995:')
144    call assert_fails('const l = [1, 2, 3]', 'E995:')
145    call assert_fails('const d = {"foo": 10}', 'E995:')
146    if has('channel')
147      call assert_fails('const j = test_null_job()', 'E995:')
148      call assert_fails('const c = test_null_channel()', 'E995:')
149    endif
150    call assert_fails('const b = v:true', 'E995:')
151    call assert_fails('const n = v:null', 'E995:')
152    call assert_fails('const bl = 0zC0FFEE', 'E995:')
153    call assert_fails('const [i, f, s] = [1, 1.1, "vim"]', 'E995:')
154
155    const i2 = 1
156    const f2 = 1.1
157    const s2 = 'vim'
158    const F2 = funcref('s:noop')
159    const l2 = [1, 2, 3]
160    const d2 = {'foo': 10}
161    if has('channel')
162      const j2 = test_null_job()
163      const c2 = test_null_channel()
164    endif
165    const b2 = v:true
166    const n2 = v:null
167    const bl2 = 0zC0FFEE
168
169    call assert_fails('const i2 = 1', 'E995:')
170    call assert_fails('const f2 = 1.1', 'E995:')
171    call assert_fails('const s2 = "vim"', 'E995:')
172    call assert_fails('const F2 = funcref("s:noop")', 'E995:')
173    call assert_fails('const l2 = [1, 2, 3]', 'E995:')
174    call assert_fails('const d2 = {"foo": 10}', 'E995:')
175    if has('channel')
176      call assert_fails('const j2 = test_null_job()', 'E995:')
177      call assert_fails('const c2 = test_null_channel()', 'E995:')
178    endif
179    call assert_fails('const b2 = v:true', 'E995:')
180    call assert_fails('const n2 = v:null', 'E995:')
181    call assert_fails('const bl2 = 0zC0FFEE', 'E995:')
182    call assert_fails('const [i2, f2, s2] = [1, 1.1, "vim"]', 'E995:')
183endfunc
184
185func Test_const_with_index_access()
186    let l = [1, 2, 3]
187    call assert_fails('const l[0] = 4', 'E996:')
188    call assert_fails('const l[0:1] = [1, 2]', 'E996:')
189
190    let d = {'aaa': 0}
191    call assert_fails("const d['aaa'] = 4", 'E996:')
192    call assert_fails("const d.aaa = 4", 'E996:')
193endfunc
194
195func Test_const_with_compound_assign()
196    let i = 0
197    call assert_fails('const i += 4', 'E995:')
198    call assert_fails('const i -= 4', 'E995:')
199    call assert_fails('const i *= 4', 'E995:')
200    call assert_fails('const i /= 4', 'E995:')
201    call assert_fails('const i %= 4', 'E995:')
202
203    let s = 'a'
204    call assert_fails('const s .= "b"', 'E995:')
205
206    let [a, b, c] = [1, 2, 3]
207    call assert_fails('const [a, b, c] += [4, 5, 6]', 'E995:')
208
209    let [d; e] = [1, 2, 3]
210    call assert_fails('const [d; e] += [4, 5, 6]', 'E995:')
211endfunc
212
213func Test_const_with_special_variables()
214    call assert_fails('const $FOO = "hello"', 'E996:')
215    call assert_fails('const @a = "hello"', 'E996:')
216    call assert_fails('const &filetype = "vim"', 'E996:')
217    call assert_fails('const &l:filetype = "vim"', 'E996:')
218    call assert_fails('const &g:encoding = "utf-8"', 'E996:')
219endfunc
220
221func Test_lock_depth_is_1()
222    const l = [1, 2, 3]
223    const d = {'foo': 10}
224
225    " Modify list
226    call add(l, 4)
227    let l[0] = 42
228
229    " Modify dict
230    let d['bar'] = 'hello'
231    let d.foo = 44
232endfunc
233