import React, {useState, useCallback, useEffect} from 'react'; import PropTypes from 'prop-types'; import {Plus, Loader, Play} from 'lucide-react'; import UnitTest from './UnitTest'; import AddUnitTestModal from './AddUnitTestModal'; const RegexTestingTab = ({ pattern, tests, onTestsChange, isRunningTests, onRunTests }) => { const [isModalOpen, setIsModalOpen] = useState(false); const [editingTest, setEditingTest] = useState(null); useEffect(() => { const needsAutoRun = tests?.length > 0 && pattern && tests.some(test => test.passes !== undefined && !test.matchSpan); if (needsAutoRun && !isRunningTests) { onRunTests(pattern, tests); } }, []); const handleAddOrUpdateTest = useCallback( testData => { let updatedTests; if (editingTest) { updatedTests = tests.map(test => test.id === testData.id ? { ...testData, passes: false, lastRun: null, matchedContent: null, matchSpan: null, matchedGroups: [] } : test ); } else { updatedTests = [ ...tests, { ...testData, passes: false, lastRun: null, matchedContent: null, matchSpan: null, matchedGroups: [] } ]; } onTestsChange(updatedTests); onRunTests(pattern, updatedTests); setEditingTest(null); }, [tests, onTestsChange, onRunTests, pattern, editingTest] ); const handleEditTest = useCallback(test => { setEditingTest(test); setIsModalOpen(true); }, []); const handleDeleteTest = useCallback( testId => { const updatedTests = tests.filter(test => test.id !== testId); onTestsChange(updatedTests); }, [tests, onTestsChange] ); const handleCloseModal = useCallback(() => { setIsModalOpen(false); setEditingTest(null); }, []); const totalTests = tests?.length || 0; const passedTests = tests?.filter(test => test.passes)?.length || 0; return (
{/* Header with Progress Bar */}

Unit Tests

{totalTests > 0 ? `${passedTests}/${totalTests} tests passing` : 'No tests added yet'}
{tests?.length > 0 && ( )}
{/* Test List */}
{tests?.length > 0 ? (
{tests.map(test => ( handleDeleteTest(test.id)} onEdit={() => handleEditTest(test)} /> ))}
) : (

No tests added yet

)}
); }; RegexTestingTab.propTypes = { pattern: PropTypes.string.isRequired, tests: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.number.isRequired, input: PropTypes.string.isRequired, expected: PropTypes.bool.isRequired, passes: PropTypes.bool.isRequired, lastRun: PropTypes.string, matchedContent: PropTypes.string, matchedGroups: PropTypes.arrayOf(PropTypes.string), matchSpan: PropTypes.shape({ start: PropTypes.number, end: PropTypes.number }) }) ), onTestsChange: PropTypes.func.isRequired, isRunningTests: PropTypes.bool.isRequired, onRunTests: PropTypes.func.isRequired }; export default RegexTestingTab;