Skip to content

Commit 6a55185

Browse files
committed
Added unit test for Interpolant.
1 parent 4126288 commit 6a55185

5 files changed

Lines changed: 397 additions & 0 deletions

File tree

test/unit/math/Interpolant.js

Lines changed: 387 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,387 @@
1+
/**
2+
* @author tschw
3+
*/
4+
5+
module( "Interpolant" );
6+
7+
// Since this is an abstract base class, we have to make it concrete in order
8+
// to test its functionality...
9+
10+
function Mock( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
11+
12+
THREE.Interpolant.call(
13+
this, parameterPositions, sampleValues, sampleSize, resultBuffer );
14+
15+
}
16+
17+
Mock.prototype = Object.create( THREE.Interpolant.prototype );
18+
19+
Mock.prototype.intervalChanged_ = function intervalChanged( i1, t0, t1 ) {
20+
21+
Mock.captureCall( arguments );
22+
23+
};
24+
25+
Mock.prototype.interpolate_ = function interpolate( i1, t0, t, t1 ) {
26+
27+
Mock.captureCall( arguments );
28+
return this.copySampleValue_( i1 - 1 );
29+
30+
};
31+
32+
Mock.prototype.beforeStart_ = function beforeStart( i, t, t0 ) {
33+
34+
Mock.captureCall( arguments );
35+
return this.copySampleValue_( i );
36+
37+
};
38+
39+
Mock.prototype.afterEnd_ = function afterEnd( i, tN, t ) {
40+
41+
Mock.captureCall( arguments );
42+
return this.copySampleValue_( i );
43+
44+
};
45+
46+
// Call capturing facility
47+
48+
Mock.calls = null;
49+
50+
Mock.captureCall = function( args ) {
51+
52+
if ( Mock.calls !== null ) {
53+
54+
Mock.calls.push( {
55+
func: Mock.captureCall.caller.name,
56+
args: Array.prototype.slice.call( args )
57+
} );
58+
59+
}
60+
61+
};
62+
63+
// Tests
64+
65+
test( "copySampleValue_", function() {
66+
67+
var interpolant = new Mock( null, [ 1, 11, 2, 22, 3, 33 ], 2, [] );
68+
69+
deepEqual( interpolant.copySampleValue_( 0 ), [ 1, 11 ], "sample fetch (0)" );
70+
deepEqual( interpolant.copySampleValue_( 1 ), [ 2, 22 ], "sample fetch (1)" );
71+
deepEqual( interpolant.copySampleValue_( 2 ), [ 3, 33 ], "first sample (2)" );
72+
73+
} );
74+
75+
test( "evaluate -> intervalChanged_ / interpolate_", function() {
76+
77+
var actual, expect;
78+
79+
var interpolant = new Mock( [ 11, 22, 33, 44, 55, 66, 77, 88, 99 ], null, 0, null );
80+
81+
Mock.calls = [];
82+
interpolant.evaluate( 11 );
83+
84+
actual = Mock.calls[ 0 ];
85+
expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
86+
deepEqual( actual, expect, JSON.stringify( expect ) );
87+
88+
actual = Mock.calls[ 1 ];
89+
expect = { func: 'interpolate', args: [ 1, 11, 11, 22 ] };
90+
deepEqual( actual, expect, JSON.stringify( expect ) );
91+
92+
ok( Mock.calls.length === 2, "no further calls" );
93+
94+
Mock.calls = [];
95+
interpolant.evaluate( 12 ); // same interval
96+
97+
actual = Mock.calls[ 0 ];
98+
expect = { func: 'interpolate', args: [ 1, 11, 12, 22 ] };
99+
deepEqual( actual, expect, JSON.stringify( expect ) );
100+
101+
ok( Mock.calls.length === 1, "no further calls" );
102+
103+
Mock.calls = [];
104+
interpolant.evaluate( 22 ); // step forward
105+
106+
actual = Mock.calls[ 0 ];
107+
expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
108+
deepEqual( actual, expect, JSON.stringify( expect ) );
109+
110+
actual = Mock.calls[ 1 ];
111+
expect = { func: 'interpolate', args: [ 2, 22, 22, 33 ] };
112+
deepEqual( actual, expect, JSON.stringify( expect ) );
113+
114+
ok( Mock.calls.length === 2 );
115+
116+
Mock.calls = [];
117+
interpolant.evaluate( 21 ); // step back
118+
119+
actual = Mock.calls[ 0 ];
120+
expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
121+
deepEqual( actual, expect, JSON.stringify( expect ) );
122+
123+
actual = Mock.calls[ 1 ];
124+
expect = { func: 'interpolate', args: [ 1, 11, 21, 22 ] };
125+
deepEqual( actual, expect, JSON.stringify( expect ) );
126+
127+
ok( Mock.calls.length === 2, "no further calls" );
128+
129+
Mock.calls = [];
130+
interpolant.evaluate( 20 ); // same interval
131+
132+
actual = Mock.calls[ 0 ];
133+
expect = { func: 'interpolate', args: [ 1, 11, 20, 22 ] };
134+
deepEqual( actual, expect, JSON.stringify( expect ) );
135+
136+
ok( Mock.calls.length === 1, "no further calls" );
137+
138+
Mock.calls = [];
139+
interpolant.evaluate( 43 ); // two steps forward
140+
141+
actual = Mock.calls[ 0 ];
142+
expect = { func: 'intervalChanged', args: [ 3, 33, 44 ] };
143+
deepEqual( actual, expect, JSON.stringify( expect ) );
144+
145+
actual = Mock.calls[ 1 ];
146+
expect = { func: 'interpolate', args: [ 3, 33, 43, 44 ] };
147+
deepEqual( actual, expect, JSON.stringify( expect ) );
148+
149+
ok( Mock.calls.length === 2, "no further calls" );
150+
151+
Mock.calls = [];
152+
interpolant.evaluate( 12 ); // two steps back
153+
154+
actual = Mock.calls[ 0 ];
155+
expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
156+
deepEqual( actual, expect, JSON.stringify( expect ) );
157+
158+
actual = Mock.calls[ 1 ];
159+
expect = { func: 'interpolate', args: [ 1, 11, 12, 22 ] };
160+
deepEqual( actual, expect, JSON.stringify( expect ) );
161+
162+
ok( Mock.calls.length === 2, "no further calls" );
163+
164+
Mock.calls = [];
165+
interpolant.evaluate( 77 ); // random access
166+
167+
actual = Mock.calls[ 0 ];
168+
expect = { func: 'intervalChanged', args: [ 7, 77, 88 ] };
169+
deepEqual( actual, expect, JSON.stringify( expect ) );
170+
171+
actual = Mock.calls[ 1 ];
172+
expect = { func: 'interpolate', args: [ 7, 77, 77, 88 ] };
173+
deepEqual( actual, expect, JSON.stringify( expect ) );
174+
175+
ok( Mock.calls.length === 2, "no further calls" );
176+
177+
Mock.calls = [];
178+
interpolant.evaluate( 80 ); // same interval
179+
180+
actual = Mock.calls[ 0 ];
181+
expect = { func: 'interpolate', args: [ 7, 77, 80, 88 ] };
182+
deepEqual( actual, expect, JSON.stringify( expect ) );
183+
184+
ok( Mock.calls.length === 1, "no further calls" );
185+
186+
Mock.calls = [];
187+
interpolant.evaluate( 36 ); // random access
188+
189+
actual = Mock.calls[ 0 ];
190+
expect = { func: 'intervalChanged', args: [ 3, 33, 44 ] };
191+
deepEqual( actual, expect, JSON.stringify( expect ) );
192+
193+
actual = Mock.calls[ 1 ];
194+
expect = { func: 'interpolate', args: [ 3, 33, 36, 44 ] };
195+
deepEqual( actual, expect, JSON.stringify( expect ) );
196+
197+
ok( Mock.calls.length === 2, "no further calls" );
198+
199+
Mock.calls = [];
200+
interpolant.evaluate( 24 ); // fast reset / loop (2nd)
201+
202+
actual = Mock.calls[ 0 ];
203+
expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
204+
deepEqual( actual, expect, JSON.stringify( expect ) );
205+
206+
actual = Mock.calls[ 1 ];
207+
expect = { func: 'interpolate', args: [ 2, 22, 24, 33 ] };
208+
deepEqual( actual, expect, JSON.stringify( expect ) );
209+
210+
ok( Mock.calls.length === 2, "no further calls" );
211+
212+
Mock.calls = [];
213+
interpolant.evaluate( 16 ); // fast reset / loop (2nd)
214+
215+
actual = Mock.calls[ 0 ];
216+
expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
217+
deepEqual( actual, expect, JSON.stringify( expect ) );
218+
219+
actual = Mock.calls[ 1 ];
220+
expect = { func: 'interpolate', args: [ 1, 11, 16, 22 ] };
221+
deepEqual( actual, expect, JSON.stringify( expect ) );
222+
223+
ok( Mock.calls.length === 2, "no further calls" );
224+
225+
} );
226+
227+
test( "evaulate -> beforeStart_ [once]", function() {
228+
229+
var actual, expect;
230+
231+
var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
232+
233+
Mock.calls = [];
234+
interpolant.evaluate( 10 );
235+
236+
actual = Mock.calls[ 0 ];
237+
expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
238+
deepEqual( actual, expect, JSON.stringify( expect ) );
239+
240+
ok( Mock.calls.length === 1, "no further calls" );
241+
242+
// Check operation resumes normally and intervalChanged gets called
243+
Mock.calls = [];
244+
interpolant.evaluate( 11 );
245+
246+
actual = Mock.calls[ 0 ];
247+
expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
248+
deepEqual( actual, expect, JSON.stringify( expect ) );
249+
250+
actual = Mock.calls[ 1 ];
251+
expect = { func: 'interpolate', args: [ 1, 11, 11, 22 ] };
252+
deepEqual( actual, expect, JSON.stringify( expect ) );
253+
254+
ok( Mock.calls.length === 2, "no further calls" );
255+
256+
// Back off-bounds
257+
Mock.calls = [];
258+
interpolant.evaluate( 10 );
259+
260+
actual = Mock.calls[ 0 ];
261+
expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
262+
deepEqual( actual, expect, JSON.stringify( expect ) );
263+
264+
ok( Mock.calls.length === 1, "no further calls" );
265+
266+
} );
267+
268+
test( "evaluate -> beforeStart_ [twice]", function() {
269+
270+
var actual, expect;
271+
272+
var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
273+
274+
Mock.calls = [];
275+
interpolant.evaluate( 10 );
276+
277+
actual = Mock.calls[ 0 ];
278+
expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
279+
deepEqual( actual, expect, JSON.stringify( expect ) );
280+
281+
ok( Mock.calls.length === 1, "no further calls" );
282+
283+
Mock.calls = []; // again - consider changed state
284+
interpolant.evaluate( 10 );
285+
286+
actual = Mock.calls[ 0 ];
287+
expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
288+
deepEqual( actual, expect, JSON.stringify( expect ) );
289+
290+
ok( Mock.calls.length === 1, "no further calls" );
291+
292+
// Check operation resumes normally and intervalChanged gets called
293+
Mock.calls = [];
294+
interpolant.evaluate( 11 );
295+
296+
actual = Mock.calls[ 0 ];
297+
expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
298+
deepEqual( actual, expect, JSON.stringify( expect ) );
299+
300+
actual = Mock.calls[ 1 ];
301+
expect = { func: 'interpolate', args: [ 1, 11, 11, 22 ] };
302+
deepEqual( actual, expect, JSON.stringify( expect ) );
303+
304+
ok( Mock.calls.length === 2, "no further calls" );
305+
306+
} );
307+
308+
test( "evaluate -> afterEnd_ [once]", function() {
309+
310+
var actual, expect;
311+
312+
var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
313+
314+
Mock.calls = [];
315+
interpolant.evaluate( 33 );
316+
317+
actual = Mock.calls[ 0 ];
318+
expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
319+
deepEqual( actual, expect, JSON.stringify( expect ) );
320+
321+
ok( Mock.calls.length === 1, "no further calls" );
322+
323+
// Check operation resumes normally and intervalChanged gets called
324+
Mock.calls = [];
325+
interpolant.evaluate( 32 );
326+
327+
actual = Mock.calls[ 0 ];
328+
expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
329+
deepEqual( actual, expect, JSON.stringify( expect ) );
330+
331+
actual = Mock.calls[ 1 ];
332+
expect = { func: 'interpolate', args: [ 2, 22, 32, 33 ] };
333+
deepEqual( actual, expect, JSON.stringify( expect ) );
334+
335+
ok( Mock.calls.length === 2, "no further calls" );
336+
337+
// Back off-bounds
338+
Mock.calls = [];
339+
interpolant.evaluate( 33 );
340+
341+
actual = Mock.calls[ 0 ];
342+
expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
343+
deepEqual( actual, expect, JSON.stringify( expect ) );
344+
345+
ok( Mock.calls.length === 1, "no further calls" );
346+
347+
} );
348+
349+
test( "evaluate -> afterEnd_ [twice]", function() {
350+
351+
var actual, expect;
352+
353+
var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
354+
355+
Mock.calls = [];
356+
interpolant.evaluate( 33 );
357+
358+
actual = Mock.calls[ 0 ];
359+
expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
360+
deepEqual( actual, expect, JSON.stringify( expect ) );
361+
362+
ok( Mock.calls.length === 1, "no further calls" );
363+
364+
Mock.calls = []; // again - consider changed state
365+
interpolant.evaluate( 33 );
366+
367+
actual = Mock.calls[ 0 ];
368+
expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
369+
deepEqual( actual, expect, JSON.stringify( expect ) );
370+
371+
ok( Mock.calls.length === 1, "no further calls" );
372+
373+
// Check operation resumes normally and intervalChanged gets called
374+
Mock.calls = [];
375+
interpolant.evaluate( 32 );
376+
377+
actual = Mock.calls[ 0 ];
378+
expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
379+
deepEqual( actual, expect, JSON.stringify( expect ) );
380+
381+
actual = Mock.calls[ 1 ];
382+
expect = { func: 'interpolate', args: [ 2, 22, 32, 33 ] };
383+
deepEqual( actual, expect, JSON.stringify( expect ) );
384+
385+
ok( Mock.calls.length === 2, "no further calls" );
386+
387+
} );

0 commit comments

Comments
 (0)