/*jshint node:true */ /*global describe:false, it:false */ "use strict"; var sequence = require('../'); var should = require('should'); require('mocha'); describe('task sequencing', function() { describe('sequence()', function() { var dependencyTree = { a: [], b: ['a'], c: ['a'], d: ['b','c'], e: ['f'], f: ['e'], g: ['g'] }; var noop = function () {}; var makeTasks = function (tree) { var tasks = {}, p; for (p in tree) { if (tree.hasOwnProperty(p)) { tasks[p] = { name: p, dep: tree[p], fn: noop }; } } return tasks; }; var theTest = function (source,expected) { // Arrange var tasks = makeTasks(dependencyTree); var actual = []; // Act sequence(tasks, source.split(','), actual); // Assert actual.join(',').should.equal(expected); }; it('a -> a', function() { theTest('a', 'a'); }); it('a,a -> a', function() { theTest('a,a', 'a'); }); it('c -> a,c', function() { theTest('c', 'a,c'); }); it('b -> a,b', function() { theTest('b', 'a,b'); }); it('c,b -> a,c,b', function() { theTest('c,b', 'a,c,b'); }); it('b,c -> a,b,c', function() { theTest('b,c', 'a,b,c'); }); it('b,a -> a,b', function() { theTest('b,a', 'a,b'); }); it('d -> a,b,c,d', function() { theTest('d', 'a,b,c,d'); }); it('c,d -> a,c,b,d', function() { theTest('c,d', 'a,c,b,d'); }); it('b,d -> a,b,c,d', function() { theTest('b,d', 'a,b,c,d'); }); it('e -> throw', function() { var failed = false, i; var expectedRecursionList = ['e','f','e']; var expectedTaskList = ['a','b','c','d','e','f','g']; try { theTest('e', 'throw'); failed = true; } catch (err) { should.exist(err); err.message.should.match(/recursive/i, err.message+' should include recursive'); err.recursiveTasks.length.should.equal(expectedRecursionList.length); for (i = 0; i < expectedRecursionList.length; i++) { err.recursiveTasks[i].should.equal(expectedRecursionList[i]); } err.taskList.length.should.equal(expectedTaskList.length); expectedTaskList.forEach(function (item) { err.taskList.should.include(item); }); } failed.should.equal(false); }); it('g -> throw', function() { var failed = false, i; var expectedRecursionList = ['g','g']; var expectedTaskList = ['a','b','c','d','e','f','g']; try { theTest('g', 'throw'); failed = true; } catch (err) { should.exist(err); err.message.should.match(/recursive/i, err.message+' should include recursive'); err.recursiveTasks.length.should.equal(expectedRecursionList.length); for (i = 0; i < expectedRecursionList.length; i++) { err.recursiveTasks[i].should.equal(expectedRecursionList[i]); } err.taskList.length.should.equal(expectedTaskList.length); expectedTaskList.forEach(function (item) { err.taskList.should.include(item); }); } failed.should.equal(false); }); it('h -> throw', function() { var failed = false; var expectedTaskList = ['a','b','c','d','e','f','g']; try { theTest('h', 'throw'); failed = true; } catch (err) { should.exist(err); err.message.should.match(/not defined/i, err.message+' should include not defined'); err.missingTask.should.equal('h'); err.taskList.length.should.equal(expectedTaskList.length); expectedTaskList.forEach(function (item) { err.taskList.should.include(item); }); } failed.should.equal(false); }); }); });