@@ -8,6 +8,7 @@ var mock = require('@mocks/sankey_energy.json');
88var mockDark = require ( '@mocks/sankey_energy_dark.json' ) ;
99var mockCircular = require ( '@mocks/sankey_circular.json' ) ;
1010var mockCircularLarge = require ( '@mocks/sankey_circular_large.json' ) ;
11+ var mockXY = require ( '@mocks/sankey_x_y.json' ) ;
1112var Sankey = require ( '@src/traces/sankey' ) ;
1213
1314var createGraphDiv = require ( '../assets/create_graph_div' ) ;
@@ -20,6 +21,7 @@ var supplyAllDefaults = require('../assets/supply_defaults');
2021var defaultColors = require ( '@src/components/color/attributes' ) . defaults ;
2122
2223var drag = require ( '../assets/drag' ) ;
24+ var checkOverlap = require ( '../assets/check_overlap' ) ;
2325
2426describe ( 'sankey tests' , function ( ) {
2527
@@ -510,6 +512,32 @@ describe('sankey tests', function() {
510512 } ) ;
511513 } ) ;
512514
515+ it ( 'prevents nodes from overlapping in snap arrangement' , function ( done ) {
516+ function checkElementOverlap ( i , j ) {
517+ var base = document . querySelector ( '.sankey-node:nth-of-type(' + i + ')' ) ;
518+ base = base . querySelector ( '.node-rect' ) ;
519+ var compare = document . querySelector ( '.sankey-node:nth-of-type(' + j + ')' ) ;
520+ compare = compare . querySelector ( '.node-rect' ) ;
521+ return checkOverlap ( base , compare ) ;
522+ }
523+
524+ var mockCopy = Lib . extendDeep ( { } , mockXY ) ;
525+
526+ Plotly . plot ( gd , mockCopy )
527+ . then ( function ( ) {
528+ // Nodes overlap
529+ expect ( checkElementOverlap ( 3 , 6 ) ) . toBeTruthy ( 'nodes do not overlap' ) ;
530+
531+ mockCopy . data [ 0 ] . arrangement = 'snap' ;
532+ return Plotly . newPlot ( gd , mockCopy ) ;
533+ } )
534+ . then ( function ( ) {
535+ // Nodes do not overlap in snap
536+ expect ( checkElementOverlap ( 3 , 6 ) ) . not . toBeTruthy ( 'nodes overlap' ) ;
537+ } )
538+ . catch ( failTest )
539+ . then ( done ) ;
540+ } ) ;
513541 } ) ;
514542
515543 describe ( 'Test hover/click interactions:' , function ( ) {
@@ -1039,7 +1067,7 @@ describe('sankey tests', function() {
10391067 nodes = document . getElementsByClassName ( 'sankey-node' ) ;
10401068 node = nodes . item ( nodeId ) ;
10411069 position = getNodeCoords ( node ) ;
1042- var timeDelay = ( arrangement === 'snap' ) ? 1000 : 0 ; // Wait for force simulation to finish
1070+ var timeDelay = ( arrangement === 'snap' ) ? 2000 : 0 ; // Wait for force simulation to finish
10431071 return drag ( node , move [ 0 ] , move [ 1 ] , false , false , false , 10 , false , timeDelay ) ;
10441072 } )
10451073 . then ( function ( ) {
@@ -1075,11 +1103,12 @@ describe('sankey tests', function() {
10751103
10761104 it ( 'should persist the position of every nodes after drag in attributes nodes.(x|y)' , function ( done ) {
10771105 mockCopy . data [ 0 ] . arrangement = arrangement ;
1078- var move = [ 50 , 50 ] ;
1106+ var move = [ 50 , - 50 ] ;
10791107 var nodes ;
10801108 var node ;
10811109 var x , x1 ;
10821110 var y , y1 ;
1111+ var precision = 3 ;
10831112
10841113 Plotly . newPlot ( gd , mockCopy )
10851114 . then ( function ( ) {
@@ -1106,13 +1135,13 @@ describe('sankey tests', function() {
11061135 x1 = gd . _fullData [ 0 ] . node . x . slice ( ) ;
11071136 y1 = gd . _fullData [ 0 ] . node . y . slice ( ) ;
11081137 if ( arrangement === 'freeform' ) expect ( x1 [ nodeId ] ) . not . toBeCloseTo ( x [ nodeId ] , 2 , 'node ' + nodeId + ' has not changed x position' ) ;
1109- expect ( y1 [ nodeId ] ) . not . toBeCloseTo ( y [ nodeId ] , 2 , 'node ' + nodeId + ' has not changed y position' ) ;
1138+ expect ( y1 [ nodeId ] ) . not . toBeCloseTo ( y [ nodeId ] , precision , 'node ' + nodeId + ' has not changed y position' ) ;
11101139
11111140 // All nodes should have same x, y values after drag
11121141 for ( var i = 0 ; i < x . length ; i ++ ) {
11131142 if ( i === nodeId ) continue ; // except the one was just dragged
1114- if ( arrangement === 'freeform' ) expect ( x [ i ] ) . toBeCloseTo ( x [ i ] , 3 , 'node ' + i + ' has changed x position' ) ;
1115- expect ( y [ i ] ) . toBeCloseTo ( y [ i ] , 3 , 'node ' + i + ' has changed y position' ) ;
1143+ if ( arrangement === 'freeform' ) expect ( x1 [ i ] ) . toBeCloseTo ( x [ i ] , 3 , 'node ' + i + ' has changed x position' ) ;
1144+ expect ( y1 [ i ] ) . toBeCloseTo ( y [ i ] , precision , 'node ' + i + ' has changed y position' ) ;
11161145 }
11171146 return true ;
11181147 } )
@@ -1121,8 +1150,8 @@ describe('sankey tests', function() {
11211150 } ) ;
11221151 } ) ;
11231152 } ) ;
1124-
11251153 } ) ;
1154+
11261155 it ( 'emits a warning if node.pad is too large' , function ( done ) {
11271156 var gd = createGraphDiv ( ) ;
11281157 var mockCopy = Lib . extendDeep ( { } , mock ) ;
0 commit comments