@@ -10,6 +10,8 @@ var fail = require('../assets/fail_test');
1010var mouseEvent = require ( '../assets/mouse_event' ) ;
1111var click = require ( '../assets/click' ) ;
1212var doubleClick = require ( '../assets/double_click' ) ;
13+ var drag = require ( '../assets/drag' ) ;
14+ var delay = require ( '../assets/delay' ) ;
1315
1416describe ( 'Test legacy polar plots logs:' , function ( ) {
1517 var gd ;
@@ -177,14 +179,14 @@ describe('Test relayout on polar subplots:', function() {
177179 var dflt = constants . layerNames ;
178180
179181 function _assert ( expected ) {
180- var actual = d3 . selectAll ( 'g.polar > .polarlayer ' ) ;
182+ var actual = d3 . selectAll ( 'g.polar > .polarsublayer ' ) ;
181183
182184 expect ( actual . size ( ) ) . toBe ( expected . length , '# of layer' ) ;
183185
184186 actual . each ( function ( d , i ) {
185187 var className = d3 . select ( this )
186188 . attr ( 'class' )
187- . split ( 'polarlayer ' ) [ 1 ] ;
189+ . split ( 'polarsublayer ' ) [ 1 ] ;
188190
189191 expect ( className ) . toBe ( expected [ i ] , 'layer ' + i ) ;
190192 } ) ;
@@ -698,4 +700,240 @@ describe('Test polar interactions:', function() {
698700 . catch ( fail )
699701 . then ( done ) ;
700702 } ) ;
703+
704+ it ( 'should response to drag interactions on plot area' , function ( done ) {
705+ var fig = Lib . extendDeep ( { } , require ( '@mocks/polar_scatter.json' ) ) ;
706+
707+ // adjust margins so that middle of plot area is at 300x300
708+ // with its middle at [200,200]
709+ fig . layout . width = 400 ;
710+ fig . layout . height = 400 ;
711+ fig . layout . margin = { l : 50 , t : 50 , b : 50 , r : 50 } ;
712+
713+ var mid = [ 200 , 200 ] ;
714+ var relayoutNumber = 0 ;
715+ var resetNumber = 0 ;
716+
717+ function _drag ( p0 , dp ) {
718+ var node = d3 . select ( '.polar > .draglayer > .maindrag' ) . node ( ) ;
719+ return drag ( node , dp [ 0 ] , dp [ 1 ] , null , p0 [ 0 ] , p0 [ 1 ] ) ;
720+ }
721+
722+ function _assertRange ( rng , msg ) {
723+ expect ( gd . _fullLayout . polar . radialaxis . range ) . toBeCloseToArray ( rng , 1 , msg ) ;
724+ }
725+
726+ function _assertDrag ( rng , msg ) {
727+ relayoutNumber ++ ;
728+ _assertRange ( rng , msg ) ;
729+
730+ if ( eventCnts . plotly_relayout === relayoutNumber ) {
731+ expect ( eventData [ 'polar.radialaxis.range' ] )
732+ . toBeCloseToArray ( rng , 1 , msg + '- event data' ) ;
733+ } else {
734+ fail ( 'incorrect number of plotly_relayout events triggered - ' + msg ) ;
735+ }
736+ }
737+
738+ function _assertBase ( extra ) {
739+ var msg = 'base range' + ( extra ? ' ' + extra : '' ) ;
740+ _assertRange ( [ 0 , 11.1 ] , msg ) ;
741+ }
742+
743+ function _reset ( ) {
744+ return _doubleClick ( mid ) . then ( function ( ) {
745+ relayoutNumber ++ ;
746+ resetNumber ++ ;
747+
748+ var extra = '(reset ' + resetNumber + ')' ;
749+ _assertBase ( extra ) ;
750+ expect ( eventCnts . plotly_doubleclick ) . toBe ( resetNumber , 'doubleclick event #' + extra ) ;
751+ } ) ;
752+ }
753+
754+ _plot ( fig )
755+ . then ( _assertBase )
756+ . then ( function ( ) { return _drag ( mid , [ 50 , 50 ] ) ; } )
757+ . then ( function ( ) {
758+ _assertDrag ( [ 0 , 5.24 ] , 'from center move toward bottom-right' ) ;
759+ } )
760+ . then ( _reset )
761+ . then ( function ( ) { return _drag ( mid , [ - 50 , - 50 ] ) ; } )
762+ . then ( function ( ) {
763+ _assertDrag ( [ 0 , 5.24 ] , 'from center move toward top-left' ) ;
764+ } )
765+ . then ( _reset )
766+ . then ( function ( ) { return _drag ( [ mid [ 0 ] + 30 , mid [ 0 ] - 30 ] , [ 50 , - 50 ] ) ; } )
767+ . then ( function ( ) {
768+ _assertDrag ( [ 3.1 , 8.4 ] , 'from quadrant #1 move top-right' ) ;
769+ } )
770+ . then ( _reset )
771+ . then ( function ( ) { return _drag ( [ 345 , 200 ] , [ - 50 , 0 ] ) ; } )
772+ . then ( function ( ) {
773+ _assertDrag ( [ 7.0 , 11.1 ] , 'from right edge move left' ) ;
774+ } )
775+ . then ( _reset )
776+ . then ( function ( ) { return _drag ( mid , [ 10 , 10 ] ) ; } )
777+ . then ( function ( ) { _assertBase ( 'from center to not far enough' ) ; } )
778+ . then ( function ( ) { return _drag ( [ mid [ 0 ] + 30 , mid [ 0 ] - 30 ] , [ - 10 , 0 ] ) ; } )
779+ . then ( function ( ) { _assertBase ( 'from quadrant #1 to not far enough' ) ; } )
780+ . then ( function ( ) { return _drag ( [ 345 , 200 ] , [ - 10 , 0 ] ) ; } )
781+ . then ( function ( ) { _assertBase ( 'from right edge to not far enough' ) ; } )
782+ . then ( function ( ) {
783+ expect ( eventCnts . plotly_relayout )
784+ . toBe ( relayoutNumber , 'no new relayout events after *not far enough* cases' ) ;
785+ } )
786+ . catch ( fail )
787+ . then ( done ) ;
788+ } ) ;
789+
790+ it ( 'should response to drag interactions on radial drag area' , function ( done ) {
791+ var fig = Lib . extendDeep ( { } , require ( '@mocks/polar_scatter.json' ) ) ;
792+
793+ // adjust margins so that middle of plot area is at 300x300
794+ // with its middle at [200,200]
795+ fig . layout . width = 400 ;
796+ fig . layout . height = 400 ;
797+ fig . layout . margin = { l : 50 , t : 50 , b : 50 , r : 50 } ;
798+
799+ var dragPos0 = [ 375 , 200 ] ;
800+ var resetNumber = 0 ;
801+
802+ // use 'special' drag method - as we need two mousemove events
803+ // to activate the radial drag mode
804+ function _drag ( p0 , dp ) {
805+ var node = d3 . select ( '.polar > .draglayer > .radialdrag' ) . node ( ) ;
806+ var p1 = [ p0 [ 0 ] + dp [ 0 ] / 2 , p0 [ 1 ] + dp [ 1 ] / 2 ] ;
807+ var p2 = [ p0 [ 0 ] + dp [ 0 ] , p0 [ 1 ] + dp [ 1 ] ] ;
808+
809+ mouseEvent ( 'mousemove' , p0 [ 0 ] , p0 [ 1 ] , { element : node } ) ;
810+ mouseEvent ( 'mousedown' , p0 [ 0 ] , p0 [ 1 ] , { element : node } ) ;
811+
812+ return delay ( 250 ) ( )
813+ . then ( function ( ) { mouseEvent ( 'mousemove' , p1 [ 0 ] , p1 [ 1 ] , { element : document } ) ; } )
814+ . then ( delay ( 50 ) )
815+ . then ( function ( ) { mouseEvent ( 'mousemove' , p2 [ 0 ] , p2 [ 1 ] , { element : document } ) ; } )
816+ . then ( function ( ) { mouseEvent ( 'mouseup' , p2 [ 0 ] , p2 [ 1 ] , { element : document } ) ; } )
817+ . then ( delay ( 50 ) ) ;
818+ }
819+
820+ function _assert ( rng , angle , evtRng1 , evtAngle , msg ) {
821+ expect ( gd . _fullLayout . polar . radialaxis . range )
822+ . toBeCloseToArray ( rng , 1 , msg + ' - range' ) ;
823+ expect ( gd . _fullLayout . polar . radialaxis . angle )
824+ . toBeCloseTo ( angle , 1 , msg + ' - angle' ) ;
825+
826+ if ( evtRng1 !== null ) {
827+ expect ( eventData [ 'polar.radialaxis.range[1]' ] )
828+ . toBeCloseTo ( evtRng1 , 1 , msg + ' - range[1] event data' ) ;
829+ }
830+ if ( evtAngle !== null ) {
831+ expect ( eventData [ 'polar.radialaxis.angle' ] )
832+ . toBeCloseTo ( evtAngle , 1 , msg + ' - angle event data' ) ;
833+ }
834+ }
835+
836+ function _assertBase ( extra ) {
837+ extra = extra ? ' ' + extra : '' ;
838+ _assert ( [ 0 , 11.1 ] , 0 , null , null , 'base' + extra ) ;
839+ }
840+
841+ function _reset ( ) {
842+ return _doubleClick ( [ 200 , 200 ] ) . then ( function ( ) {
843+ resetNumber ++ ;
844+
845+ var extra = '(reset ' + resetNumber + ')' ;
846+ _assertBase ( extra ) ;
847+ expect ( eventCnts . plotly_doubleclick ) . toBe ( resetNumber , 'doubleclick event #' + extra ) ;
848+ } ) ;
849+ }
850+
851+ _plot ( fig )
852+ . then ( _assertBase )
853+ . then ( function ( ) { return _drag ( dragPos0 , [ - 50 , 0 ] ) ; } )
854+ . then ( function ( ) {
855+ _assert ( [ 0 , 13.9 ] , 0 , 13.9 , null , 'move inward' ) ;
856+ } )
857+ . then ( _reset )
858+ . then ( function ( ) { return _drag ( dragPos0 , [ 50 , 0 ] ) ; } )
859+ . then ( function ( ) {
860+ _assert ( [ 0 , 8.33 ] , 0 , 8.33 , null , 'move outward' ) ;
861+ } )
862+ . then ( _reset )
863+ . then ( function ( ) { return _drag ( dragPos0 , [ 0 , - 50 ] ) ; } )
864+ . then ( function ( ) {
865+ _assert ( [ 0 , 11.1 ] , 15.94 , null , 15.94 , 'move counterclockwise' ) ;
866+ } )
867+ . then ( _reset )
868+ . then ( function ( ) { return _drag ( dragPos0 , [ 0 , 50 ] ) ; } )
869+ . then ( function ( ) {
870+ _assert ( [ 0 , 11.1 ] , - 15.94 , null , - 15.94 , 'move clockwise' ) ;
871+ } )
872+ . then ( _reset )
873+ . then ( function ( ) {
874+ expect ( eventCnts . plotly_relayout ) . toBe ( 8 , 'total # of relayout events' ) ;
875+ } )
876+ . catch ( fail )
877+ . then ( done ) ;
878+ } ) ;
879+
880+ it ( 'should response to drag interactions on angular drag area' , function ( done ) {
881+ var fig = Lib . extendDeep ( { } , require ( '@mocks/polar_scatter.json' ) ) ;
882+
883+ // adjust margins so that middle of plot area is at 300x300
884+ // with its middle at [200,200]
885+ fig . layout . width = 400 ;
886+ fig . layout . height = 400 ;
887+ fig . layout . margin = { l : 50 , t : 50 , b : 50 , r : 50 } ;
888+
889+ var dragPos0 = [ 350 , 150 ] ;
890+ var resetNumber = 0 ;
891+
892+ function _drag ( p0 , dp ) {
893+ var node = d3 . select ( '.polar > .draglayer > .angulardrag' ) . node ( ) ;
894+ return drag ( node , dp [ 0 ] , dp [ 1 ] , null , p0 [ 0 ] , p0 [ 1 ] ) ;
895+ }
896+
897+ function _assert ( rot , msg , noEvent ) {
898+ expect ( gd . _fullLayout . polar . angularaxis . rotation )
899+ . toBeCloseTo ( rot , 1 , msg + ' - rotation' ) ;
900+ if ( ! noEvent ) {
901+ expect ( eventData [ 'polar.angularaxis.rotation' ] )
902+ . toBeCloseTo ( rot , 1 , msg + ' - rotation event data' ) ;
903+ }
904+ }
905+
906+ function _assertBase ( extra ) {
907+ extra = extra ? ' ' + extra : '' ;
908+ _assert ( 0 , 'base' + extra , true ) ;
909+ }
910+
911+ function _reset ( ) {
912+ return _doubleClick ( [ 200 , 200 ] ) . then ( function ( ) {
913+ resetNumber ++ ;
914+
915+ var extra = '(reset ' + resetNumber + ')' ;
916+ _assertBase ( extra ) ;
917+ expect ( eventCnts . plotly_doubleclick ) . toBe ( resetNumber , 'doubleclick event #' + extra ) ;
918+ } ) ;
919+ }
920+
921+ _plot ( fig )
922+ . then ( _assertBase )
923+ . then ( function ( ) { return _drag ( dragPos0 , [ - 20 , - 20 ] ) ; } )
924+ . then ( function ( ) {
925+ _assert ( 7.7 , 'move counterclockwise' ) ;
926+ } )
927+ . then ( _reset )
928+ . then ( function ( ) { return _drag ( dragPos0 , [ 20 , 20 ] ) ; } )
929+ . then ( function ( ) {
930+ _assert ( - 6.3 , 'move clockwise' ) ;
931+ } )
932+ . then ( _reset )
933+ . then ( function ( ) {
934+ expect ( eventCnts . plotly_relayout ) . toBe ( 4 , 'total # of relayout events' ) ;
935+ } )
936+ . catch ( fail )
937+ . then ( done ) ;
938+ } ) ;
701939} ) ;
0 commit comments