Interpolant.tests.js 12 KB

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