You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.8 KiB
139 lines
4.8 KiB
|
6 years ago
|
|
||
|
|
a = {1,2,3,4}
|
||
|
|
b = a
|
||
|
|
|
||
|
|
assertTrue (a == b, 'Tables should be able to be compared by identity')
|
||
|
|
assertTrue (not (a == {1,2,3,4}), 'Tables should not be able to be compared to literals')
|
||
|
|
assertTrue (#a == 4, 'Length operator should return the number of items in a table')
|
||
|
|
|
||
|
|
|
||
|
|
assertTrue (a[1] == 1, 'Square brackets operation on table should return correct value for index [1]')
|
||
|
|
assertTrue (a[2] == 2, 'Square brackets operation on table should return correct value for index [2]')
|
||
|
|
assertTrue (a[3] == 3, 'Square brackets operation on table should return correct value for index [3]')
|
||
|
|
assertTrue (a[4] == 4, 'Square brackets operation on table should return correct value for index [4]')
|
||
|
|
assertTrue (a[5] == nil, 'Square brackets operation on table should return nil for an index greater than the length')
|
||
|
|
assertTrue (a[0] == nil, 'Square brackets operation on table should return nil for an index of 0')
|
||
|
|
assertTrue (a[-1] == nil, 'Square brackets operation on table should return nil for an index less than 0')
|
||
|
|
|
||
|
|
|
||
|
|
a = {[1] = 20, [3] = 40}
|
||
|
|
assertTrue (a[1] == 20, 'Square brackets operation on table should return correct value for index when keys are used in literal assignment [1]')
|
||
|
|
assertTrue (a[2] == nil, 'Square brackets operation on table should return correct value for index when keys are used in literal assignment [2]')
|
||
|
|
assertTrue (a[3] == 40, 'Square brackets operation on table should return correct value for index when keys are used in literal assignment [3]')
|
||
|
|
assertTrue (a[4] == nil, 'Square brackets operation on table should return correct value for index when keys are used in literal assignment [4]')
|
||
|
|
|
||
|
|
b = 'hello'
|
||
|
|
a = {[b] = 'value'}
|
||
|
|
assertEqual (a.hello, 'value', 'Identifier should be able to be used as a key')
|
||
|
|
|
||
|
|
b = 2
|
||
|
|
a = {[b] = 'value2'}
|
||
|
|
assertEqual (a[2], 'value2', 'Numeric identifier should be able to be used as a key')
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
-- TABLES
|
||
|
|
|
||
|
|
|
||
|
|
Account = { balance = 0 }
|
||
|
|
|
||
|
|
function Account:new (o)
|
||
|
|
o = o or {}
|
||
|
|
setmetatable (o,self)
|
||
|
|
self.__index = self
|
||
|
|
return o
|
||
|
|
end
|
||
|
|
|
||
|
|
function Account:deposit (v)
|
||
|
|
self.balance = self.balance + v
|
||
|
|
end
|
||
|
|
|
||
|
|
function Account:withdraw (v)
|
||
|
|
if v > self.balance then error "insufficient funds" end
|
||
|
|
self.balance = self.balance - v
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
acc = Account:new ()
|
||
|
|
|
||
|
|
|
||
|
|
assertTrue (acc.balance == 0, 'Class properties should be initiated when instantiated [1]')
|
||
|
|
|
||
|
|
acc:deposit (20)
|
||
|
|
assertTrue (acc.balance == 20, 'Class instance properties should be updatable though instance method calls [1]')
|
||
|
|
|
||
|
|
acc:withdraw (5)
|
||
|
|
assertTrue (acc.balance == 15, 'Class instance properties should maintain their value in the instance')
|
||
|
|
|
||
|
|
|
||
|
|
acc2 = Account:new ()
|
||
|
|
|
||
|
|
assertTrue (acc2.balance == 0, 'Class properties should be initiated when instantiated [2]')
|
||
|
|
|
||
|
|
acc2:deposit (50)
|
||
|
|
assertTrue (acc2.balance == 50, 'Class instance properties should be updatable though instance method calls [2]')
|
||
|
|
assertTrue (acc.balance == 15, 'Class instance properties should maintain their value separate to other instances')
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
SpecialAccount = Account:new ()
|
||
|
|
|
||
|
|
function SpecialAccount:withdraw (v)
|
||
|
|
if v - self.balance >= self:getLimit () then
|
||
|
|
error "insufficient funds"
|
||
|
|
end
|
||
|
|
|
||
|
|
self.balance = self.balance - v
|
||
|
|
end
|
||
|
|
|
||
|
|
function SpecialAccount:getLimit ()
|
||
|
|
return self.limit or 0
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
s = SpecialAccount:new {limit=1000.00}
|
||
|
|
|
||
|
|
assertTrue (s.balance == 0, 'Class properties should be initiated when instantiated, even if class is inherited')
|
||
|
|
assertTrue (s:getLimit () == 1000, 'Inherited class should have its own properties')
|
||
|
|
assertTrue (acc.getLimit == nil, 'Base class properties should not change when inherited class manipulated')
|
||
|
|
|
||
|
|
s:deposit (500)
|
||
|
|
assertTrue (s.balance == 500, 'Class instance properties should be updatable though instance method calls [3]')
|
||
|
|
|
||
|
|
|
||
|
|
function f ()
|
||
|
|
return 1, 3, 9
|
||
|
|
end
|
||
|
|
|
||
|
|
local t = {f()}
|
||
|
|
|
||
|
|
assertTrue (t[1] == 1, 'Table should be able to be instantiated by the result of a function [1]')
|
||
|
|
assertTrue (t[2] == 3, 'Table should be able to be instantiated by the result of a function [2]')
|
||
|
|
assertTrue (t[3] == 9, 'Table should be able to be instantiated by the result of a function [3]')
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
t = {}
|
||
|
|
t[1] = 'number'
|
||
|
|
t['1'] = 'string'
|
||
|
|
|
||
|
|
assertTrue (t[1] == 'number', 'A numerical table index should return a different value than when using the same index as a sting. [1]')
|
||
|
|
assertTrue (t['1'] == 'string', 'A numerical table index should return a different value than when using the same index as a sting. [2]')
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function testUnpack()
|
||
|
|
return 1, 2, 3
|
||
|
|
end
|
||
|
|
|
||
|
|
t = { testUnpack(), 10 }
|
||
|
|
assertTrue (t[1] == 1, 'Function call in table literal should pass return value as argument')
|
||
|
|
assertTrue (t[2] == 10, 'Function call in middle of table literal should only pass one argument')
|
||
|
|
assertTrue (t[3] == nil, 'Table properties should stop at the end of table literal list')
|
||
|
|
|
||
|
|
t = { 10, testUnpack() }
|
||
|
|
assertTrue (t[1] == 10, 'Table literal should set properties in order')
|
||
|
|
assertTrue (t[2] == 1, 'Function call in table literal should set properties')
|
||
|
|
assertTrue (t[3] == 2, 'Function call at end of table literal should set properties for all return values')
|