2022-12-08 15:32:33 +00:00
|
|
|
" Test Vim9 classes
|
|
|
|
|
|
|
|
source check.vim
|
|
|
|
import './vim9.vim' as v9
|
|
|
|
|
|
|
|
def Test_class_basic()
|
|
|
|
var lines =<< trim END
|
|
|
|
class NotWorking
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1316:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class notWorking
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1314:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Not@working
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1315:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
abstract noclass Something
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E475:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
abstract classy Something
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E475:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
endcl
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1065:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
endclass school's out
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E488:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
endclass | echo 'done'
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E488:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1317:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this.
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1317:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this .count
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1317:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this. count
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1317:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this.count: number
|
|
|
|
that.count
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1318: Not a valid command in a class: that.count')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this.count
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1022:')
|
|
|
|
|
2022-12-23 17:56:27 +00:00
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
def new()
|
|
|
|
this.state = 0
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
var obj = Something.new()
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1089:')
|
|
|
|
|
2022-12-08 15:32:33 +00:00
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this.count : number
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1059:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Something
|
|
|
|
this.count:number
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1069:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
|
|
|
|
class TextPosition
|
|
|
|
this.lnum: number
|
2022-12-10 18:42:12 +00:00
|
|
|
this.col: number
|
2022-12-09 21:41:48 +00:00
|
|
|
|
2022-12-20 13:38:22 +00:00
|
|
|
# make a nicely formatted string
|
2022-12-09 21:41:48 +00:00
|
|
|
def ToString(): string
|
|
|
|
return $'({this.lnum}, {this.col})'
|
|
|
|
enddef
|
2022-12-08 15:32:33 +00:00
|
|
|
endclass
|
|
|
|
|
2022-12-08 20:42:00 +00:00
|
|
|
# use the automatically generated new() method
|
|
|
|
var pos = TextPosition.new(2, 12)
|
|
|
|
assert_equal(2, pos.lnum)
|
|
|
|
assert_equal(12, pos.col)
|
2022-12-09 21:41:48 +00:00
|
|
|
|
|
|
|
# call an object method
|
|
|
|
assert_equal('(2, 12)', pos.ToString())
|
2022-12-08 15:32:33 +00:00
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
|
|
|
enddef
|
|
|
|
|
2022-12-10 18:42:12 +00:00
|
|
|
def Test_class_member_initializer()
|
|
|
|
var lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
|
|
|
|
class TextPosition
|
|
|
|
this.lnum: number = 1
|
|
|
|
this.col: number = 1
|
|
|
|
|
2022-12-20 13:38:22 +00:00
|
|
|
# constructor with only the line number
|
2022-12-10 18:42:12 +00:00
|
|
|
def new(lnum: number)
|
|
|
|
this.lnum = lnum
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var pos = TextPosition.new(3)
|
|
|
|
assert_equal(3, pos.lnum)
|
|
|
|
assert_equal(1, pos.col)
|
|
|
|
|
|
|
|
var instr = execute('disassemble TextPosition.new')
|
|
|
|
assert_match('new\_s*' ..
|
2022-12-10 19:03:51 +00:00
|
|
|
'0 NEW TextPosition size \d\+\_s*' ..
|
2022-12-10 18:42:12 +00:00
|
|
|
'\d PUSHNR 1\_s*' ..
|
|
|
|
'\d STORE_THIS 0\_s*' ..
|
|
|
|
'\d PUSHNR 1\_s*' ..
|
|
|
|
'\d STORE_THIS 1\_s*' ..
|
|
|
|
'this.lnum = lnum\_s*' ..
|
|
|
|
'\d LOAD arg\[-1]\_s*' ..
|
|
|
|
'\d PUSHNR 0\_s*' ..
|
|
|
|
'\d LOAD $0\_s*' ..
|
|
|
|
'\d\+ STOREINDEX object\_s*' ..
|
|
|
|
'\d\+ RETURN object.*',
|
|
|
|
instr)
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
|
|
|
enddef
|
|
|
|
|
2022-12-13 18:43:22 +00:00
|
|
|
def Test_class_default_new()
|
|
|
|
var lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
|
|
|
|
class TextPosition
|
|
|
|
this.lnum: number = 1
|
|
|
|
this.col: number = 1
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var pos = TextPosition.new()
|
|
|
|
assert_equal(1, pos.lnum)
|
|
|
|
assert_equal(1, pos.col)
|
|
|
|
|
|
|
|
pos = TextPosition.new(v:none, v:none)
|
|
|
|
assert_equal(1, pos.lnum)
|
|
|
|
assert_equal(1, pos.col)
|
|
|
|
|
|
|
|
pos = TextPosition.new(3, 22)
|
|
|
|
assert_equal(3, pos.lnum)
|
|
|
|
assert_equal(22, pos.col)
|
|
|
|
|
|
|
|
pos = TextPosition.new(v:none, 33)
|
|
|
|
assert_equal(1, pos.lnum)
|
|
|
|
assert_equal(33, pos.col)
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Person
|
|
|
|
this.name: string
|
|
|
|
this.age: number = 42
|
|
|
|
this.education: string = "unknown"
|
|
|
|
|
|
|
|
def new(this.name, this.age = v:none, this.education = v:none)
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var piet = Person.new("Piet")
|
|
|
|
assert_equal("Piet", piet.name)
|
|
|
|
assert_equal(42, piet.age)
|
|
|
|
assert_equal("unknown", piet.education)
|
|
|
|
|
|
|
|
var chris = Person.new("Chris", 4, "none")
|
|
|
|
assert_equal("Chris", chris.name)
|
|
|
|
assert_equal(4, chris.age)
|
|
|
|
assert_equal("none", chris.education)
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
2022-12-13 21:14:28 +00:00
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Person
|
|
|
|
this.name: string
|
|
|
|
this.age: number = 42
|
|
|
|
this.education: string = "unknown"
|
|
|
|
|
|
|
|
def new(this.name, this.age = v:none, this.education = v:none)
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var missing = Person.new()
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E119:')
|
2022-12-13 18:43:22 +00:00
|
|
|
enddef
|
|
|
|
|
2022-12-13 21:14:28 +00:00
|
|
|
def Test_class_object_member_inits()
|
|
|
|
var lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class TextPosition
|
|
|
|
this.lnum: number
|
|
|
|
this.col = 1
|
|
|
|
this.addcol: number = 2
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var pos = TextPosition.new()
|
|
|
|
assert_equal(0, pos.lnum)
|
|
|
|
assert_equal(1, pos.col)
|
|
|
|
assert_equal(2, pos.addcol)
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class TextPosition
|
|
|
|
this.lnum
|
|
|
|
this.col = 1
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1022:')
|
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class TextPosition
|
|
|
|
this.lnum = v:none
|
|
|
|
this.col = 1
|
|
|
|
endclass
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1330:')
|
|
|
|
enddef
|
|
|
|
|
2022-12-14 20:59:32 +00:00
|
|
|
def Test_class_object_member_access()
|
|
|
|
var lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Triple
|
|
|
|
this._one = 1
|
|
|
|
this.two = 2
|
|
|
|
public this.three = 3
|
|
|
|
|
|
|
|
def GetOne(): number
|
|
|
|
return this._one
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var trip = Triple.new()
|
|
|
|
assert_equal(1, trip.GetOne())
|
|
|
|
assert_equal(2, trip.two)
|
|
|
|
assert_equal(3, trip.three)
|
|
|
|
assert_fails('echo trip._one', 'E1333')
|
|
|
|
|
|
|
|
assert_fails('trip._one = 11', 'E1333')
|
|
|
|
assert_fails('trip.two = 22', 'E1335')
|
|
|
|
trip.three = 33
|
|
|
|
assert_equal(33, trip.three)
|
2022-12-18 21:42:55 +00:00
|
|
|
|
|
|
|
assert_fails('trip.four = 4', 'E1334')
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
2022-12-24 21:24:06 +00:00
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
|
|
|
|
class MyCar
|
|
|
|
this.make: string
|
|
|
|
|
|
|
|
def new(make_arg: string)
|
|
|
|
this.make = make_arg
|
|
|
|
enddef
|
|
|
|
|
|
|
|
def GetMake(): string
|
|
|
|
return $"make = {this.make}"
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var c = MyCar.new("abc")
|
|
|
|
assert_equal('make = abc', c.GetMake())
|
|
|
|
|
|
|
|
c = MyCar.new("def")
|
|
|
|
assert_equal('make = def', c.GetMake())
|
|
|
|
|
|
|
|
var c2 = MyCar.new("123")
|
|
|
|
assert_equal('make = 123', c2.GetMake())
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
2022-12-25 19:31:36 +00:00
|
|
|
|
|
|
|
lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
|
|
|
|
class MyCar
|
|
|
|
this.make: string
|
|
|
|
|
|
|
|
def new(make_arg: string)
|
|
|
|
this.make = make_arg
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
var c = MyCar.new("abc")
|
|
|
|
var c = MyCar.new("def")
|
|
|
|
END
|
|
|
|
v9.CheckScriptFailure(lines, 'E1041:')
|
2022-12-18 21:42:55 +00:00
|
|
|
enddef
|
|
|
|
|
|
|
|
def Test_class_member_access()
|
|
|
|
var lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class TextPos
|
|
|
|
this.lnum = 1
|
|
|
|
this.col = 1
|
|
|
|
static counter = 0
|
2022-12-31 19:01:02 +00:00
|
|
|
static _secret = 7
|
|
|
|
public static anybody = 42
|
2022-12-18 21:42:55 +00:00
|
|
|
|
2023-01-01 12:58:33 +00:00
|
|
|
static def AddToCounter(nr: number)
|
2022-12-18 21:42:55 +00:00
|
|
|
counter += nr
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
assert_equal(0, TextPos.counter)
|
|
|
|
TextPos.AddToCounter(3)
|
|
|
|
assert_equal(3, TextPos.counter)
|
2022-12-23 17:56:27 +00:00
|
|
|
assert_fails('echo TextPos.noSuchMember', 'E1338:')
|
2022-12-18 21:42:55 +00:00
|
|
|
|
2022-12-23 17:56:27 +00:00
|
|
|
assert_fails('TextPos.noSuchMember = 2', 'E1337:')
|
2022-12-31 19:01:02 +00:00
|
|
|
assert_fails('TextPos.counter = 5', 'E1335:')
|
|
|
|
assert_fails('TextPos.counter += 5', 'E1335:')
|
|
|
|
|
|
|
|
assert_fails('echo TextPos._secret', 'E1333:')
|
|
|
|
assert_fails('TextPos._secret = 8', 'E1333:')
|
|
|
|
|
|
|
|
assert_equal(42, TextPos.anybody)
|
|
|
|
TextPos.anybody = 12
|
|
|
|
assert_equal(12, TextPos.anybody)
|
|
|
|
TextPos.anybody += 5
|
|
|
|
assert_equal(17, TextPos.anybody)
|
2022-12-14 20:59:32 +00:00
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
|
|
|
enddef
|
|
|
|
|
2023-01-01 12:58:33 +00:00
|
|
|
def Test_class_function()
|
|
|
|
var lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class Value
|
|
|
|
this.value = 0
|
|
|
|
static objects = 0
|
|
|
|
|
|
|
|
def new(v: number)
|
|
|
|
this.value = v
|
|
|
|
++objects
|
|
|
|
enddef
|
|
|
|
|
|
|
|
static def GetCount(): number
|
|
|
|
return objects
|
|
|
|
enddef
|
|
|
|
endclass
|
|
|
|
|
|
|
|
assert_equal(0, Value.GetCount())
|
|
|
|
var v1 = Value.new(2)
|
|
|
|
assert_equal(1, Value.GetCount())
|
|
|
|
var v2 = Value.new(7)
|
|
|
|
assert_equal(2, Value.GetCount())
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
|
|
|
enddef
|
|
|
|
|
2022-12-14 17:30:37 +00:00
|
|
|
def Test_class_object_to_string()
|
|
|
|
var lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
class TextPosition
|
|
|
|
this.lnum = 1
|
|
|
|
this.col = 22
|
|
|
|
endclass
|
|
|
|
|
|
|
|
assert_equal("class TextPosition", string(TextPosition))
|
|
|
|
|
|
|
|
var pos = TextPosition.new()
|
|
|
|
assert_equal("object of TextPosition {lnum: 1, col: 22}", string(pos))
|
|
|
|
END
|
|
|
|
v9.CheckScriptSuccess(lines)
|
|
|
|
enddef
|
2022-12-13 21:14:28 +00:00
|
|
|
|
2022-12-08 15:32:33 +00:00
|
|
|
|
|
|
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|