|
1 | 1 | var d3 = require('d3');
|
2 | 2 |
|
3 | 3 | var Plotly = require('@lib/index');
|
| 4 | +var Plots = require('@src/plots/plots'); |
| 5 | +var Lib = require('@src/lib'); |
4 | 6 |
|
5 | 7 | var createGraphDiv = require('../assets/create_graph_div');
|
6 | 8 | var destroyGraphDiv = require('../assets/destroy_graph_div');
|
| 9 | +var selectButton = require('../assets/modebar_button'); |
7 | 10 |
|
8 | 11 | /*
|
9 | 12 | * WebGL interaction test cases fail on the CircleCI
|
@@ -43,4 +46,171 @@ describe('Test plot structure', function() {
|
43 | 46 | });
|
44 | 47 | });
|
45 | 48 |
|
| 49 | + describe('gl3d modebar click handlers', function() { |
| 50 | + var gd, modeBar; |
| 51 | + |
| 52 | + beforeEach(function(done) { |
| 53 | + var mockData = [{ |
| 54 | + type: 'scatter3d' |
| 55 | + }, { |
| 56 | + type: 'surface', scene: 'scene2' |
| 57 | + }]; |
| 58 | + |
| 59 | + var mockLayout = { |
| 60 | + scene: { camera: { eye: { x: 0.1, y: 0.1, z: 1 }}}, |
| 61 | + scene2: { camera: { eye: { x: 2.5, y: 2.5, z: 2.5 }}} |
| 62 | + }; |
| 63 | + |
| 64 | + gd = createGraphDiv(); |
| 65 | + Plotly.plot(gd, mockData, mockLayout).then(function() { |
| 66 | + modeBar = gd._fullLayout._modeBar; |
| 67 | + done(); |
| 68 | + }); |
| 69 | + }); |
| 70 | + |
| 71 | + function assertScenes(cont, attr, val) { |
| 72 | + var sceneIds = Plots.getSubplotIds(cont, 'gl3d'); |
| 73 | + |
| 74 | + sceneIds.forEach(function(sceneId) { |
| 75 | + var thisVal = Lib.nestedProperty(cont[sceneId], attr).get(); |
| 76 | + expect(thisVal).toEqual(val); |
| 77 | + }); |
| 78 | + } |
| 79 | + |
| 80 | + describe('button zoom3d', function() { |
| 81 | + it('should updates the scene dragmode and dragmode button', function() { |
| 82 | + var buttonTurntable = selectButton(modeBar, 'tableRotation'), |
| 83 | + buttonZoom3d = selectButton(modeBar, 'zoom3d'); |
| 84 | + |
| 85 | + assertScenes(gd._fullLayout, 'dragmode', 'turntable'); |
| 86 | + expect(buttonTurntable.isActive()).toBe(true); |
| 87 | + expect(buttonZoom3d.isActive()).toBe(false); |
| 88 | + |
| 89 | + buttonZoom3d.click(); |
| 90 | + assertScenes(gd.layout, 'dragmode', 'zoom'); |
| 91 | + expect(gd.layout.dragmode).toBe(undefined); |
| 92 | + expect(gd._fullLayout.dragmode).toBe('zoom'); |
| 93 | + expect(buttonTurntable.isActive()).toBe(false); |
| 94 | + expect(buttonZoom3d.isActive()).toBe(true); |
| 95 | + |
| 96 | + buttonTurntable.click(); |
| 97 | + assertScenes(gd._fullLayout, 'dragmode', 'turntable'); |
| 98 | + expect(buttonTurntable.isActive()).toBe(true); |
| 99 | + expect(buttonZoom3d.isActive()).toBe(false); |
| 100 | + }); |
| 101 | + }); |
| 102 | + |
| 103 | + describe('button pan3d', function() { |
| 104 | + it('should updates the scene dragmode and dragmode button', function() { |
| 105 | + var buttonTurntable = selectButton(modeBar, 'tableRotation'), |
| 106 | + buttonPan3d = selectButton(modeBar, 'pan3d'); |
| 107 | + |
| 108 | + assertScenes(gd._fullLayout, 'dragmode', 'turntable'); |
| 109 | + expect(buttonTurntable.isActive()).toBe(true); |
| 110 | + expect(buttonPan3d.isActive()).toBe(false); |
| 111 | + |
| 112 | + buttonPan3d.click(); |
| 113 | + assertScenes(gd.layout, 'dragmode', 'pan'); |
| 114 | + expect(gd.layout.dragmode).toBe(undefined); |
| 115 | + expect(gd._fullLayout.dragmode).toBe('zoom'); |
| 116 | + expect(buttonTurntable.isActive()).toBe(false); |
| 117 | + expect(buttonPan3d.isActive()).toBe(true); |
| 118 | + |
| 119 | + buttonTurntable.click(); |
| 120 | + assertScenes(gd._fullLayout, 'dragmode', 'turntable'); |
| 121 | + expect(buttonTurntable.isActive()).toBe(true); |
| 122 | + expect(buttonPan3d.isActive()).toBe(false); |
| 123 | + }); |
| 124 | + }); |
| 125 | + |
| 126 | + describe('button orbitRotation', function() { |
| 127 | + it('should updates the scene dragmode and dragmode button', function() { |
| 128 | + var buttonTurntable = selectButton(modeBar, 'tableRotation'), |
| 129 | + buttonOrbit = selectButton(modeBar, 'orbitRotation'); |
| 130 | + |
| 131 | + assertScenes(gd._fullLayout, 'dragmode', 'turntable'); |
| 132 | + expect(buttonTurntable.isActive()).toBe(true); |
| 133 | + expect(buttonOrbit.isActive()).toBe(false); |
| 134 | + |
| 135 | + buttonOrbit.click(); |
| 136 | + assertScenes(gd.layout, 'dragmode', 'orbit'); |
| 137 | + expect(gd.layout.dragmode).toBe(undefined); |
| 138 | + expect(gd._fullLayout.dragmode).toBe('zoom'); |
| 139 | + expect(buttonTurntable.isActive()).toBe(false); |
| 140 | + expect(buttonOrbit.isActive()).toBe(true); |
| 141 | + |
| 142 | + buttonTurntable.click(); |
| 143 | + assertScenes(gd._fullLayout, 'dragmode', 'turntable'); |
| 144 | + expect(buttonTurntable.isActive()).toBe(true); |
| 145 | + expect(buttonOrbit.isActive()).toBe(false); |
| 146 | + }); |
| 147 | + }); |
| 148 | + |
| 149 | + describe('buttons resetCameraDefault3d and resetCameraLastSave3d', function() { |
| 150 | + // changes in scene objects are not instantaneous |
| 151 | + var DELAY = 1000; |
| 152 | + |
| 153 | + it('should update the scene camera', function(done) { |
| 154 | + var sceneLayout = gd._fullLayout.scene, |
| 155 | + sceneLayout2 = gd._fullLayout.scene2, |
| 156 | + scene = sceneLayout._scene, |
| 157 | + scene2 = sceneLayout2._scene; |
| 158 | + |
| 159 | + expect(sceneLayout.camera.eye) |
| 160 | + .toEqual({x: 0.1, y: 0.1, z: 1}); |
| 161 | + expect(sceneLayout2.camera.eye) |
| 162 | + .toEqual({x: 2.5, y: 2.5, z: 2.5}); |
| 163 | + |
| 164 | + selectButton(modeBar, 'resetCameraDefault3d').click(); |
| 165 | + setTimeout(function() { |
| 166 | + expect(sceneLayout.camera.eye) |
| 167 | + .toEqual({x: 0.1, y: 0.1, z: 1}, 'does not change the layout objects'); |
| 168 | + expect(scene.camera.eye) |
| 169 | + .toEqual([1.2500000000000002, 1.25, 1.25]); |
| 170 | + expect(sceneLayout2.camera.eye) |
| 171 | + .toEqual({x: 2.5, y: 2.5, z: 2.5}, 'does not change the layout objects'); |
| 172 | + expect(scene2.camera.eye) |
| 173 | + .toEqual([1.2500000000000002, 1.25, 1.25]); |
| 174 | + |
| 175 | + selectButton(modeBar, 'resetCameraLastSave3d').click(); |
| 176 | + setTimeout(function() { |
| 177 | + expect(sceneLayout.camera.eye) |
| 178 | + .toEqual({x: 0.1, y: 0.1, z: 1}, 'does not change the layout objects'); |
| 179 | + expect(scene.camera.eye) |
| 180 | + .toEqual([ 0.10000000000000016, 0.10000000000000016, 1]); |
| 181 | + expect(sceneLayout2.camera.eye) |
| 182 | + .toEqual({x: 2.5, y: 2.5, z: 2.5}, 'does not change the layout objects'); |
| 183 | + expect(scene2.camera.eye) |
| 184 | + .toEqual([2.500000000000001, 2.5000000000000004, 2.5000000000000004]); |
| 185 | + |
| 186 | + done(); |
| 187 | + }, DELAY); |
| 188 | + }, DELAY); |
| 189 | + }); |
| 190 | + }); |
| 191 | + |
| 192 | + describe('button hoverClosest3d', function() { |
| 193 | + it('should update the scene hovermode and spikes', function() { |
| 194 | + var buttonHover = selectButton(modeBar, 'hoverClosest3d'); |
| 195 | + |
| 196 | + assertScenes(gd._fullLayout, 'hovermode', 'closest'); |
| 197 | + expect(buttonHover.isActive()).toBe(true); |
| 198 | + |
| 199 | + buttonHover.click(); |
| 200 | + assertScenes(gd._fullLayout, 'hovermode', false); |
| 201 | + assertScenes(gd._fullLayout, 'xaxis.showspikes', false); |
| 202 | + assertScenes(gd._fullLayout, 'yaxis.showspikes', false); |
| 203 | + assertScenes(gd._fullLayout, 'zaxis.showspikes', false); |
| 204 | + expect(buttonHover.isActive()).toBe(false); |
| 205 | + |
| 206 | + buttonHover.click(); |
| 207 | + assertScenes(gd._fullLayout, 'hovermode', 'closest'); |
| 208 | + assertScenes(gd._fullLayout, 'xaxis.showspikes', true); |
| 209 | + assertScenes(gd._fullLayout, 'yaxis.showspikes', true); |
| 210 | + assertScenes(gd._fullLayout, 'zaxis.showspikes', true); |
| 211 | + expect(buttonHover.isActive()).toBe(true); |
| 212 | + }); |
| 213 | + }); |
| 214 | + |
| 215 | + }); |
46 | 216 | });
|
0 commit comments