// @vitest-environment jsdom import { cleanup, render } from '@testing-library/react' import { afterEach, describe, expect, it } from 'vitest' import { StateDot } from '@deepseek-ai/dsh-client-ui-primitives' import type { StateDotState } from '@deepseek-ai/dsh-client-ui-primitives' afterEach(cleanup) describe('StateDot', () => { it.each(['done', 'warning', 'ongoing', 'error'] as const)('renders state %s as data-state', (state) => { const { container } = render() const dot = container.firstElementChild as HTMLElement expect(dot.dataset['state']).toBe(state) expect(dot.getAttribute('aria-hidden')).toBe('true') }) it('solid states are spans; ongoing is an svg pixel matrix', () => { const { container, rerender } = render() expect(container.firstElementChild?.tagName).toBe('SPAN') rerender() const matrix = container.firstElementChild as SVGSVGElement expect(matrix.tagName).toBe('svg') const cells = matrix.querySelectorAll('rect') expect(cells).toHaveLength(8) // Chase phase: every cell carries its own negative animation delay. const delays = [...cells].map(cell => (cell).style.animationDelay) expect(new Set(delays).size).toBe(8) }) it('sizes via the size prop in both shapes', () => { const { container, rerender } = render() const dot = container.firstElementChild as HTMLElement expect(dot.style.width).toBe('12px') expect(dot.style.height).toBe('12px') rerender() const ring = container.firstElementChild as SVGSVGElement expect(ring.getAttribute('width')).toBe('12') expect(ring.getAttribute('height')).toBe('12') }) it('rejects unknown states at the type level', () => { const bad = (state: StateDotState) => state // @ts-expect-error 'paused' is not one of the four states expect(bad('paused')).toBe('paused') }) })