123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553 |
- /**
- * @author tschw
- * @author TristanVALCKE / https://github.com/Itee
- */
- /* global QUnit */
- import { Interpolant } from '../../../../src/math/Interpolant';
- export default QUnit.module( 'Maths', () => {
- QUnit.module( 'Interpolant', () => {
- // Since this is an abstract base class, we have to make it concrete in order
- // to QUnit.test its functionality...
- function Mock( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
- Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
- }
- Mock.prototype = Object.create( Interpolant.prototype );
- Mock.prototype.intervalChanged_ = function intervalChanged( i1, t0, t1 ) {
- if ( Mock.calls !== null ) {
- Mock.calls.push( {
- func: 'intervalChanged',
- args: [ i1, t0, t1 ]
- } );
- }
- };
- Mock.prototype.interpolate_ = function interpolate( i1, t0, t, t1 ) {
- if ( Mock.calls !== null ) {
- Mock.calls.push( {
- func: 'interpolate',
- args: [ i1, t0, t, t1 ]
- } );
- }
- return this.copySampleValue_( i1 - 1 );
- };
- Mock.prototype.beforeStart_ = function beforeStart( i, t, t0 ) {
- if ( Mock.calls !== null ) {
- Mock.calls.push( {
- func: 'beforeStart',
- args: [ i, t, t0 ]
- } );
- }
- return this.copySampleValue_( i );
- };
- Mock.prototype.afterEnd_ = function afterEnd( i, tN, t ) {
- if ( Mock.calls !== null ) {
- Mock.calls.push( {
- func: 'afterEnd',
- args: [ i, tN, t ]
- } );
- }
- return this.copySampleValue_( i );
- };
- // Call capturing facility
- Mock.calls = null;
- Mock.captureCall = function ( args ) {
- if ( Mock.calls !== null ) {
- Mock.calls.push( {
- func: Mock.captureCall.caller.name,
- args: Array.prototype.slice.call( args )
- } );
- }
- };
- // Tests
- // INSTANCING
- QUnit.todo( "Instancing", ( assert ) => {
- assert.ok( false, "everything's gonna be alright" );
- } );
- // PUBLIC STUFF
- QUnit.todo( "evaluate", ( assert ) => {
- assert.ok( false, "everything's gonna be alright" );
- } );
- // PRIVATE STUFF
- QUnit.test( "copySampleValue_", ( assert ) => {
- var interpolant = new Mock( null, [ 1, 11, 2, 22, 3, 33 ], 2, [] );
- assert.deepEqual( interpolant.copySampleValue_( 0 ), [ 1, 11 ], "sample fetch (0)" );
- assert.deepEqual( interpolant.copySampleValue_( 1 ), [ 2, 22 ], "sample fetch (1)" );
- assert.deepEqual( interpolant.copySampleValue_( 2 ), [ 3, 33 ], "first sample (2)" );
- } );
- QUnit.test( "evaluate -> intervalChanged_ / interpolate_", ( assert ) => {
- var actual, expect;
- var interpolant = new Mock( [ 11, 22, 33, 44, 55, 66, 77, 88, 99 ], null, 0, null );
- Mock.calls = [];
- interpolant.evaluate( 11 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 1, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 12 ); // same interval
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 12, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 22 ); // step forward
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 2, 22, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 2, 22, 22, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2 );
- Mock.calls = [];
- interpolant.evaluate( 21 ); // step back
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 1, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 21, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 20 ); // same interval
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 20, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 43 ); // two steps forward
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 3, 33, 44 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 3, 33, 43, 44 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 12 ); // two steps back
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 1, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 12, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 77 ); // random access
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 7, 77, 88 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 7, 77, 77, 88 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 80 ); // same interval
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'interpolate',
- args: [ 7, 77, 80, 88 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 36 ); // random access
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 3, 33, 44 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 3, 33, 36, 44 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 24 ); // fast reset / loop (2nd)
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 2, 22, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 2, 22, 24, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- Mock.calls = [];
- interpolant.evaluate( 16 ); // fast reset / loop (2nd)
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 1, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 16, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- } );
- QUnit.test( "evaulate -> beforeStart_ [once]", ( assert ) => {
- var actual, expect;
- var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
- Mock.calls = [];
- interpolant.evaluate( 10 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'beforeStart',
- args: [ 0, 10, 11 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- // Check operation resumes normally and intervalChanged gets called
- Mock.calls = [];
- interpolant.evaluate( 11 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 1, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- // Back off-bounds
- Mock.calls = [];
- interpolant.evaluate( 10 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'beforeStart',
- args: [ 0, 10, 11 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- } );
- QUnit.test( "evaluate -> beforeStart_ [twice]", ( assert ) => {
- var actual, expect;
- var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
- Mock.calls = [];
- interpolant.evaluate( 10 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'beforeStart',
- args: [ 0, 10, 11 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- Mock.calls = []; // again - consider changed state
- interpolant.evaluate( 10 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'beforeStart',
- args: [ 0, 10, 11 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- // Check operation resumes normally and intervalChanged gets called
- Mock.calls = [];
- interpolant.evaluate( 11 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 1, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 1, 11, 11, 22 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- } );
- QUnit.test( "evaluate -> afterEnd_ [once]", ( assert ) => {
- var actual, expect;
- var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
- Mock.calls = [];
- interpolant.evaluate( 33 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'afterEnd',
- args: [ 2, 33, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- // Check operation resumes normally and intervalChanged gets called
- Mock.calls = [];
- interpolant.evaluate( 32 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 2, 22, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 2, 22, 32, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- // Back off-bounds
- Mock.calls = [];
- interpolant.evaluate( 33 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'afterEnd',
- args: [ 2, 33, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- } );
- QUnit.test( "evaluate -> afterEnd_ [twice]", ( assert ) => {
- var actual, expect;
- var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
- Mock.calls = [];
- interpolant.evaluate( 33 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'afterEnd',
- args: [ 2, 33, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- Mock.calls = []; // again - consider changed state
- interpolant.evaluate( 33 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'afterEnd',
- args: [ 2, 33, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 1, "no further calls" );
- // Check operation resumes normally and intervalChanged gets called
- Mock.calls = [];
- interpolant.evaluate( 32 );
- actual = Mock.calls[ 0 ];
- expect = {
- func: 'intervalChanged',
- args: [ 2, 22, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- actual = Mock.calls[ 1 ];
- expect = {
- func: 'interpolate',
- args: [ 2, 22, 32, 33 ]
- };
- assert.deepEqual( actual, expect, JSON.stringify( expect ) );
- assert.ok( Mock.calls.length === 2, "no further calls" );
- } );
- } );
- } );
|