Interpolant.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. /**
  2. * @author tschw
  3. */
  4. module( "Interpolant" );
  5. // Since this is an abstract base class, we have to make it concrete in order
  6. // to test its functionality...
  7. function Mock( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
  8. THREE.Interpolant.call(
  9. this, parameterPositions, sampleValues, sampleSize, resultBuffer );
  10. }
  11. Mock.prototype = Object.create( THREE.Interpolant.prototype );
  12. Mock.prototype.intervalChanged_ = function intervalChanged( i1, t0, t1 ) {
  13. Mock.captureCall( arguments );
  14. };
  15. Mock.prototype.interpolate_ = function interpolate( i1, t0, t, t1 ) {
  16. Mock.captureCall( arguments );
  17. return this.copySampleValue_( i1 - 1 );
  18. };
  19. Mock.prototype.beforeStart_ = function beforeStart( i, t, t0 ) {
  20. Mock.captureCall( arguments );
  21. return this.copySampleValue_( i );
  22. };
  23. Mock.prototype.afterEnd_ = function afterEnd( i, tN, t ) {
  24. Mock.captureCall( arguments );
  25. return this.copySampleValue_( i );
  26. };
  27. // Call capturing facility
  28. Mock.calls = null;
  29. Mock.captureCall = function( args ) {
  30. if ( Mock.calls !== null ) {
  31. Mock.calls.push( {
  32. func: Mock.captureCall.caller.name,
  33. args: Array.prototype.slice.call( args )
  34. } );
  35. }
  36. };
  37. // Tests
  38. test( "copySampleValue_", function() {
  39. var interpolant = new Mock( null, [ 1, 11, 2, 22, 3, 33 ], 2, [] );
  40. deepEqual( interpolant.copySampleValue_( 0 ), [ 1, 11 ], "sample fetch (0)" );
  41. deepEqual( interpolant.copySampleValue_( 1 ), [ 2, 22 ], "sample fetch (1)" );
  42. deepEqual( interpolant.copySampleValue_( 2 ), [ 3, 33 ], "first sample (2)" );
  43. } );
  44. test( "evaluate -> intervalChanged_ / interpolate_", function() {
  45. var actual, expect;
  46. var interpolant = new Mock( [ 11, 22, 33, 44, 55, 66, 77, 88, 99 ], null, 0, null );
  47. Mock.calls = [];
  48. interpolant.evaluate( 11 );
  49. actual = Mock.calls[ 0 ];
  50. expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
  51. deepEqual( actual, expect, JSON.stringify( expect ) );
  52. actual = Mock.calls[ 1 ];
  53. expect = { func: 'interpolate', args: [ 1, 11, 11, 22 ] };
  54. deepEqual( actual, expect, JSON.stringify( expect ) );
  55. ok( Mock.calls.length === 2, "no further calls" );
  56. Mock.calls = [];
  57. interpolant.evaluate( 12 ); // same interval
  58. actual = Mock.calls[ 0 ];
  59. expect = { func: 'interpolate', args: [ 1, 11, 12, 22 ] };
  60. deepEqual( actual, expect, JSON.stringify( expect ) );
  61. ok( Mock.calls.length === 1, "no further calls" );
  62. Mock.calls = [];
  63. interpolant.evaluate( 22 ); // step forward
  64. actual = Mock.calls[ 0 ];
  65. expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
  66. deepEqual( actual, expect, JSON.stringify( expect ) );
  67. actual = Mock.calls[ 1 ];
  68. expect = { func: 'interpolate', args: [ 2, 22, 22, 33 ] };
  69. deepEqual( actual, expect, JSON.stringify( expect ) );
  70. ok( Mock.calls.length === 2 );
  71. Mock.calls = [];
  72. interpolant.evaluate( 21 ); // step back
  73. actual = Mock.calls[ 0 ];
  74. expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
  75. deepEqual( actual, expect, JSON.stringify( expect ) );
  76. actual = Mock.calls[ 1 ];
  77. expect = { func: 'interpolate', args: [ 1, 11, 21, 22 ] };
  78. deepEqual( actual, expect, JSON.stringify( expect ) );
  79. ok( Mock.calls.length === 2, "no further calls" );
  80. Mock.calls = [];
  81. interpolant.evaluate( 20 ); // same interval
  82. actual = Mock.calls[ 0 ];
  83. expect = { func: 'interpolate', args: [ 1, 11, 20, 22 ] };
  84. deepEqual( actual, expect, JSON.stringify( expect ) );
  85. ok( Mock.calls.length === 1, "no further calls" );
  86. Mock.calls = [];
  87. interpolant.evaluate( 43 ); // two steps forward
  88. actual = Mock.calls[ 0 ];
  89. expect = { func: 'intervalChanged', args: [ 3, 33, 44 ] };
  90. deepEqual( actual, expect, JSON.stringify( expect ) );
  91. actual = Mock.calls[ 1 ];
  92. expect = { func: 'interpolate', args: [ 3, 33, 43, 44 ] };
  93. deepEqual( actual, expect, JSON.stringify( expect ) );
  94. ok( Mock.calls.length === 2, "no further calls" );
  95. Mock.calls = [];
  96. interpolant.evaluate( 12 ); // two steps back
  97. actual = Mock.calls[ 0 ];
  98. expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
  99. deepEqual( actual, expect, JSON.stringify( expect ) );
  100. actual = Mock.calls[ 1 ];
  101. expect = { func: 'interpolate', args: [ 1, 11, 12, 22 ] };
  102. deepEqual( actual, expect, JSON.stringify( expect ) );
  103. ok( Mock.calls.length === 2, "no further calls" );
  104. Mock.calls = [];
  105. interpolant.evaluate( 77 ); // random access
  106. actual = Mock.calls[ 0 ];
  107. expect = { func: 'intervalChanged', args: [ 7, 77, 88 ] };
  108. deepEqual( actual, expect, JSON.stringify( expect ) );
  109. actual = Mock.calls[ 1 ];
  110. expect = { func: 'interpolate', args: [ 7, 77, 77, 88 ] };
  111. deepEqual( actual, expect, JSON.stringify( expect ) );
  112. ok( Mock.calls.length === 2, "no further calls" );
  113. Mock.calls = [];
  114. interpolant.evaluate( 80 ); // same interval
  115. actual = Mock.calls[ 0 ];
  116. expect = { func: 'interpolate', args: [ 7, 77, 80, 88 ] };
  117. deepEqual( actual, expect, JSON.stringify( expect ) );
  118. ok( Mock.calls.length === 1, "no further calls" );
  119. Mock.calls = [];
  120. interpolant.evaluate( 36 ); // random access
  121. actual = Mock.calls[ 0 ];
  122. expect = { func: 'intervalChanged', args: [ 3, 33, 44 ] };
  123. deepEqual( actual, expect, JSON.stringify( expect ) );
  124. actual = Mock.calls[ 1 ];
  125. expect = { func: 'interpolate', args: [ 3, 33, 36, 44 ] };
  126. deepEqual( actual, expect, JSON.stringify( expect ) );
  127. ok( Mock.calls.length === 2, "no further calls" );
  128. Mock.calls = [];
  129. interpolant.evaluate( 24 ); // fast reset / loop (2nd)
  130. actual = Mock.calls[ 0 ];
  131. expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
  132. deepEqual( actual, expect, JSON.stringify( expect ) );
  133. actual = Mock.calls[ 1 ];
  134. expect = { func: 'interpolate', args: [ 2, 22, 24, 33 ] };
  135. deepEqual( actual, expect, JSON.stringify( expect ) );
  136. ok( Mock.calls.length === 2, "no further calls" );
  137. Mock.calls = [];
  138. interpolant.evaluate( 16 ); // fast reset / loop (2nd)
  139. actual = Mock.calls[ 0 ];
  140. expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
  141. deepEqual( actual, expect, JSON.stringify( expect ) );
  142. actual = Mock.calls[ 1 ];
  143. expect = { func: 'interpolate', args: [ 1, 11, 16, 22 ] };
  144. deepEqual( actual, expect, JSON.stringify( expect ) );
  145. ok( Mock.calls.length === 2, "no further calls" );
  146. } );
  147. test( "evaulate -> beforeStart_ [once]", function() {
  148. var actual, expect;
  149. var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
  150. Mock.calls = [];
  151. interpolant.evaluate( 10 );
  152. actual = Mock.calls[ 0 ];
  153. expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
  154. deepEqual( actual, expect, JSON.stringify( expect ) );
  155. ok( Mock.calls.length === 1, "no further calls" );
  156. // Check operation resumes normally and intervalChanged gets called
  157. Mock.calls = [];
  158. interpolant.evaluate( 11 );
  159. actual = Mock.calls[ 0 ];
  160. expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
  161. deepEqual( actual, expect, JSON.stringify( expect ) );
  162. actual = Mock.calls[ 1 ];
  163. expect = { func: 'interpolate', args: [ 1, 11, 11, 22 ] };
  164. deepEqual( actual, expect, JSON.stringify( expect ) );
  165. ok( Mock.calls.length === 2, "no further calls" );
  166. // Back off-bounds
  167. Mock.calls = [];
  168. interpolant.evaluate( 10 );
  169. actual = Mock.calls[ 0 ];
  170. expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
  171. deepEqual( actual, expect, JSON.stringify( expect ) );
  172. ok( Mock.calls.length === 1, "no further calls" );
  173. } );
  174. test( "evaluate -> beforeStart_ [twice]", function() {
  175. var actual, expect;
  176. var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
  177. Mock.calls = [];
  178. interpolant.evaluate( 10 );
  179. actual = Mock.calls[ 0 ];
  180. expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
  181. deepEqual( actual, expect, JSON.stringify( expect ) );
  182. ok( Mock.calls.length === 1, "no further calls" );
  183. Mock.calls = []; // again - consider changed state
  184. interpolant.evaluate( 10 );
  185. actual = Mock.calls[ 0 ];
  186. expect = { func: 'beforeStart', args: [ 0, 10, 11 ] };
  187. deepEqual( actual, expect, JSON.stringify( expect ) );
  188. ok( Mock.calls.length === 1, "no further calls" );
  189. // Check operation resumes normally and intervalChanged gets called
  190. Mock.calls = [];
  191. interpolant.evaluate( 11 );
  192. actual = Mock.calls[ 0 ];
  193. expect = { func: 'intervalChanged', args: [ 1, 11, 22 ] };
  194. deepEqual( actual, expect, JSON.stringify( expect ) );
  195. actual = Mock.calls[ 1 ];
  196. expect = { func: 'interpolate', args: [ 1, 11, 11, 22 ] };
  197. deepEqual( actual, expect, JSON.stringify( expect ) );
  198. ok( Mock.calls.length === 2, "no further calls" );
  199. } );
  200. test( "evaluate -> afterEnd_ [once]", function() {
  201. var actual, expect;
  202. var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
  203. Mock.calls = [];
  204. interpolant.evaluate( 33 );
  205. actual = Mock.calls[ 0 ];
  206. expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
  207. deepEqual( actual, expect, JSON.stringify( expect ) );
  208. ok( Mock.calls.length === 1, "no further calls" );
  209. // Check operation resumes normally and intervalChanged gets called
  210. Mock.calls = [];
  211. interpolant.evaluate( 32 );
  212. actual = Mock.calls[ 0 ];
  213. expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
  214. deepEqual( actual, expect, JSON.stringify( expect ) );
  215. actual = Mock.calls[ 1 ];
  216. expect = { func: 'interpolate', args: [ 2, 22, 32, 33 ] };
  217. deepEqual( actual, expect, JSON.stringify( expect ) );
  218. ok( Mock.calls.length === 2, "no further calls" );
  219. // Back off-bounds
  220. Mock.calls = [];
  221. interpolant.evaluate( 33 );
  222. actual = Mock.calls[ 0 ];
  223. expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
  224. deepEqual( actual, expect, JSON.stringify( expect ) );
  225. ok( Mock.calls.length === 1, "no further calls" );
  226. } );
  227. test( "evaluate -> afterEnd_ [twice]", function() {
  228. var actual, expect;
  229. var interpolant = new Mock( [ 11, 22, 33 ], null, 0, null );
  230. Mock.calls = [];
  231. interpolant.evaluate( 33 );
  232. actual = Mock.calls[ 0 ];
  233. expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
  234. deepEqual( actual, expect, JSON.stringify( expect ) );
  235. ok( Mock.calls.length === 1, "no further calls" );
  236. Mock.calls = []; // again - consider changed state
  237. interpolant.evaluate( 33 );
  238. actual = Mock.calls[ 0 ];
  239. expect = { func: 'afterEnd', args: [ 2, 33, 33 ] };
  240. deepEqual( actual, expect, JSON.stringify( expect ) );
  241. ok( Mock.calls.length === 1, "no further calls" );
  242. // Check operation resumes normally and intervalChanged gets called
  243. Mock.calls = [];
  244. interpolant.evaluate( 32 );
  245. actual = Mock.calls[ 0 ];
  246. expect = { func: 'intervalChanged', args: [ 2, 22, 33 ] };
  247. deepEqual( actual, expect, JSON.stringify( expect ) );
  248. actual = Mock.calls[ 1 ];
  249. expect = { func: 'interpolate', args: [ 2, 22, 32, 33 ] };
  250. deepEqual( actual, expect, JSON.stringify( expect ) );
  251. ok( Mock.calls.length === 2, "no further calls" );
  252. } );