import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { Toolbar } from './Toolbar';
describe('Toolbar Component', () => {
const mockOnToolDrag = vi.fn();
it('renders all tools', () => {
render(<Toolbar onToolClick={mockOnToolDrag} />);
// Inputs
expect(screen.getByText('NO Contact')).toBeInTheDocument();
expect(screen.getByText('NC Contact')).toBeInTheDocument();
expect(screen.getByText('One-Shot Rising')).toBeInTheDocument();
// Outputs
expect(screen.getByText('Output Coil')).toBeInTheDocument();
expect(screen.getByText('Set Coil')).toBeInTheDocument();
// Timers
expect(screen.getByText('TON Timer')).toBeInTheDocument();
expect(screen.getByText('RTO Timer')).toBeInTheDocument();
// Counters
expect(screen.getByText('CTU Counter')).toBeInTheDocument();
expect(screen.getByText('CTD Counter')).toBeInTheDocument();
// Logic
expect(screen.getByText('AND Gate')).toBeInTheDocument();
expect(screen.getByText('NAND Gate')).toBeInTheDocument();
// Control
expect(screen.getByText('Branch OR')).toBeInTheDocument();
expect(screen.getByText('Branch AND')).toBeInTheDocument();
expect(screen.getByText('NoOp')).toBeInTheDocument();
// Data
expect(screen.getByText('Math ADD')).toBeInTheDocument();
expect(screen.getByText('Math SUB')).toBeInTheDocument();
expect(screen.getByText('Move')).toBeInTheDocument();
expect(screen.getByText('Scale')).toBeInTheDocument();
expect(screen.getByText('Compare')).toBeInTheDocument();
});
it('sets dataTransfer on drag start', () => {
render(<Toolbar onToolClick={mockOnToolDrag} />);
const toolItem = screen.getByText('NO Contact');
const setData = vi.fn();
fireEvent.dragStart(toolItem, {
dataTransfer: {
setData,
} as any,
});
expect(setData).toHaveBeenCalledWith('text/plain', 'contact-no');
});
});