import React from "react"; import { Text } from "react-native"; import { render, renderHook } from "@testing-library/react-native"; import { buildThemedStyles } from "./buildThemedStyles"; import { AtlantisThemeContextProvider } from "./AtlantisThemeContext"; describe("buildThemedStyles", () => { const wrapper = ({ children }: { children: React.ReactNode }) => ( {children} ); it("creates styles using theme tokens", () => { const useTestStyles = buildThemedStyles(tokens => ({ container: { backgroundColor: tokens["color-surface"], padding: tokens["space-base"], }, })); const { result } = renderHook(() => useTestStyles(), { wrapper }); expect(result.current).toEqual({ container: { backgroundColor: expect.any(String), padding: expect.any(Number), }, }); }); it("memoizes styles and only updates when tokens change", () => { const styleFactory = jest.fn(tokens => ({ container: { backgroundColor: tokens["color-surface"], }, })); const useTestStyles = buildThemedStyles(styleFactory); const { result, rerender } = renderHook(() => useTestStyles(), { wrapper }); // Initial render should call styleFactory expect(styleFactory).toHaveBeenCalledTimes(1); const initialResult = result.current; // Rerender without token changes should not call styleFactory again rerender({ wrapper }); expect(styleFactory).toHaveBeenCalledTimes(1); expect(result.current).toBe(initialResult); }); it("reuses cached styles across multiple instances of the same generated hook", () => { const styleFactory = jest.fn(tokens => ({ container: { backgroundColor: tokens["color-surface"], }, })); const useTestStyles = buildThemedStyles(styleFactory); const renderedStyles: Array> = []; function TestComponent() { const styles = useTestStyles(); renderedStyles.push(styles); return Test; } render( , ); expect(styleFactory).toHaveBeenCalledTimes(1); expect(renderedStyles[1]).toBe(renderedStyles[0]); expect(renderedStyles[2]).toBe(renderedStyles[0]); }); it("creates styles again when the theme tokens change", () => { const styleFactory = jest.fn(tokens => ({ container: { backgroundColor: tokens["color-surface"], }, })); const useTestStyles = buildThemedStyles(styleFactory); const renderedStyles: Array> = []; function TestComponent() { const styles = useTestStyles(); renderedStyles.push(styles); return Test; } const { rerender } = render( , ); rerender( , ); expect(styleFactory).toHaveBeenCalledTimes(2); expect(renderedStyles[1]).not.toBe(renderedStyles[0]); }); it("handles empty style objects", () => { const useTestStyles = buildThemedStyles(() => ({})); const { result } = renderHook(() => useTestStyles(), { wrapper }); expect(result.current).toEqual({}); }); });