From 06bc83957c4c529ed89f6808d8bdf58235e7d0f5 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 24 Feb 2019 01:59:21 -0800 Subject: [PATCH] Ignore invalid log scale min and max (#6058) --- src/scales/scale.logarithmic.js | 13 ++++-- test/specs/scale.logarithmic.tests.js | 62 +++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/scales/scale.logarithmic.js b/src/scales/scale.logarithmic.js index e52f714a81f..06b206df27c 100644 --- a/src/scales/scale.logarithmic.js +++ b/src/scales/scale.logarithmic.js @@ -62,6 +62,11 @@ var defaultConfig = { } }; +// TODO(v3): change this to positiveOrDefault +function nonNegativeOrDefault(value, defaultValue) { + return helpers.isFinite(value) && value >= 0 ? value : defaultValue; +} + module.exports = Scale.extend({ determineDataLimits: function() { var me = this; @@ -174,8 +179,8 @@ module.exports = Scale.extend({ var DEFAULT_MIN = 1; var DEFAULT_MAX = 10; - me.min = valueOrDefault(tickOpts.min, me.min); - me.max = valueOrDefault(tickOpts.max, me.max); + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); if (me.min === me.max) { if (me.min !== 0 && me.min !== null) { @@ -211,8 +216,8 @@ module.exports = Scale.extend({ var reverse = !me.isHorizontal(); var generationOptions = { - min: tickOpts.min, - max: tickOpts.max + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) }; var ticks = me.ticks = generateTicks(generationOptions, me); diff --git a/test/specs/scale.logarithmic.tests.js b/test/specs/scale.logarithmic.tests.js index cb44f108d36..dd7c7cce94a 100644 --- a/test/specs/scale.logarithmic.tests.js +++ b/test/specs/scale.logarithmic.tests.js @@ -477,6 +477,68 @@ describe('Logarithmic Scale tests', function() { expect(yScale.ticks[tickCount - 1]).toBe(10); }); + it('should ignore negative min and max options', function() { + var chart = window.acquireChart({ + type: 'bar', + data: { + datasets: [{ + data: [1, 1, 1, 2, 1, 0] + }], + labels: [] + }, + options: { + scales: { + yAxes: [{ + id: 'yScale', + type: 'logarithmic', + ticks: { + min: -10, + max: -1010, + callback: function(value) { + return value; + } + } + }] + } + } + }); + + var yScale = chart.scales.yScale; + expect(yScale.min).toBe(0); + expect(yScale.max).toBe(2); + }); + + it('should ignore invalid min and max options', function() { + var chart = window.acquireChart({ + type: 'bar', + data: { + datasets: [{ + data: [1, 1, 1, 2, 1, 0] + }], + labels: [] + }, + options: { + scales: { + yAxes: [{ + id: 'yScale', + type: 'logarithmic', + ticks: { + min: '', + max: false, + callback: function(value) { + return value; + } + } + }] + } + } + }); + + var yScale = chart.scales.yScale; + expect(yScale.min).toBe(0); + expect(yScale.max).toBe(2); + }); + it('should generate tick marks', function() { var chart = window.acquireChart({ type: 'bar',