@@ -5,6 +5,14 @@ import lolex from 'lolex';
55const SET_TIMEOUT = setTimeout ;
66let fakeClock ;
77
8+ function escapeCurrentMicrotaskQueue ( ) {
9+ return new Promise ( ( resolve ) => {
10+ // this ensures that we have been to the end of the current
11+ // events microtask queue
12+ setTimeout ( resolve , 0 ) ;
13+ } ) ;
14+ }
15+
816QUnit . module ( 'tests/autorun' , {
917 afterEach ( ) {
1018 if ( fakeClock ) {
@@ -162,3 +170,153 @@ QUnit.test('autorun functions even when using fake timers', function(assert) {
162170 assert . ok ( bb . currentInstance , 'The DeferredActionQueues object exists' ) ;
163171 assert . equal ( step ++ , 1 ) ;
164172} ) ;
173+
174+ QUnit . test ( 'customizing flushing per queue via flush' , function ( assert ) {
175+ assert . step ( 'start' ) ;
176+
177+ let deferredFlush ;
178+
179+ let bb = new Backburner (
180+ [
181+ 'zomg' ,
182+ 'render' ,
183+ 'afterRender'
184+ ] ,
185+ {
186+ flush ( queueName , flush ) {
187+ if ( queueName === 'render' ) {
188+ deferredFlush = flush ;
189+ } else {
190+ flush ( ) ;
191+ }
192+ }
193+ }
194+ ) ;
195+
196+ bb . schedule ( 'zomg' , null , ( ) => {
197+ assert . step ( 'running zomg' ) ;
198+ } ) ;
199+
200+ bb . schedule ( 'render' , null , ( ) => {
201+ assert . step ( 'running render' ) ;
202+ } ) ;
203+
204+ bb . schedule ( 'afterRender' , null , ( ) => {
205+ assert . step ( 'running afterRender' ) ;
206+ } ) ;
207+
208+ return escapeCurrentMicrotaskQueue ( )
209+ . then ( ( ) => {
210+ deferredFlush ( ) ;
211+ } )
212+ . then ( escapeCurrentMicrotaskQueue )
213+ . then ( ( ) => {
214+ assert . verifySteps ( [
215+ 'start' ,
216+ 'running zomg' ,
217+ 'running render' ,
218+ 'running afterRender' ,
219+ ] ) ;
220+ } ) ;
221+ } ) ;
222+
223+ QUnit . test ( 'customized flushing - precedence is rechecked upon each flush' , function ( assert ) {
224+ assert . step ( 'start' ) ;
225+
226+ let deferredFlush ;
227+
228+ let bb = new Backburner (
229+ [
230+ 'zomg' ,
231+ 'render' ,
232+ 'afterRender'
233+ ] ,
234+ {
235+ flush ( queueName , flush ) {
236+ if ( deferredFlush === undefined && queueName === 'render' ) {
237+ deferredFlush = flush ;
238+ } else {
239+ flush ( ) ;
240+ }
241+ }
242+ }
243+ ) ;
244+
245+ bb . schedule ( 'zomg' , null , ( ) => {
246+ assert . step ( 'running zomg' ) ;
247+ } ) ;
248+
249+ bb . schedule ( 'render' , null , ( ) => {
250+ assert . step ( 'running render' ) ;
251+ } ) ;
252+
253+ bb . schedule ( 'afterRender' , null , ( ) => {
254+ assert . step ( 'running afterRender' ) ;
255+ } ) ;
256+
257+ return escapeCurrentMicrotaskQueue ( )
258+ . then ( ( ) => {
259+ bb . schedule ( 'zomg' , null , ( ) => {
260+ assert . step ( 'running zomg 2' ) ;
261+ } ) ;
262+
263+ deferredFlush ( ) ;
264+ } )
265+ . then ( escapeCurrentMicrotaskQueue )
266+ . then ( ( ) => {
267+ assert . verifySteps ( [
268+ 'start' ,
269+ 'running zomg' ,
270+ 'running zomg 2' ,
271+ 'running render' ,
272+ 'running afterRender' ,
273+ ] ) ;
274+ } ) ;
275+ } ) ;
276+
277+ QUnit . test ( 'customizing flushing per queue via flush - with forced run' , function ( assert ) {
278+ assert . step ( 'start' ) ;
279+
280+ let deferredFlush ;
281+
282+ let bb = new Backburner (
283+ [
284+ 'zomg' ,
285+ 'render' ,
286+ 'afterRender'
287+ ] ,
288+ {
289+ flush ( queueName , flush ) {
290+ if ( queueName === 'render' ) {
291+ deferredFlush = flush ;
292+ } else {
293+ flush ( ) ;
294+ }
295+ }
296+ }
297+ ) ;
298+
299+ bb . schedule ( 'zomg' , null , ( ) => {
300+ assert . step ( 'running zomg' ) ;
301+ } ) ;
302+
303+ bb . schedule ( 'render' , null , ( ) => {
304+ assert . step ( 'running render' ) ;
305+ } ) ;
306+
307+ bb . schedule ( 'afterRender' , null , ( ) => {
308+ assert . step ( 'running afterRender' ) ;
309+ } ) ;
310+
311+ return escapeCurrentMicrotaskQueue ( )
312+ . then ( ( ) => {
313+ bb . run ( ( ) => { } ) ;
314+
315+ assert . verifySteps ( [
316+ 'start' ,
317+ 'running zomg' ,
318+ 'running render' ,
319+ 'running afterRender' ,
320+ ] ) ;
321+ } ) ;
322+ } ) ;
0 commit comments