Interpolant.tests.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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. // Call capturing facility
  30. Mock.calls = null;
  31. // Tests
  32. // INSTANCING
  33. QUnit.test( 'Instancing', ( assert ) => {
  34. const interpolant = new Mock( null, [ 1, 11, 2, 22, 3, 33 ], 2, [] );
  35. assert.strictEqual(
  36. interpolant instanceof Interpolant, true,
  37. 'Mock extends from Interpolant'
  38. );
  39. } );
  40. // PROPERTIES
  41. QUnit.todo( 'parameterPositions', ( assert ) => {
  42. assert.ok( false, 'everything\'s gonna be alright' );
  43. } );
  44. QUnit.todo( 'resultBuffer', ( assert ) => {
  45. assert.ok( false, 'everything\'s gonna be alright' );
  46. } );
  47. QUnit.todo( 'sampleValues', ( assert ) => {
  48. assert.ok( false, 'everything\'s gonna be alright' );
  49. } );
  50. QUnit.todo( 'valueSize', ( assert ) => {
  51. assert.ok( false, 'everything\'s gonna be alright' );
  52. } );
  53. QUnit.todo( 'settings', ( assert ) => {
  54. assert.ok( false, 'everything\'s gonna be alright' );
  55. } );
  56. // PUBLIC
  57. QUnit.todo( 'evaluate', ( assert ) => {
  58. assert.ok( false, 'everything\'s gonna be alright' );
  59. } );
  60. // PRIVATE
  61. QUnit.test( 'copySampleValue_', ( assert ) => {
  62. const interpolant = new Mock( null, [ 1, 11, 2, 22, 3, 33 ], 2, [] );
  63. assert.deepEqual( interpolant.copySampleValue_( 0 ), [ 1, 11 ], 'sample fetch (0)' );
  64. assert.deepEqual( interpolant.copySampleValue_( 1 ), [ 2, 22 ], 'sample fetch (1)' );
  65. assert.deepEqual( interpolant.copySampleValue_( 2 ), [ 3, 33 ], 'first sample (2)' );
  66. } );
  67. QUnit.test( 'evaluate -> intervalChanged_ / interpolate_', ( assert ) => {
  68. let actual, expect;
  69. const interpolant = new Mock( [ 11, 22, 33, 44, 55, 66, 77, 88, 99 ], null, 0, null );
  70. Mock.calls = [];
  71. interpolant.evaluate( 11 );
  72. actual = Mock.calls[ 0 ];
  73. expect = {
  74. func: 'intervalChanged',
  75. args: [ 1, 11, 22 ]
  76. };
  77. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  78. actual = Mock.calls[ 1 ];
  79. expect = {
  80. func: 'interpolate',
  81. args: [ 1, 11, 11, 22 ]
  82. };
  83. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  84. assert.ok( Mock.calls.length === 2, 'no further calls' );
  85. Mock.calls = [];
  86. interpolant.evaluate( 12 ); // same interval
  87. actual = Mock.calls[ 0 ];
  88. expect = {
  89. func: 'interpolate',
  90. args: [ 1, 11, 12, 22 ]
  91. };
  92. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  93. assert.ok( Mock.calls.length === 1, 'no further calls' );
  94. Mock.calls = [];
  95. interpolant.evaluate( 22 ); // step forward
  96. actual = Mock.calls[ 0 ];
  97. expect = {
  98. func: 'intervalChanged',
  99. args: [ 2, 22, 33 ]
  100. };
  101. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  102. actual = Mock.calls[ 1 ];
  103. expect = {
  104. func: 'interpolate',
  105. args: [ 2, 22, 22, 33 ]
  106. };
  107. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  108. assert.ok( Mock.calls.length === 2 );
  109. Mock.calls = [];
  110. interpolant.evaluate( 21 ); // step back
  111. actual = Mock.calls[ 0 ];
  112. expect = {
  113. func: 'intervalChanged',
  114. args: [ 1, 11, 22 ]
  115. };
  116. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  117. actual = Mock.calls[ 1 ];
  118. expect = {
  119. func: 'interpolate',
  120. args: [ 1, 11, 21, 22 ]
  121. };
  122. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  123. assert.ok( Mock.calls.length === 2, 'no further calls' );
  124. Mock.calls = [];
  125. interpolant.evaluate( 20 ); // same interval
  126. actual = Mock.calls[ 0 ];
  127. expect = {
  128. func: 'interpolate',
  129. args: [ 1, 11, 20, 22 ]
  130. };
  131. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  132. assert.ok( Mock.calls.length === 1, 'no further calls' );
  133. Mock.calls = [];
  134. interpolant.evaluate( 43 ); // two steps forward
  135. actual = Mock.calls[ 0 ];
  136. expect = {
  137. func: 'intervalChanged',
  138. args: [ 3, 33, 44 ]
  139. };
  140. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  141. actual = Mock.calls[ 1 ];
  142. expect = {
  143. func: 'interpolate',
  144. args: [ 3, 33, 43, 44 ]
  145. };
  146. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  147. assert.ok( Mock.calls.length === 2, 'no further calls' );
  148. Mock.calls = [];
  149. interpolant.evaluate( 12 ); // two steps back
  150. actual = Mock.calls[ 0 ];
  151. expect = {
  152. func: 'intervalChanged',
  153. args: [ 1, 11, 22 ]
  154. };
  155. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  156. actual = Mock.calls[ 1 ];
  157. expect = {
  158. func: 'interpolate',
  159. args: [ 1, 11, 12, 22 ]
  160. };
  161. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  162. assert.ok( Mock.calls.length === 2, 'no further calls' );
  163. Mock.calls = [];
  164. interpolant.evaluate( 77 ); // random access
  165. actual = Mock.calls[ 0 ];
  166. expect = {
  167. func: 'intervalChanged',
  168. args: [ 7, 77, 88 ]
  169. };
  170. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  171. actual = Mock.calls[ 1 ];
  172. expect = {
  173. func: 'interpolate',
  174. args: [ 7, 77, 77, 88 ]
  175. };
  176. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  177. assert.ok( Mock.calls.length === 2, 'no further calls' );
  178. Mock.calls = [];
  179. interpolant.evaluate( 80 ); // same interval
  180. actual = Mock.calls[ 0 ];
  181. expect = {
  182. func: 'interpolate',
  183. args: [ 7, 77, 80, 88 ]
  184. };
  185. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  186. assert.ok( Mock.calls.length === 1, 'no further calls' );
  187. Mock.calls = [];
  188. interpolant.evaluate( 36 ); // random access
  189. actual = Mock.calls[ 0 ];
  190. expect = {
  191. func: 'intervalChanged',
  192. args: [ 3, 33, 44 ]
  193. };
  194. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  195. actual = Mock.calls[ 1 ];
  196. expect = {
  197. func: 'interpolate',
  198. args: [ 3, 33, 36, 44 ]
  199. };
  200. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  201. assert.ok( Mock.calls.length === 2, 'no further calls' );
  202. Mock.calls = [];
  203. interpolant.evaluate( 24 ); // fast reset / loop (2nd)
  204. actual = Mock.calls[ 0 ];
  205. expect = {
  206. func: 'intervalChanged',
  207. args: [ 2, 22, 33 ]
  208. };
  209. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  210. actual = Mock.calls[ 1 ];
  211. expect = {
  212. func: 'interpolate',
  213. args: [ 2, 22, 24, 33 ]
  214. };
  215. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  216. assert.ok( Mock.calls.length === 2, 'no further calls' );
  217. Mock.calls = [];
  218. interpolant.evaluate( 16 ); // fast reset / loop (2nd)
  219. actual = Mock.calls[ 0 ];
  220. expect = {
  221. func: 'intervalChanged',
  222. args: [ 1, 11, 22 ]
  223. };
  224. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  225. actual = Mock.calls[ 1 ];
  226. expect = {
  227. func: 'interpolate',
  228. args: [ 1, 11, 16, 22 ]
  229. };
  230. assert.deepEqual( actual, expect, JSON.stringify( expect ) );
  231. assert.ok( Mock.calls.length === 2, 'no further calls' );
  232. } );
  233. } );
  234. } );