/** @jsxImportSource nativewind */
import { View } from "react-native";
import { getAnimatedStyle } from "react-native-reanimated";
import { opacity } from "react-native-reanimated/lib/typescript/reanimated2/Colors";
import { render, screen } from "../test";
const testID = "test-id";
// Default transition duration is 150ms
jest.useFakeTimers();
test("transition-colors", async () => {
await render(
,
{
config: {
safelist: ["bg-blue-500 border-slate-500"],
},
},
);
let component = screen.getByTestId(testID);
// Should have a static color, and should not animate
expect(getAnimatedStyle(component)).toStrictEqual({
backgroundColor: "#ef4444",
borderColor: "#000000",
});
jest.advanceTimersByTime(300);
expect(getAnimatedStyle(component)).toStrictEqual({
backgroundColor: "#ef4444",
borderColor: "#000000",
});
// Rerender with a new color, triggering the animation
screen.rerender(
,
);
// Directly after rerender, should still have the old color
expect(getAnimatedStyle(component)).toStrictEqual({
backgroundColor: "#ef4444",
borderColor: "#000000",
});
// Bg-Color should only change after we advance time
jest.advanceTimersByTime(76); // Transition half the time
expect(getAnimatedStyle(component)).toStrictEqual({
backgroundColor: "rgba(178, 105, 184, 1)",
borderColor: "rgba(73, 85, 101, 1)",
});
// At the end of the transition
jest.advanceTimersByTime(1000);
expect(getAnimatedStyle(component)).toStrictEqual({
backgroundColor: "rgba(59, 130, 246, 1)",
borderColor: "rgba(100, 116, 139, 1)",
});
// Bg-Color should not change after the transition is done
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
backgroundColor: "rgba(59, 130, 246, 1)",
borderColor: "rgba(100, 116, 139, 1)",
});
});
test("transition-opacity", async () => {
await render(
,
{
config: {
safelist: ["opacity-100"],
},
},
);
let component = screen.getByTestId(testID);
expect(getAnimatedStyle(component)).toStrictEqual({ opacity: 0 });
jest.advanceTimersByTime(300);
expect(getAnimatedStyle(component)).toStrictEqual({ opacity: 0 });
// Rerender with a new color, triggering the animation
screen.rerender(
,
);
// Directly after rerender, should still have the old color
expect(getAnimatedStyle(component)).toStrictEqual({ opacity: 0 });
// Bg-Color should only change after we advance time
jest.advanceTimersByTime(76); // Transition half the time
expect(getAnimatedStyle(component)).toStrictEqual({ opacity: 0.5 });
// At the end of the transition
jest.advanceTimersByTime(1000);
expect(getAnimatedStyle(component)).toStrictEqual({ opacity: 1 });
// Bg-Color should not change after the transition is done
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({ opacity: 1 });
});
test("animate-spin", async () => {
await render();
let component = screen.getByTestId(testID);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [{ rotate: "0deg" }],
});
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [{ rotate: "180deg" }],
});
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [{ rotate: "360deg" }],
});
jest.advanceTimersByTime(250);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [{ rotate: "90deg" }],
});
});
test("animate-pulse", async () => {
await render();
let component = screen.getByTestId(testID);
expect(getAnimatedStyle(component)).toStrictEqual({
opacity: 1,
});
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
opacity: 0.7500000093132256,
});
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
opacity: 0.5,
});
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
opacity: 0.7491666591949523,
});
jest.advanceTimersByTime(501);
expect(getAnimatedStyle(component)).toStrictEqual({
opacity: 1,
});
});
test("changing animations", async () => {
await render(, {
config: {
safelist: ["animate-bounce"],
},
});
let component = screen.getByTestId(testID);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [{ rotate: "0deg" }],
});
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [{ rotate: "180deg" }],
});
screen.rerender();
// It takes 1 tick for reanimated to realize that the SharedValues have changed
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [{ rotate: "0deg" }],
});
// Advance to the next tick
jest.advanceTimersToNextTimer();
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [
{ translateY: "-25%" },
{ perspective: 1 },
{ translateX: 0 },
{ rotate: "0deg" },
{ rotateX: "0deg" },
{ rotateY: "0deg" },
{ rotateZ: "0deg" },
{ scale: 1 },
{ scaleX: 1 },
{ scaleY: 1 },
{ skewX: "0deg" },
{ skewY: "0deg" },
],
});
jest.advanceTimersByTime(500);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [
{ translateY: "0%" },
{ perspective: 1 },
{ translateX: 0 },
{ rotate: "0deg" },
{ rotateX: "0deg" },
{ rotateY: "0deg" },
{ rotateZ: "0deg" },
{ scale: 1 },
{ scaleX: 1 },
{ scaleY: 1 },
{ skewX: "0deg" },
{ skewY: "0deg" },
],
});
jest.advanceTimersByTime(501);
expect(getAnimatedStyle(component)).toStrictEqual({
transform: [
{ translateY: "-25%" },
{ perspective: 1 },
{ translateX: 0 },
{ rotate: "0deg" },
{ rotateX: "0deg" },
{ rotateY: "0deg" },
{ rotateZ: "0deg" },
{ scale: 1 },
{ scaleX: 1 },
{ scaleY: 1 },
{ skewX: "0deg" },
{ skewY: "0deg" },
],
});
});