Skip to content

Commit

Permalink
New: Initial implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
phated committed Oct 1, 2017
1 parent 04705a3 commit a35cf64
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
35 changes: 35 additions & 0 deletions index.js
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;
58 changes: 58 additions & 0 deletions test/index.js
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();
});
});

0 comments on commit a35cf64

Please sign in to comment.