node-red-contrib-prib-functions
Version:
Node-RED added node functions.
113 lines (107 loc) • 4.09 kB
JavaScript
const assert=require('assert');
const should=require("should");
const dataAnalysis=require("../dataAnalysis/dataAnalysis.js");
const helper=require("node-red-node-test-helper");
helper.init(require.resolve('node-red'));
const helperNodeResults={id :"helperNodeResults", type : "helper"}
const helperNodeDetails={id :"helperNodeDetails", type : "helper"}
const helperNodeOutliers={id :"helperNodeOutliers", type : "helper"}
const base = {
id : "n1",
type:"Data Analysis",
// action: "avg",
// outputs: {value:(["realtime","realtimePredict"].includes(this.action)?3:2),required:true},
// outliersBase: "sum",
// outliersStdDevs: 3,
// term:10,
// keyProperty:"msg.topic",
dataProperty: "msg.payload",
// dataProperties: ["msg.payload[0]","msg.payload[1]"],
wires : [[helperNodeResults.id],[helperNodeDetails.id],[helperNodeOutliers.id]]
} ;
function getNode(node) {
const n=helper.getNode(node.id);
if(n) return n;
throw Error("node id: "+node.id+" not found, node: "+JSON.stringify(node))
} ;
function test(label,action,data,expected) {
it(label+" "+action, function(done) {
if(data.length==0) {
done("no data")
return
}
let errors=[];
const newBase=Object.assign({},base,{action:action});
const flow=[helperNodeResults,helperNodeDetails,helperNodeOutliers,newBase];
let count=data.length;
helper.load(dataAnalysis,flow, function() {
try{
const resultsNode=getNode(helperNodeResults);
const detailsNode=getNode(helperNodeDetails);
const outliersNode=getNode(helperNodeOutliers);
const n1=getNode(newBase);
n1.should.have.property("action", action);
resultsNode.on("input", function(msg) {
try{
if(msg.error) throw Error(msg.error);
assert.strictEqual(msg.result,expected[msg._i]);
} catch(ex) {
console.log(JSON.stringify({label:"**** error ",test:label,error:ex.message,count:count,action:action,msg:msg,expected:expected[msg._i]}))
errors.push(ex.message)
}
if(--count) return;
if(errors.length) done(errors)
else done();
});
detailsNode.on("input", function(msg) {
console.log(JSON.stringify({label:"***** details ",action:action,msg:msg}))
});
outliersNode.on("input", function(msg) {
console.log(JSON.stringify({label:"***** outliers ",action:action,msg:msg}))
});
data.forEach((e,i)=>{
n1.receive({payload:e,_i :i});
})
} catch(ex) {
console.log(ex.stack)
done(ex);
}
});
}).timeout(4000);
}
describe('Data Anaylsis', function() {
beforeEach(function(done) {
helper.startServer(done);
});
afterEach(function(done) {
helper.unload();
helper.stopServer(done);
});
const zeros=[undefined,[0],[0,0],[0,0,0]];
test("test zeros","sum",zeros,[undefined,0,0,0]);
test("test zeros","avg",zeros,[undefined,0,0,0]);
test("test zeros","max",zeros,[undefined,0,0,0]);
test("test zeros","min",zeros,[undefined,0,0,0]);
test("test zeros","stdDev",zeros,[undefined,0,0,0]);
const ones=[[1],[1,1],[1,1,1]];
test("test ones","sum",ones,[1,2,3]);
test("test ones","avg",ones,[1,1,1]);
test("test ones","max",ones,[1,1,1]);
test("test ones","min",ones,[1,1,1]);
test("test ones","stdDev",ones,[0,0,0]);
const minus=[[-1],[-1,1],[-1,1,-1]];
test("test minus","sum",minus,[-1,0,-1]);
test("test minus","avg",minus,[-1,0,-1/3]);
test("test minus","max",minus,[-1,1,1]);
test("test minus","min",minus,[-1,-1,-1]);
test("test minus","stdDev",minus,[0,1,0.9428090415820634]);
const twos=[[2],[2,2],[2,2,2],[2,2,2,2]];
test("test twos","sum",twos,[2,4,6,8]);
test("test twos","avg",twos,[2,2,2,2]);
test("test twos","stdDev",twos,[0,0,0,0]);
const c1234=[[1],[1,2],[1,2,3],[1,2,3,4]];
test("test c1234","sum",c1234,[1,3,6,10]);
test("test c1234","avg",c1234,[1,1.5,2,10/4]);
test("test c1234","stdDev",c1234,[0,0.5,0.8164965809277263,1.118033988749895]);
test("test c1234","sampleStdDev",c1234,[0,0.7071067811865476,1,1.2909944487358056]);
});