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)
|
||||
|
||||
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()
|
||||
|
||||
local Peter, peter
|
||||
|
Loading…
Reference in New Issue
Block a user