diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 614c9ce1869..8f8bea84b5c 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -222,7 +222,7 @@ function plotPoints(sel, axes, trace, t) { maxJitterFactor = Math.max(jitterFactor, maxJitterFactor); } } - newJitter = trace.jitter * 2 / maxJitterFactor; + newJitter = trace.jitter * 2 / (maxJitterFactor || 1); } // fills in 'x' and 'y' in calcdata 'pts' item diff --git a/test/jasmine/tests/box_test.js b/test/jasmine/tests/box_test.js index 86afca3add6..a50e578ad1c 100644 --- a/test/jasmine/tests/box_test.js +++ b/test/jasmine/tests/box_test.js @@ -5,7 +5,7 @@ var Box = require('@src/traces/box'); var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); -var fail = require('../assets/fail_test'); +var failTest = require('../assets/fail_test'); var mouseEvent = require('../assets/mouse_event'); var customAssertions = require('../assets/custom_assertions'); @@ -313,7 +313,38 @@ describe('Test box hover:', function() { name: '' }].forEach(function(specs) { it('should generate correct hover labels ' + specs.desc, function(done) { - run(specs).catch(fail).then(done); + run(specs).catch(failTest).then(done); }); }); }); + +describe('Box edge cases', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + it('does not barf on a single outlier with jitter', function(done) { + var trace = { + boxpoints: 'outliers', + jitter: 0.7, + type: 'box', + y: [46.505, 0.143, 0.649, 0.059, 513, 90, 234] + }; + + Plotly.newPlot(gd, [trace]) + .then(function() { + var outliers = []; + gd.calcdata[0][0].pts.forEach(function(pt) { + if(pt.x !== undefined) outliers.push(pt); + }); + expect(outliers.length).toBe(1); + expect(outliers[0].x).toBe(0); + }) + .catch(failTest) + .then(done); + }); +});