Interpolant.tests.js 13 KB

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