mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Reorganise nodes into new categories
This commit is contained in:
1606
test/nodes/core/sequence/17-split_spec.js
Normal file
1606
test/nodes/core/sequence/17-split_spec.js
Normal file
File diff suppressed because it is too large
Load Diff
496
test/nodes/core/sequence/18-sort_spec.js
Normal file
496
test/nodes/core/sequence/18-sort_spec.js
Normal file
@@ -0,0 +1,496 @@
|
||||
/**
|
||||
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
var should = require("should");
|
||||
var sortNode = require("nr-test-utils").require("@node-red/nodes/core/sequence/18-sort.js");
|
||||
var helper = require("node-red-node-test-helper");
|
||||
var RED = require("nr-test-utils").require("node-red/lib/red.js");
|
||||
var Context = require("nr-test-utils").require("@node-red/runtime/lib/nodes/context");
|
||||
|
||||
describe('SORT node', function() {
|
||||
|
||||
beforeEach(function(done) {
|
||||
helper.startServer(done);
|
||||
});
|
||||
|
||||
function initContext(done) {
|
||||
Context.init({
|
||||
contextStorage: {
|
||||
memory: {
|
||||
module: "memory"
|
||||
}
|
||||
}
|
||||
});
|
||||
Context.load().then(function () {
|
||||
done();
|
||||
});
|
||||
}
|
||||
|
||||
afterEach(function(done) {
|
||||
helper.unload().then(function(){
|
||||
RED.settings.nodeMessageBufferMaxLength = 0;
|
||||
helper.stopServer(done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should be loaded', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:false, name: "SortNode", wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
n1.should.have.property('name', 'SortNode');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
function check_sort0(flow, target, key, key_type, data_in, data_out, done) {
|
||||
var sort = flow[0];
|
||||
sort.target = target;
|
||||
sort.targetType = "msg";
|
||||
sort.msgKey = key;
|
||||
sort.msgKeyType = key_type;
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property(target);
|
||||
var data = msg[target];
|
||||
data.length.should.equal(data_out.length);
|
||||
for(var i = 0; i < data_out.length; i++) {
|
||||
var data0 = data[i];
|
||||
var data1 = data_out[i];
|
||||
if (typeof data0 === "object") {
|
||||
data0.should.deepEqual(data1);
|
||||
}
|
||||
else {
|
||||
data0.should.equal(data1);
|
||||
}
|
||||
}
|
||||
done();
|
||||
}
|
||||
catch(e) {
|
||||
console.log(e);
|
||||
}
|
||||
});
|
||||
var msg = {};
|
||||
msg[target] = data_in;
|
||||
n1.receive(msg);
|
||||
});
|
||||
}
|
||||
|
||||
function check_sort0A(flow, data_in, data_out, done) {
|
||||
check_sort0(flow, "payload", "", "elem", data_in, data_out, done);
|
||||
}
|
||||
|
||||
function check_sort0B(flow, data_in, data_out, done) {
|
||||
check_sort0(flow, "data", "", "elem", data_in, data_out, done);
|
||||
}
|
||||
|
||||
function check_sort0C(flow, exp, data_in, data_out, done) {
|
||||
check_sort0(flow, "data", exp, "jsonata", data_in, data_out, done);
|
||||
}
|
||||
|
||||
function check_sort1(flow, key, key_type, data_in, data_out, done) {
|
||||
function equals(v0, v1) {
|
||||
var k0 = Object.keys(v0);
|
||||
var k1 = Object.keys(v1);
|
||||
|
||||
if (k0.length === k1.length) {
|
||||
for (var i = 0; i < k0.length; i++) {
|
||||
var k = k0[i];
|
||||
if (!v1.hasOwnProperty(k) ||
|
||||
(v0[k] !== v1[k])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function indexOf(a, v) {
|
||||
for(var i = 0; i < a.length; i++) {
|
||||
var av = a[i];
|
||||
if ((typeof v === 'object') && equals(v, av)) {
|
||||
return i;
|
||||
}
|
||||
else if (v === av) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
var sort = flow[0];
|
||||
var prop = (key_type === "msg") ? key : "payload";
|
||||
sort.targetType = "seq";
|
||||
sort.seqKey = key;
|
||||
sort.seqKeyType = key_type;
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var count = 0;
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property(prop);
|
||||
msg.should.have.property("parts");
|
||||
msg.parts.should.have.property("count", data_out.length);
|
||||
var data = msg[prop];
|
||||
var index = indexOf(data_out, data);
|
||||
msg.parts.should.have.property("index", index);
|
||||
count++;
|
||||
if (count === data_out.length) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
var len = data_in.length;
|
||||
for(var i = 0; i < len; i++) {
|
||||
var parts = { id: "X", index: i, count: len };
|
||||
var msg = {parts: parts};
|
||||
msg[prop] = data_in[i];
|
||||
n1.receive(msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function check_sort1A(flow, data_in, data_out, done) {
|
||||
check_sort1(flow, "payload", "msg", data_in, data_out, done);
|
||||
}
|
||||
|
||||
function check_sort1B(flow, data_in, data_out, done) {
|
||||
check_sort1(flow, "data", "msg", data_in, data_out, done);
|
||||
}
|
||||
|
||||
function check_sort1C(flow, exp, data_in, data_out, done) {
|
||||
check_sort1(flow, exp, "jsonata", data_in, data_out, done);
|
||||
}
|
||||
|
||||
(function() {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:false, wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var data_in = [ "200", "4", "30", "1000" ];
|
||||
var data_out = [ "1000", "200", "30", "4" ];
|
||||
it('should sort payload (elem, not number, ascending)', function(done) {
|
||||
check_sort0A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort msg prop (elem, not number, ascending)', function(done) {
|
||||
check_sort0B(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/payload (not number, ascending)', function(done) {
|
||||
check_sort1A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/prop (not number, ascending)', function(done) {
|
||||
check_sort1B(flow, data_in, data_out, done);
|
||||
});
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var flow = [{id:"n1", type:"sort", order:"descending", as_num:false, wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var data_in = [ "200", "4", "30", "1000" ];
|
||||
var data_out = [ "4", "30", "200", "1000" ];
|
||||
it('should sort payload (elem, not number, descending)', function(done) {
|
||||
check_sort0A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort msg prop (elem, not number, descending)', function(done) {
|
||||
check_sort0B(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/payload (not number, descending)', function(done) {
|
||||
check_sort1A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/prop (not number, descending)', function(done) {
|
||||
check_sort1B(flow, data_in, data_out, done);
|
||||
});
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:true, wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var data_in = [ "200", "4", "30", "1000" ];
|
||||
var data_out = [ "4", "30", "200", "1000" ];
|
||||
it('should sort payload (elem, number, ascending)', function(done) {
|
||||
check_sort0A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort msg prop (elem, number, ascending)', function(done) {
|
||||
check_sort0B(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/payload (number, ascending)', function(done) {
|
||||
check_sort1A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/prop (number, ascending)', function(done) {
|
||||
check_sort1B(flow, data_in, data_out, done);
|
||||
});
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var flow = [{id:"n1", type:"sort", order:"descending", as_num:true, wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var data_in = [ "200", "4", "30", "1000" ];
|
||||
var data_out = [ "1000", "200", "30", "4" ];
|
||||
it('should sort payload (elem, number, descending)', function(done) {
|
||||
check_sort0A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort msg prop (elem, number, descending)', function(done) {
|
||||
check_sort0B(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/payload (number, descending)', function(done) {
|
||||
check_sort1A(flow, data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group/prop (number, descending)', function(done) {
|
||||
check_sort1B(flow, data_in, data_out, done);
|
||||
});
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:false, wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var data_in = [ "C200", "A4", "B30", "D1000" ];
|
||||
var data_out = [ "D1000", "C200", "B30", "A4" ];
|
||||
it('should sort payload (exp, not number, ascending)', function(done) {
|
||||
check_sort0C(flow, "$substring($,1)", data_in, data_out, done);
|
||||
});
|
||||
it('should sort message group (exp, not number, ascending)', function(done) {
|
||||
check_sort1C(flow, "$substring(payload,1)", data_in, data_out, done);
|
||||
});
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var flow = [{id:"n1", type:"sort", order:"descending", as_num:false, wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var data_in = [ "C200", "A4", "B30", "D1000" ];
|
||||
var data_out = [ "A4", "B30", "C200", "D1000" ];
|
||||
it('should sort message group (exp, not number, descending)', function(done) {
|
||||
check_sort0C(flow, "$substring($,1)", data_in, data_out, done);
|
||||
});
|
||||
it('should sort payload (exp, not number, descending)', function(done) {
|
||||
check_sort1C(flow, "$substring(payload,1)", data_in, data_out, done);
|
||||
});
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:true, wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var conv = function(x) {
|
||||
return x.map(function(v) { return { val:v }; });
|
||||
};
|
||||
var data_in = conv([ "200", "4", "30", "1000" ]);
|
||||
var data_out = conv([ "4", "30", "200", "1000" ]);
|
||||
it('should sort payload of objects', function(done) {
|
||||
check_sort0C(flow, "val", data_in, data_out, done);
|
||||
});
|
||||
})();
|
||||
|
||||
it('should sort payload by context (exp, not number, ascending)', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", target:"data", targetType:"msg", msgKey:"$flowContext($)", msgKeyType:"jsonata", order:"ascending", as_num:false, wires:[["n2"]],z:"flow"},
|
||||
{id:"n2", type:"helper",z:"flow"},
|
||||
{id:"flow", type:"tab"}];
|
||||
var data_in = [ "first", "second", "third", "fourth" ];
|
||||
var data_out = [ "second", "third", "first", "fourth" ];
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context()["flow"].set("first","3");
|
||||
n1.context()["flow"].set("second","1");
|
||||
n1.context()["flow"].set("third","2");
|
||||
n1.context()["flow"].set("fourth","4");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property("data");
|
||||
var data = msg["data"];
|
||||
data.length.should.equal(data_out.length);
|
||||
for(var i = 0; i < data_out.length; i++) {
|
||||
data[i].should.equal(data_out[i]);
|
||||
}
|
||||
done();
|
||||
});
|
||||
var msg = {};
|
||||
msg["data"] = data_in;
|
||||
n1.receive(msg);
|
||||
});
|
||||
});
|
||||
|
||||
it('should sort message group by context (exp, not number, ascending)', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", target:"data", targetType:"seq", seqKey:"$globalContext(payload)", seqKeyType:"jsonata", order:"ascending", as_num:false, wires:[["n2"]],z:"flow"},
|
||||
{id:"n2", type:"helper",z:"flow"},
|
||||
{id:"flow", type:"tab"}];
|
||||
var data_in = [ "first", "second", "third", "fourth" ];
|
||||
var data_out = [ "second", "fourth", "third", "first" ];
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var count = 0;
|
||||
n1.context()["global"].set("first","4");
|
||||
n1.context()["global"].set("second","1");
|
||||
n1.context()["global"].set("third","3");
|
||||
n1.context()["global"].set("fourth","2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.should.have.property("parts");
|
||||
msg.parts.should.have.property("count", data_out.length);
|
||||
var data = msg["payload"];
|
||||
var index = data_out.indexOf(data);
|
||||
msg.parts.should.have.property("index", index);
|
||||
count++;
|
||||
if (count === data_out.length) {
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(e) {
|
||||
done(e);
|
||||
}
|
||||
});
|
||||
var len = data_in.length;
|
||||
for(var i = 0; i < len; i++) {
|
||||
var parts = { id: "X", index: i, count: len };
|
||||
var msg = {parts: parts};
|
||||
msg["payload"] = data_in[i];
|
||||
n1.receive(msg);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should sort payload by persistable context (exp, not number, descending)', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", target:"data", targetType:"msg", msgKey:"$globalContext($,\"memory\")", msgKeyType:"jsonata", order:"descending", as_num:false, wires:[["n2"]],z:"flow"},
|
||||
{id:"n2", type:"helper",z:"flow"},
|
||||
{id:"flow", type:"tab"}];
|
||||
var data_in = [ "first", "second", "third", "fourth" ];
|
||||
var data_out = [ "fourth", "first", "third", "second" ];
|
||||
helper.load(sortNode, flow, function() {
|
||||
initContext(function(){
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context()["global"].set(["first","second","third","fourth"],["3","1","2","4"],"memory",function(){
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property("data");
|
||||
var data = msg["data"];
|
||||
data.length.should.equal(data_out.length);
|
||||
for(var i = 0; i < data_out.length; i++) {
|
||||
data[i].should.equal(data_out[i]);
|
||||
}
|
||||
done();
|
||||
});
|
||||
var msg = {};
|
||||
msg["data"] = data_in;
|
||||
n1.receive(msg);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should sort message group by persistable context (exp, not number, descending)', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", target:"data", targetType:"seq", seqKey:"$flowContext(payload,\"memory\")", seqKeyType:"jsonata", order:"descending", as_num:false, wires:[["n2"]],z:"flow"},
|
||||
{id:"n2", type:"helper",z:"flow"},
|
||||
{id:"flow", type:"tab"}];
|
||||
var data_in = [ "first", "second", "third", "fourth" ];
|
||||
var data_out = [ "first", "third", "fourth", "second" ];
|
||||
helper.load(sortNode, flow, function() {
|
||||
initContext(function(){
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var count = 0;
|
||||
n1.context()["flow"].set(["first","second","third","fourth"],["4","1","3","2"],"memory",function(){
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.should.have.property("parts");
|
||||
msg.parts.should.have.property("count", data_out.length);
|
||||
var data = msg["payload"];
|
||||
var index = data_out.indexOf(data);
|
||||
msg.parts.should.have.property("index", index);
|
||||
count++;
|
||||
if (count === data_out.length) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
var len = data_in.length;
|
||||
for(var i = 0; i < len; i++) {
|
||||
var parts = { id: "X", index: i, count: len };
|
||||
var msg = {parts: parts};
|
||||
msg["payload"] = data_in[i];
|
||||
n1.receive(msg);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle JSONata script error', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:false, target:"payload", targetType:"seq", seqKey:"$unknown()", seqKeyType:"jsonata", wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
setTimeout(function() {
|
||||
var logEvents = helper.log().args.filter(function (evt) {
|
||||
return evt[0].type == "sort";
|
||||
});
|
||||
var evt = logEvents[0][0];
|
||||
evt.should.have.property('id', "n1");
|
||||
evt.should.have.property('type', "sort");
|
||||
evt.should.have.property('msg', "sort.invalid-exp");
|
||||
done();
|
||||
}, 150);
|
||||
var msg0 = { payload: "A", parts: { id: "X", index: 0, count: 2} };
|
||||
var msg1 = { payload: "B", parts: { id: "X", index: 1, count: 2} };
|
||||
n1.receive(msg0);
|
||||
n1.receive(msg1);
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle too many pending messages', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:false, target:"payload", targetType:"seq", seqKey:"payload", seqKeyType:"msg", wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
RED.settings.nodeMessageBufferMaxLength = 2;
|
||||
setTimeout(function() {
|
||||
var logEvents = helper.log().args.filter(function (evt) {
|
||||
return evt[0].type == "sort";
|
||||
});
|
||||
var evt = logEvents[0][0];
|
||||
evt.should.have.property('id', "n1");
|
||||
evt.should.have.property('type', "sort");
|
||||
evt.should.have.property('msg', "sort.too-many");
|
||||
done();
|
||||
}, 150);
|
||||
for(var i = 0; i < 4; i++) {
|
||||
var msg = { payload: "V"+i,
|
||||
parts: { id: "X", index: i, count: 4} };
|
||||
n1.receive(msg);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should clear pending messages on close', function(done) {
|
||||
var flow = [{id:"n1", type:"sort", order:"ascending", as_num:false, target:"payload", targetType:"seq", seqKey:"payload", seqKeyType:"msg", wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(sortNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var msg = { payload: 0,
|
||||
parts: { id: "X", index: 0, count: 2} };
|
||||
n1.receive(msg);
|
||||
setTimeout(function() {
|
||||
n1.close().then(function() {
|
||||
var logEvents = helper.log().args.filter(function (evt) {
|
||||
return evt[0].type == "sort";
|
||||
});
|
||||
var evt = logEvents[0][0];
|
||||
evt.should.have.property('id', "n1");
|
||||
evt.should.have.property('type', "sort");
|
||||
evt.should.have.property('msg', "sort.clear");
|
||||
done();
|
||||
});
|
||||
}, 150);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
360
test/nodes/core/sequence/19-batch_spec.js
Normal file
360
test/nodes/core/sequence/19-batch_spec.js
Normal file
@@ -0,0 +1,360 @@
|
||||
/**
|
||||
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
var should = require("should");
|
||||
var batchNode = require("nr-test-utils").require("@node-red/nodes/core/sequence/19-batch.js");
|
||||
var helper = require("node-red-node-test-helper");
|
||||
var RED = require("nr-test-utils").require("node-red/lib/red.js");
|
||||
|
||||
describe('BATCH node', function() {
|
||||
this.timeout(8000);
|
||||
|
||||
before(function(done) {
|
||||
helper.startServer(done);
|
||||
});
|
||||
|
||||
after(function(done) {
|
||||
helper.stopServer(done);
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
helper.unload();
|
||||
RED.settings.nodeMessageBufferMaxLength = 0;
|
||||
});
|
||||
|
||||
it('should be loaded with defaults', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(batchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
n1.should.have.property('name', 'BatchNode');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
function check_parts(msg, id, idx, count) {
|
||||
msg.should.have.property("parts");
|
||||
var parts = msg.parts;
|
||||
parts.should.have.property("id", id);
|
||||
parts.should.have.property("index", idx);
|
||||
parts.should.have.property("count", count);
|
||||
}
|
||||
|
||||
function check_data(n1, n2, results, done) {
|
||||
var id = undefined;
|
||||
var ix0 = 0; // seq no
|
||||
var ix1 = 0; // loc. in seq
|
||||
var seq = undefined;
|
||||
var msgs = [];
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
for (var i = 0; i < msgs.length; i++) {
|
||||
msg.should.not.equal(msgs[i]);
|
||||
}
|
||||
msgs.push(msg);
|
||||
if (seq === undefined) {
|
||||
seq = results[ix0];
|
||||
}
|
||||
var val = seq[ix1];
|
||||
msg.should.have.property("payload", val);
|
||||
if (id === undefined) {
|
||||
id = msg.parts.id;
|
||||
}
|
||||
check_parts(msg, id, ix1, seq.length);
|
||||
ix1++;
|
||||
if (ix1 === seq.length) {
|
||||
ix0++;
|
||||
ix1 = 0;
|
||||
seq = undefined;
|
||||
id = undefined;
|
||||
if (ix0 === results.length) {
|
||||
done();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
done(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function check_count(flow, results, done) {
|
||||
try {
|
||||
helper.load(batchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
check_data(n1, n2, results, done);
|
||||
for(var i = 0; i < 6; i++) {
|
||||
n1.receive({payload: i});
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
done(e);
|
||||
}
|
||||
}
|
||||
|
||||
function delayed_send(receiver, index, count, delay) {
|
||||
if (index < count) {
|
||||
setTimeout(function() {
|
||||
receiver.receive({payload: index});
|
||||
delayed_send(receiver, index+1, count, delay);
|
||||
}, delay);
|
||||
}
|
||||
}
|
||||
|
||||
function check_interval(flow, results, delay, done) {
|
||||
helper.load(batchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
check_data(n1, n2, results, done);
|
||||
delayed_send(n1, 0, 4, delay);
|
||||
});
|
||||
}
|
||||
|
||||
function check_concat(flow, results, inputs, done) {
|
||||
try {
|
||||
helper.load(batchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
check_data(n1, n2, results, done);
|
||||
for(var data of inputs) {
|
||||
var msg = {
|
||||
topic: data[0],
|
||||
payload: data[1],
|
||||
parts: {
|
||||
id: data[0],
|
||||
index: data[2],
|
||||
count: data[3]
|
||||
}
|
||||
};
|
||||
n1.receive(msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
done(e);
|
||||
}
|
||||
}
|
||||
|
||||
describe('mode: count', function() {
|
||||
|
||||
it('should create seq. with count', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "count", count: 2, overlap: 0, interval: 10, allowEmptySequence: false, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[0, 1],
|
||||
[2, 3],
|
||||
[4, 5]
|
||||
];
|
||||
check_count(flow, results, done);
|
||||
});
|
||||
|
||||
it('should create seq. with count and overlap', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "count", count: 3, overlap: 2, interval: 10, allowEmptySequence: false, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[0, 1, 2],
|
||||
[1, 2, 3],
|
||||
[2, 3, 4],
|
||||
[3, 4, 5]
|
||||
];
|
||||
check_count(flow, results, done);
|
||||
});
|
||||
|
||||
it('should handle too many pending messages', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "count", count: 5, overlap: 0, interval: 10, allowEmptySequence: false, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(batchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
RED.settings.nodeMessageBufferMaxLength = 2;
|
||||
setTimeout(function() {
|
||||
var logEvents = helper.log().args.filter(function (evt) {
|
||||
return evt[0].type == "batch";
|
||||
});
|
||||
var evt = logEvents[0][0];
|
||||
evt.should.have.property('id', "n1");
|
||||
evt.should.have.property('type', "batch");
|
||||
evt.should.have.property('msg', "batch.too-many");
|
||||
done();
|
||||
}, 150);
|
||||
for(var i = 0; i < 3; i++) {
|
||||
n1.receive({payload: i});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('mode: interval', function() {
|
||||
|
||||
it('should create seq. with interval', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "interval", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[0, 1],
|
||||
[2, 3]
|
||||
];
|
||||
check_interval(flow, results, 450, done);
|
||||
});
|
||||
|
||||
it('should create seq. with interval (in float)', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "interval", count: 0, overlap: 0, interval: 0.5, allowEmptySequence: false, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[0, 1],
|
||||
[2, 3]
|
||||
];
|
||||
check_interval(flow, results, 225, done);
|
||||
});
|
||||
|
||||
it('should create seq. with interval & not send empty seq', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "interval", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
// 1300, 2600, 3900, 5200,
|
||||
[0], [1], [2], [3]
|
||||
];
|
||||
check_interval(flow, results, 1300, done);
|
||||
});
|
||||
|
||||
it('should create seq. with interval & send empty seq', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "interval", count: 0, overlap: 0, interval: 1, allowEmptySequence: true, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
// 1300, 2600, 3900, 5200,
|
||||
[null], [0], [1], [2], [null], [3]
|
||||
];
|
||||
check_interval(flow, results, 1300, done);
|
||||
});
|
||||
|
||||
it('should handle too many pending messages', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "interval", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(batchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
RED.settings.nodeMessageBufferMaxLength = 2;
|
||||
setTimeout(function() {
|
||||
var logEvents = helper.log().args.filter(function (evt) {
|
||||
return evt[0].type == "batch";
|
||||
});
|
||||
var evt = logEvents[0][0];
|
||||
evt.should.have.property('id', "n1");
|
||||
evt.should.have.property('type', "batch");
|
||||
evt.should.have.property('msg', "batch.too-many");
|
||||
done();
|
||||
}, 150);
|
||||
for(var i = 0; i < 3; i++) {
|
||||
n1.receive({payload: i});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('mode: concat', function() {
|
||||
|
||||
it('should concat two seq. (series)', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "concat", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [{topic: "TA"}, {topic: "TB"}], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[2, 3, 0, 1]
|
||||
];
|
||||
var inputs = [
|
||||
["TB", 0, 0, 2],
|
||||
["TB", 1, 1, 2],
|
||||
["TA", 2, 0, 2],
|
||||
["TA", 3, 1, 2]
|
||||
];
|
||||
check_concat(flow, results, inputs, done);
|
||||
});
|
||||
|
||||
it('should concat two seq. (mixed)', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "concat", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [{topic: "TA"}, {topic: "TB"}], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[2, 3, 0, 1]
|
||||
];
|
||||
var inputs = [
|
||||
["TA", 2, 0, 2],
|
||||
["TB", 0, 0, 2],
|
||||
["TA", 3, 1, 2],
|
||||
["TB", 1, 1, 2]
|
||||
];
|
||||
check_concat(flow, results, inputs, done);
|
||||
});
|
||||
|
||||
it('should concat three seq.', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "concat", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [{topic: "TA"}, {topic: "TB"}, {topic: "TC"}], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[2, 3, 0, 1, 4]
|
||||
];
|
||||
var inputs = [
|
||||
["TC", 4, 0, 1],
|
||||
["TB", 0, 0, 2],
|
||||
["TB", 1, 1, 2],
|
||||
["TA", 2, 0, 2],
|
||||
["TA", 3, 1, 2]
|
||||
];
|
||||
check_concat(flow, results, inputs, done);
|
||||
});
|
||||
|
||||
it('should concat same seq.', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "concat", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [{topic: "TA"}, {topic: "TA"}], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = [
|
||||
[9, 8, 9, 8]
|
||||
];
|
||||
var inputs = [
|
||||
["TA", 9, 0, 2],
|
||||
["TA", 8, 1, 2]
|
||||
];
|
||||
check_concat(flow, results, inputs, done);
|
||||
});
|
||||
|
||||
it('should handle too many pending messages', function(done) {
|
||||
var flow = [{id:"n1", type:"batch", name: "BatchNode", mode: "concat", count: 0, overlap: 0, interval: 1, allowEmptySequence: false, topics: [{topic: "TA"}, {topic: "TB"}], wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(batchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
RED.settings.nodeMessageBufferMaxLength = 2;
|
||||
setTimeout(function() {
|
||||
var logEvents = helper.log().args.filter(function (evt) {
|
||||
return evt[0].type == "batch";
|
||||
});
|
||||
var evt = logEvents[0][0];
|
||||
evt.should.have.property('id', "n1");
|
||||
evt.should.have.property('type', "batch");
|
||||
evt.should.have.property('msg', "batch.too-many");
|
||||
done();
|
||||
}, 150);
|
||||
var C = 3;
|
||||
for(var i = 0; i < C; i++) {
|
||||
var parts_a = {index:i, count:C, id:"A"};
|
||||
var parts_b = {index:i, count:C, id:"B"};
|
||||
n1.receive({payload: i, topic: "TA", parts:parts_a});
|
||||
n1.receive({payload: i, topic: "TB", parts:parts_b});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
Reference in New Issue
Block a user