@@ -3,6 +3,7 @@ var Lib = require('@src/lib');
3
3
var Plots = Plotly . Plots ;
4
4
var plotApiHelpers = require ( '@src/plot_api/helpers' ) ;
5
5
var Registry = require ( '@src/registry' ) ;
6
+ var Drawing = require ( '@src/components/drawing' ) ;
6
7
7
8
var createGraphDiv = require ( '../assets/create_graph_div' ) ;
8
9
var destroyGraphDiv = require ( '../assets/destroy_graph_div' ) ;
@@ -795,4 +796,88 @@ describe('Plotly.react transitions:', function() {
795
796
. catch ( failTest )
796
797
. then ( done ) ;
797
798
} ) ;
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
+ } ) ;
798
883
} ) ;
0 commit comments