@@ -3,6 +3,7 @@ var Lib = require('@src/lib');
33var Plots = Plotly . Plots ;
44var plotApiHelpers = require ( '@src/plot_api/helpers' ) ;
55var Registry = require ( '@src/registry' ) ;
6+ var Drawing = require ( '@src/components/drawing' ) ;
67
78var createGraphDiv = require ( '../assets/create_graph_div' ) ;
89var 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