Interpolant.tests.js 12 KB

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