import React, { useState } from 'react'; import { describe, it, expect, vi } from 'vitest'; import { render, fireEvent, act } from '@testing-library/react'; import { PixelToggle } from '../../forms/PixelToggle'; /* Group-driven behavior (single/multiple selection, roving focus) is covered in ./PixelToggleGroup.test.tsx — this file covers the STANDALONE toggle. */ describe('PixelToggle — standalone', () => { it('pressed state toggles (controlled)', () => { const onPressedChange = vi.fn(); function Wrapper() { const [pressed, setPressed] = useState(false); return ( { onPressedChange(next); setPressed(next); }} > B ); } const { getByText } = render(); const btn = getByText('B').closest('button')!; expect(btn.getAttribute('aria-pressed')).toBe('false'); act(() => { fireEvent.click(btn); }); expect(onPressedChange).toHaveBeenLastCalledWith(true); expect(btn.getAttribute('aria-pressed')).toBe('true'); act(() => { fireEvent.click(btn); }); expect(onPressedChange).toHaveBeenLastCalledWith(false); expect(btn.getAttribute('aria-pressed')).toBe('false'); }); it('toggles internally when uncontrolled (no pressed prop)', () => { const onPressedChange = vi.fn(); const { getByRole } = render( I , ); const btn = getByRole('button'); expect(btn.getAttribute('aria-pressed')).toBe('false'); expect(btn.getAttribute('data-state')).toBe('off'); fireEvent.click(btn); expect(btn.getAttribute('aria-pressed')).toBe('true'); expect(btn.getAttribute('data-state')).toBe('on'); expect(onPressedChange).toHaveBeenLastCalledWith(true); fireEvent.click(btn); expect(btn.getAttribute('aria-pressed')).toBe('false'); expect(onPressedChange).toHaveBeenLastCalledWith(false); }); it('disabled blocks toggling and sets the disabled attribute', () => { const onPressedChange = vi.fn(); const { getByRole } = render( C , ); const btn = getByRole('button') as HTMLButtonElement; expect(btn.disabled).toBe(true); fireEvent.click(btn); expect(onPressedChange).not.toHaveBeenCalled(); expect(btn.getAttribute('aria-pressed')).toBe('false'); }); it('defaults to type="button", forwards className + DOM props', () => { const { getByRole } = render( X , ); const btn = getByRole('button') as HTMLButtonElement; expect(btn.type).toBe('button'); expect(btn.className).toContain('my-toggle'); expect(btn.getAttribute('data-testid')).toBe('tg'); expect(btn.getAttribute('data-pxl-toggle-value')).toBe('x'); }); });