PriorityQueue.test.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { PriorityQueue } from '../src/utilities/PriorityQueue.js';
  2. const nextFrame = () => new Promise( resolve => requestAnimationFrame( resolve ) );
  3. const nextTick = () => new Promise( resolve => process.nextTick( resolve ) );
  4. describe( 'PriorityQueue', () => {
  5. it( 'should run jobs automatically in the correct order.', async () => {
  6. const queue = new PriorityQueue( 6 );
  7. queue.add( {}, 6, () => new Promise( () => {} ) );
  8. queue.add( {}, 3, () => new Promise( () => {} ) );
  9. queue.add( {}, 4, () => new Promise( () => {} ) );
  10. queue.add( {}, 0, () => new Promise( () => {} ) );
  11. queue.add( {}, 8, () => new Promise( () => {} ) );
  12. queue.add( {}, 2, () => new Promise( () => {} ) );
  13. queue.add( {}, 1, () => new Promise( () => {} ) );
  14. await nextFrame();
  15. expect( queue.items.map( item => item.priority ) ).toEqual( [ 0 ] );
  16. expect( queue.currJobs ).toEqual( 6 );
  17. } );
  18. it( 'should add the jobs in the correct order.', () => {
  19. const queue = new PriorityQueue();
  20. queue.add( {}, 6, () => new Promise( () => {} ) );
  21. queue.add( {}, 3, () => new Promise( () => {} ) );
  22. queue.add( {}, 4, () => new Promise( () => {} ) );
  23. queue.add( {}, 0, () => new Promise( () => {} ) );
  24. queue.add( {}, 8, () => new Promise( () => {} ) );
  25. queue.add( {}, 2, () => new Promise( () => {} ) );
  26. queue.add( {}, 1, () => new Promise( () => {} ) );
  27. expect( queue.items.map( item => item.priority ) ).toEqual( [ 0, 1, 2, 3, 4, 6, 8 ] );
  28. } );
  29. it( 'should remove an item from the queue correctly.', () => {
  30. const A = {};
  31. const B = {};
  32. const C = {};
  33. const D = {};
  34. const queue = new PriorityQueue();
  35. queue.add( A, 0, () => new Promise( () => {} ) );
  36. queue.add( B, 1, () => new Promise( () => {} ) );
  37. queue.add( C, 2, () => new Promise( () => {} ) );
  38. queue.add( D, 3, () => new Promise( () => {} ) );
  39. expect( queue.items.map( item => item.item ) ).toEqual( [ A, B, C, D ] );
  40. queue.remove( C );
  41. expect( queue.items.map( item => item.item ) ).toEqual( [ A, B, D ] );
  42. queue.remove( A );
  43. expect( queue.items.map( item => item.item ) ).toEqual( [ B, D ] );
  44. queue.remove( B );
  45. expect( queue.items.map( item => item.item ) ).toEqual( [ D ] );
  46. queue.remove( D );
  47. expect( queue.items.map( item => item.item ) ).toEqual( [] );
  48. } );
  49. it( 'should automatically run new jobs when one is finished.', async () => {
  50. let called = 0;
  51. let resolveFunc = null;
  52. const queue = new PriorityQueue( 1 );
  53. queue.add( {}, 1, () => new Promise( resolve => {
  54. resolveFunc = resolve;
  55. called ++;
  56. } ) );
  57. queue.add( {}, 0, () => new Promise( () => {
  58. called ++;
  59. } ) );
  60. expect( queue.currJobs ).toEqual( 0 );
  61. await nextFrame();
  62. expect( queue.currJobs ).toEqual( 1 );
  63. expect( resolveFunc ).not.toEqual( null );
  64. expect( called ).toEqual( 1 );
  65. resolveFunc();
  66. await nextFrame();
  67. expect( queue.currJobs ).toEqual( 1 );
  68. expect( called ).toEqual( 2 );
  69. } );
  70. it( 'should fire the callback with the item and priority.', async () => {
  71. const A = {};
  72. const queue = new PriorityQueue();
  73. queue.add( A, 100, ( item, priority ) => new Promise( () => {
  74. expect( item ).toEqual( A );
  75. expect( priority ).toEqual( 100 );
  76. } ) );
  77. await nextFrame();
  78. } );
  79. it( 'should return a promise that resolves from the add function.', async () => {
  80. const queue = new PriorityQueue();
  81. let result = null;
  82. queue.add( {}, 0, item => Promise.resolve( 1000 ) ).then( res => result = res );
  83. expect( result ).toEqual( null );
  84. await nextFrame();
  85. expect( result ).toEqual( 1000 );
  86. } );
  87. } );