Interpolant.tests.js 12 KB

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