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