2011-08-12 08:33:58 +00:00
|
|
|
require 'middleclass'
|
|
|
|
|
2011-08-10 19:45:15 +00:00
|
|
|
context('A Mixin', function()
|
|
|
|
|
2011-08-13 21:58:55 +00:00
|
|
|
local Mixin, Class1, Class2
|
2011-08-12 08:33:58 +00:00
|
|
|
|
2011-08-13 21:58:55 +00:00
|
|
|
before(function()
|
|
|
|
Mixin = {}
|
|
|
|
function Mixin:included(theClass) theClass.includesMixin = true end
|
|
|
|
function Mixin:foo() return 'foo' end
|
|
|
|
function Mixin:bar() return 'bar' end
|
|
|
|
function Mixin:baz() return 'baz' end
|
2011-08-10 19:45:15 +00:00
|
|
|
|
2011-08-13 21:58:55 +00:00
|
|
|
Class1 = class('Class1'):include(Mixin)
|
|
|
|
function Class1:foo() return 'foo1' end
|
|
|
|
|
|
|
|
Class2 = class('Class2', Class1)
|
|
|
|
function Class2:bar2() return 'bar2' end
|
|
|
|
end)
|
2011-08-10 19:45:15 +00:00
|
|
|
|
2011-08-12 08:33:58 +00:00
|
|
|
test('invokes the "included" method when included', function()
|
2011-08-10 19:45:15 +00:00
|
|
|
assert_true(Class1.includesMixin)
|
|
|
|
end)
|
|
|
|
|
2011-08-12 08:33:58 +00:00
|
|
|
test('has all its functions (except "included") copied to its target class', function()
|
|
|
|
assert_equal(Class1:baz(), 'baz')
|
2011-08-10 19:45:15 +00:00
|
|
|
assert_equal(Class1.included, nil)
|
|
|
|
end)
|
|
|
|
|
2011-08-12 08:33:58 +00:00
|
|
|
test('makes its functions available to subclasses', function()
|
|
|
|
assert_equal(Class2:baz(), 'baz')
|
|
|
|
end)
|
|
|
|
|
|
|
|
test('allows overriding of methods in the same class', function()
|
|
|
|
assert_equal(Class2:foo(), 'foo1')
|
2011-08-10 19:45:15 +00:00
|
|
|
end)
|
|
|
|
|
2011-08-12 08:33:58 +00:00
|
|
|
test('allows overriding of methods on subclasses', function()
|
|
|
|
assert_equal(Class2:bar2(), 'bar2')
|
2011-08-10 19:45:15 +00:00
|
|
|
end)
|
|
|
|
|
|
|
|
end)
|
2011-08-13 21:58:55 +00:00
|
|
|
|