From 5efc9ad462dce2efbe94b857fc64e2282630bb9d Mon Sep 17 00:00:00 2001 From: "Simon Genin (ges)" Date: Mon, 4 Oct 2021 11:21:55 +0200 Subject: [PATCH] [FIX] remove indeterminism in animation tests Animations have quite a few intricate calls to request next animation frames. On quick devices, the helper method nextFrame made of 2 request of animation frames would not be enough and race condition problems would rise. The fix is simply to ask the nextFrame helper to do a third request of animation frame in the animation tests, making the test deterministic on a very fast device. Hopefully, this should be enough. --- tests/animations.test.ts | 10 +++++----- tests/helpers.ts | 7 ++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/animations.test.ts b/tests/animations.test.ts index 85b40842..ff45b292 100644 --- a/tests/animations.test.ts +++ b/tests/animations.test.ts @@ -420,29 +420,29 @@ describe("animations", () => { widget.state.flag = true; - await nextFrame(); + await nextFrame(3); widget.el!.querySelector("span")!.dispatchEvent(new Event("transitionend")); expect(fixture.innerHTML).toBe('
blue
'); expect(QWeb.utils.transitionInsert).toBeCalledTimes(1); widget.state.flag = false; - await nextFrame(); + await nextFrame(3); expect(fixture.innerHTML).toBe( '
blue
' ); expect(QWeb.utils.transitionInsert).toBeCalledTimes(1); widget.state.flag = true; - await nextFrame(); + await nextFrame(3); expect(fixture.innerHTML).toBe( '
blue
' ); expect(QWeb.utils.transitionInsert).toBeCalledTimes(2); widget.state.flag = false; - await nextFrame(); + await nextFrame(3); widget.state.flag = true; - await nextFrame(); + await nextFrame(3); expect(QWeb.utils.transitionInsert).toBeCalledTimes(3); widget.el!.querySelector("span")!.dispatchEvent(new Event("transitionend")); diff --git a/tests/helpers.ts b/tests/helpers.ts index c569329d..ef1bb6f6 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -41,9 +41,10 @@ export async function nextTick(): Promise { await new Promise((resolve) => scheduler.requestAnimationFrame(resolve)); } -export async function nextFrame(): Promise { - await new Promise((resolve) => scheduler.requestAnimationFrame(resolve)); - await new Promise((resolve) => scheduler.requestAnimationFrame(resolve)); +export async function nextFrame(numberOfAnimationFrames: number = 2): Promise { + for (let i = 0; i < numberOfAnimationFrames; i++) { + await new Promise((resolve) => scheduler.requestAnimationFrame(resolve)); + } } export function makeTestFixture() {