PriorityQueue.test.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 nextTick();
  67. expect( queue.currJobs ).toEqual( 0 );
  68. await nextFrame();
  69. expect( queue.currJobs ).toEqual( 1 );
  70. expect( called ).toEqual( 2 );
  71. } );
  72. it( 'should fire the callback with the item and priority.', async () => {
  73. const A = {};
  74. const queue = new PriorityQueue();
  75. queue.add( A, 100, ( item, priority ) => new Promise( () => {
  76. expect( item ).toEqual( A );
  77. expect( priority ).toEqual( 100 );
  78. } ) );
  79. await nextFrame();
  80. } );
  81. it( 'should return a promise that resolves from the add function.', async () => {
  82. const queue = new PriorityQueue();
  83. let result = null;
  84. queue.add( {}, 0, item => Promise.resolve( 1000 ) ).then( res => result = res );
  85. expect( result ).toEqual( null );
  86. await nextFrame();
  87. expect( result ).toEqual( 1000 );
  88. } );
  89. } );