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();
  7. queue.maxJobs = 6;
  8. queue.add( {}, 6, () => new Promise( () => {} ) );
  9. queue.add( {}, 3, () => new Promise( () => {} ) );
  10. queue.add( {}, 4, () => new Promise( () => {} ) );
  11. queue.add( {}, 0, () => new Promise( () => {} ) );
  12. queue.add( {}, 8, () => new Promise( () => {} ) );
  13. queue.add( {}, 2, () => new Promise( () => {} ) );
  14. queue.add( {}, 1, () => new Promise( () => {} ) );
  15. await nextFrame();
  16. expect( queue.items.map( item => item.priority ) ).toEqual( [ 0 ] );
  17. expect( queue.currJobs ).toEqual( 6 );
  18. } );
  19. it( 'should add the jobs in the correct order.', () => {
  20. const queue = new PriorityQueue();
  21. queue.add( {}, 6, () => new Promise( () => {} ) );
  22. queue.add( {}, 3, () => new Promise( () => {} ) );
  23. queue.add( {}, 4, () => new Promise( () => {} ) );
  24. queue.add( {}, 0, () => new Promise( () => {} ) );
  25. queue.add( {}, 8, () => new Promise( () => {} ) );
  26. queue.add( {}, 2, () => new Promise( () => {} ) );
  27. queue.add( {}, 1, () => new Promise( () => {} ) );
  28. expect( queue.items.map( item => item.priority ) ).toEqual( [ 0, 1, 2, 3, 4, 6, 8 ] );
  29. } );
  30. it( 'should remove an item from the queue correctly.', () => {
  31. const A = {};
  32. const B = {};
  33. const C = {};
  34. const D = {};
  35. const queue = new PriorityQueue();
  36. queue.add( A, 0, () => new Promise( () => {} ) );
  37. queue.add( B, 1, () => new Promise( () => {} ) );
  38. queue.add( C, 2, () => new Promise( () => {} ) );
  39. queue.add( D, 3, () => new Promise( () => {} ) );
  40. expect( queue.items.map( item => item.item ) ).toEqual( [ A, B, C, D ] );
  41. queue.remove( C );
  42. expect( queue.items.map( item => item.item ) ).toEqual( [ A, B, D ] );
  43. queue.remove( A );
  44. expect( queue.items.map( item => item.item ) ).toEqual( [ B, D ] );
  45. queue.remove( B );
  46. expect( queue.items.map( item => item.item ) ).toEqual( [ D ] );
  47. queue.remove( D );
  48. expect( queue.items.map( item => item.item ) ).toEqual( [] );
  49. } );
  50. it( 'should automatically run new jobs when one is finished.', async () => {
  51. let called = 0;
  52. let resolveFunc = null;
  53. const queue = new PriorityQueue();
  54. queue.maxJobs = 1;
  55. queue.add( {}, 1, () => new Promise( resolve => {
  56. resolveFunc = resolve;
  57. called ++;
  58. } ) );
  59. queue.add( {}, 0, () => new Promise( () => {
  60. called ++;
  61. } ) );
  62. expect( queue.currJobs ).toEqual( 0 );
  63. await nextFrame();
  64. expect( queue.currJobs ).toEqual( 1 );
  65. expect( resolveFunc ).not.toEqual( null );
  66. expect( called ).toEqual( 1 );
  67. resolveFunc();
  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. } );