Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/node_types/node.lua
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ function Node:initialize(config)
end

if self.name ~= nil then
Registry.register(self.name, self)
Registry.register(self.name, function()
return Node:new(config)
end)
end
end

Expand Down
12 changes: 8 additions & 4 deletions lib/registry.lua
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
local registeredNodes = {}

local Registry = {}
Registry.registeredNodes = {}

function Registry.register(name, node)
registeredNodes[name] = node;
Registry.registeredNodes[name] = node;
end

function Registry.getNode(name)
if type(name) == 'string' then
return registeredNodes[name]
local node = Registry.registeredNodes[name]
if type(node) == "function" then
return node()
else
return node
end
else
return name
end
Expand Down
35 changes: 35 additions & 0 deletions spec/functional/registry_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
local BehaviourTree = require 'lib/behaviour_tree'
local Registry = require 'lib/registry'
local Task = BehaviourTree.Task

describe('Registry', function()
local subject, task1
before_each(function()
subject = Registry
task1 = BehaviourTree.Task:new()
Registry.register('node', task1)
Registry.register('func', function() return BehaviourTree.Task:new() end)
subject = Registry
end)

teardown(function()
Registry.registeredNodes = {}
end)

it('should be able to return a simple node', function()
assert.has_no.errors(function() subject:getNode('node'))
end)
it('should return the same simple node each time', function()
local node1 = subject:getNode('node')
local node2 = subject:getNode('node')
assert.are_equals(node1, node2)
end)
it('should be able to return a func node', function()
assert.has_no.errors(function() subject:getNode('func'))
end)
it('should return new instances of func nodes', function()
local node1 = subject:getNode('func')
local node2 = subject:getNode('func')
assert.are_not.equals(node1, node2)
end)
end)