Skip to content

Commit 73284f4

Browse files
committed
add test for trace object-constancy out-of-order case
- making uid anim:true and allowing uid to be numbers was enough to fix this case.
1 parent 61ee4e9 commit 73284f4

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

test/jasmine/tests/transition_test.js

+85
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var Lib = require('@src/lib');
33
var Plots = Plotly.Plots;
44
var plotApiHelpers = require('@src/plot_api/helpers');
55
var Registry = require('@src/registry');
6+
var Drawing = require('@src/components/drawing');
67

78
var createGraphDiv = require('../assets/create_graph_div');
89
var destroyGraphDiv = require('../assets/destroy_graph_div');
@@ -795,4 +796,88 @@ describe('Plotly.react transitions:', function() {
795796
.catch(failTest)
796797
.then(done);
797798
});
799+
800+
it('should preserve trace object-constancy (out-of-order case)', function(done) {
801+
var data1 = [{
802+
uid: 1,
803+
x: [5, 6, 7],
804+
y: [5, 6, 7],
805+
marker: {color: 'blue', size: 10}
806+
}, {
807+
uid: 2,
808+
x: [1, 2, 3],
809+
y: [1, 2, 3],
810+
marker: {color: 'red', size: 10}
811+
}];
812+
813+
var data2 = [{
814+
uid: 2,
815+
x: [5, 6, 7],
816+
y: [5, 6, 7],
817+
marker: {color: 'yellow', size: 10}
818+
}, {
819+
uid: 1,
820+
x: [1, 2, 3],
821+
y: [1, 2, 3],
822+
marker: {color: 'green', size: 10}
823+
}];
824+
825+
var layout = {
826+
xaxis: {range: [-1, 8]},
827+
yaxis: {range: [-1, 8]},
828+
showlegend: false,
829+
transition: {duration: 10}
830+
};
831+
832+
var traceNodes;
833+
834+
function _assertTraceNodes(msg, traceNodesOrdered, ptsXY) {
835+
var traceNodesNew = gd.querySelectorAll('.scatterlayer > .trace');
836+
expect(traceNodesNew[0]).toBe(traceNodesOrdered[0], 'same trace node 0 - ' + msg);
837+
expect(traceNodesNew[1]).toBe(traceNodesOrdered[1], 'same trace node 1 - ' + msg);
838+
839+
var pt0 = traceNodes[0].querySelector('.points > path');
840+
var pt0XY = Drawing.getTranslate(pt0);
841+
expect(pt0XY.x).toBeCloseTo(ptsXY[0][0], 1, 'pt0 x - ' + msg);
842+
expect(pt0XY.y).toBeCloseTo(ptsXY[0][1], 1, 'pt0 y - ' + msg);
843+
844+
var pt1 = traceNodes[1].querySelector('.points > path');
845+
var pt1XY = Drawing.getTranslate(pt1);
846+
expect(pt1XY.x).toBeCloseTo(ptsXY[1][0], 1, 'pt1 x - ' + msg);
847+
expect(pt1XY.y).toBeCloseTo(ptsXY[1][1], 1, 'pt1 y - ' + msg);
848+
}
849+
850+
Plotly.react(gd, data1, layout)
851+
.then(function() {
852+
methods.push([gd._fullLayout._basePlotModules[0], 'plot']);
853+
methods.push([gd._fullLayout._basePlotModules[0], 'transitionAxes2']);
854+
addSpies();
855+
856+
traceNodes = gd.querySelectorAll('.scatterlayer > .trace');
857+
_assertTraceNodes('base', traceNodes, [[360, 90], [120, 210]]);
858+
})
859+
.then(function() { return Plotly.react(gd, data2, layout); })
860+
.then(function() {
861+
var msg = 'transition into data2';
862+
assertSpies(msg, [
863+
[Plots, 'transition2', 1],
864+
[gd._fullLayout._basePlotModules[0], 'plot', 1],
865+
[gd._fullLayout._basePlotModules[0], 'transitionAxes2', 0]
866+
]);
867+
// N.B. order is reversed, but the nodes are the *same*
868+
_assertTraceNodes(msg, [traceNodes[1], traceNodes[0]], [[120, 210], [360, 90]]);
869+
})
870+
.then(function() { return Plotly.react(gd, data1, layout); })
871+
.then(function() {
872+
var msg = 'transition back to data1';
873+
assertSpies(msg, [
874+
[Plots, 'transition2', 1],
875+
[gd._fullLayout._basePlotModules[0], 'plot', 1],
876+
[gd._fullLayout._basePlotModules[0], 'transitionAxes2', 0]
877+
]);
878+
_assertTraceNodes(msg, traceNodes, [[360, 90], [120, 210]]);
879+
})
880+
.catch(failTest)
881+
.then(done);
882+
});
798883
});

0 commit comments

Comments
 (0)