Initial commit
This commit is contained in:
103
node_modules/node-red-contrib-buffer-parser/test/buffer-maker_spec.js
generated
vendored
Normal file
103
node_modules/node-red-contrib-buffer-parser/test/buffer-maker_spec.js
generated
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
var should = require("should");
|
||||
var helper = require("node-red-node-test-helper");
|
||||
var bufferMaker = require("../buffer-maker.js");
|
||||
|
||||
const getTestFlow = (nodeName, resultPayloadPropName) => {
|
||||
resultPayloadPropName = resultPayloadPropName ? resultPayloadPropName : "payload";
|
||||
return [
|
||||
{ id: 'helperNode', type: 'helper' },
|
||||
{
|
||||
"id": "testNode", "type": "buffer-maker", "name": nodeName, "msgProperty": resultPayloadPropName, "specification": "spec", "specificationType": "ui",
|
||||
"items": [
|
||||
{ "name": "item1", "type": "byte", "length": 1, "dataType": "num", "data": "1" },
|
||||
{ "name": "item2", "type": "int8", "length": 1, "dataType": "num", "data": "-2" },
|
||||
{ "name": "item3", "type": "uint8", "length": 1, "dataType": "num", "data": "3" },
|
||||
{ "name": "item4", "type": "int16le", "length": 1, "dataType": "num", "data": "-4" },
|
||||
{ "name": "item5", "type": "int16be", "length": 1, "dataType": "num", "data": "-5" },
|
||||
{ "name": "item6", "type": "uint16le", "length": 1, "dataType": "num", "data": "6" },
|
||||
{ "name": "item7", "type": "uint16le", "length": 1, "dataType": "num", "data": "7" },
|
||||
{ "name": "item8", "type": "int32le", "length": 1, "dataType": "num", "data": "-8" },
|
||||
{ "name": "item9", "type": "int32be", "length": 1, "dataType": "num", "data": "-9" },
|
||||
{ "name": "item10", "type": "uint32le", "length": 1, "dataType": "num", "data": "10" },
|
||||
{ "name": "item11", "type": "uint32be", "length": 1, "dataType": "num", "data": "11" },
|
||||
{ "name": "item12", "type": "bigint64le", "length": 1, "dataType": "num", "data": "-120000000000" },
|
||||
{ "name": "item13", "type": "bigint64be", "length": 1, "dataType": "num", "data": "-130000000000" },
|
||||
{ "name": "item14", "type": "biguint64le", "length": 1, "dataType": "num", "data": "14000000000" },
|
||||
{ "name": "item15", "type": "biguint64be", "length": 1, "dataType": "num", "data": "15000000000" },
|
||||
{ "name": "item16", "type": "floatle", "length": 1, "dataType": "num", "data": "16.161616" },
|
||||
{ "name": "item17", "type": "floatbe", "length": 1, "dataType": "num", "data": "17.171717" },
|
||||
{ "name": "item18", "type": "doublele", "length": 1, "dataType": "num", "data": "18.1818e-18" },
|
||||
{ "name": "item19", "type": "doublebe", "length": 1, "dataType": "num", "data": "19.1919e-19" },
|
||||
{ "name": "item20", "type": "8bit", "length": 1, "dataType": "jsonata", "data": "[[1,0,1,0,0,1,1,0]]" },
|
||||
{ "name": "item21", "type": "16bitle", "length": 1, "dataType": "jsonata", "data": "[[1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,0]]" },
|
||||
{ "name": "item22", "type": "16bitbe", "length": 1, "dataType": "jsonata", "data": "[[1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,0]]" },
|
||||
{ "name": "item23", "type": "bcdle", "length": 1, "dataType": "num", "data": "2323" },
|
||||
{ "name": "item24", "type": "bcdbe", "length": 1, "dataType": "num", "data": "2424" },
|
||||
{ "name": "item25", "type": "string", "length": 2, "dataType": "str", "data": "25" },
|
||||
{ "name": "item26", "type": "hex", "length": 4, "dataType": "str", "data": "2626" },
|
||||
{ "name": "item27", "type": "buffer", "length": 24, "dataType": "bin", "data": "[50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55]" },
|
||||
{ "name": "item28", "type": "buffer", "length": -1, "dataType": "bin", "data": "[50,55,50,55]" }
|
||||
],
|
||||
"swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgPropertyType": "str",
|
||||
"wires": [["helperNode"]]
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
helper.init(require.resolve('node-red'));
|
||||
|
||||
describe('buffer-maker Node', function(){
|
||||
"use strict";
|
||||
|
||||
beforeEach(done => { helper.startServer(done); });
|
||||
|
||||
afterEach(done => { helper.unload().then(() => helper.stopServer(done)); });
|
||||
|
||||
it('should be loaded', done => {
|
||||
// const flow = [{ id: 'testNode', type: 'buffer-maker', name: 'DEMO buffer-maker' }];
|
||||
const flow = [{"id":"testNode","type":"buffer-maker","name":"DEMO buffer-maker","specification":"spec","specificationType":"ui","items":[{"name":"item1","type":"byte","length":1,"dataType":"num","data":"1"},{"name":"item2","type":"int8","length":1,"dataType":"num","data":"-2"},{"name":"item3","type":"uint8","length":1,"dataType":"num","data":"3"},{"name":"item4","type":"int16le","length":1,"dataType":"num","data":"-4"},{"name":"item5","type":"uint16le","length":1,"dataType":"num","data":"5"},{"name":"item6","type":"uint16le","length":1,"dataType":"num","data":"6"}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgProperty":"payload","msgPropertyType":"str"}]
|
||||
helper.load(bufferMaker, flow, () => {
|
||||
try {
|
||||
const n = helper.getNode('testNode');
|
||||
n.should.have.property('name', 'DEMO buffer-maker');
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
it('should generate output messages when data is received', done => {
|
||||
//this flow is a buffer maker configured with every possible conversion & some fixed values. Expect output to be a buffer of [1,254,3,252,255,5,0,6,0]
|
||||
const resultProp = "my.custom.payload";
|
||||
const testNodeName = "buffer-maker-node-name";
|
||||
const flow = getTestFlow(testNodeName,resultProp);
|
||||
helper.load(bufferMaker, flow, function() {
|
||||
try {
|
||||
const helperNode = helper.getNode("helperNode");
|
||||
const testNode = helper.getNode("testNode");
|
||||
should(helperNode).not.be.null();
|
||||
should(testNode).not.be.null();
|
||||
testNode.should.have.property('name', testNodeName);
|
||||
helperNode.on("input", function (msg) {
|
||||
try {
|
||||
msg.should.have.propertyByPath(...resultProp.split("."));
|
||||
/** @type {should.Assertion} */ var rp = msg.should.have.propertyByPath(...resultProp.split(".")).obj;//get the nested property
|
||||
rp.should.be.an.Object()
|
||||
rp.should.instanceOf(Buffer);
|
||||
var expectedPayload = Buffer.from([1,254,3,252,255,255,251,6,0,7,0,248,255,255,255,255,255,255,247,10,0,0,0,0,0,0,11,0,80,113,15,228,255,255,255,255,255,255,225,187,101,108,0,0,12,119,66,3,0,0,0,0,0,0,3,126,17,214,0,253,74,129,65,65,137,95,173,159,29,121,247,81,246,116,60,60,65,179,143,43,255,224,32,101,101,101,101,101,35,35,36,36,50,53,38,38,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55,50,55]).toString("hex");
|
||||
rp.toString("hex").should.equal(expectedPayload);
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
});
|
||||
testNode.receive({ i1: 1111, i2: 2222 }); //fire input of testNode
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
144
node_modules/node-red-contrib-buffer-parser/test/buffer-parser_spec.js
generated
vendored
Normal file
144
node_modules/node-red-contrib-buffer-parser/test/buffer-parser_spec.js
generated
vendored
Normal file
@@ -0,0 +1,144 @@
|
||||
var should = require("should");
|
||||
var helper = require("node-red-node-test-helper");
|
||||
var bufferParser = require("../buffer-parser.js");
|
||||
|
||||
const getTestFlow = (nodeName, resultPayloadPropName) => {
|
||||
resultPayloadPropName = resultPayloadPropName ? resultPayloadPropName : "payload";
|
||||
return [
|
||||
{ id: 'helperNode1', type: 'helper' },
|
||||
{ id: 'helperNode2', type: 'helper' },
|
||||
{ id: 'helperNode3', type: 'helper' },
|
||||
{ id: 'helperNode4', type: 'helper' },
|
||||
{ id: 'helperNode5', type: 'helper' },
|
||||
{"id":"testNode","type":"buffer-parser","name":nodeName,"msgProperty":resultPayloadPropName,"data":"payload","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"int16be","name":"item1","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"int32be","name":"item2","offset":2,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"bigint64be","name":"item3","offset":6,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"hex","name":"item4","offset":14,"length":10,"offsetbit":0,"scale":"1","mask":""},{"type":"string","name":"item5","offset":24,"length":10,"offsetbit":0,"scale":"1","mask":""}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgPropertyType":"str","resultType":"value","resultTypeType":"output","multipleResult":true,"fanOutMultipleResult":true,"setTopic":true,"outputs":5,"wires":[["helperNode1"],["helperNode2"],["helperNode3"],["helperNode4"],["helperNode5"]]}
|
||||
];
|
||||
};
|
||||
|
||||
helper.init(require.resolve('node-red'));
|
||||
|
||||
describe('buffer-parser Node', function(){
|
||||
"use strict";
|
||||
|
||||
beforeEach(done => { helper.startServer(done); });
|
||||
|
||||
afterEach(done => { helper.unload().then(() => helper.stopServer(done)); });
|
||||
|
||||
it('should be loaded', done => {
|
||||
// const flow = [{ id: 'testNode', type: 'buffer-parser', name: 'test--buffer-parser' }];
|
||||
const flow = [{"id":"testNode","type":"buffer-parser","name":"test--buffer-parser","specification":"spec","specificationType":"ui","items":[{"name":"item1","type":"byte","length":1,"dataType":"num","data":"1"},{"name":"item2","type":"int8","length":1,"dataType":"num","data":"-2"},{"name":"item3","type":"uint8","length":1,"dataType":"num","data":"3"},{"name":"item4","type":"int16le","length":1,"dataType":"num","data":"-4"},{"name":"item5","type":"uint16le","length":1,"dataType":"num","data":"5"},{"name":"item6","type":"uint16le","length":1,"dataType":"num","data":"6"}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgProperty":"payload","msgPropertyType":"str"}]
|
||||
helper.load(bufferParser, flow, () => {
|
||||
try {
|
||||
const testNode = helper.getNode('testNode');
|
||||
testNode.should.have.property('name', 'test--buffer-parser');
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
it('should make BigInt values with and without mask', done => {
|
||||
const flow = [{ id: 'helperNode1', type: 'helper' }, {"id":"testNode","type":"buffer-parser","name":"test--buffer-parser","data":"payload","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"bigint64be","name":"MASK_00000001FFFFFFFF","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":"0x00000001FFFFFFFF"},{"type":"bigint64be","name":"MASK_000001FFFFFFFFFF","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":"0x000001FFFFFFFFFF"},{"type":"bigint64be","name":"MASK_0001FFFFFFFFFFFF","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":"0x0001FFFFFFFFFFFF"},{"type":"bigint64be","name":"MASK_000FFFFFFFFFFFFF","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":"0x000FFFFFFFFFFFFF"},{"type":"bigint64be","name":"NO_MASK","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":""}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgProperty":"payload","msgPropertyType":"str","resultType":"keyvalue","resultTypeType":"return","multipleResult":false,"fanOutMultipleResult":false,"setTopic":true,"outputs":1,"wires":[["helperNode1"]]}]
|
||||
helper.load(bufferParser, flow, () => {
|
||||
try {
|
||||
const testNode = helper.getNode('testNode');
|
||||
const helperNode1 = helper.getNode("helperNode1");
|
||||
|
||||
helperNode1.on("input", function (msg) {
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("MASK_00000001FFFFFFFF");
|
||||
msg.payload.should.have.property("MASK_000001FFFFFFFFFF");
|
||||
msg.payload.should.have.property("MASK_0001FFFFFFFFFFFF");
|
||||
msg.payload.should.have.property("MASK_000FFFFFFFFFFFFF");
|
||||
msg.payload.should.have.property("NO_MASK");
|
||||
msg.payload.MASK_00000001FFFFFFFF.should.eql(8589934591n);
|
||||
msg.payload.MASK_000001FFFFFFFFFF.should.eql(2199023255551n);
|
||||
msg.payload.MASK_0001FFFFFFFFFFFF.should.eql(562949953421311n);
|
||||
msg.payload.MASK_000FFFFFFFFFFFFF.should.eql(4503599627370495n);
|
||||
msg.payload.NO_MASK.should.eql(4503599627370495n);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
testNode.should.have.property('name', 'test--buffer-parser');
|
||||
testNode.receive({ payload: Buffer.from([0,15,255,255,255,255,255,255]) }); //fire input of testNode with a buffer of 0x000FFFFFFFFFFFFF (4503599627370495)
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
it('should generate 5 values (fan out test)', done => {
|
||||
|
||||
const resultProp = "my.custom.payload";
|
||||
const testNodeName = "buffer-parser-node-name";
|
||||
const flow = getTestFlow(testNodeName,resultProp);
|
||||
this.timeout(2000); //timeout with an error if done() isn't called within one second
|
||||
|
||||
helper.load(bufferParser, flow, function() {
|
||||
try {
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
var helperNode2 = helper.getNode("helperNode2");
|
||||
var helperNode3 = helper.getNode("helperNode3");
|
||||
var helperNode4 = helper.getNode("helperNode4");
|
||||
var helperNode5 = helper.getNode("helperNode5");
|
||||
var testNode = helper.getNode("testNode");
|
||||
|
||||
should(helperNode1).not.be.null();
|
||||
should(helperNode2).not.be.null();
|
||||
should(helperNode3).not.be.null();
|
||||
should(helperNode4).not.be.null();
|
||||
should(helperNode5).not.be.null();
|
||||
should(testNode).not.be.null();
|
||||
testNode.should.have.property('name', testNodeName);
|
||||
|
||||
var results = {};
|
||||
setTimeout(function () {
|
||||
|
||||
var doTest = function(msg, expectedType, expectedValue) {
|
||||
var path = resultProp.split(".");
|
||||
msg.should.have.propertyByPath(...path);
|
||||
/** @type {should.Assertion} */ var rp = msg.should.have.propertyByPath(...path).obj;//get the nested property
|
||||
should(rp).be.of.type(expectedType);
|
||||
should(rp).eql(expectedValue);
|
||||
}
|
||||
|
||||
try {
|
||||
results.should.have.properties(["resultMsg1","resultMsg2","resultMsg3","resultMsg4","resultMsg5"])
|
||||
doTest(results.resultMsg1, "number", 24930);
|
||||
doTest(results.resultMsg2, "number", 1667523942);
|
||||
doTest(results.resultMsg3, "bigint", 7451321489274203502n);
|
||||
doTest(results.resultMsg4, "string", "6f707172737475767778");
|
||||
doTest(results.resultMsg5, "string", "yzABCDEFGH");
|
||||
done();
|
||||
return;
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
helperNode1.on("input", function (msg) { results.resultMsg1 = msg; });
|
||||
helperNode2.on("input", function (msg) { results.resultMsg2 = msg; });
|
||||
helperNode3.on("input", function (msg) { results.resultMsg3 = msg; });
|
||||
helperNode4.on("input", function (msg) { results.resultMsg4 = msg; });
|
||||
helperNode5.on("input", function (msg) { results.resultMsg5 = msg; });
|
||||
testNode.receive({ payload: Buffer.from([97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90]) }); //fire input of testNode
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//TODO: Test the following...
|
||||
/*
|
||||
* all functions
|
||||
* all output types
|
||||
* byte swaps
|
||||
* scaling operators
|
||||
* dynamic spec
|
||||
*/
|
||||
});
|
||||
108
node_modules/node-red-contrib-buffer-parser/test/common-functions_spec.js
generated
vendored
Normal file
108
node_modules/node-red-contrib-buffer-parser/test/common-functions_spec.js
generated
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
var should = require("should");
|
||||
const commonFunctions = require('.././common-functions.js');
|
||||
|
||||
describe('common-functions.js', function(){
|
||||
var stop = false;
|
||||
it('should be loaded', done => {
|
||||
function shouldHaveFunction(obj, fName) {
|
||||
obj.should.have.property(fName).which.is.a.Function();
|
||||
}
|
||||
try {
|
||||
commonFunctions.should.be.type("object");
|
||||
commonFunctions.should.have.property("SWAPOPTS").which.is.instanceOf(Array);
|
||||
commonFunctions.should.have.property("TYPEOPTS").which.is.instanceOf(Array);
|
||||
|
||||
shouldHaveFunction(commonFunctions, "bcd2number");//additional tests TO DO
|
||||
shouldHaveFunction(commonFunctions, "number2bcd");//additional tests TO DO
|
||||
shouldHaveFunction(commonFunctions, "byteToBits");
|
||||
shouldHaveFunction(commonFunctions, "wordToBits");
|
||||
shouldHaveFunction(commonFunctions, "bitsToByte");
|
||||
shouldHaveFunction(commonFunctions, "bitsToWord");
|
||||
shouldHaveFunction(commonFunctions, "getBit");//additional tests TO DO
|
||||
shouldHaveFunction(commonFunctions, "setBit");//additional tests TO DO
|
||||
shouldHaveFunction(commonFunctions, "clearBit");//additional tests TO DO
|
||||
shouldHaveFunction(commonFunctions, "updateBit");//additional tests TO DO
|
||||
shouldHaveFunction(commonFunctions, "isNumber");
|
||||
shouldHaveFunction(commonFunctions, "setObjectProperty");
|
||||
shouldHaveFunction(commonFunctions, "getObjectProperty");
|
||||
|
||||
var parent = {};
|
||||
var grandchildNamePath = "child.child.name";
|
||||
var grandchildName = "dum dum";
|
||||
|
||||
describe('#setObjectProperty()', () => {
|
||||
it('should set object property by path', done => {
|
||||
try {
|
||||
commonFunctions.setObjectProperty(parent, "child.child.name", grandchildName);
|
||||
parent.should.have.propertyByPath(...grandchildNamePath.split(".")).which.eqls(grandchildName);
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('#getObjectProperty()', () => {
|
||||
it('should get object property by path', done => {
|
||||
try {
|
||||
var name = commonFunctions.getObjectProperty(parent, grandchildNamePath) || "";
|
||||
name.should.eql(grandchildName);
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('#isNumber()', () => {
|
||||
it('should test numbers', done => {
|
||||
try {
|
||||
commonFunctions.isNumber("123").should.eql(true);
|
||||
commonFunctions.isNumber("0x123").should.eql(true);
|
||||
commonFunctions.isNumber("0b1001").should.eql(true);
|
||||
commonFunctions.isNumber("0o1234567").should.eql(true);
|
||||
commonFunctions.isNumber("0o12345678").should.eql(false);
|
||||
commonFunctions.isNumber("efg").should.eql(false);
|
||||
commonFunctions.isNumber(null).should.eql(false);
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('#byteToBits() #bitsToByte()', () => {
|
||||
it('should convert byte to bits and back to byte', done => {
|
||||
try {
|
||||
var x96 = commonFunctions.byteToBits(0x96);
|
||||
x96.bits.should.eql([0, 1, 1, 0, 1, 0, 0, 1]); //bit 0 ~ 7
|
||||
commonFunctions.bitsToByte(x96.bits).should.eql(0x96);
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('#wordToBits() #bitsToWord()', () => {
|
||||
it('should convert word to bits and back to word', done => {
|
||||
try {
|
||||
var xf708 = commonFunctions.wordToBits(0xf708); //
|
||||
xf708.bits.should.eql([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1]); //bit 0 ~ 15
|
||||
commonFunctions.bitsToWord(xf708.bits).should.eql(0xf708);
|
||||
done();
|
||||
} catch (error) {
|
||||
done(error);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
done(); //success :)
|
||||
} catch (error) {
|
||||
stop = true;
|
||||
done(error);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user