Skip to content

Commit bc90474

Browse files
committed
add several 3d mode bar jasmine tests,
- these will only run locally at the moment as and until #241 is resolved.
1 parent 48d5957 commit bc90474

File tree

2 files changed

+193
-0
lines changed

2 files changed

+193
-0
lines changed

test/jasmine/assets/modebar_button.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict';
2+
3+
var d3 = require('d3');
4+
5+
var modeBarButtons = require('@src/components/modebar/buttons');
6+
7+
8+
module.exports = function selectButton(modeBar, name) {
9+
var button = d3.select(modeBar.element)
10+
.select('[data-title="' + modeBarButtons[name].title + '"]')
11+
.node();
12+
13+
button.click = function() {
14+
var ev = new window.MouseEvent('click');
15+
button.dispatchEvent(ev);
16+
};
17+
18+
button.isActive = function() {
19+
return d3.select(button).classed('active');
20+
};
21+
22+
return button;
23+
};

test/jasmine/tests/gl_plot_interact_test.js

+170
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
var d3 = require('d3');
22

33
var Plotly = require('@lib/index');
4+
var Plots = require('@src/plots/plots');
5+
var Lib = require('@src/lib');
46

57
var createGraphDiv = require('../assets/create_graph_div');
68
var destroyGraphDiv = require('../assets/destroy_graph_div');
9+
var selectButton = require('../assets/modebar_button');
710

811
/*
912
* WebGL interaction test cases fail on the CircleCI
@@ -43,4 +46,171 @@ describe('Test plot structure', function() {
4346
});
4447
});
4548

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+
});
46216
});

0 commit comments

Comments
 (0)