From 5916a72397be745085dd1879fdd50209a3c55730 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 8 May 2019 16:23:12 -0400 Subject: [PATCH 1/3] display falsy zero number --- src/traces/pie/calc.js | 2 +- src/traces/pie/plot.js | 4 +- src/traces/sunburst/plot.js | 7 +- .../baselines/display-text_zero-number.png | Bin 0 -> 65280 bytes .../image/mocks/display-text_zero-number.json | 80 ++++++++++++++++++ 5 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 test/image/baselines/display-text_zero-number.png create mode 100644 test/image/mocks/display-text_zero-number.json diff --git a/src/traces/pie/calc.js b/src/traces/pie/calc.js index f918f51ba30..f992460a6b4 100644 --- a/src/traces/pie/calc.js +++ b/src/traces/pie/calc.js @@ -100,7 +100,7 @@ function calc(gd, trace) { thisText = hasLabel ? [pt.label] : []; if(hasText) { var texti = helpers.getFirstFilled(trace.text, pt.pts); - if(texti) thisText.push(texti); + if(texti || texti === 0) thisText.push(texti); } if(hasValue) thisText.push(helpers.formatPieValue(pt.v, separators)); if(hasPercent) thisText.push(helpers.formatPiePercent(pt.v / vTotal, separators)); diff --git a/src/traces/pie/plot.js b/src/traces/pie/plot.js index d940a5ecfb6..7803e82fc48 100644 --- a/src/traces/pie/plot.js +++ b/src/traces/pie/plot.js @@ -352,8 +352,8 @@ function attachFxHandlers(sliceTop, gd, cd) { if(hoverinfo && hoverinfo.indexOf('label') !== -1) thisText.push(pt.label); pt.text = helpers.castOption(trace2.hovertext || trace2.text, pt.pts); if(hoverinfo && hoverinfo.indexOf('text') !== -1) { - var texti = pt.text; - if(texti) thisText.push(texti); + var tx = pt.text; + if(tx || tx === 0) thisText.push(tx); } pt.value = pt.v; pt.valueLabel = helpers.formatPieValue(pt.v, separators); diff --git a/src/traces/sunburst/plot.js b/src/traces/sunburst/plot.js index 67742e89fc8..a06018daec2 100644 --- a/src/traces/sunburst/plot.js +++ b/src/traces/sunburst/plot.js @@ -578,7 +578,10 @@ function attachFxHandlers(sliceTop, gd, cd) { } hoverPt.text = _cast('hovertext') || _cast('text'); - if(hasFlag('text') && hoverPt.text) thisText.push(hoverPt.text); + if(hasFlag('text')) { + var tx = hoverPt.text; + if(tx || tx === 0) thisText.push(tx); + } Fx.loneHover({ trace: traceNow, @@ -736,7 +739,7 @@ function formatSliceLabel(pt, trace, fullLayout) { if(hasFlag('text')) { var tx = Lib.castOption(trace, cdi.i, 'text'); - if(tx) thisText.push(tx); + if(tx || tx === 0) thisText.push(tx); } return thisText.join('
'); diff --git a/test/image/baselines/display-text_zero-number.png b/test/image/baselines/display-text_zero-number.png new file mode 100644 index 0000000000000000000000000000000000000000..07fd3647934fb820ba304a5bc97c825063e91e5d GIT binary patch literal 65280 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

-T$fM#BT+&GpLpJ)KPd|grMw1p$ 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

D0^Kihtg%f4ZXlpHIyvKD`rk~zSDlIWK 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 O=ZunuVvhVJum1vYsX*8O literal 0 HcmV?d00001 diff --git a/test/image/mocks/display-text_zero-number.json b/test/image/mocks/display-text_zero-number.json new file mode 100644 index 00000000000..ebd75c52348 --- /dev/null +++ b/test/image/mocks/display-text_zero-number.json @@ -0,0 +1,80 @@ +{ + "data": [ + { + "name": "pie", + "type": "pie", + "labels": ["A", "B", "C", "D", "E", "F", "G"], + "values": [7, 6, 5, 4, 3, 2, 1], + "text": [null, "", "0", 0, 1, true, false], + "textinfo": "label+text+value", + "domain": { + "x": [0, 0.48], + "y": [0.52, 1] + } + }, + { + "name": "sunburst", + "type": "sunburst", + "parents": ["", "A", "B", "C", "D", "E", "F"], + "labels": ["A", "B", "C", "D", "E", "F", "G"], + "values": [7, 6, 5, 4, 3, 2, 1], + "text": [null, "", "0", 0, 1, true, false], + "textinfo": "label+text+value", + "domain": { + "x": [0.52, 1], + "y": [0, 0.48] + } + }, + { + "name": "funnel", + "type": "funnel", + "y": ["A", "B", "C", "D", "E", "F", "G"], + "x": [7, 6, 5, 4, 3, 2, 1], + "text": [null, "", "0", 0, 1, true, false], + "textinfo": "label+text+value" + }, + { + "name": "waterfall", + "type": "waterfall", + "x": ["A", "B", "C", "D", "E", "F", "G"], + "y": [5, -4, 3, -2, 1, null, 3.14], + "measure": ["r", "r", "r", "r", "r", "t", "a"], + "text": [null, "", "0", 0, 1, true, false], + "textinfo": "label+text+final", + "textposition": "auto", + "xaxis": "x2", + "yaxis": "y2" + } + ], + "layout": { + "width": 800, + "height": 800, + "dragmode": "pan", + "xaxis": { + "domain": [ + 0, + 0.48 + ] + }, + "xaxis2": { + "anchor": "y2", + "domain": [ + 0.52, + 1 + ] + }, + "yaxis": { + "domain": [ + 0, + 0.48 + ] + }, + "yaxis2": { + "anchor": "x2", + "domain": [ + 0.52, + 1 + ] + } + } +} From d66c99622f7f3ff65ff92873544bbf72b988baf7 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 8 May 2019 17:17:29 -0400 Subject: [PATCH 2/3] move fillHoverText to lib and rename it to fillText - export isValidTextValue too - also rm unused gl3d camera file --- src/lib/index.js | 31 ++++++++++++++++++++ src/plots/gl3d/camera.js | 7 ----- src/traces/bar/hover.js | 5 ++-- src/traces/barpolar/hover.js | 4 +-- src/traces/box/hover.js | 4 +-- src/traces/choropleth/hover.js | 4 +-- src/traces/ohlc/hover.js | 4 +-- src/traces/scatter/fill_hover_text.js | 41 --------------------------- src/traces/scatter/hover.js | 4 +-- src/traces/scattercarpet/hover.js | 4 +-- src/traces/scattergeo/hover.js | 4 +-- src/traces/scattergl/index.js | 4 +-- src/traces/scattermapbox/hover.js | 4 +-- 13 files changed, 52 insertions(+), 68 deletions(-) delete mode 100644 src/plots/gl3d/camera.js delete mode 100644 src/traces/scatter/fill_hover_text.js diff --git a/src/lib/index.js b/src/lib/index.js index 7a650690a02..ed572a0cdcc 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -1127,3 +1127,34 @@ lib.pseudoRandom = function() { if(Math.abs(randSeed - lastVal) < 429496729) return lib.pseudoRandom(); return randSeed / 4294967296; }; + + +/** Fill hover 'pointData' container with 'correct' hover text value + * + * - If trace hoverinfo contains a 'text' flag and hovertext is not set, + * the text elements will be seen in the hover labels. + * + * - If trace hoverinfo contains a 'text' flag and hovertext is set, + * hovertext takes precedence over text + * i.e. the hoverinfo elements will be seen in the hover labels + * + * @param {object} calcPt + * @param {object} trace + * @param {object || array} contOut (mutated here) + */ +lib.fillText = function(calcPt, trace, contOut) { + var fill = Array.isArray(contOut) ? + function(v) { contOut.push(v); } : + function(v) { contOut.text = v; }; + + var htx = lib.extractOption(calcPt, trace, 'htx', 'hovertext'); + if(lib.isValidTextValue(htx)) return fill(htx); + + var tx = lib.extractOption(calcPt, trace, 'tx', 'text'); + if(lib.isValidTextValue(tx)) return fill(tx); +}; + +// accept all truthy values and 0 (which gets cast to '0' in the hover labels) +lib.isValidTextValue = function(v) { + return v || v === 0; +}; diff --git a/src/plots/gl3d/camera.js b/src/plots/gl3d/camera.js deleted file mode 100644 index 13fdcaccb33..00000000000 --- a/src/plots/gl3d/camera.js +++ /dev/null @@ -1,7 +0,0 @@ -/** -* Copyright 2012-2019, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ diff --git a/src/traces/bar/hover.js b/src/traces/bar/hover.js index c6dbce18c78..68d5fb818d7 100644 --- a/src/traces/bar/hover.js +++ b/src/traces/bar/hover.js @@ -12,7 +12,8 @@ var Fx = require('../../components/fx'); var Registry = require('../../registry'); var Color = require('../../components/color'); -var fillHoverText = require('../scatter/fill_hover_text'); + +var fillText = require('../../lib').fillText; function hoverPoints(pointData, xval, yval, hovermode) { var barPointData = hoverOnBars(pointData, xval, yval, hovermode); @@ -155,7 +156,7 @@ function hoverOnBars(pointData, xval, yval, hovermode) { // in case of bars shifted within groups pointData[posLetter + 'Spike'] = pa.c2p(di.p, true); - fillHoverText(di, trace, pointData); + fillText(di, trace, pointData); pointData.hovertemplate = trace.hovertemplate; return pointData; diff --git a/src/traces/barpolar/hover.js b/src/traces/barpolar/hover.js index 2719f16725e..369c29ffa0c 100644 --- a/src/traces/barpolar/hover.js +++ b/src/traces/barpolar/hover.js @@ -11,7 +11,7 @@ var Fx = require('../../components/fx'); var Lib = require('../../lib'); var getTraceColor = require('../bar/hover').getTraceColor; -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = Lib.fillText; var makeHoverPointText = require('../scatterpolar/hover').makeHoverPointText; var isPtInsidePolygon = require('../../plots/polar/helpers').isPtInsidePolygon; @@ -59,7 +59,7 @@ module.exports = function hoverPoints(pointData, xval, yval) { pointData.y0 = pointData.y1 = cdi.ct[1]; var _cdi = Lib.extendFlat({}, cdi, {r: cdi.s, theta: cdi.p}); - fillHoverText(cdi, trace, pointData); + fillText(cdi, trace, pointData); makeHoverPointText(_cdi, trace, subplot, pointData); pointData.hovertemplate = trace.hovertemplate; pointData.color = getTraceColor(trace, cdi); diff --git a/src/traces/box/hover.js b/src/traces/box/hover.js index f5dd7f3e722..0d47ca02855 100644 --- a/src/traces/box/hover.js +++ b/src/traces/box/hover.js @@ -12,7 +12,7 @@ var Axes = require('../../plots/cartesian/axes'); var Lib = require('../../lib'); var Fx = require('../../components/fx'); var Color = require('../../components/color'); -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = Lib.fillText; function hoverPoints(pointData, xval, yval, hovermode) { var cd = pointData.cd; @@ -270,7 +270,7 @@ function hoverOnPoints(pointData, xval, yval) { var pLetter = pa._id.charAt(0); closePtData[pLetter + 'Spike'] = pa.c2p(di.pos, true); - fillHoverText(pt, trace, closePtData); + fillText(pt, trace, closePtData); return closePtData; } diff --git a/src/traces/choropleth/hover.js b/src/traces/choropleth/hover.js index 70211333f51..1071adbcecb 100644 --- a/src/traces/choropleth/hover.js +++ b/src/traces/choropleth/hover.js @@ -11,7 +11,7 @@ var Axes = require('../../plots/cartesian/axes'); var attributes = require('./attributes'); -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = require('../../lib').fillText; module.exports = function hoverPoints(pointData, xval, yval) { var cd = pointData.cd; @@ -86,7 +86,7 @@ function makeHoverInfo(pointData, trace, pt, axis) { if(hasZ) text.push(formatter(pt.z)); if(hasText) { - fillHoverText(pt, trace, text); + fillText(pt, trace, text); } pointData.extraText = text.join('
'); diff --git a/src/traces/ohlc/hover.js b/src/traces/ohlc/hover.js index 58e67165e6a..8243cacc6a8 100644 --- a/src/traces/ohlc/hover.js +++ b/src/traces/ohlc/hover.js @@ -12,7 +12,7 @@ var Axes = require('../../plots/cartesian/axes'); var Lib = require('../../lib'); var Fx = require('../../components/fx'); var Color = require('../../components/color'); -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = require('../../lib').fillText; var DIRSYMBOL = { increasing: '▲', @@ -184,7 +184,7 @@ function hoverOnPoints(pointData, xval, yval, hovermode) { getLabelLine('low'), getLabelLine('close') + ' ' + DIRSYMBOL[dir] ] : []; - if(hasText) fillHoverText(di, trace, textParts); + if(hasText) fillText(di, trace, textParts); // don't make .yLabelVal or .text, since we're managing hoverinfo // put it all in .extraText diff --git a/src/traces/scatter/fill_hover_text.js b/src/traces/scatter/fill_hover_text.js deleted file mode 100644 index ca925844e8e..00000000000 --- a/src/traces/scatter/fill_hover_text.js +++ /dev/null @@ -1,41 +0,0 @@ -/** -* Copyright 2012-2019, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ - -'use strict'; - -var Lib = require('../../lib'); - -/** Fill hover 'pointData' container with 'correct' hover text value - * - * - If trace hoverinfo contains a 'text' flag and hovertext is not set, - * the text elements will be seen in the hover labels. - * - * - If trace hoverinfo contains a 'text' flag and hovertext is set, - * hovertext takes precedence over text - * i.e. the hoverinfo elements will be seen in the hover labels - * - * @param {object} calcPt - * @param {object} trace - * @param {object || array} contOut (mutated here) - */ -module.exports = function fillHoverText(calcPt, trace, contOut) { - var fill = Array.isArray(contOut) ? - function(v) { contOut.push(v); } : - function(v) { contOut.text = v; }; - - var htx = Lib.extractOption(calcPt, trace, 'htx', 'hovertext'); - if(isValid(htx)) return fill(htx); - - var tx = Lib.extractOption(calcPt, trace, 'tx', 'text'); - if(isValid(tx)) return fill(tx); -}; - -// accept all truthy values and 0 (which gets cast to '0' in the hover labels) -function isValid(v) { - return v || v === 0; -} diff --git a/src/traces/scatter/hover.js b/src/traces/scatter/hover.js index f75f5308552..a56193059d6 100644 --- a/src/traces/scatter/hover.js +++ b/src/traces/scatter/hover.js @@ -13,7 +13,7 @@ var Fx = require('../../components/fx'); var Registry = require('../../registry'); var getTraceColor = require('./get_trace_color'); var Color = require('../../components/color'); -var fillHoverText = require('./fill_hover_text'); +var fillText = Lib.fillText; module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var cd = pointData.cd; @@ -96,7 +96,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { hovertemplate: trace.hovertemplate }); - fillHoverText(di, trace, pointData); + fillText(di, trace, pointData); Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, pointData); return [pointData]; diff --git a/src/traces/scattercarpet/hover.js b/src/traces/scattercarpet/hover.js index 3f71bd0fbaf..74de3b8c581 100644 --- a/src/traces/scattercarpet/hover.js +++ b/src/traces/scattercarpet/hover.js @@ -9,7 +9,7 @@ 'use strict'; var scatterHover = require('../scatter/hover'); -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = require('../../lib').fillText; module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var scatterPointData = scatterHover(pointData, xval, yval, hovermode); @@ -84,7 +84,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { text.push('y: ' + newPointData.yLabel); if(parts.indexOf('text') !== -1) { - fillHoverText(cdi, trace, text); + fillText(cdi, trace, text); } newPointData.extraText = text.join('
'); diff --git a/src/traces/scattergeo/hover.js b/src/traces/scattergeo/hover.js index 5aa9ed50c4b..37569731fe1 100644 --- a/src/traces/scattergeo/hover.js +++ b/src/traces/scattergeo/hover.js @@ -14,7 +14,7 @@ var Axes = require('../../plots/cartesian/axes'); var BADNUM = require('../../constants/numerical').BADNUM; var getTraceColor = require('../scatter/get_trace_color'); -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = require('../../lib').fillText; var attributes = require('./attributes'); module.exports = function hoverPoints(pointData, xval, yval) { @@ -103,7 +103,7 @@ function getExtraText(trace, pt, axis, labels) { } if(hasText) { - fillHoverText(pt, trace, text); + fillText(pt, trace, text); } return text.join('
'); diff --git a/src/traces/scattergl/index.js b/src/traces/scattergl/index.js index c6ea11ee6d4..3a655fdb22f 100644 --- a/src/traces/scattergl/index.js +++ b/src/traces/scattergl/index.js @@ -29,7 +29,7 @@ var setFirstScatter = scatterCalc.setFirstScatter; var calcColorscale = require('../scatter/colorscale_calc'); var linkTraces = require('../scatter/link_traces'); var getTraceColor = require('../scatter/get_trace_color'); -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = Lib.fillText; var convert = require('./convert'); var BADNUM = require('../../constants/numerical').BADNUM; @@ -853,7 +853,7 @@ function calcHover(pointData, x, y, trace) { else if(di.tx) pointData.text = di.tx; else if(trace.text) pointData.text = trace.text; - fillHoverText(di, trace, pointData); + fillText(di, trace, pointData); Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, pointData); return pointData; diff --git a/src/traces/scattermapbox/hover.js b/src/traces/scattermapbox/hover.js index b1134016b9a..9dbe52f9775 100644 --- a/src/traces/scattermapbox/hover.js +++ b/src/traces/scattermapbox/hover.js @@ -12,7 +12,7 @@ var Fx = require('../../components/fx'); var Lib = require('../../lib'); var getTraceColor = require('../scatter/get_trace_color'); -var fillHoverText = require('../scatter/fill_hover_text'); +var fillText = Lib.fillText; var BADNUM = require('../../constants/numerical').BADNUM; module.exports = function hoverPoints(pointData, xval, yval) { @@ -99,7 +99,7 @@ function getExtraText(trace, di, labels) { } if(isAll || parts.indexOf('text') !== -1) { - fillHoverText(di, trace, text); + fillText(di, trace, text); } return text.join('
'); From 92ffc2b380e8a6dbd164c1b40a40b17dcfb3bf6a Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 8 May 2019 17:44:34 -0400 Subject: [PATCH 3/3] reuse lib function and add jasmine test for pie and sunburst hover falsy zero text --- src/traces/pie/calc.js | 5 +++-- src/traces/pie/plot.js | 2 +- src/traces/sunburst/plot.js | 4 ++-- test/jasmine/tests/pie_test.js | 26 ++++++++++++++++++++++++++ test/jasmine/tests/sunburst_test.js | 22 ++++++++++++++++++++++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/traces/pie/calc.js b/src/traces/pie/calc.js index f992460a6b4..03d7fa81ae3 100644 --- a/src/traces/pie/calc.js +++ b/src/traces/pie/calc.js @@ -14,6 +14,7 @@ var tinycolor = require('tinycolor2'); var Color = require('../../components/color'); var helpers = require('./helpers'); +var isValidTextValue = require('../../lib').isValidTextValue; var pieExtendedColorWays = {}; @@ -99,8 +100,8 @@ function calc(gd, trace) { pt = cd[i]; thisText = hasLabel ? [pt.label] : []; if(hasText) { - var texti = helpers.getFirstFilled(trace.text, pt.pts); - if(texti || texti === 0) thisText.push(texti); + var tx = helpers.getFirstFilled(trace.text, pt.pts); + if(isValidTextValue(tx)) thisText.push(tx); } if(hasValue) thisText.push(helpers.formatPieValue(pt.v, separators)); if(hasPercent) thisText.push(helpers.formatPiePercent(pt.v / vTotal, separators)); diff --git a/src/traces/pie/plot.js b/src/traces/pie/plot.js index 7803e82fc48..71167677eee 100644 --- a/src/traces/pie/plot.js +++ b/src/traces/pie/plot.js @@ -353,7 +353,7 @@ function attachFxHandlers(sliceTop, gd, cd) { pt.text = helpers.castOption(trace2.hovertext || trace2.text, pt.pts); if(hoverinfo && hoverinfo.indexOf('text') !== -1) { var tx = pt.text; - if(tx || tx === 0) thisText.push(tx); + if(Lib.isValidTextValue(tx)) thisText.push(tx); } pt.value = pt.v; pt.valueLabel = helpers.formatPieValue(pt.v, separators); diff --git a/src/traces/sunburst/plot.js b/src/traces/sunburst/plot.js index a06018daec2..e0792ce1aad 100644 --- a/src/traces/sunburst/plot.js +++ b/src/traces/sunburst/plot.js @@ -580,7 +580,7 @@ function attachFxHandlers(sliceTop, gd, cd) { hoverPt.text = _cast('hovertext') || _cast('text'); if(hasFlag('text')) { var tx = hoverPt.text; - if(tx || tx === 0) thisText.push(tx); + if(Lib.isValidTextValue(tx)) thisText.push(tx); } Fx.loneHover({ @@ -739,7 +739,7 @@ function formatSliceLabel(pt, trace, fullLayout) { if(hasFlag('text')) { var tx = Lib.castOption(trace, cdi.i, 'text'); - if(tx || tx === 0) thisText.push(tx); + if(Lib.isValidTextValue(tx)) thisText.push(tx); } return thisText.join('
'); diff --git a/test/jasmine/tests/pie_test.js b/test/jasmine/tests/pie_test.js index 858bf1e51ff..7274a07de1f 100644 --- a/test/jasmine/tests/pie_test.js +++ b/test/jasmine/tests/pie_test.js @@ -998,6 +998,11 @@ describe('pie hovering', function() { Lib.clearThrottle(); } + function _hover2() { + mouseEvent('mouseover', 200, 250); + Lib.clearThrottle(); + } + function assertLabel(content, style, msg) { assertHoverLabelContent({nums: content}, msg); @@ -1103,6 +1108,27 @@ describe('pie hovering', function() { .then(done); }); + it('should show falsy zero text', function(done) { + Plotly.plot(gd, { + data: [{ + type: 'pie', + labels: ['A', 'B', 'C', 'D', 'E', 'F', 'G'], + values: [7, 6, 5, 4, 3, 2, 1], + text: [null, '', '0', 0, 1, true, false], + textinfo: 'label+text+value' + }], + layout: { + width: 400, + height: 400 + } + }) + .then(_hover2) + .then(function() { + assertLabel('D\n0\n4\n14.3%'); + }) + .then(done); + }); + it('should use hovertemplate if specified', function(done) { mockCopy.data[0].name = ''; Plotly.plot(gd, mockCopy.data, mockCopy.layout) diff --git a/test/jasmine/tests/sunburst_test.js b/test/jasmine/tests/sunburst_test.js index 26f7c7e9a5e..bc5d423572b 100644 --- a/test/jasmine/tests/sunburst_test.js +++ b/test/jasmine/tests/sunburst_test.js @@ -1138,4 +1138,26 @@ describe('Test sunburst interactions edge cases', function() { .catch(failTest) .then(done); }); + + it('should show falsy zero text', function(done) { + Plotly.plot(gd, { + data: [{ + type: 'sunburst', + parents: ['', 'A', 'B', 'C', 'D', 'E', 'F'], + labels: ['A', 'B', 'C', 'D', 'E', 'F', 'G'], + values: [7, 6, 5, 4, 3, 2, 1], + text: [null, '', '0', 0, 1, true, false], + textinfo: 'label+text+value' + }], + layout: { + width: 400, + height: 400 + } + }) + .then(hover(gd, 4)) + .then(function() { + assertHoverLabelContent({ nums: 'D\n4\n0' }); + }) + .then(done); + }); });