/** @jsxImportSource test */ import { View } from "react-native"; import { getAnimatedStyle } from "react-native-reanimated"; import { fireEvent, registerCSS, render, screen, setupAllComponents, } from "test"; const grouping = ["^group(/.*)?"]; const testID = "react-native-css-interop"; const parentID = "parent"; const childID = "child"; setupAllComponents(); jest.useFakeTimers(); test("numeric transition", () => { registerCSS(` .transition { transition: width 1s linear; } .first { width: 100px; } .second { width: 200px; } `); render(); let component = screen.getByTestId(testID); // Should have a static width, and should not animate expect(component).toHaveAnimatedStyle({ width: 100, }); jest.advanceTimersByTime(1000); expect(component).toHaveAnimatedStyle({ width: 100, }); // Rerender with a new width, triggering the animation screen.rerender(); // Directly after rerender, should still have the old width expect(component).toHaveAnimatedStyle({ width: 100, }); // Width should only change after we advance time jest.advanceTimersByTime(501); // Transition half the time expect(component).toHaveAnimatedStyle({ width: 150, }); // At the end of the transition jest.advanceTimersByTime(500); expect(component).toHaveAnimatedStyle({ width: 200, }); // Width should not change after the transition is done jest.advanceTimersByTime(500); expect(component).toHaveAnimatedStyle({ width: 200, }); }); test("transition - rerender", () => { registerCSS(` .transition { transition: color 1s linear; } .first { color: red; } .second { color: blue; } `); render(); const component = screen.getByTestId(testID); // Should have the initial color expect(component).toHaveAnimatedStyle({ color: "#ff0000", }); jest.advanceTimersByTime(1000); expect(component).toHaveAnimatedStyle({ color: "#ff0000", }); screen.rerender(); // Directly after rerender, should still have the old width expect(component).toHaveAnimatedStyle({ color: "#ff0000", }); // Width should only change after we advance time jest.advanceTimersByTime(500); expect(component).toHaveAnimatedStyle({ color: "rgba(186, 0, 186, 1)", }); // At the end of the transition jest.advanceTimersByTime(501); expect(component).toHaveAnimatedStyle({ color: "rgba(0, 0, 255, 1)", }); // Width should not change after the transition is done jest.advanceTimersByTime(500); expect(component).toHaveAnimatedStyle({ color: "rgba(0, 0, 255, 1)", }); }); test("transition - interaction", () => { registerCSS(` .transition { transition: color 1s linear; } .first { color: red; } .first:active { color: blue; } `); render(); const component = screen.getByTestId(testID); // Should have the initial color expect(component).toHaveAnimatedStyle({ color: "#ff0000", }); jest.advanceTimersByTime(1000); expect(component).toHaveAnimatedStyle({ color: "#ff0000", }); fireEvent(component, "pressIn"); // Directly after rerender, should still have the old color expect(component).toHaveAnimatedStyle({ color: "#ff0000", }); // Color should only change after we advance time jest.advanceTimersByTime(500); expect(component).toHaveAnimatedStyle({ color: "rgba(186, 0, 186, 1)", }); // At the end of the transition jest.advanceTimersByTime(501); expect(component).toHaveAnimatedStyle({ color: "rgba(0, 0, 255, 1)", }); // Color should not change after the transition is done jest.advanceTimersByTime(500); expect(component).toHaveAnimatedStyle({ color: "rgba(0, 0, 255, 1)", }); }); test("optional transitions", async () => { registerCSS( ` .group\\/item:active .my-class { color: red; transition: color 1s; }`, { grouping, }, ); render( , ); const parent = screen.getByTestId(parentID); const child = screen.getByTestId(childID); expect(getAnimatedStyle(child)).toStrictEqual({}); fireEvent(parent, "pressIn"); jest.advanceTimersByTime(0); expect(getAnimatedStyle(child)).toStrictEqual({ color: "black", }); jest.advanceTimersByTime(500); expect(getAnimatedStyle(child)).toStrictEqual({ color: "rgba(151, 0, 0, 1)", }); jest.advanceTimersByTime(500); expect(getAnimatedStyle(child)).toStrictEqual({ color: "rgba(255, 0, 0, 1)", }); fireEvent(parent, "pressOut"); jest.advanceTimersByTime(0); expect(getAnimatedStyle(child)).toStrictEqual({ color: "black", }); });