@@ -880,4 +880,90 @@ describe('Plotly.react transitions:', function() {
880
880
. catch ( failTest )
881
881
. then ( done ) ;
882
882
} ) ;
883
+
884
+ it ( 'should preserve trace object-constancy (# of traces mismatch case)' , function ( done ) {
885
+ var data1 = [ {
886
+ uid : 1 ,
887
+ x : [ 5 , 6 , 7 ] ,
888
+ y : [ 5 , 6 , 7 ] ,
889
+ marker : { color : 'blue' , size : 10 }
890
+ } , {
891
+ uid : 2 ,
892
+ x : [ 1 , 2 , 3 ] ,
893
+ y : [ 1 , 2 , 3 ] ,
894
+ marker : { color : 'red' , size : 10 }
895
+ } ] ;
896
+
897
+ var data2 = [ {
898
+ uid : 1 ,
899
+ x : [ 1 , 2 , 3 ] ,
900
+ y : [ 1 , 2 , 3 ] ,
901
+ marker : { color : 'blue' , size : 10 }
902
+ } ] ;
903
+
904
+ var layout = {
905
+ xaxis : { range : [ - 1 , 8 ] } ,
906
+ yaxis : { range : [ - 1 , 8 ] } ,
907
+ showlegend : false ,
908
+ transition : { duration : 10 }
909
+ } ;
910
+
911
+ var traceNodes ;
912
+
913
+ function _assertTraceNodes ( msg , traceNodesOrdered , ptsXY ) {
914
+ var traceNodesNew = gd . querySelectorAll ( '.scatterlayer > .trace' ) ;
915
+ expect ( traceNodesNew . length ) . toBe ( traceNodesOrdered . length , 'same # of traces - ' + msg ) ;
916
+
917
+ for ( var i = 0 ; i < traceNodesNew . length ; i ++ ) {
918
+ var node = traceNodesOrdered [ i ] ;
919
+
920
+ expect ( traceNodesNew [ i ] ) . toBe ( node , 'same trace node ' + i + ' - ' + msg ) ;
921
+
922
+ var pt0 = node . querySelector ( '.points > path' ) ;
923
+ var pt0XY = Drawing . getTranslate ( pt0 ) ;
924
+ expect ( pt0XY . x ) . toBeCloseTo ( ptsXY [ i ] [ 0 ] , 1 , 'pt' + i + ' x - ' + msg ) ;
925
+ expect ( pt0XY . y ) . toBeCloseTo ( ptsXY [ i ] [ 1 ] , 1 , 'pt' + i + ' y - ' + msg ) ;
926
+ }
927
+ }
928
+
929
+ Plotly . react ( gd , data1 , layout )
930
+ . then ( function ( ) {
931
+ methods . push ( [ gd . _fullLayout . _basePlotModules [ 0 ] , 'plot' ] ) ;
932
+ methods . push ( [ gd . _fullLayout . _basePlotModules [ 0 ] , 'transitionAxes2' ] ) ;
933
+ addSpies ( ) ;
934
+
935
+ traceNodes = gd . querySelectorAll ( '.scatterlayer > .trace' ) ;
936
+ _assertTraceNodes ( 'base' , traceNodes , [ [ 360 , 90 ] , [ 120 , 210 ] ] ) ;
937
+ } )
938
+ . then ( function ( ) { return Plotly . react ( gd , data2 , layout ) ; } )
939
+ . then ( function ( ) {
940
+ var msg = 'transition into data2' ;
941
+ assertSpies ( msg , [
942
+ [ Plots , 'transition2' , 1 ] ,
943
+ [ Registry , 'call' , 1 ] ,
944
+ [ gd . _fullLayout . _basePlotModules [ 0 ] , 'plot' , 2 ] ,
945
+ [ gd . _fullLayout . _basePlotModules [ 0 ] , 'transitionAxes2' , 0 ]
946
+ ] ) ;
947
+
948
+ // N.B. traceNodes[1] is gone, but traceNodes[0] is the same
949
+ _assertTraceNodes ( msg , [ traceNodes [ 0 ] ] , [ [ 120 , 210 ] ] ) ;
950
+ } )
951
+ . then ( function ( ) { return Plotly . react ( gd , data1 , layout ) ; } )
952
+ . then ( function ( ) {
953
+ var msg = 'transition back to data1' ;
954
+ assertSpies ( msg , [
955
+ [ Plots , 'transition2' , 1 ] ,
956
+ [ Registry , 'call' , 1 ] ,
957
+ [ gd . _fullLayout . _basePlotModules [ 0 ] , 'plot' , 2 ] ,
958
+ [ gd . _fullLayout . _basePlotModules [ 0 ] , 'transitionAxes2' , 0 ]
959
+ ] ) ;
960
+
961
+ // N.B. we have a "new" traceNodes[1] here,
962
+ // the old one get removed from the DOM when transitioning into data2
963
+ var traceNodesNew = gd . querySelectorAll ( '.scatterlayer > .trace' ) ;
964
+ _assertTraceNodes ( msg , [ traceNodes [ 0 ] , traceNodesNew [ 1 ] ] , [ [ 360 , 90 ] , [ 120 , 210 ] ] ) ;
965
+ } )
966
+ . catch ( failTest )
967
+ . then ( done ) ;
968
+ } ) ;
883
969
} ) ;
0 commit comments