From 02ac70218390d85c2f72e1f409d8e9f8f47371bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Thu, 3 Oct 2019 15:23:31 -0400 Subject: [PATCH 1/2] fix #4232 - fill in `value` for generated sectors ... with the partialSum to compute the correct partition under `branchvalues: 'total'`. Remember, we "generate" sectors for "implied root" and "root of roots" scenarios. --- src/traces/sunburst/calc.js | 11 ++++++- test/jasmine/tests/sunburst_test.js | 50 ++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/traces/sunburst/calc.js b/src/traces/sunburst/calc.js index 703dbe8c79a..007215aaf38 100644 --- a/src/traces/sunburst/calc.js +++ b/src/traces/sunburst/calc.js @@ -106,6 +106,7 @@ exports.calc = function(gd, trace) { if(impliedRoots.length === 1) { k = impliedRoots[0]; cd.unshift({ + hasImpliedRoot: true, id: k, pid: '', label: k @@ -153,12 +154,20 @@ exports.calc = function(gd, trace) { break; case 'total': hierarchy.each(function(d) { - var v = d.data.data.v; + var cdi = d.data.data; + var v = cdi.v; if(d.children) { var partialSum = d.children.reduce(function(a, c) { return a + c.data.data.v; }, 0); + + // N.B. we must fill in `value` for generated sectors + // with the partialSum to compute the correct partition + if(cdi.hasImpliedRoot || cdi.hasMultipleRoots) { + v = partialSum; + } + if(v < partialSum) { failed = true; return Lib.warn([ diff --git a/test/jasmine/tests/sunburst_test.js b/test/jasmine/tests/sunburst_test.js index ed3524e6719..c27e6c93af4 100644 --- a/test/jasmine/tests/sunburst_test.js +++ b/test/jasmine/tests/sunburst_test.js @@ -185,7 +185,7 @@ describe('Test sunburst calc:', function() { function extractPt(k) { var out = gd.calcdata.map(function(cd) { return cd[0].hierarchy.descendants().map(function(pt) { - return pt[k]; + return Lib.nestedProperty(pt, k).get(); }); }); return out.length > 1 ? out : out[0]; @@ -317,6 +317,54 @@ describe('Test sunburst calc:', function() { expect(extract('id')).toEqual(['true', '1', '2', '3', '4', '5', '6', '7', '8']); expect(extract('pid')).toEqual(['', 'true', 'true', '2', '2', 'true', 'true', '6', 'true']); }); + + it('should compute correct sector *value* for generated implied root', function() { + _calc([{ + labels: [ 'A', 'B', 'b'], + parents: ['Root', 'Root', 'B'], + values: [1, 2, 1], + branchvalues: 'remainder' + }, { + labels: [ 'A', 'B', 'b'], + parents: ['Root', 'Root', 'B'], + values: [1, 2, 1], + branchvalues: 'total' + }]); + + expect(extractPt('data.data.id')).toEqual([ + ['Root', 'B', 'A', 'b'], + ['Root', 'B', 'A', 'b'] + ]); + expect(extractPt('value')).toEqual([ + [4, 3, 1, 1], + [3, 2, 1, 1] + ]); + }); + + it('should compute correct sector *value* for generated "root of roots"', function() { + spyOn(Lib, 'randstr').and.callFake(function() { return 'dummy'; }); + + _calc([{ + labels: [ 'A', 'B', 'b'], + parents: ['', '', 'B'], + values: [1, 2, 1], + branchvalues: 'remainder' + }, { + labels: [ 'A', 'B', 'b'], + parents: ['', '', 'B'], + values: [1, 2, 1], + branchvalues: 'total' + }]); + + expect(extractPt('data.data.id')).toEqual([ + ['dummy', 'B', 'A', 'b'], + ['dummy', 'B', 'A', 'b'] + ]); + expect(extractPt('value')).toEqual([ + [4, 3, 1, 1], + [3, 2, 1, 1] + ]); + }); }); describe('Test sunburst hover:', function() { From 3bb5ebeb23fd3cb8b71bfa8862ee41d7e04cf87e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Thu, 3 Oct 2019 15:32:54 -0400 Subject: [PATCH 2/2] comment-out machine-dependent treemap-text-transition assertion --- test/jasmine/tests/treemap_test.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/jasmine/tests/treemap_test.js b/test/jasmine/tests/treemap_test.js index bf1a8977bd2..a17266d14f1 100644 --- a/test/jasmine/tests/treemap_test.js +++ b/test/jasmine/tests/treemap_test.js @@ -1367,7 +1367,10 @@ describe('Test treemap tweening:', function() { 'M284.375,188.5L548.375,188.5L548.375,308.5L284.375,308.5Z' ); _assert('move B text to new position', 'transform', 'B', [220.25126, 0]); - _assert('enter b text to new position', 'transform', 'b', [286.16071428571433, 35714285714286]); + + // TODO this node gets cleared out of viewport to some + // machine-dependent position - skip for now + // _assert('enter b text to new position', 'transform', 'b', [286.16071428571433, 35714285714286]); }) .catch(failTest) .then(done);