-
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
93 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
'use strict'; | ||
|
||
var util = require('util'); | ||
var assert = require('assert'); | ||
|
||
var DefaultRegistry = require('undertaker-registry'); | ||
|
||
function buildTempTask(tasks, name){ | ||
var tempTask = function(){ | ||
var task = tasks[name]; | ||
assert(task, 'Forward referenced task \'' + name + '\' not defined before use'); | ||
return task.apply(null, arguments); | ||
}; | ||
|
||
tempTask.displayName = name; | ||
|
||
return tempTask; | ||
} | ||
|
||
function ForwardRefRegistry(){ | ||
DefaultRegistry.call(this); | ||
} | ||
util.inherits(ForwardRefRegistry, DefaultRegistry); | ||
|
||
// Assumes this._tasks from DefaultRegistry | ||
ForwardRefRegistry.prototype.get = function(name){ | ||
var task = this._tasks[name]; | ||
if(task){ | ||
return task; | ||
} else { | ||
return buildTempTask(this._tasks, name); | ||
} | ||
}; | ||
|
||
module.exports = ForwardRefRegistry; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
'use strict'; | ||
|
||
var lab = exports.lab = require('lab').script(); | ||
var code = require('code'); | ||
|
||
var Registry = require('../'); | ||
|
||
function noop(){} | ||
|
||
lab.experiment('Forward Reference Registry', function(){ | ||
|
||
var registry; | ||
|
||
lab.beforeEach(function(done){ | ||
registry = new Registry(); | ||
done(); | ||
}); | ||
|
||
lab.test('returns a function even if not registered', function(done){ | ||
var task = registry.get('nothing'); | ||
code.expect(task).to.be.a.function(); | ||
done(); | ||
}); | ||
|
||
lab.test('forward reference function mimics task name', function(done){ | ||
var task = registry.get('nothing'); | ||
code.expect(task.displayName).to.equal('nothing'); | ||
done(); | ||
}); | ||
|
||
lab.test('returns the task if already registered', function(done){ | ||
registry.set('nothing', noop); | ||
var task = registry.get('nothing'); | ||
code.expect(task).to.equal(noop); | ||
done(); | ||
}); | ||
|
||
lab.test('excutes task when forward reference is called', function(done){ | ||
var count = 0; | ||
|
||
function actualTask(){ | ||
count++; | ||
code.expect(count).to.equal(1); | ||
done(); | ||
} | ||
|
||
var task = registry.get('nothing'); | ||
registry.set('nothing', actualTask); | ||
|
||
task(); | ||
}); | ||
|
||
lab.test('throws if task is not defined before forward ref is called', function(done){ | ||
var task = registry.get('nothing'); | ||
code.expect(task).to.throw('Forward referenced task \'nothing\' not defined before use'); | ||
done(); | ||
}); | ||
}); |