noflo
Version:
Flow-Based Programming environment for JavaScript
1,036 lines (1,027 loc) • 32.6 kB
JavaScript
var chai, legacyBasic, noflo, path, processAsync, processGenerator, processMerge, root, urlPrefix, wirePatternAsync, wirePatternMerge;
if (typeof process !== 'undefined' && process.execPath && process.execPath.match(/node|iojs/)) {
if (!chai) {
chai = require('chai');
}
noflo = require('../src/lib/NoFlo.coffee');
path = require('path');
root = path.resolve(__dirname, '../');
urlPrefix = './';
} else {
noflo = require('noflo');
root = 'noflo';
urlPrefix = '/';
}
legacyBasic = function() {
var c;
c = new noflo.Component;
c.inPorts.add('in', {
datatype: 'string'
});
c.outPorts.add('out', {
datatype: 'string'
});
c.inPorts["in"].on('connect', function() {
return c.outPorts.out.connect();
});
c.inPorts["in"].on('begingroup', function(group) {
return c.outPorts.out.beginGroup(group);
});
c.inPorts["in"].on('data', function(data) {
return c.outPorts.out.data(data + c.nodeId);
});
c.inPorts["in"].on('endgroup', function(group) {
return c.outPorts.out.endGroup();
});
c.inPorts["in"].on('disconnect', function() {
return c.outPorts.out.disconnect();
});
return c;
};
wirePatternAsync = function() {
var c;
c = new noflo.Component;
c.inPorts.add('in', {
datatype: 'string'
});
c.outPorts.add('out', {
datatype: 'string'
});
return noflo.helpers.WirePattern(c, {
"in": 'in',
out: 'out',
async: true,
forwardGroups: true
}, function(data, groups, out, callback) {
return setTimeout(function() {
out.send(data + c.nodeId);
return callback();
}, 1);
});
};
wirePatternMerge = function() {
var c;
c = new noflo.Component;
c.inPorts.add('in1', {
datatype: 'string'
});
c.inPorts.add('in2', {
datatype: 'string'
});
c.outPorts.add('out', {
datatype: 'string'
});
return noflo.helpers.WirePattern(c, {
"in": ['in1', 'in2'],
out: 'out',
async: true,
forwardGroups: true
}, function(data, groups, out, callback) {
out.send("1" + data['in1'] + c.nodeId + "2" + data['in2'] + c.nodeId);
return callback();
});
};
processAsync = function() {
var c;
c = new noflo.Component;
c.inPorts.add('in', {
datatype: 'string'
});
c.outPorts.add('out', {
datatype: 'string'
});
return c.process(function(input, output) {
var data;
data = input.getData('in');
return setTimeout(function() {
return output.sendDone(data + c.nodeId);
}, 1);
});
};
processMerge = function() {
var c;
c = new noflo.Component;
c.inPorts.add('in1', {
datatype: 'string'
});
c.inPorts.add('in2', {
datatype: 'string'
});
c.outPorts.add('out', {
datatype: 'string'
});
c.forwardBrackets = {
'in1': ['out']
};
return c.process(function(input, output) {
var first, second;
if (!input.has('in1', 'in2', function(ip) {
return ip.type === 'data';
})) {
return;
}
first = input.getData('in1');
second = input.getData('in2');
return output.sendDone({
out: "1" + first + ":2" + second + ":" + c.nodeId
});
});
};
processGenerator = function() {
var c, cleanUp;
c = new noflo.Component;
c.inPorts.add('start', {
datatype: 'bang'
});
c.inPorts.add('stop', {
datatype: 'bang'
});
c.outPorts.add('out', {
datatype: 'bang'
});
c.autoOrdering = false;
cleanUp = function() {
if (!c.timer) {
return;
}
clearInterval(c.timer.interval);
c.timer.deactivate();
return c.timer = null;
};
c.tearDown = function(callback) {
cleanUp();
return callback();
};
return c.process(function(input, output, context) {
if (input.hasData('start')) {
if (c.timer) {
cleanUp();
}
input.getData('start');
c.timer = context;
c.timer.interval = setInterval(function() {
return output.send({
out: true
});
}, 100);
}
if (input.hasData('stop')) {
input.getData('stop');
if (!c.timer) {
return output.done();
}
cleanUp();
return output.done();
}
});
};
describe('Network Lifecycle', function() {
var loader;
loader = null;
before(function(done) {
loader = new noflo.ComponentLoader(root);
return loader.listComponents(function(err) {
if (err) {
return done(err);
}
loader.registerComponent('wirepattern', 'Async', wirePatternAsync);
loader.registerComponent('wirepattern', 'Merge', wirePatternMerge);
loader.registerComponent('process', 'Async', processAsync);
loader.registerComponent('process', 'Merge', processMerge);
loader.registerComponent('process', 'Generator', processGenerator);
loader.registerComponent('legacy', 'Sync', legacyBasic);
return done();
});
});
describe('with WirePattern sending to Process API', function() {
var c, ins, out;
c = null;
ins = null;
out = null;
before(function(done) {
var fbpData;
fbpData = "INPORT=Wp.IN:IN OUTPORT=Pc.OUT:OUT Wp(wirepattern/Async) OUT -> IN Pc(process/Async)";
return noflo.graph.loadFBP(fbpData, function(err, g) {
if (err) {
return done(err);
}
loader.registerComponent('scope', 'Connected', g);
return loader.load('scope/Connected', function(err, instance) {
if (err) {
return done(err);
}
c = instance;
ins = noflo.internalSocket.createSocket();
c.inPorts["in"].attach(ins);
return done();
});
});
});
beforeEach(function() {
out = noflo.internalSocket.createSocket();
return c.outPorts.out.attach(out);
});
afterEach(function(done) {
c.outPorts.out.detach(out);
out = null;
return c.shutdown(done);
});
it('should forward old-style groups as expected', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA bazWpPc', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
ins.connect();
ins.beginGroup(1);
ins.beginGroup('a');
ins.send('baz');
ins.endGroup();
ins.endGroup();
return ins.disconnect();
});
});
it('should forward new-style brackets as expected', function(done) {
var brackets, checkEnd, checkStart, expected, received, wasStarted;
expected = ['< 1', '< a', 'DATA fooWpPc', '>', '>'];
received = [];
brackets = [];
out.on('ip', function(ip) {
switch (ip.type) {
case 'openBracket':
received.push("< " + ip.data);
return brackets.push(ip.data);
case 'data':
return received.push("DATA " + ip.data);
case 'closeBracket':
received.push('>');
return brackets.pop();
}
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
ins.post(new noflo.IP('openBracket', 1));
ins.post(new noflo.IP('openBracket', 'a'));
ins.post(new noflo.IP('data', 'foo'));
ins.post(new noflo.IP('closeBracket', 'a'));
return ins.post(new noflo.IP('closeBracket', 1));
});
});
return it('should forward scopes as expected', function(done) {
var brackets, checkEnd, checkStart, expected, received, wasStarted;
expected = ['x < 1', 'x < a', 'x DATA barWpPc', 'x >', 'x >'];
received = [];
brackets = [];
out.on('ip', function(ip) {
switch (ip.type) {
case 'openBracket':
received.push(ip.scope + " < " + ip.data);
return brackets.push(ip.data);
case 'data':
return received.push(ip.scope + " DATA " + ip.data);
case 'closeBracket':
received.push(ip.scope + " >");
return brackets.pop();
}
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
ins.post(new noflo.IP('openBracket', 1, {
scope: 'x'
}));
ins.post(new noflo.IP('openBracket', 'a', {
scope: 'x'
}));
ins.post(new noflo.IP('data', 'bar', {
scope: 'x'
}));
ins.post(new noflo.IP('closeBracket', 'a', {
scope: 'x'
}));
return ins.post(new noflo.IP('closeBracket', 1, {
scope: 'x'
}));
});
});
});
describe('pure Process API merging two inputs', function() {
var c, in1, in2, out;
c = null;
in1 = null;
in2 = null;
out = null;
before(function(done) {
var fbpData;
fbpData = "INPORT=Pc1.IN:IN1 INPORT=Pc2.IN:IN2 OUTPORT=PcMerge.OUT:OUT Pc1(process/Async) OUT -> IN1 PcMerge(process/Merge) Pc2(process/Async) OUT -> IN2 PcMerge(process/Merge)";
return noflo.graph.loadFBP(fbpData, function(err, g) {
if (err) {
return done(err);
}
loader.registerComponent('scope', 'Merge', g);
return loader.load('scope/Merge', function(err, instance) {
if (err) {
return done(err);
}
c = instance;
in1 = noflo.internalSocket.createSocket();
c.inPorts.in1.attach(in1);
in2 = noflo.internalSocket.createSocket();
c.inPorts.in2.attach(in2);
return done();
});
});
});
beforeEach(function() {
out = noflo.internalSocket.createSocket();
return c.outPorts.out.attach(out);
});
afterEach(function(done) {
c.outPorts.out.detach(out);
out = null;
return c.shutdown(done);
});
it('should forward new-style brackets as expected', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA 1bazPc1:2fooPc2:PcMerge', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in2.connect();
in2.send('foo');
in2.disconnect();
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
return in1.disconnect();
});
});
it('should forward new-style brackets as expected regardless of sending order', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA 1bazPc1:2fooPc2:PcMerge', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
in1.disconnect();
in2.connect();
in2.send('foo');
return in2.disconnect();
});
});
return it('should forward scopes as expected', function(done) {
var brackets, checkEnd, checkStart, expected, received, wasStarted;
expected = ['x < 1', 'x DATA 1onePc1:2twoPc2:PcMerge', 'x >'];
received = [];
brackets = [];
out.on('ip', function(ip) {
switch (ip.type) {
case 'openBracket':
received.push(ip.scope + " < " + ip.data);
return brackets.push(ip.data);
case 'data':
return received.push(ip.scope + " DATA " + ip.data);
case 'closeBracket':
received.push(ip.scope + " >");
return brackets.pop();
}
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in2.post(new noflo.IP('data', 'two', {
scope: 'x'
}));
in1.post(new noflo.IP('openBracket', 1, {
scope: 'x'
}));
in1.post(new noflo.IP('data', 'one', {
scope: 'x'
}));
return in1.post(new noflo.IP('closeBracket', 1, {
scope: 'x'
}));
});
});
});
describe('Process API mixed with legacy merging two inputs', function() {
var c, in1, in2, out;
c = null;
in1 = null;
in2 = null;
out = null;
before(function(done) {
var fbpData;
fbpData = "INPORT=Leg1.IN:IN1 INPORT=Leg2.IN:IN2 OUTPORT=Leg3.OUT:OUT Leg1(legacy/Sync) OUT -> IN1 PcMerge(process/Merge) Leg2(legacy/Sync) OUT -> IN2 PcMerge(process/Merge) PcMerge OUT -> IN Leg3(legacy/Sync)";
return noflo.graph.loadFBP(fbpData, function(err, g) {
if (err) {
return done(err);
}
loader.registerComponent('scope', 'Merge', g);
return loader.load('scope/Merge', function(err, instance) {
if (err) {
return done(err);
}
c = instance;
in1 = noflo.internalSocket.createSocket();
c.inPorts.in1.attach(in1);
in2 = noflo.internalSocket.createSocket();
c.inPorts.in2.attach(in2);
return done();
});
});
});
beforeEach(function() {
out = noflo.internalSocket.createSocket();
return c.outPorts.out.attach(out);
});
afterEach(function(done) {
c.outPorts.out.detach(out);
out = null;
return c.shutdown(done);
});
it('should forward new-style brackets as expected', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA 1bazLeg1:2fooLeg2:PcMergeLeg3', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in2.connect();
in2.send('foo');
in2.disconnect();
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
return in1.disconnect();
});
});
return it('should forward new-style brackets as expected regardless of sending order', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA 1bazLeg1:2fooLeg2:PcMergeLeg3', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
in1.disconnect();
in2.connect();
in2.send('foo');
return in2.disconnect();
});
});
});
describe('Process API mixed with Legacy and WirePattern merging two inputs', function() {
var c, in1, in2, out;
c = null;
in1 = null;
in2 = null;
out = null;
before(function(done) {
var fbpData;
fbpData = "INPORT=Leg1.IN:IN1 INPORT=Leg2.IN:IN2 OUTPORT=Wp.OUT:OUT Leg1(legacy/Sync) OUT -> IN1 PcMerge(process/Merge) Leg2(legacy/Sync) OUT -> IN2 PcMerge(process/Merge) PcMerge OUT -> IN Wp(wirepattern/Async)";
return noflo.graph.loadFBP(fbpData, function(err, g) {
if (err) {
return done(err);
}
loader.registerComponent('scope', 'Merge', g);
return loader.load('scope/Merge', function(err, instance) {
if (err) {
return done(err);
}
c = instance;
in1 = noflo.internalSocket.createSocket();
c.inPorts.in1.attach(in1);
in2 = noflo.internalSocket.createSocket();
c.inPorts.in2.attach(in2);
return done();
});
});
});
beforeEach(function() {
out = noflo.internalSocket.createSocket();
return c.outPorts.out.attach(out);
});
afterEach(function(done) {
c.outPorts.out.detach(out);
out = null;
return c.shutdown(done);
});
it('should forward new-style brackets as expected', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA 1bazLeg1:2fooLeg2:PcMergeWp', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in2.connect();
in2.send('foo');
in2.disconnect();
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
return in1.disconnect();
});
});
return it('should forward new-style brackets as expected regardless of sending order', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA 1bazLeg1:2fooLeg2:PcMergeWp', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
in1.disconnect();
in2.connect();
in2.send('foo');
return in2.disconnect();
});
});
});
describe('Process API mixed with WirePattern and legacy merging two inputs', function() {
var c, in1, in2, out;
c = null;
in1 = null;
in2 = null;
out = null;
before(function(done) {
var fbpData;
fbpData = "INPORT=Leg1.IN:IN1 INPORT=Leg2.IN:IN2 OUTPORT=Leg3.OUT:OUT Leg1(legacy/Sync) OUT -> IN1 PcMerge(process/Merge) Leg2(legacy/Sync) OUT -> IN2 PcMerge(process/Merge) PcMerge OUT -> IN Wp(wirepattern/Async) Wp OUT -> IN Leg3(legacy/Sync)";
return noflo.graph.loadFBP(fbpData, function(err, g) {
if (err) {
return done(err);
}
loader.registerComponent('scope', 'Merge', g);
return loader.load('scope/Merge', function(err, instance) {
if (err) {
return done(err);
}
c = instance;
in1 = noflo.internalSocket.createSocket();
c.inPorts.in1.attach(in1);
in2 = noflo.internalSocket.createSocket();
c.inPorts.in2.attach(in2);
return done();
});
});
});
beforeEach(function() {
out = noflo.internalSocket.createSocket();
return c.outPorts.out.attach(out);
});
afterEach(function(done) {
c.outPorts.out.detach(out);
out = null;
return c.shutdown(done);
});
it('should forward new-style brackets as expected', function(done) {
var checkEnd, checkStart, expected, receiveConnect, receiveDisconnect, receiveEvent, received, wasStarted;
expected = ['START', 'DATA -> IN Leg2() CONN', 'Leg2() OUT -> IN2 PcMerge() CONN', 'DATA -> IN Leg2() DATA foo', 'Leg2() OUT -> IN2 PcMerge() DATA fooLeg2', 'Leg2() OUT -> IN2 PcMerge() DISC', 'DATA -> IN Leg2() DISC', 'Leg1() OUT -> IN1 PcMerge() CONN', 'Leg1() OUT -> IN1 PcMerge() < 1', 'Leg1() OUT -> IN1 PcMerge() < a', 'Leg1() OUT -> IN1 PcMerge() DATA bazLeg1', 'PcMerge() OUT -> IN Wp() CONN', 'PcMerge() OUT -> IN Wp() < 1', 'PcMerge() OUT -> IN Wp() < a', 'PcMerge() OUT -> IN Wp() DATA 1bazLeg1:2fooLeg2:PcMerge', 'Leg1() OUT -> IN1 PcMerge() > a', 'PcMerge() OUT -> IN Wp() > a', 'Leg1() OUT -> IN1 PcMerge() > 1', 'PcMerge() OUT -> IN Wp() > 1', 'PcMerge() OUT -> IN Wp() DISC', 'Leg1() OUT -> IN1 PcMerge() DISC', 'Wp() OUT -> IN Leg3() CONN', 'Wp() OUT -> IN Leg3() < 1', 'Wp() OUT -> IN Leg3() < a', 'Wp() OUT -> IN Leg3() DATA 1bazLeg1:2fooLeg2:PcMergeWp', 'Wp() OUT -> IN Leg3() > a', 'Wp() OUT -> IN Leg3() > 1', 'Wp() OUT -> IN Leg3() DISC', 'END'];
received = [];
wasStarted = false;
checkStart = function() {
return received.push('START');
};
receiveConnect = function(event) {
return received.push(event.id + " CONN");
};
receiveEvent = function(event) {
var data, prefix;
prefix = '';
switch (event.type) {
case 'openBracket':
prefix = '<';
data = prefix + " " + event.data;
break;
case 'data':
prefix = 'DATA';
data = prefix + " " + event.data;
break;
case 'closeBracket':
prefix = '>';
data = prefix + " " + event.data;
}
return received.push(event.id + " " + data);
};
receiveDisconnect = function(event) {
return received.push(event.id + " DISC");
};
checkEnd = function() {
received.push('END');
c.network.graph.removeInitial('foo', 'Leg2', 'in');
c.network.removeListener('connect', receiveConnect);
c.network.removeListener('ip', receiveEvent);
c.network.removeListener('disconnect', receiveDisconnect);
chai.expect(received).to.eql(expected);
return done();
};
c.network.once('start', checkStart);
c.network.on('connect', receiveConnect);
c.network.on('ip', receiveEvent);
c.network.on('disconnect', receiveDisconnect);
c.network.once('end', checkEnd);
c.network.graph.addInitial('foo', 'Leg2', 'in');
return c.start(function(err) {
if (err) {
return done(err);
}
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
return in1.disconnect();
});
});
return it('should forward new-style brackets as expected regardless of sending order', function(done) {
var checkEnd, checkStart, expected, received, wasStarted;
expected = ['CONN', '< 1', '< a', 'DATA 1bazLeg1:2fooLeg2:PcMergeWpLeg3', '>', '>', 'DISC'];
received = [];
out.on('connect', function() {
return received.push('CONN');
});
out.on('begingroup', function(group) {
return received.push("< " + group);
});
out.on('data', function(data) {
return received.push("DATA " + data);
});
out.on('endgroup', function() {
return received.push('>');
});
out.on('disconnect', function() {
return received.push('DISC');
});
wasStarted = false;
checkStart = function() {
chai.expect(wasStarted).to.equal(false);
return wasStarted = true;
};
checkEnd = function() {
chai.expect(received).to.eql(expected);
chai.expect(wasStarted).to.equal(true);
return done();
};
c.network.once('start', checkStart);
c.network.once('end', checkEnd);
return c.start(function(err) {
if (err) {
return done(err);
}
in1.connect();
in1.beginGroup(1);
in1.beginGroup('a');
in1.send('baz');
in1.endGroup();
in1.endGroup();
in1.disconnect();
in2.connect();
in2.send('foo');
return in2.disconnect();
});
});
});
return describe('with a Process API Generator component', function() {
var c, out, start, stop;
c = null;
start = null;
stop = null;
out = null;
before(function(done) {
var fbpData;
fbpData = "INPORT=PcGen.START:START INPORT=PcGen.STOP:STOP OUTPORT=Pc.OUT:OUT PcGen(process/Generator) OUT -> IN Pc(process/Async)";
return noflo.graph.loadFBP(fbpData, function(err, g) {
if (err) {
return done(err);
}
loader.registerComponent('scope', 'Connected', g);
return loader.load('scope/Connected', function(err, instance) {
if (err) {
return done(err);
}
return instance.once('ready', function() {
c = instance;
start = noflo.internalSocket.createSocket();
c.inPorts.start.attach(start);
stop = noflo.internalSocket.createSocket();
c.inPorts.stop.attach(stop);
return done();
});
});
});
});
beforeEach(function() {
out = noflo.internalSocket.createSocket();
return c.outPorts.out.attach(out);
});
afterEach(function(done) {
c.outPorts.out.detach(out);
out = null;
return c.shutdown(done);
});
it('should not be running initially', function() {
return chai.expect(c.network.isRunning()).to.equal(false);
});
it('should not be running even when network starts', function(done) {
return c.start(function(err) {
if (err) {
return done(err);
}
chai.expect(c.network.isRunning()).to.equal(false);
return done();
});
});
it('should start generating when receiving a start packet', function(done) {
return c.start(function(err) {
if (err) {
return done(err);
}
out.once('data', function() {
chai.expect(c.network.isRunning()).to.equal(true);
return done();
});
return start.send(true);
});
});
return it('should stop generating when receiving a stop packet', function(done) {
return c.start(function(err) {
if (err) {
return done(err);
}
out.once('data', function() {
chai.expect(c.network.isRunning()).to.equal(true);
stop.send(true);
return setTimeout(function() {
chai.expect(c.network.isRunning()).to.equal(false);
return done();
}, 10);
});
return start.send(true);
});
});
});
});