Interpolant.tests.js 12 KB

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