@@ -47,6 +47,28 @@ test('PriorityQueue inserts high-priority items correctly after partial dequeue'
4747 assert . equal ( queue . dequeue ( ) , undefined ) ;
4848} ) ;
4949
50+ test ( 'PriorityQueue appends same-priority and lower-priority items correctly after partial dequeue' , ( ) => {
51+ const queue = new PriorityQueue ( ) ;
52+ const first = createRun ( 'first' ) ;
53+ const second = createRun ( 'second' ) ;
54+ const samePriority = createRun ( 'samePriority' ) ;
55+ const lowerPriority = createRun ( 'lowerPriority' ) ;
56+
57+ queue . enqueue ( first , { priority : 0 } ) ;
58+ queue . enqueue ( second , { priority : 0 } ) ;
59+
60+ assert . equal ( queue . dequeue ( ) , first ) ;
61+
62+ queue . enqueue ( samePriority , { priority : 0 } ) ;
63+ queue . enqueue ( lowerPriority , { priority : - 1 } ) ;
64+
65+ assert . equal ( queue . size , 3 ) ;
66+ assert . equal ( queue . dequeue ( ) , second ) ;
67+ assert . equal ( queue . dequeue ( ) , samePriority ) ;
68+ assert . equal ( queue . dequeue ( ) , lowerPriority ) ;
69+ assert . equal ( queue . dequeue ( ) , undefined ) ;
70+ } ) ;
71+
5072test ( 'PriorityQueue removes the live duplicate id after partial dequeue' , ( ) => {
5173 const queue = new PriorityQueue ( ) ;
5274 const first = createRun ( 'first' ) ;
@@ -85,30 +107,57 @@ test('PriorityQueue removes by run after partial dequeue', () => {
85107 assert . equal ( queue . dequeue ( ) , undefined ) ;
86108} ) ;
87109
110+ test ( 'PriorityQueue ignores consumed items with no live match' , ( ) => {
111+ const queue = new PriorityQueue ( ) ;
112+ const first = createRun ( 'first' ) ;
113+ const second = createRun ( 'second' ) ;
114+
115+ queue . enqueue ( first , { id : 'first' } ) ;
116+ queue . enqueue ( second , { id : 'second' } ) ;
117+
118+ assert . equal ( queue . dequeue ( ) , first ) ;
119+
120+ assert . throws (
121+ ( ) => {
122+ queue . setPriority ( 'first' , 1 ) ;
123+ } ,
124+ {
125+ name : 'ReferenceError' ,
126+ message : 'No promise function with the id "first" exists in the queue.' ,
127+ } ,
128+ ) ;
129+
130+ queue . remove ( first ) ;
131+
132+ assert . equal ( queue . size , 1 ) ;
133+ assert . equal ( queue . dequeue ( ) , second ) ;
134+ assert . equal ( queue . dequeue ( ) , undefined ) ;
135+ } ) ;
136+
88137test ( 'PriorityQueue stays ordered after cursor compaction' , ( ) => {
89138 const queue = new PriorityQueue ( ) ;
90139 const urgent = createRun ( 'urgent' ) ;
140+ const tasks = Array . from ( { length : 150 } , ( _element , index ) => createRun ( `task-${ index } ` ) ) ;
91141
92- for ( let index = 0 ; index < 150 ; index ++ ) {
93- queue . enqueue ( createRun ( ` task- ${ index } ` ) ) ;
142+ for ( const task of tasks ) {
143+ queue . enqueue ( task ) ;
94144 }
95145
96146 // Cross the compaction threshold while leaving queued items behind.
97147 for ( let index = 0 ; index < 120 ; index ++ ) {
98- assert . notEqual ( queue . dequeue ( ) , undefined ) ;
148+ assert . equal ( queue . dequeue ( ) , tasks [ index ] ) ;
99149 }
100150
101151 queue . enqueue ( urgent , { priority : 1 } ) ;
102152
103153 assert . equal ( queue . size , 31 ) ;
104154 assert . equal ( queue . dequeue ( ) , urgent ) ;
105155
106- let remaining = 0 ;
107- while ( queue . dequeue ( ) !== undefined ) {
108- remaining ++ ;
156+ for ( let index = 120 ; index < tasks . length ; index ++ ) {
157+ assert . equal ( queue . dequeue ( ) , tasks [ index ] ) ;
109158 }
110159
111- assert . equal ( remaining , 30 ) ;
160+ assert . equal ( queue . dequeue ( ) , undefined ) ;
112161 assert . equal ( queue . size , 0 ) ;
113162} ) ;
114163
0 commit comments