blob: d30c7b468b1bbf70fea98354d2a9c6ed947d458d [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
134 def ToString(): string
135 return $'({this.lnum}, {this.col})'
136 enddef
Bram Moolenaar00b28d62022-12-08 15:32:33 +0000137 endclass
138
Bram Moolenaard28d7b92022-12-08 20:42:00 +0000139 # use the automatically generated new() method
140 var pos = TextPosition.new(2, 12)
141 assert_equal(2, pos.lnum)
142 assert_equal(12, pos.col)
Bram Moolenaarffdaca92022-12-09 21:41:48 +0000143
144 # call an object method
145 assert_equal('(2, 12)', pos.ToString())
Bram Moolenaar00b28d62022-12-08 15:32:33 +0000146 END
147 v9.CheckScriptSuccess(lines)
148enddef
149
Bram Moolenaar7ce7daf2022-12-10 18:42:12 +0000150def Test_class_member_initializer()
151 var lines =<< trim END
152 vim9script
153
154 class TextPosition
155 this.lnum: number = 1
156 this.col: number = 1
157
158 def new(lnum: number)
159 this.lnum = lnum
160 enddef
161 endclass
162
163 var pos = TextPosition.new(3)
164 assert_equal(3, pos.lnum)
165 assert_equal(1, pos.col)
166
167 var instr = execute('disassemble TextPosition.new')
168 assert_match('new\_s*' ..
Bram Moolenaar3ea8a1b2022-12-10 19:03:51 +0000169 '0 NEW TextPosition size \d\+\_s*' ..
Bram Moolenaar7ce7daf2022-12-10 18:42:12 +0000170 '\d PUSHNR 1\_s*' ..
171 '\d STORE_THIS 0\_s*' ..
172 '\d PUSHNR 1\_s*' ..
173 '\d STORE_THIS 1\_s*' ..
174 'this.lnum = lnum\_s*' ..
175 '\d LOAD arg\[-1]\_s*' ..
176 '\d PUSHNR 0\_s*' ..
177 '\d LOAD $0\_s*' ..
178 '\d\+ STOREINDEX object\_s*' ..
179 '\d\+ RETURN object.*',
180 instr)
181 END
182 v9.CheckScriptSuccess(lines)
183enddef
184
Bram Moolenaar65b0d162022-12-13 18:43:22 +0000185def Test_class_default_new()
186 var lines =<< trim END
187 vim9script
188
189 class TextPosition
190 this.lnum: number = 1
191 this.col: number = 1
192 endclass
193
194 var pos = TextPosition.new()
195 assert_equal(1, pos.lnum)
196 assert_equal(1, pos.col)
197
198 pos = TextPosition.new(v:none, v:none)
199 assert_equal(1, pos.lnum)
200 assert_equal(1, pos.col)
201
202 pos = TextPosition.new(3, 22)
203 assert_equal(3, pos.lnum)
204 assert_equal(22, pos.col)
205
206 pos = TextPosition.new(v:none, 33)
207 assert_equal(1, pos.lnum)
208 assert_equal(33, pos.col)
209 END
210 v9.CheckScriptSuccess(lines)
211
212 lines =<< trim END
213 vim9script
214 class Person
215 this.name: string
216 this.age: number = 42
217 this.education: string = "unknown"
218
219 def new(this.name, this.age = v:none, this.education = v:none)
220 enddef
221 endclass
222
223 var piet = Person.new("Piet")
224 assert_equal("Piet", piet.name)
225 assert_equal(42, piet.age)
226 assert_equal("unknown", piet.education)
227
228 var chris = Person.new("Chris", 4, "none")
229 assert_equal("Chris", chris.name)
230 assert_equal(4, chris.age)
231 assert_equal("none", chris.education)
232 END
233 v9.CheckScriptSuccess(lines)
Bram Moolenaar74e12742022-12-13 21:14:28 +0000234
235 lines =<< trim END
236 vim9script
237 class Person
238 this.name: string
239 this.age: number = 42
240 this.education: string = "unknown"
241
242 def new(this.name, this.age = v:none, this.education = v:none)
243 enddef
244 endclass
245
246 var missing = Person.new()
247 END
248 v9.CheckScriptFailure(lines, 'E119:')
Bram Moolenaar65b0d162022-12-13 18:43:22 +0000249enddef
250
Bram Moolenaar74e12742022-12-13 21:14:28 +0000251def Test_class_object_member_inits()
252 var lines =<< trim END
253 vim9script
254 class TextPosition
255 this.lnum: number
256 this.col = 1
257 this.addcol: number = 2
258 endclass
259
260 var pos = TextPosition.new()
261 assert_equal(0, pos.lnum)
262 assert_equal(1, pos.col)
263 assert_equal(2, pos.addcol)
264 END
265 v9.CheckScriptSuccess(lines)
266
267 lines =<< trim END
268 vim9script
269 class TextPosition
270 this.lnum
271 this.col = 1
272 endclass
273 END
274 v9.CheckScriptFailure(lines, 'E1022:')
275
276 lines =<< trim END
277 vim9script
278 class TextPosition
279 this.lnum = v:none
280 this.col = 1
281 endclass
282 END
283 v9.CheckScriptFailure(lines, 'E1330:')
284enddef
285
Bram Moolenaar3d473ee2022-12-14 20:59:32 +0000286def Test_class_object_member_access()
287 var lines =<< trim END
288 vim9script
289 class Triple
290 this._one = 1
291 this.two = 2
292 public this.three = 3
293
294 def GetOne(): number
295 return this._one
296 enddef
297 endclass
298
299 var trip = Triple.new()
300 assert_equal(1, trip.GetOne())
301 assert_equal(2, trip.two)
302 assert_equal(3, trip.three)
303 assert_fails('echo trip._one', 'E1333')
304
305 assert_fails('trip._one = 11', 'E1333')
306 assert_fails('trip.two = 22', 'E1335')
307 trip.three = 33
308 assert_equal(33, trip.three)
309 END
310 v9.CheckScriptSuccess(lines)
311enddef
312
Bram Moolenaar91c9d6d2022-12-14 17:30:37 +0000313def Test_class_object_to_string()
314 var lines =<< trim END
315 vim9script
316 class TextPosition
317 this.lnum = 1
318 this.col = 22
319 endclass
320
321 assert_equal("class TextPosition", string(TextPosition))
322
323 var pos = TextPosition.new()
324 assert_equal("object of TextPosition {lnum: 1, col: 22}", string(pos))
325 END
326 v9.CheckScriptSuccess(lines)
327enddef
Bram Moolenaar74e12742022-12-13 21:14:28 +0000328
Bram Moolenaar00b28d62022-12-08 15:32:33 +0000329
330" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker