| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {ifEnvSupports} from '../test-util'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('AsyncTestZoneSpec', function() { | 
					
						
							|  |  |  |   let log: string[]; | 
					
						
							|  |  |  |   const AsyncTestZoneSpec = (Zone as any)['AsyncTestZoneSpec']; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   function finishCallback() { | 
					
						
							|  |  |  |     log.push('finish'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   function failCallback() { | 
					
						
							|  |  |  |     log.push('fail'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   beforeEach(() => { | 
					
						
							|  |  |  |     log = []; | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should call finish after zone is run in sync call', (done) => { | 
					
						
							|  |  |  |     let finished = false; | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec(() => { | 
					
						
							|  |  |  |       expect(finished).toBe(true); | 
					
						
							|  |  |  |       done(); | 
					
						
							|  |  |  |     }, failCallback, 'name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     atz.run(function() { | 
					
						
							|  |  |  |       finished = true; | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should call finish after a setTimeout is done', (done) => { | 
					
						
							|  |  |  |     let finished = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							|  |  |  |         () => { | 
					
						
							|  |  |  |           expect(finished).toBe(true); | 
					
						
							|  |  |  |           done(); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'name'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     atz.run(function() { | 
					
						
							|  |  |  |       setTimeout(() => { | 
					
						
							|  |  |  |         finished = true; | 
					
						
							|  |  |  |       }, 10); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should call finish after microtasks are done', (done) => { | 
					
						
							|  |  |  |     let finished = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							|  |  |  |         () => { | 
					
						
							|  |  |  |           expect(finished).toBe(true); | 
					
						
							|  |  |  |           done(); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'name'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     atz.run(function() { | 
					
						
							|  |  |  |       Promise.resolve().then(() => { | 
					
						
							|  |  |  |         finished = true; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should call finish after both micro and macrotasks are done', (done) => { | 
					
						
							|  |  |  |     let finished = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							|  |  |  |         () => { | 
					
						
							|  |  |  |           expect(finished).toBe(true); | 
					
						
							|  |  |  |           done(); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'name'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     atz.run(function() { | 
					
						
							| 
									
										
										
										
											2020-11-04 19:58:29 -05:00
										 |  |  |       new Promise<void>((resolve) => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |           resolve(); | 
					
						
							|  |  |  |         }, 10); | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |         finished = true; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should call finish after both macro and microtasks are done', (done) => { | 
					
						
							|  |  |  |     let finished = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							|  |  |  |         () => { | 
					
						
							|  |  |  |           expect(finished).toBe(true); | 
					
						
							|  |  |  |           done(); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'name'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     atz.run(function() { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       Promise.resolve().then(() => { | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |           finished = true; | 
					
						
							|  |  |  |         }, 10); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('event tasks', ifEnvSupports('document', () => { | 
					
						
							|  |  |  |              let button: HTMLButtonElement; | 
					
						
							|  |  |  |              beforeEach(function() { | 
					
						
							|  |  |  |                button = document.createElement('button'); | 
					
						
							|  |  |  |                document.body.appendChild(button); | 
					
						
							|  |  |  |              }); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              afterEach(function() { | 
					
						
							|  |  |  |                document.body.removeChild(button); | 
					
						
							|  |  |  |              }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |              it('should call finish because an event task is considered as sync', (done) => { | 
					
						
							|  |  |  |                let finished = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							|  |  |  |                    () => { | 
					
						
							|  |  |  |                      expect(finished).toBe(true); | 
					
						
							|  |  |  |                      done(); | 
					
						
							|  |  |  |                    }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                    () => { | 
					
						
							|  |  |  |                      done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |                    }, | 
					
						
							|  |  |  |                    'name'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |                const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                atz.run(function() { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                  const listener = () => { | 
					
						
							|  |  |  |                    finished = true; | 
					
						
							|  |  |  |                  }; | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                  button.addEventListener('click', listener); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  const clickEvent = document.createEvent('Event'); | 
					
						
							|  |  |  |                  clickEvent.initEvent('click', true, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  button.dispatchEvent(clickEvent); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              it('should call finish after an event task is done asynchronously', (done) => { | 
					
						
							|  |  |  |                let finished = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							|  |  |  |                    () => { | 
					
						
							|  |  |  |                      expect(finished).toBe(true); | 
					
						
							|  |  |  |                      done(); | 
					
						
							|  |  |  |                    }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                    () => { | 
					
						
							|  |  |  |                      done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |                    }, | 
					
						
							|  |  |  |                    'name'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |                const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                atz.run(function() { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                  button.addEventListener('click', () => { | 
					
						
							|  |  |  |                    setTimeout(() => { | 
					
						
							|  |  |  |                      finished = true; | 
					
						
							|  |  |  |                    }, 10); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |                  const clickEvent = document.createEvent('Event'); | 
					
						
							|  |  |  |                  clickEvent.initEvent('click', true, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  button.dispatchEvent(clickEvent); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('XHRs', ifEnvSupports('XMLHttpRequest', () => { | 
					
						
							|  |  |  |              it('should wait for XHRs to complete', function(done) { | 
					
						
							|  |  |  |                let req: XMLHttpRequest; | 
					
						
							|  |  |  |                let finished = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							|  |  |  |                    () => { | 
					
						
							|  |  |  |                      expect(finished).toBe(true); | 
					
						
							|  |  |  |                      done(); | 
					
						
							|  |  |  |                    }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                    (err: Error) => { | 
					
						
							|  |  |  |                      done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |                    }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                    'name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                atz.run(function() { | 
					
						
							|  |  |  |                  req = new XMLHttpRequest(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  req.onreadystatechange = () => { | 
					
						
							|  |  |  |                    if (req.readyState === XMLHttpRequest.DONE) { | 
					
						
							|  |  |  |                      finished = true; | 
					
						
							|  |  |  |                    } | 
					
						
							|  |  |  |                  }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  req.open('get', '/', true); | 
					
						
							|  |  |  |                  req.send(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              it('should fail if an xhr fails', function(done) { | 
					
						
							|  |  |  |                let req: XMLHttpRequest; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                    () => { | 
					
						
							|  |  |  |                      done.fail('expected failCallback to be called'); | 
					
						
							|  |  |  |                    }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                    (err: Error) => { | 
					
						
							|  |  |  |                      expect(err.message).toEqual('bad url failure'); | 
					
						
							|  |  |  |                      done(); | 
					
						
							|  |  |  |                    }, | 
					
						
							|  |  |  |                    'name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                atz.run(function() { | 
					
						
							|  |  |  |                  req = new XMLHttpRequest(); | 
					
						
							|  |  |  |                  req.onload = () => { | 
					
						
							|  |  |  |                    if (req.status != 200) { | 
					
						
							|  |  |  |                      throw new Error('bad url failure'); | 
					
						
							|  |  |  |                    } | 
					
						
							|  |  |  |                  }; | 
					
						
							|  |  |  |                  req.open('get', '/bad-url', true); | 
					
						
							|  |  |  |                  req.send(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should not fail if setInterval is used and canceled', (done) => { | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           done(); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         (err: Error) => { | 
					
						
							|  |  |  |           done.fail('async zone called failCallback unexpectedly'); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'name'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     atz.run(function() { | 
					
						
							|  |  |  |       let id = setInterval(() => { | 
					
						
							|  |  |  |         clearInterval(id); | 
					
						
							|  |  |  |       }, 100); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should fail if an error is thrown asynchronously', (done) => { | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           done.fail('expected failCallback to be called'); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |         (err: Error) => { | 
					
						
							|  |  |  |           expect(err.message).toEqual('my error'); | 
					
						
							|  |  |  |           done(); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     atz.run(function() { | 
					
						
							|  |  |  |       setTimeout(() => { | 
					
						
							|  |  |  |         throw new Error('my error'); | 
					
						
							|  |  |  |       }, 10); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should fail if a promise rejection is unhandled', (done) => { | 
					
						
							|  |  |  |     const testZoneSpec = new AsyncTestZoneSpec( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         () => { | 
					
						
							|  |  |  |           done.fail('expected failCallback to be called'); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |         (err: Error) => { | 
					
						
							|  |  |  |           expect(err.message).toEqual('Uncaught (in promise): my reason'); | 
					
						
							|  |  |  |           done(); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const atz = Zone.current.fork(testZoneSpec); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     atz.run(function() { | 
					
						
							|  |  |  |       Promise.reject('my reason'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const asyncTest: any = (Zone as any)[Zone.__symbol__('asyncTest')]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function wrapAsyncTest(fn: Function, doneFn?: Function) { | 
					
						
							| 
									
										
										
										
											2019-06-26 10:33:02 +02:00
										 |  |  |     return function(this: unknown, done: Function) { | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |       const asyncWrapper = asyncTest(fn); | 
					
						
							| 
									
										
										
										
											2019-06-26 10:33:02 +02:00
										 |  |  |       return asyncWrapper.apply(this, [function(this: unknown) { | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                                   if (doneFn) { | 
					
						
							|  |  |  |                                     doneFn(); | 
					
						
							|  |  |  |                                   } | 
					
						
							|  |  |  |                                   return done.apply(this, arguments); | 
					
						
							|  |  |  |                                 }]); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('async', () => { | 
					
						
							|  |  |  |     describe('non zone aware async task in promise should be detected', () => { | 
					
						
							|  |  |  |       let finished = false; | 
					
						
							|  |  |  |       const _global: any = | 
					
						
							|  |  |  |           typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global; | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         _global[Zone.__symbol__('supportWaitUnResolvedChainedPromise')] = true; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       afterEach(() => { | 
					
						
							|  |  |  |         _global[Zone.__symbol__('supportWaitUnResolvedChainedPromise')] = false; | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |       it('should be able to detect non zone aware async task in promise', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							|  |  |  |              () => { | 
					
						
							|  |  |  |                new Promise((res, rej) => { | 
					
						
							|  |  |  |                  const g: any = typeof window === 'undefined' ? global : window; | 
					
						
							|  |  |  |                  g[Zone.__symbol__('setTimeout')](res, 100); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                }).then(() => { | 
					
						
							|  |  |  |                  finished = true; | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                expect(finished).toBe(true); | 
					
						
							|  |  |  |              })); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('test without beforeEach', () => { | 
					
						
							|  |  |  |       const logs: string[] = []; | 
					
						
							|  |  |  |       it('should automatically done after async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['timeout']); | 
					
						
							|  |  |  |                logs.splice(0); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after all nested async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							|  |  |  |              () => { | 
					
						
							|  |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('timeout'); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                  setTimeout(() => { | 
					
						
							|  |  |  |                    logs.push('nested timeout'); | 
					
						
							|  |  |  |                  }, 100); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                }, 100); | 
					
						
							|  |  |  |              }, | 
					
						
							|  |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['timeout', 'nested timeout']); | 
					
						
							|  |  |  |                logs.splice(0); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after multiple async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							|  |  |  |              () => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('1st timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('2nd timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              }, | 
					
						
							|  |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['1st timeout', '2nd timeout']); | 
					
						
							|  |  |  |                logs.splice(0); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('test with sync beforeEach', () => { | 
					
						
							|  |  |  |       const logs: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         logs.splice(0); | 
					
						
							|  |  |  |         logs.push('beforeEach'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['beforeEach', 'timeout']); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('test with async beforeEach', () => { | 
					
						
							|  |  |  |       const logs: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(wrapAsyncTest(() => { | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |           logs.splice(0); | 
					
						
							|  |  |  |           logs.push('beforeEach'); | 
					
						
							|  |  |  |         }, 100); | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['beforeEach', 'timeout']); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after all nested async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							|  |  |  |              () => { | 
					
						
							|  |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('timeout'); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                  setTimeout(() => { | 
					
						
							|  |  |  |                    logs.push('nested timeout'); | 
					
						
							|  |  |  |                  }, 100); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                }, 100); | 
					
						
							|  |  |  |              }, | 
					
						
							|  |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['beforeEach', 'timeout', 'nested timeout']); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after multiple async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							|  |  |  |              () => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('1st timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('2nd timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              }, | 
					
						
							|  |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['beforeEach', '1st timeout', '2nd timeout']); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('test with async beforeEach and sync afterEach', () => { | 
					
						
							|  |  |  |       const logs: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(wrapAsyncTest(() => { | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |           expect(logs).toEqual([]); | 
					
						
							|  |  |  |           logs.push('beforeEach'); | 
					
						
							|  |  |  |         }, 100); | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       afterEach(() => { | 
					
						
							|  |  |  |         logs.splice(0); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['beforeEach', 'timeout']); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('test with async beforeEach and async afterEach', () => { | 
					
						
							|  |  |  |       const logs: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(wrapAsyncTest(() => { | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |           expect(logs).toEqual([]); | 
					
						
							|  |  |  |           logs.push('beforeEach'); | 
					
						
							|  |  |  |         }, 100); | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       afterEach(wrapAsyncTest(() => { | 
					
						
							|  |  |  |         setTimeout(() => { | 
					
						
							|  |  |  |           logs.splice(0); | 
					
						
							|  |  |  |         }, 100); | 
					
						
							|  |  |  |       })); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should automatically done after async tasks finished', | 
					
						
							|  |  |  |          wrapAsyncTest( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                setTimeout(() => { | 
					
						
							|  |  |  |                  logs.push('timeout'); | 
					
						
							|  |  |  |                }, 100); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                expect(logs).toEqual(['beforeEach', 'timeout']); | 
					
						
							|  |  |  |              })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |