blob: 7e4c92dda62c3bf6893e84e0cda3af2fc5dd3de4 [file] [log] [blame]
" 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:')
lines =<< trim END
vim9script
class Something
def new()
this.state = 0
enddef
endclass
var obj = Something.new()
END
v9.CheckScriptFailure(lines, 'E1089:')
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
this.col: number
# make a nicely formatted string
def ToString(): string
return $'({this.lnum}, {this.col})'
enddef
endclass
# use the automatically generated new() method
var pos = TextPosition.new(2, 12)
assert_equal(2, pos.lnum)
assert_equal(12, pos.col)
# call an object method
assert_equal('(2, 12)', pos.ToString())
END
v9.CheckScriptSuccess(lines)
enddef
def Test_class_member_initializer()
var lines =<< trim END
vim9script
class TextPosition
this.lnum: number = 1
this.col: number = 1
# constructor with only the line number
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*' ..
'0 NEW TextPosition size \d\+\_s*' ..
'\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
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)
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:')
enddef
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
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)
assert_fails('trip.four = 4', 'E1334')
END
v9.CheckScriptSuccess(lines)
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)
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:')
enddef
def Test_class_member_access()
var lines =<< trim END
vim9script
class TextPos
this.lnum = 1
this.col = 1
static counter = 0
def AddToCounter(nr: number)
counter += nr
enddef
endclass
assert_equal(0, TextPos.counter)
TextPos.AddToCounter(3)
assert_equal(3, TextPos.counter)
assert_fails('echo TextPos.noSuchMember', 'E1338:')
assert_fails('TextPos.noSuchMember = 2', 'E1337:')
assert_fails('TextPos.counter += 5', 'E1335')
END
v9.CheckScriptSuccess(lines)
enddef
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
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker