mirror of
https://github.com/kikito/middleclass.git
synced 2024-11-08 09:34:22 +00:00
Add tests for custom __index and __newindex
This commit is contained in:
parent
227705b3ec
commit
7574380519
@ -204,6 +204,92 @@ describe('Metamethods', function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe('Custom __index and __newindex', function()
|
||||||
|
describe('Tables', function()
|
||||||
|
local Proxy, fallback, p
|
||||||
|
before_each(function()
|
||||||
|
Proxy = class('Proxy')
|
||||||
|
fallback = {foo = 'bar', common = 'fallback'}
|
||||||
|
Proxy.__index = fallback
|
||||||
|
Proxy.__newindex = fallback
|
||||||
|
Proxy.common = 'class'
|
||||||
|
p = Proxy()
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('uses __index', function()
|
||||||
|
assert.equal(p.foo, 'bar')
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('does not use __index when field exists in class', function()
|
||||||
|
assert.equal(p.common, 'class')
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('uses __newindex', function()
|
||||||
|
p.key = 'value'
|
||||||
|
assert.equal(fallback.key, 'value')
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('does not use __newindex when field exists in class', function()
|
||||||
|
p.common = 'value'
|
||||||
|
assert.equal(p.common, 'value')
|
||||||
|
assert.equal(Proxy.common, 'class')
|
||||||
|
assert.equal(fallback.common, 'fallback')
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
describe('Functions', function()
|
||||||
|
local Namespace, Rectangle, r
|
||||||
|
before_each(function()
|
||||||
|
Namespace = class('Namespace')
|
||||||
|
function Namespace:__index(name)
|
||||||
|
local getter = self.class[name.."Getter"]
|
||||||
|
if getter then return getter(self) end
|
||||||
|
end
|
||||||
|
function Namespace:__newindex(name, value)
|
||||||
|
local setter = self.class[name.."Setter"]
|
||||||
|
if setter then setter(self, value) else rawset(self, name, value) end
|
||||||
|
end
|
||||||
|
Rectangle = class('Rectangle', Namespace)
|
||||||
|
function Rectangle:initialize(x, y, scale)
|
||||||
|
self._scale, self.x, self.y = 1, x, y
|
||||||
|
self.scale = scale
|
||||||
|
end
|
||||||
|
function Rectangle:scaleGetter() return self._scale end
|
||||||
|
function Rectangle:scaleSetter(v)
|
||||||
|
self.x = self.x*v/self._scale
|
||||||
|
self.y = self.y*v/self._scale
|
||||||
|
self._scale = v
|
||||||
|
end
|
||||||
|
function Rectangle:areaGetter() return self.x * self.y end
|
||||||
|
r = Rectangle(3, 4, 2)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('uses setter', function()
|
||||||
|
assert.equal(r.x, 6)
|
||||||
|
assert.equal(r.y, 8)
|
||||||
|
r.scale = 3
|
||||||
|
assert.equal(r.x, 9)
|
||||||
|
assert.equal(r.y, 12)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('uses getters', function()
|
||||||
|
assert.equal(r.scale, 2)
|
||||||
|
assert.equal(r.area, 48)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('updates inherited __index', function()
|
||||||
|
function Namespace.__index() return 42 end
|
||||||
|
assert.equal(r.area, 42)
|
||||||
|
function Rectangle.__index() return 24 end
|
||||||
|
assert.equal(r.area, 24)
|
||||||
|
function Namespace.__index() return 96 end
|
||||||
|
assert.equal(r.area, 24)
|
||||||
|
Rectangle.__index = nil
|
||||||
|
assert.equal(r.area, 96)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
describe('Default Metamethods', function()
|
describe('Default Metamethods', function()
|
||||||
|
|
||||||
local Peter, peter
|
local Peter, peter
|
||||||
|
Loading…
Reference in New Issue
Block a user