mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Add drop mode to range node
and include tests
This commit is contained in:
		| @@ -10,6 +10,7 @@ | ||||
|             <option value="scale" data-i18n="range.scale.payload"></option> | ||||
|             <option value="clamp" data-i18n="range.scale.limit"></option> | ||||
|             <option value="roll" data-i18n="range.scale.wrap"></option> | ||||
|             <option value="drop" data-i18n="range.scale.drop"></option> | ||||
|         </select> | ||||
|     </div> | ||||
|     <br/> | ||||
|   | ||||
| @@ -32,11 +32,15 @@ module.exports = function(RED) { | ||||
|             if (value !== undefined) { | ||||
|                 var n = Number(value); | ||||
|                 if (!isNaN(n)) { | ||||
|                     if (node.action == "clamp") { | ||||
|                     if (node.action === "drop") { | ||||
|                         if (n < node.minin) { done(); return; } | ||||
|                         if (n > node.maxin) { done(); return; } | ||||
|                     } | ||||
|                     if (node.action === "clamp") { | ||||
|                         if (n < node.minin) { n = node.minin; } | ||||
|                         if (n > node.maxin) { n = node.maxin; } | ||||
|                     } | ||||
|                     if (node.action == "roll") { | ||||
|                     if (node.action === "roll") { | ||||
|                         var divisor = node.maxin - node.minin; | ||||
|                         n = ((n - node.minin) % divisor + divisor) % divisor + node.minin; | ||||
|                     } | ||||
|   | ||||
| @@ -34,11 +34,14 @@ | ||||
|     the range specified within the target range.</p> | ||||
|     <p><i>Scale and wrap within the target range</i> means that the result will | ||||
|     be wrapped within the target range.</p> | ||||
|     <p><i>Scale, but drop if outside input range</i> means that the result will | ||||
|     be scaled, but any inputs outside of the inout range will be dropped.</p> | ||||
|     <p>For example an input 0 - 10 mapped to 0 - 100.</p> | ||||
|     <table style="outline-width:#888 solid thin"> | ||||
|         <tr><th width="80px">mode</th><th width="80px">input</th><th width="80px">output</th></tr> | ||||
|         <tr><td><center>scale</center></td><td><center>12</center></td><td><center>120</center></td></tr> | ||||
|         <tr><td><center>limit</center></td><td><center>12</center></td><td><center>100</center></td></tr> | ||||
|         <tr><td><center>wrap</center></td><td><center>12</center></td><td><center>20</center></td></tr> | ||||
|         <tr><td><center>drop</center></td><td><center>12</center></td><td><center><i>(no output)</i></center></td></tr> | ||||
|     </table> | ||||
| </script> | ||||
|   | ||||
| @@ -813,7 +813,8 @@ | ||||
|         "scale": { | ||||
|             "payload": "Scale the message property", | ||||
|             "limit": "Scale and limit to the target range", | ||||
|             "wrap": "Scale and wrap within the target range" | ||||
|             "wrap": "Scale and wrap within the target range", | ||||
|             "drop": "Scale, but drop msg if outside input range" | ||||
|         }, | ||||
|         "tip": "Tip: This node ONLY works with numbers.", | ||||
|         "errors": { | ||||
|   | ||||
| @@ -106,6 +106,27 @@ describe('range Node', function() { | ||||
|         genericRangeTest("clamp", 0, 10, 0, 1000, false, -1, 0, done); | ||||
|     }); | ||||
|  | ||||
|     it('drops msg if in drop mode and input outside range', function(done) { | ||||
|         var flow = [{"id":"rangeNode1","type":"range","minin":2,"maxin":8,"minout":20,"maxout":80,"action":"drop","round":true,"name":"rangeNode","wires":[["helperNode1"]]}, | ||||
|                     {id:"helperNode1", type:"helper", wires:[]}]; | ||||
|         helper.load(rangeNode, flow, function() { | ||||
|             var rangeNode1 = helper.getNode("rangeNode1"); | ||||
|             var helperNode1 = helper.getNode("helperNode1"); | ||||
|             helperNode1.on("input", function(msg) { | ||||
|                 try { | ||||
|                     msg.should.have.property('payload'); | ||||
|                     msg.payload.should.equal(50); | ||||
|                     done(); | ||||
|                 } catch(err) { | ||||
|                     done(err); | ||||
|                 } | ||||
|             }); | ||||
|             rangeNode1.receive({payload:1}); | ||||
|             rangeNode1.receive({payload:9}); | ||||
|             rangeNode1.receive({payload:5}); | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
|     it('just passes on msg if payload not present', function(done) { | ||||
|         var flow = [{"id":"rangeNode1","type":"range","minin":0,"maxin":100,"minout":0,"maxout":100,"action":"scale","round":true,"name":"rangeNode","wires":[["helperNode1"]]}, | ||||
|                     {id:"helperNode1", type:"helper", wires:[]}]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user