| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright Microsoft Corporation. All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 15:11:44 -08:00
										 |  |  | import { test, expect } from './playwright-test-fixtures'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should retry predicate', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should toPass sync predicate', async () => { | 
					
						
							|  |  |  |         let i = 0; | 
					
						
							|  |  |  |         await test.expect(() => { | 
					
						
							|  |  |  |           expect(++i).toBe(3); | 
					
						
							|  |  |  |         }).toPass(); | 
					
						
							|  |  |  |         expect(i).toBe(3); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       test('should toPass async predicate', async () => { | 
					
						
							|  |  |  |         let i = 0; | 
					
						
							|  |  |  |         await test.expect(async () => { | 
					
						
							|  |  |  |           await new Promise(x => setTimeout(x, 50)); | 
					
						
							|  |  |  |           expect(++i).toBe(3); | 
					
						
							|  |  |  |         }).toPass(); | 
					
						
							|  |  |  |         expect(i).toBe(3); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							| 
									
										
										
										
											2023-04-10 17:39:49 -07:00
										 |  |  |   expect(result.passed).toBe(2); | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should respect timeout', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should fail', async () => { | 
					
						
							|  |  |  |         await test.expect(() => { | 
					
						
							|  |  |  |           expect(1).toBe(2); | 
					
						
							|  |  |  |         }).toPass({ timeout: 100 }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							| 
									
										
										
										
											2023-02-07 15:11:44 -08:00
										 |  |  |   expect(result.output).toContain('Timeout 100ms exceeded while waiting on the predicate'); | 
					
						
							|  |  |  |   expect(result.output).toContain('Received: 1'); | 
					
						
							|  |  |  |   expect(result.output).toContain(`
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |   4 |         await test.expect(() => { | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |   `.trim());
 | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should not fail when used with web-first assertion', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should fail', async ({ page }) => { | 
					
						
							|  |  |  |         let i = 0; | 
					
						
							|  |  |  |         await test.expect(async () => { | 
					
						
							|  |  |  |           if (++i < 3) | 
					
						
							|  |  |  |             await expect(page.locator('body')).toHaveText('foo', { timeout: 1 }); | 
					
						
							|  |  |  |         }).toPass(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |   expect(result.passed).toBe(1); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should support .not predicate', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should pass', async ({ page }) => { | 
					
						
							|  |  |  |         let i = 0; | 
					
						
							|  |  |  |         await test.expect(() => { | 
					
						
							|  |  |  |           expect(++i).toBeLessThan(3); | 
					
						
							|  |  |  |         }).not.toPass(); | 
					
						
							|  |  |  |         expect(i).toBe(3); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |   expect(result.passed).toBe(1); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should respect interval', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should fail', async () => { | 
					
						
							|  |  |  |         let probes = 0; | 
					
						
							| 
									
										
										
										
											2023-01-20 15:47:24 -08:00
										 |  |  |         const startTime = Date.now(); | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |         await test.expect(() => { | 
					
						
							| 
									
										
										
										
											2023-01-20 15:47:24 -08:00
										 |  |  |           ++probes; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |           expect(1).toBe(2); | 
					
						
							| 
									
										
										
										
											2023-01-20 15:47:24 -08:00
										 |  |  |         }).toPass({ timeout: 1000, intervals: [0, 10000] }).catch(() => {}); | 
					
						
							|  |  |  |         // Probe at 0 and epsilon.
 | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |         expect(probes).toBe(2); | 
					
						
							| 
									
										
										
										
											2023-01-20 15:47:24 -08:00
										 |  |  |         expect(Date.now() - startTime).toBeLessThan(5000); | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should compile', async ({ runTSC }) => { | 
					
						
							|  |  |  |   const result = await runTSC({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should poll sync predicate', async ({ page }) => { | 
					
						
							|  |  |  |         let i = 0; | 
					
						
							|  |  |  |         test.expect(() => ++i).toPass(); | 
					
						
							|  |  |  |         test.expect(() => ++i, 'message').toPass(); | 
					
						
							|  |  |  |         test.expect(() => ++i, { message: 'message' }).toPass(); | 
					
						
							|  |  |  |         test.expect(() => ++i).toPass({ timeout: 100 }); | 
					
						
							|  |  |  |         test.expect(() => ++i, { message: 'message' }).toPass({ timeout: 100 }); | 
					
						
							|  |  |  |         test.expect(async () => { | 
					
						
							|  |  |  |           await new Promise(x => setTimeout(x, 50)); | 
					
						
							|  |  |  |           return ++i; | 
					
						
							|  |  |  |         }).toPass(); | 
					
						
							|  |  |  |         test.expect(() => Promise.resolve(++i)).toPass(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should use custom message', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should fail with custom message', async () => { | 
					
						
							|  |  |  |         await test.expect(() => { | 
					
						
							|  |  |  |           expect(1).toBe(3); | 
					
						
							|  |  |  |         }, 'Custom message').toPass({ timeout: 1 }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-02-07 15:11:44 -08:00
										 |  |  |   expect(result.output).toContain('Error: Custom message'); | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.failed).toBe(1); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should work with soft', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |       test('should respect soft', async () => { | 
					
						
							| 
									
										
										
										
											2023-04-10 17:39:49 -07:00
										 |  |  |         await expect.soft(() => { | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |           expect(1).toBe(3); | 
					
						
							| 
									
										
										
										
											2023-01-20 15:47:24 -08:00
										 |  |  |         }).toPass({ timeout: 1000 }); | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |         expect.soft(2).toBe(3); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-02-07 15:11:44 -08:00
										 |  |  |   expect(result.output).toContain('Received: 1'); | 
					
						
							|  |  |  |   expect(result.output).toContain('Received: 2'); | 
					
						
							| 
									
										
										
										
											2022-12-14 19:23:13 -08:00
										 |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.failed).toBe(1); | 
					
						
							| 
									
										
										
										
											2022-12-20 08:41:32 -08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should not accept TimeoutError', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							| 
									
										
										
										
											2023-02-14 19:20:56 -08:00
										 |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							| 
									
										
										
										
											2022-12-20 08:41:32 -08:00
										 |  |  |       test('should fail', async () => { | 
					
						
							|  |  |  |         await test.expect(() => {}).not.toPass({ timeout: 1 }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.failed).toBe(1); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-04-19 14:45:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should not spin forever', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       let log; | 
					
						
							|  |  |  |       test('spill toPass', async () => { | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							|  |  |  |           log?.push('poll'); | 
					
						
							|  |  |  |           throw new Error('Polling'); | 
					
						
							| 
									
										
										
										
											2023-05-12 19:15:31 -07:00
										 |  |  |         }).toPass().catch(() => {}); | 
					
						
							| 
									
										
										
										
											2023-04-19 14:45:58 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |       test('should not see toPass', async () => { | 
					
						
							|  |  |  |         log = []; | 
					
						
							|  |  |  |         await new Promise(f => setTimeout(f, 1000)); | 
					
						
							|  |  |  |         expect(log.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |   expect(result.passed).toBe(2); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-07-18 17:03:26 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should show intermediate result for toPass that spills over test time', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.spec.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('should fail', async () => { | 
					
						
							|  |  |  |         await expect(() => { | 
					
						
							|  |  |  |           expect(3).toBe(2); | 
					
						
							|  |  |  |         }).toPass(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }, { timeout: 1000 }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.output).toContain('Expected: 2'); | 
					
						
							|  |  |  |   expect(result.output).toContain('Received: 3'); | 
					
						
							|  |  |  | }); |