@@ -1562,3 +1562,74 @@ describe('Test removal of gl contexts', function() {
1562
1562
. then ( done ) ;
1563
1563
} ) ;
1564
1564
} ) ;
1565
+
1566
+ describe ( 'Test gl3d drag events' , function ( ) {
1567
+ var gd ;
1568
+
1569
+ beforeEach ( function ( ) {
1570
+ gd = createGraphDiv ( ) ;
1571
+ } ) ;
1572
+
1573
+ afterEach ( function ( ) {
1574
+ Plotly . purge ( gd ) ;
1575
+ destroyGraphDiv ( ) ;
1576
+ } ) ;
1577
+
1578
+ // Expected shape of projection-related data
1579
+ var cameraStructure = {
1580
+ projection : { type : jasmine . any ( String ) } ,
1581
+ up : { x : jasmine . any ( Number ) , y : jasmine . any ( Number ) , z : jasmine . any ( Number ) } ,
1582
+ center : { x : jasmine . any ( Number ) , y : jasmine . any ( Number ) , z : jasmine . any ( Number ) } ,
1583
+ eye : { x : jasmine . any ( Number ) , y : jasmine . any ( Number ) , z : jasmine . any ( Number ) }
1584
+ } ;
1585
+
1586
+ function makePlot ( gd , mock ) {
1587
+ return Plotly . plot ( gd , mock . data , mock . layout ) ;
1588
+ }
1589
+
1590
+ function addEventCallback ( graphDiv ) {
1591
+ var relayoutCallback = jasmine . createSpy ( 'relayoutCallback' ) ;
1592
+ graphDiv . on ( 'plotly_relayout' , relayoutCallback ) ;
1593
+ return { graphDiv : graphDiv , relayoutCallback : relayoutCallback } ;
1594
+ }
1595
+
1596
+ function verifyInteractionEffects ( tuple ) {
1597
+ // One 'drag': simulating fairly thoroughly as the mouseup event is also needed here
1598
+ mouseEvent ( 'mousemove' , 400 , 200 ) ;
1599
+ mouseEvent ( 'mousedown' , 400 , 200 ) ;
1600
+ mouseEvent ( 'mousemove' , 320 , 320 , { buttons : 1 } ) ;
1601
+ mouseEvent ( 'mouseup' , 320 , 320 ) ;
1602
+
1603
+ // Check event emission count
1604
+ expect ( tuple . relayoutCallback ) . toHaveBeenCalledTimes ( 1 ) ;
1605
+
1606
+ // Check structure of event callback value contents
1607
+ expect ( tuple . relayoutCallback ) . toHaveBeenCalledWith ( jasmine . objectContaining ( { 'scene.camera' : cameraStructure } ) ) ;
1608
+
1609
+ // Check camera contents on the DIV layout
1610
+ var divCamera = tuple . graphDiv . layout . scene . camera ;
1611
+
1612
+ expect ( divCamera ) . toEqual ( cameraStructure ) ;
1613
+
1614
+ return tuple . graphDiv ;
1615
+ }
1616
+
1617
+ function testEvents ( plot ) {
1618
+ return plot . then ( function ( graphDiv ) {
1619
+ var tuple = addEventCallback ( graphDiv ) ;
1620
+ verifyInteractionEffects ( tuple ) ;
1621
+ } ) ;
1622
+ }
1623
+
1624
+ it ( '@gl should respond to drag interactions with mock of unset camera' , function ( done ) {
1625
+ testEvents ( makePlot ( gd , require ( '@mocks/gl3d_scatter3d-connectgaps.json' ) ) )
1626
+ . catch ( failTest )
1627
+ . then ( done ) ;
1628
+ } ) ;
1629
+
1630
+ it ( '@gl should respond to drag interactions with mock of partially set camera' , function ( done ) {
1631
+ testEvents ( makePlot ( gd , require ( '@mocks/gl3d_errorbars_zx.json' ) ) )
1632
+ . catch ( failTest )
1633
+ . then ( done ) ;
1634
+ } ) ;
1635
+ } ) ;
0 commit comments