node-red-contrib-bitunloader
Version:
Unload numbers to a binary string, array of bits, array of bools, object of bits, or object of bools.
286 lines (268 loc) • 10 kB
JavaScript
var should = require('should'); //eslint-disable-line no-unused-vars
var helper = require('node-red-node-test-helper');
var bitunloaderNode = require('../src/bitunloaderNode');
helper.init(require.resolve('node-red'));
describe('bitunloader Node', function () {
afterEach(function () {
helper.unload();
});
it('should be loaded', function (done) {
var flow = [{ id: 'n1', type:'bitunloader', name: 'test name' }];
helper.load(bitunloaderNode, flow, function () {
var n1 = helper.getNode('n1');
n1.should.have.property('name', 'test name');
done();
});
});
it('should detect if property is undefined', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'undefined' }];
helper.load(bitunloaderNode, flow, function () {
var n1 = helper.getNode('n1');
const testMsg = { payload: { number: 5 } };
n1.receive(testMsg);
setTimeout(function() {helper.log().called.should.be.true();
var logEvents = helper.log().args.filter(function(evt) {
return evt[0].type == 'bitunloader';
});
logEvents.should.have.length(1);
var msg = logEvents[0][0];
msg.should.have.property('level', helper.log().ERROR);
msg.should.have.property('id', 'n1');
msg.should.have.property('type', 'bitunloader');
msg.should.have.property('msg', 'Property undefined is undefined');
done();
});
});
});
it('should detect if input is not a parsable number', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number' }];
helper.load(bitunloaderNode, flow, function () {
var n1 = helper.getNode('n1');
const testMsg = { payload: { number: 'String' } };
n1.receive(testMsg);
setTimeout(function () {
helper.log().called.should.be.true();
var logEvents = helper.log().args.filter(function(evt) {
return evt[0].type == 'bitunloader';
});
logEvents.should.have.length(1);
var msg = logEvents[0][0];
msg.should.have.property('level', helper.log().ERROR);
msg.should.have.property('id', 'n1');
msg.should.have.property('type', 'bitunloader');
msg.should.have.property('msg', 'Input is not a number or parsable string.');
done();
});
});
});
it('should reject arrays', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload', mode: 'string', padding: 'none', wires:[['n2']] }];
helper.load(bitunloaderNode, flow, function () {
var n1 = helper.getNode('n1');
n1.receive({ payload: [6,3] });
setTimeout(function() {
helper.log().called.should.be.true();
var logEvents = helper.log().args.filter(function(evt) {
return evt[0].type == 'bitunloader';
});
logEvents.should.have.length(1);
var msg = logEvents[0][0];
msg.should.have.property('level', helper.log().ERROR);
msg.should.have.property('id', 'n1');
msg.should.have.property('type', 'bitunloader');
msg.should.have.property('msg', 'Input is not a number or parsable string.');
done();
});
});
});
it('should handle negative numbers', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'string', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number', '101');
});
} catch (err) {
done(err);
}
n1.receive({ payload: {number: -5 } });
done();
});
});
it('should handle floating point numbers as whole numbers', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'string', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number');
msg.payload.should.be.exactly('101');
});
} catch(err) {
done(err);
}
n1.receive({ payload: {number: 5.5 } });
done();
});
});
it('should output a binary string', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'string', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number', '11');
});
} catch (err) {
done(err);
}
n1.receive({ payload: {number: 3 } });
done();
});
});
it('should output an array of bits', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'arrayBits', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number').which.is.an.Array();
msg.payload.number.should.have.length(2);
msg.payload.number[0].should.be.exactly(1);
msg.payload.number[1].should.be.exactly(1);
});
} catch (err) {
done(err);
}
n1.receive({ payload: {number: 3 } });
done();
});
});
it('should output an array of bool', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'arrayBools', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number').which.is.an.Array();
msg.payload.number[0].should.equal(false);
msg.payload.number[1].should.equal(true);
});
} catch (err) {
done(err);
}
n1.receive({ payload: {number: 2 } });
done();
});
});
it('should output an object of bits', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'objectBits', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number').which.is.an.Object();
msg.payload.number.should.have.ownProperty('b0', 0);
msg.payload.number.should.have.ownProperty('b1', 1);
});
} catch (err) {
done(err);
}
n1.receive({ payload: {number: 2 } });
done();
});
});
it('should output an object of bools', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'objectBools', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number').which.is.an.Object();
msg.payload.number.should.have.ownProperty('b0');
msg.payload.number.should.have.ownProperty('b1');
msg.payload.number['b0'].should.be.false;
msg.payload.number['b1'].should.be.true;
});
} catch (err) {
done(err);
}
n1.receive({ payload: {number: 2 } });
done();
});
});
it('should not change other properties', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number[0]', mode: 'objectBools', padding: 'none', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.should.have.property('topic', 'unchanged');
msg.payload.should.have.property('number').which.is.an.Array();
msg.payload.number[0].should.have.ownProperty('b0');
msg.payload.number[0].should.have.ownProperty('b1');
msg.payload.number[0]['b0'].should.be.false;
msg.payload.number[0]['b1'].should.be.true;
msg.payload.number[1].should.equal(100);
});
} catch (err) {
done(err);
}
n1.receive({ topic: 'unchanged', payload: {number: [2,100] } });
done();
});
});
it('should pad the result to the requested length', function (done) {
var flow = [{ id: 'n1', type: 'bitunloader', name: 'test name', prop: 'payload.number', mode: 'arrayBools', padding: '8', wires:[['n2']] },
{ id: 'n2', type: 'helper' }];
helper.load(bitunloaderNode, flow, function () {
var n2 = helper.getNode('n2');
var n1 = helper.getNode('n1');
try {
n2.on('input', function (msg) {
msg.should.have.property('payload');
msg.payload.should.have.property('number');
msg.payload.number.should.be.an.Array();
msg.payload.number.should.have.length(8);
msg.payload.number[0].should.be.false;
msg.payload.number[1].should.be.true;
msg.payload.number[2].should.be.false;
msg.payload.number[3].should.be.false;
msg.payload.number[4].should.be.false;
msg.payload.number[5].should.be.false;
msg.payload.number[6].should.be.false;
msg.payload.number[7].should.be.false;
});
} catch (err) {
done(err);
}
n1.receive({ topic: 'unchanged', payload: {number: 2 } });
done();
});
});
});