import React from "react"; import { renderHook } from "@testing-library/react"; import { useChessPuzzleTheme, PuzzleThemeProvider } from "../context"; import { defaultPuzzleTheme } from "../defaults"; describe("useChessPuzzleTheme", () => { it("should return default puzzle theme when no provider is present", () => { const { result } = renderHook(() => useChessPuzzleTheme()); expect(result.current).toEqual(defaultPuzzleTheme); }); it("should return provided theme when wrapped in PuzzleThemeProvider", () => { const customTheme = { ...defaultPuzzleTheme, puzzle: { ...defaultPuzzleTheme.puzzle, hint: "rgba(0, 255, 255, 0.5)", }, }; const wrapper = ({ children }: { children: React.ReactNode }) => ( {children} ); const { result } = renderHook(() => useChessPuzzleTheme(), { wrapper }); expect(result.current.puzzle.hint).toBe("rgba(0, 255, 255, 0.5)"); }); it("should return all puzzle-specific properties", () => { const { result } = renderHook(() => useChessPuzzleTheme()); expect(result.current.puzzle).toHaveProperty("success"); expect(result.current.puzzle).toHaveProperty("failure"); expect(result.current.puzzle).toHaveProperty("hint"); }); it("should return inherited game theme properties", () => { const { result } = renderHook(() => useChessPuzzleTheme()); expect(result.current.board).toBeDefined(); expect(result.current.state).toBeDefined(); expect(result.current.indicators).toBeDefined(); }); }); describe("PuzzleThemeProvider", () => { it("should allow nested providers with inner provider winning", () => { const outerTheme = { ...defaultPuzzleTheme, puzzle: { ...defaultPuzzleTheme.puzzle, hint: "outer" }, }; const innerTheme = { ...defaultPuzzleTheme, puzzle: { ...defaultPuzzleTheme.puzzle, hint: "inner" }, }; const wrapper = ({ children }: { children: React.ReactNode }) => ( {children} ); const { result } = renderHook(() => useChessPuzzleTheme(), { wrapper }); expect(result.current.puzzle.hint).toBe("inner"); }); });