blob: f45e3fa6c8cde887129f3278eb2c069b47ab0bea [file] [log] [blame]
Bram Moolenaar00b28d62022-12-08 15:32:33 +00001" Test Vim9 classes
2
3source check.vim
4import './vim9.vim' as v9
5
6def Test_class_basic()
7 var lines =<< trim END
8 class NotWorking
9 endclass
10 END
11 v9.CheckScriptFailure(lines, 'E1316:')
12
13 lines =<< trim END
14 vim9script
15 class notWorking
16 endclass
17 END
18 v9.CheckScriptFailure(lines, 'E1314:')
19
20 lines =<< trim END
21 vim9script
22 class Not@working
23 endclass
24 END
25 v9.CheckScriptFailure(lines, 'E1315:')
26
27 lines =<< trim END
28 vim9script
29 abstract noclass Something
30 endclass
31 END
32 v9.CheckScriptFailure(lines, 'E475:')
33
34 lines =<< trim END
35 vim9script
36 abstract classy Something
37 endclass
38 END
39 v9.CheckScriptFailure(lines, 'E475:')
40
41 lines =<< trim END
42 vim9script
43 class Something
44 endcl
45 END
46 v9.CheckScriptFailure(lines, 'E1065:')
47
48 lines =<< trim END
49 vim9script
50 class Something
51 endclass school's out
52 END
53 v9.CheckScriptFailure(lines, 'E488:')
54
55 lines =<< trim END
56 vim9script
57 class Something
58 endclass | echo 'done'
59 END
60 v9.CheckScriptFailure(lines, 'E488:')
61
62 lines =<< trim END
63 vim9script
64 class Something
65 this
66 endclass
67 END
68 v9.CheckScriptFailure(lines, 'E1317:')
69
70 lines =<< trim END
71 vim9script
72 class Something
73 this.
74 endclass
75 END
76 v9.CheckScriptFailure(lines, 'E1317:')
77
78 lines =<< trim END
79 vim9script
80 class Something
81 this .count
82 endclass
83 END
84 v9.CheckScriptFailure(lines, 'E1317:')
85
86 lines =<< trim END
87 vim9script
88 class Something
89 this. count
90 endclass
91 END
92 v9.CheckScriptFailure(lines, 'E1317:')
93
94 lines =<< trim END
95 vim9script
96 class Something
97 this.count: number
98 that.count
99 endclass
100 END
101 v9.CheckScriptFailure(lines, 'E1318: Not a valid command in a class: that.count')
102
103 lines =<< trim END
104 vim9script
105 class Something
106 this.count
107 endclass
108 END
109 v9.CheckScriptFailure(lines, 'E1022:')
110
111 lines =<< trim END
112 vim9script
113 class Something
114 this.count : number
115 endclass
116 END
117 v9.CheckScriptFailure(lines, 'E1059:')
118
119 lines =<< trim END
120 vim9script
121 class Something
122 this.count:number
123 endclass
124 END
125 v9.CheckScriptFailure(lines, 'E1069:')
126
127 lines =<< trim END
128 vim9script
129
130 class TextPosition
131 this.lnum: number
Bram Moolenaar7ce7daf2022-12-10 18:42:12 +0000132 this.col: number
Bram Moolenaarffdaca92022-12-09 21:41:48 +0000133
Bram Moolenaar418b5472022-12-20 13:38:22 +0000134 # make a nicely formatted string
Bram Moolenaarffdaca92022-12-09 21:41:48 +0000135 def ToString(): string
136 return $'({this.lnum}, {this.col})'
137 enddef
Bram Moolenaar00b28d62022-12-08 15:32:33 +0000138 endclass
139
Bram Moolenaard28d7b92022-12-08 20:42:00 +0000140 # use the automatically generated new() method
141 var pos = TextPosition.new(2, 12)
142 assert_equal(2, pos.lnum)
143 assert_equal(12, pos.col)
Bram Moolenaarffdaca92022-12-09 21:41:48 +0000144
145 # call an object method
146 assert_equal('(2, 12)', pos.ToString())
Bram Moolenaar00b28d62022-12-08 15:32:33 +0000147 END
148 v9.CheckScriptSuccess(lines)
149enddef
150
Bram Moolenaar7ce7daf2022-12-10 18:42:12 +0000151def Test_class_member_initializer()
152 var lines =<< trim END
153 vim9script
154
155 class TextPosition
156 this.lnum: number = 1
157 this.col: number = 1
158
Bram Moolenaar418b5472022-12-20 13:38:22 +0000159 # constructor with only the line number
Bram Moolenaar7ce7daf2022-12-10 18:42:12 +0000160 def new(lnum: number)
161 this.lnum = lnum
162 enddef
163 endclass
164
165 var pos = TextPosition.new(3)
166 assert_equal(3, pos.lnum)
167 assert_equal(1, pos.col)
168
169 var instr = execute('disassemble TextPosition.new')
170 assert_match('new\_s*' ..
Bram Moolenaar3ea8a1b2022-12-10 19:03:51 +0000171 '0 NEW TextPosition size \d\+\_s*' ..
Bram Moolenaar7ce7daf2022-12-10 18:42:12 +0000172 '\d PUSHNR 1\_s*' ..
173 '\d STORE_THIS 0\_s*' ..
174 '\d PUSHNR 1\_s*' ..
175 '\d STORE_THIS 1\_s*' ..
176 'this.lnum = lnum\_s*' ..
177 '\d LOAD arg\[-1]\_s*' ..
178 '\d PUSHNR 0\_s*' ..
179 '\d LOAD $0\_s*' ..
180 '\d\+ STOREINDEX object\_s*' ..
181 '\d\+ RETURN object.*',
182 instr)
183 END
184 v9.CheckScriptSuccess(lines)
185enddef
186
Bram Moolenaar65b0d162022-12-13 18:43:22 +0000187def Test_class_default_new()
188 var lines =<< trim END
189 vim9script
190
191 class TextPosition
192 this.lnum: number = 1
193 this.col: number = 1
194 endclass
195
196 var pos = TextPosition.new()
197 assert_equal(1, pos.lnum)
198 assert_equal(1, pos.col)
199
200 pos = TextPosition.new(v:none, v:none)
201 assert_equal(1, pos.lnum)
202 assert_equal(1, pos.col)
203
204 pos = TextPosition.new(3, 22)
205 assert_equal(3, pos.lnum)
206 assert_equal(22, pos.col)
207
208 pos = TextPosition.new(v:none, 33)
209 assert_equal(1, pos.lnum)
210 assert_equal(33, pos.col)
211 END
212 v9.CheckScriptSuccess(lines)
213
214 lines =<< trim END
215 vim9script
216 class Person
217 this.name: string
218 this.age: number = 42
219 this.education: string = "unknown"
220
221 def new(this.name, this.age = v:none, this.education = v:none)
222 enddef
223 endclass
224
225 var piet = Person.new("Piet")
226 assert_equal("Piet", piet.name)
227 assert_equal(42, piet.age)
228 assert_equal("unknown", piet.education)
229
230 var chris = Person.new("Chris", 4, "none")
231 assert_equal("Chris", chris.name)
232 assert_equal(4, chris.age)
233 assert_equal("none", chris.education)
234 END
235 v9.CheckScriptSuccess(lines)
Bram Moolenaar74e12742022-12-13 21:14:28 +0000236
237 lines =<< trim END
238 vim9script
239 class Person
240 this.name: string
241 this.age: number = 42
242 this.education: string = "unknown"
243
244 def new(this.name, this.age = v:none, this.education = v:none)
245 enddef
246 endclass
247
248 var missing = Person.new()
249 END
250 v9.CheckScriptFailure(lines, 'E119:')
Bram Moolenaar65b0d162022-12-13 18:43:22 +0000251enddef
252
Bram Moolenaar74e12742022-12-13 21:14:28 +0000253def Test_class_object_member_inits()
254 var lines =<< trim END
255 vim9script
256 class TextPosition
257 this.lnum: number
258 this.col = 1
259 this.addcol: number = 2
260 endclass
261
262 var pos = TextPosition.new()
263 assert_equal(0, pos.lnum)
264 assert_equal(1, pos.col)
265 assert_equal(2, pos.addcol)
266 END
267 v9.CheckScriptSuccess(lines)
268
269 lines =<< trim END
270 vim9script
271 class TextPosition
272 this.lnum
273 this.col = 1
274 endclass
275 END
276 v9.CheckScriptFailure(lines, 'E1022:')
277
278 lines =<< trim END
279 vim9script
280 class TextPosition
281 this.lnum = v:none
282 this.col = 1
283 endclass
284 END
285 v9.CheckScriptFailure(lines, 'E1330:')
286enddef
287
Bram Moolenaar3d473ee2022-12-14 20:59:32 +0000288def Test_class_object_member_access()
289 var lines =<< trim END
290 vim9script
291 class Triple
292 this._one = 1
293 this.two = 2
294 public this.three = 3
295
296 def GetOne(): number
297 return this._one
298 enddef
299 endclass
300
301 var trip = Triple.new()
302 assert_equal(1, trip.GetOne())
303 assert_equal(2, trip.two)
304 assert_equal(3, trip.three)
305 assert_fails('echo trip._one', 'E1333')
306
307 assert_fails('trip._one = 11', 'E1333')
308 assert_fails('trip.two = 22', 'E1335')
309 trip.three = 33
310 assert_equal(33, trip.three)
Bram Moolenaard505d172022-12-18 21:42:55 +0000311
312 assert_fails('trip.four = 4', 'E1334')
313 END
314 v9.CheckScriptSuccess(lines)
315enddef
316
317def Test_class_member_access()
318 var lines =<< trim END
319 vim9script
320 class TextPos
321 this.lnum = 1
322 this.col = 1
323 static counter = 0
324
325 def AddToCounter(nr: number)
326 counter += nr
327 enddef
328 endclass
329
330 assert_equal(0, TextPos.counter)
331 TextPos.AddToCounter(3)
332 assert_equal(3, TextPos.counter)
333
334 assert_fails('TextPos.counter += 5', 'E1335')
Bram Moolenaar3d473ee2022-12-14 20:59:32 +0000335 END
336 v9.CheckScriptSuccess(lines)
337enddef
338
Bram Moolenaar91c9d6d2022-12-14 17:30:37 +0000339def Test_class_object_to_string()
340 var lines =<< trim END
341 vim9script
342 class TextPosition
343 this.lnum = 1
344 this.col = 22
345 endclass
346
347 assert_equal("class TextPosition", string(TextPosition))
348
349 var pos = TextPosition.new()
350 assert_equal("object of TextPosition {lnum: 1, col: 22}", string(pos))
351 END
352 v9.CheckScriptSuccess(lines)
353enddef
Bram Moolenaar74e12742022-12-13 21:14:28 +0000354
Bram Moolenaar00b28d62022-12-08 15:32:33 +0000355
356" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker