Skip to content

Commit 8531e23

Browse files
committed
first cut streamtube jasmine tests
1 parent 5da1c59 commit 8531e23

File tree

1 file changed

+310
-0
lines changed

1 file changed

+310
-0
lines changed

test/jasmine/tests/streamtube_test.js

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
var Plotly = require('@lib');
2+
var Lib = require('@src/lib');
3+
4+
var supplyAllDefaults = require('../assets/supply_defaults');
5+
var createGraphDiv = require('../assets/create_graph_div');
6+
var destroyGraphDiv = require('../assets/destroy_graph_div');
7+
var failTest = require('../assets/fail_test');
8+
var delay = require('../assets/delay');
9+
var mouseEvent = require('../assets/mouse_event');
10+
11+
var customAssertions = require('../assets/custom_assertions');
12+
var assertHoverLabelContent = customAssertions.assertHoverLabelContent;
13+
14+
describe('Test streamtube defaults', function() {
15+
var gd;
16+
17+
function makeGD() {
18+
return {
19+
data: [{
20+
type: 'streamtube',
21+
x: [1, 2],
22+
y: [1, 2],
23+
z: [1, 2],
24+
u: [1, 2],
25+
v: [1, 2],
26+
w: [1, 2]
27+
}],
28+
layout: {}
29+
};
30+
}
31+
32+
it('should not set `visible: false` for traces with x,y,z,u,v,w arrays', function() {
33+
// even when startx/starty/startz are missing
34+
gd = makeGD();
35+
supplyAllDefaults(gd);
36+
expect(gd._fullData[0].visible).toBe(true);
37+
});
38+
39+
it('should set `visible: false` for traces missing x,y,z,u,v,w arrays', function() {
40+
var keysToDelete = ['x', 'y', 'z', 'u', 'v', 'w'];
41+
42+
keysToDelete.forEach(function(k) {
43+
gd = makeGD();
44+
delete gd.data[0][k];
45+
46+
supplyAllDefaults(gd);
47+
expect(gd._fullData[0].visible).toBe(false, 'missing array ' + k);
48+
});
49+
});
50+
51+
it('should set `visible: false` for traces empty x,y,z,u,v,w arrays', function() {
52+
var keysToEmpty = ['x', 'y', 'z', 'u', 'v', 'w'];
53+
54+
keysToEmpty.forEach(function(k) {
55+
gd = makeGD();
56+
gd.data[0][k] = [];
57+
58+
supplyAllDefaults(gd);
59+
expect(gd._fullData[0].visible).toBe(false, 'empty array ' + k);
60+
});
61+
});
62+
});
63+
64+
describe('@gl Test streamtube autorange', function() {
65+
var gd;
66+
67+
beforeEach(function() {
68+
gd = createGraphDiv();
69+
});
70+
71+
afterEach(function() {
72+
Plotly.purge(gd);
73+
destroyGraphDiv();
74+
});
75+
76+
function _assertAxisRanges(msg, xrng, yrng, zrng) {
77+
var sceneLayout = gd._fullLayout.scene;
78+
expect(sceneLayout.xaxis.range).toBeCloseToArray(xrng, 2, 'xaxis range - ' + msg);
79+
expect(sceneLayout.yaxis.range).toBeCloseToArray(yrng, 2, 'yaxis range - ' + msg);
80+
expect(sceneLayout.zaxis.range).toBeCloseToArray(zrng, 2, 'zaxis range - ' + msg);
81+
}
82+
83+
it('should add pad around tubes to make sure they fit on the scene', function(done) {
84+
var fig = Lib.extendDeep({}, require('@mocks/gl3d_streamtube-first'));
85+
86+
Plotly.plot(gd, fig).then(function() {
87+
_assertAxisRanges('base',
88+
[-5.36, 5.525], [-3.73, 5.44], [-3.55, 3.78]
89+
);
90+
return Plotly.restyle(gd, 'sizeref', 10);
91+
})
92+
.then(function() {
93+
_assertAxisRanges('with large sizeref',
94+
[-9.86, 10.02], [-8.23, 9.935], [-8.045, 8.28]
95+
);
96+
return Plotly.restyle(gd, 'sizeref', 0.1);
97+
})
98+
.then(function() {
99+
_assertAxisRanges('with small sizeref',
100+
[-5.32, 5.48], [-3.69, 5.39], [-3.50, 3.73]
101+
);
102+
})
103+
.catch(failTest)
104+
.then(done);
105+
});
106+
});
107+
108+
describe('@gl Test streamtube interactions', function() {
109+
var gd;
110+
111+
beforeEach(function() {
112+
gd = createGraphDiv();
113+
});
114+
115+
afterEach(function() {
116+
Plotly.purge(gd);
117+
destroyGraphDiv();
118+
});
119+
120+
it('overspecified meshgrid should return blank mesh grid', function(done) {
121+
var fig = Lib.extendDeep({}, require('@mocks/gl3d_streamtube-simple.json'));
122+
var trace = fig.data[0];
123+
var x = trace.x.slice();
124+
var y = trace.y.slice();
125+
var z = trace.z.slice();
126+
trace.x = [1, 2, 3];
127+
trace.y = [1, 2, 3];
128+
trace.z = [1, 2, 3];
129+
130+
function _assert(msg, exp) {
131+
var scene = gd._fullLayout.scene._scene;
132+
var objs = scene.glplot.objects;
133+
expect(objs.length).toBe(1, 'one gl-vis object - ' + msg);
134+
expect(exp.positionsLength).toBe(objs[0].positions.length, 'positions length - ' + msg);
135+
expect(exp.cellsLength).toBe(objs[0].cells.length, 'cells length - ' + msg);
136+
}
137+
138+
Plotly.plot(gd, fig).then(function() {
139+
_assert('base', {
140+
positionsLength: 0,
141+
cellsLength: 0
142+
});
143+
return Plotly.restyle(gd, {x: [x], y: [y], z: [z]});
144+
})
145+
.then(function() {
146+
_assert('overspecified meshgrid (i.e underspecified x/y/z)', {
147+
positionsLength: 1536,
148+
cellsLength: 512
149+
});
150+
})
151+
.catch(failTest)
152+
.then(done);
153+
});
154+
155+
it('should add/clear gl objects correctly', function(done) {
156+
var fig = Lib.extendDeep({}, require('@mocks/gl3d_streamtube-simple.json'));
157+
var trace = Lib.extendDeep({}, fig.data[0]);
158+
159+
function _assert(msg, exp) {
160+
if(exp.glObjCnt) {
161+
var scene = gd._fullLayout.scene._scene;
162+
var objs = scene.glplot.objects;
163+
expect(objs.length).toBe(exp.glObjCnt, 'gl-vis object cnt - ' + msg);
164+
} else {
165+
expect(gd._fullLayout.scene).toBe(undefined, 'no scene -' + msg);
166+
}
167+
}
168+
169+
Plotly.plot(gd, fig).then(function() {
170+
_assert('base', {glObjCnt: 1});
171+
return Plotly.addTraces(gd, [trace]);
172+
})
173+
.then(function() {
174+
_assert('after addTraces', {glObjCnt: 2});
175+
return Plotly.deleteTraces(gd, [0]);
176+
})
177+
.then(function() {
178+
_assert('after deleteTraces', {glObjCnt: 1});
179+
return Plotly.deleteTraces(gd, [0]);
180+
})
181+
.then(function() {
182+
_assert('after deleteTraces #2', {glObjCnt: 0});
183+
})
184+
.catch(failTest)
185+
.then(done);
186+
});
187+
188+
it('should be able to restyle to a cone trace and back', function(done) {
189+
var fig = Lib.extendDeep({}, require('@mocks/gl3d_cone-autorange.json'));
190+
var trace1 = Lib.extendDeep({}, fig.data[0]);
191+
trace1.type = 'streamtube';
192+
193+
function _assert(msg, exp) {
194+
var scene = gd._fullLayout.scene._scene;
195+
var objs = scene.glplot.objects;
196+
var objTypes = objs.map(function(o) { return o._trace.data.type; });
197+
expect(objTypes).toEqual(exp.objTypes);
198+
}
199+
200+
Plotly.plot(gd, fig).then(function() {
201+
_assert('base cone', {objTypes: ['cone', 'cone']});
202+
return Plotly.restyle(gd, 'type', 'streamtube');
203+
})
204+
.then(function() {
205+
_assert('restyled to streamtube', {objTypes: ['streamtube']});
206+
return Plotly.restyle(gd, 'type', 'cone');
207+
})
208+
.then(function() {
209+
_assert('back to cone', {objTypes: ['cone', 'cone']});
210+
return Plotly.addTraces(gd, [trace1]);
211+
})
212+
.then(function() {
213+
_assert('add streamtube on top of cone', {
214+
objTypes: ['cone', 'cone', 'streamtube']
215+
});
216+
})
217+
.catch(failTest)
218+
.then(done);
219+
});
220+
});
221+
222+
describe('@gl Test streamtube hover', function() {
223+
var gd;
224+
225+
beforeEach(function() {
226+
gd = createGraphDiv();
227+
});
228+
229+
afterEach(function() {
230+
Plotly.purge(gd);
231+
destroyGraphDiv();
232+
});
233+
234+
it('should display hover labels', function(done) {
235+
var fig = Lib.extendDeep({}, require('@mocks/gl3d_streamtube-simple.json'));
236+
fig.data[0].showscale = false;
237+
fig.layout.margin = {l: 0, t: 0, r: 0, b: 0};
238+
fig.layout.width = 400;
239+
fig.layout.height = 400;
240+
241+
function _hover() {
242+
mouseEvent('mouseover', 188, 199);
243+
return delay(20)();
244+
}
245+
246+
Plotly.plot(gd, fig)
247+
.then(delay(20))
248+
.then(_hover)
249+
.then(function() {
250+
assertHoverLabelContent({
251+
nums: [
252+
'x: 2.250878',
253+
'y: 0.5866609',
254+
'z: 1.091627',
255+
'norm: 2.06'
256+
].join('\n')
257+
});
258+
259+
return Plotly.restyle(gd, 'hoverinfo', 'u+v+w');
260+
})
261+
.then(delay(20))
262+
.then(_hover)
263+
.then(function() {
264+
assertHoverLabelContent({
265+
nums: [
266+
'u: 1.847686',
267+
'v: 0.7303133',
268+
'w: 0.1693927'
269+
].join('\n')
270+
});
271+
})
272+
.catch(failTest)
273+
.then(done);
274+
});
275+
276+
it('should display hover labels (multi-trace case)', function(done) {
277+
var fig = Lib.extendDeep({}, require('@mocks/gl3d_streamtube-simple.json'));
278+
var trace0 = fig.data[0];
279+
trace0.showscale = false;
280+
trace0.name = 'TUBE!';
281+
fig.layout.margin = {l: 0, t: 0, r: 0, b: 0};
282+
fig.layout.width = 400;
283+
fig.layout.height = 400;
284+
285+
var trace1 = Lib.extendDeep({}, fig.data[0]);
286+
trace1.type = 'cone';
287+
fig.data.push(trace1);
288+
289+
function _hover() {
290+
mouseEvent('mouseover', 193, 177);
291+
return delay(20)();
292+
}
293+
Plotly.plot(gd, fig)
294+
.then(delay(20))
295+
.then(_hover)
296+
.then(function() {
297+
assertHoverLabelContent({
298+
nums: [
299+
'x: 2.059149',
300+
'y: 0.5083682',
301+
'z: 1.074042',
302+
'norm: 2.07'
303+
].join('\n'),
304+
name: 'TUBE!'
305+
});
306+
})
307+
.catch(failTest)
308+
.then(done);
309+
});
310+
});

0 commit comments

Comments
 (0)