/** * Simple test runner for style preservation system * Tests our implementation with actual DOM elements */ import { styleDetectionEngine } from './style-detection.js'; import { htmlPreservationEngine } from './html-preservation.js'; /** * Run all style detection tests with real DOM elements */ export function runStyleDetectionTests() { console.log('๐Ÿงช Running Style Detection Tests'); console.log('================================'); const results = []; // Test 1: Demo Example 1 - Styled Strong Element results.push(testExample1()); // Test 2: Demo Example 2 - Styled Link Element results.push(testExample2()); // Test 3: Demo Example 4 - Multiple Styled Elements results.push(testExample4()); // Test 4: Demo Example 5 - Button with Data Attributes results.push(testExample5()); // Summary const passed = results.filter(r => r.passed).length; const total = results.length; console.log(`\n๐Ÿ“Š Test Results: ${passed}/${total} passed`); if (passed === total) { console.log('โœ… All style detection tests passed!'); } else { console.log('โŒ Some tests failed - see details above'); } return { passed, total, results }; } /** * Test Example 1:

Hello world and welcome!

*/ function testExample1() { console.log('\n๐Ÿ” Test 1: Styled Strong Element'); try { // Create test element const container = document.createElement('p'); container.className = 'insertr'; container.innerHTML = 'Hello world and welcome!'; // Detect styles const detectedStyles = styleDetectionEngine.detectStyles(container); // Validate results const hasEmphStyle = detectedStyles.has('strong_emph'); const emphStyle = detectedStyles.get('strong_emph'); const correctName = emphStyle?.name === 'Emphasis'; const correctTag = emphStyle?.tagName === 'strong'; const correctClasses = emphStyle?.classes?.includes('emph'); const passed = hasEmphStyle && correctName && correctTag && correctClasses; console.log(` Detected ${detectedStyles.size} style(s)`); console.log(` Found "Emphasis" style: ${hasEmphStyle ? 'โœ…' : 'โŒ'}`); console.log(` Correct name: ${correctName ? 'โœ…' : 'โŒ'}`); console.log(` Result: ${passed ? 'โœ… PASSED' : 'โŒ FAILED'}`); return { test: 'Example 1', passed, details: { hasEmphStyle, correctName, correctTag, correctClasses } }; } catch (error) { console.log(` Error: ${error.message}`); console.log(` Result: โŒ FAILED`); return { test: 'Example 1', passed: false, error: error.message }; } } /** * Test Example 2:

Visit our about page for more info.

*/ function testExample2() { console.log('\n๐Ÿ” Test 2: Styled Link Element'); try { const container = document.createElement('p'); container.className = 'insertr'; container.innerHTML = 'Visit our about page for more info.'; const detectedStyles = styleDetectionEngine.detectStyles(container); const hasFancyStyle = detectedStyles.has('a_fancy'); const fancyStyle = detectedStyles.get('a_fancy'); const correctName = fancyStyle?.name === 'Fancy Link'; const hasHref = fancyStyle?.attributes?.href === '#about'; const passed = hasFancyStyle && correctName && hasHref; console.log(` Detected ${detectedStyles.size} style(s)`); console.log(` Found "Fancy Link" style: ${hasFancyStyle ? 'โœ…' : 'โŒ'}`); console.log(` Preserved href attribute: ${hasHref ? 'โœ…' : 'โŒ'}`); console.log(` Result: ${passed ? 'โœ… PASSED' : 'โŒ FAILED'}`); return { test: 'Example 2', passed, details: { hasFancyStyle, correctName, hasHref } }; } catch (error) { console.log(` Error: ${error.message}`); console.log(` Result: โŒ FAILED`); return { test: 'Example 2', passed: false, error: error.message }; } } /** * Test Example 4: Multiple styled elements */ function testExample4() { console.log('\n๐Ÿ” Test 4: Multiple Styled Elements'); try { const container = document.createElement('p'); container.className = 'insertr'; container.innerHTML = 'Welcome to Acme Corp where we create innovative solutions for modern businesses.'; const detectedStyles = styleDetectionEngine.detectStyles(container); const hasBrand = detectedStyles.has('strong_brand'); const hasHighlight = detectedStyles.has('span_highlight'); const hasEmphItalic = detectedStyles.has('em_emph'); const correctCount = detectedStyles.size === 3; const passed = hasBrand && hasHighlight && hasEmphItalic && correctCount; console.log(` Detected ${detectedStyles.size} style(s) (expected 3)`); console.log(` Found "Brand" style: ${hasBrand ? 'โœ…' : 'โŒ'}`); console.log(` Found "Highlight" style: ${hasHighlight ? 'โœ…' : 'โŒ'}`); console.log(` Found "Emphasis Italic" style: ${hasEmphItalic ? 'โœ…' : 'โŒ'}`); console.log(` Result: ${passed ? 'โœ… PASSED' : 'โŒ FAILED'}`); return { test: 'Example 4', passed, details: { hasBrand, hasHighlight, hasEmphItalic, correctCount } }; } catch (error) { console.log(` Error: ${error.message}`); console.log(` Result: โŒ FAILED`); return { test: 'Example 4', passed: false, error: error.message }; } } /** * Test Example 5: Button with data attributes */ function testExample5() { console.log('\n๐Ÿ” Test 5: Button with Data Attributes'); try { const container = document.createElement('p'); container.className = 'insertr'; container.innerHTML = 'Ready to start? and begin your journey!'; const detectedStyles = styleDetectionEngine.detectStyles(container); const hasButtonStyle = detectedStyles.has('button_btn'); const buttonStyle = detectedStyles.get('button_btn'); const correctName = buttonStyle?.name === 'Button Style'; const hasDataAction = buttonStyle?.attributes?.['data-action'] === 'signup'; const hasDataAnalytics = buttonStyle?.attributes?.['data-analytics'] === 'cta-main'; const passed = hasButtonStyle && correctName && hasDataAction && hasDataAnalytics; console.log(` Detected ${detectedStyles.size} style(s)`); console.log(` Found "Button Style": ${hasButtonStyle ? 'โœ…' : 'โŒ'}`); console.log(` Preserved data-action: ${hasDataAction ? 'โœ…' : 'โŒ'}`); console.log(` Preserved data-analytics: ${hasDataAnalytics ? 'โœ…' : 'โŒ'}`); console.log(` Result: ${passed ? 'โœ… PASSED' : 'โŒ FAILED'}`); return { test: 'Example 5', passed, details: { hasButtonStyle, correctName, hasDataAction, hasDataAnalytics } }; } catch (error) { console.log(` Error: ${error.message}`); console.log(` Result: โŒ FAILED`); return { test: 'Example 5', passed: false, error: error.message }; } } /** * Run HTML preservation tests */ export function runHTMLPreservationTests() { console.log('\n๐Ÿงช Running HTML Preservation Tests'); console.log('=================================='); const results = []; results.push(testHTMLExtraction()); results.push(testHTMLApplication()); results.push(testAttributePreservation()); const passed = results.filter(r => r.passed).length; const total = results.length; console.log(`\n๐Ÿ“Š HTML Preservation Results: ${passed}/${total} passed`); return { passed, total, results }; } function testHTMLExtraction() { console.log('\n๐Ÿ” HTML Extraction Test'); try { const element = document.createElement('p'); element.className = 'insertr test'; element.id = 'test-element'; element.innerHTML = 'Hello world!'; const extracted = htmlPreservationEngine.extractForEditing(element); const hasHTML = extracted.html === 'Hello world!'; const hasText = extracted.text === 'Hello world!'; const hasAttributes = extracted.containerAttributes.class === 'insertr test'; const detectsNesting = extracted.hasNestedElements === true; const passed = hasHTML && hasText && hasAttributes && detectsNesting; console.log(` HTML extraction: ${hasHTML ? 'โœ…' : 'โŒ'}`); console.log(` Text extraction: ${hasText ? 'โœ…' : 'โŒ'}`); console.log(` Attribute preservation: ${hasAttributes ? 'โœ…' : 'โŒ'}`); console.log(` Nesting detection: ${detectsNesting ? 'โœ…' : 'โŒ'}`); console.log(` Result: ${passed ? 'โœ… PASSED' : 'โŒ FAILED'}`); return { test: 'HTML Extraction', passed }; } catch (error) { console.log(` Error: ${error.message}`); console.log(` Result: โŒ FAILED`); return { test: 'HTML Extraction', passed: false, error: error.message }; } } function testHTMLApplication() { console.log('\n๐Ÿ” HTML Application Test'); try { const element = document.createElement('p'); element.className = 'insertr original'; const newHTML = 'Updated content!'; const success = htmlPreservationEngine.applyFromEditing(element, newHTML); const appliedCorrectly = element.innerHTML === newHTML; const preservedClass = element.className === 'insertr original'; const passed = success && appliedCorrectly && preservedClass; console.log(` Application success: ${success ? 'โœ…' : 'โŒ'}`); console.log(` Content applied: ${appliedCorrectly ? 'โœ…' : 'โŒ'}`); console.log(` Container class preserved: ${preservedClass ? 'โœ…' : 'โŒ'}`); console.log(` Result: ${passed ? 'โœ… PASSED' : 'โŒ FAILED'}`); return { test: 'HTML Application', passed }; } catch (error) { console.log(` Error: ${error.message}`); console.log(` Result: โŒ FAILED`); return { test: 'HTML Application', passed: false, error: error.message }; } } function testAttributePreservation() { console.log('\n๐Ÿ” Attribute Preservation Test'); try { const element = document.createElement('div'); const originalAttrs = { class: 'insertr test', id: 'unique-id', 'data-value': '123' }; // Apply original attributes Object.entries(originalAttrs).forEach(([key, value]) => { element.setAttribute(key, value); }); // Extract and restore const extracted = htmlPreservationEngine.extractElementAttributes(element); const newElement = document.createElement('div'); htmlPreservationEngine.restoreElementAttributes(newElement, extracted); const classRestored = newElement.getAttribute('class') === 'insertr test'; const idRestored = newElement.getAttribute('id') === 'unique-id'; const dataRestored = newElement.getAttribute('data-value') === '123'; const passed = classRestored && idRestored && dataRestored; console.log(` Class attribute: ${classRestored ? 'โœ…' : 'โŒ'}`); console.log(` ID attribute: ${idRestored ? 'โœ…' : 'โŒ'}`); console.log(` Data attribute: ${dataRestored ? 'โœ…' : 'โŒ'}`); console.log(` Result: ${passed ? 'โœ… PASSED' : 'โŒ FAILED'}`); return { test: 'Attribute Preservation', passed }; } catch (error) { console.log(` Error: ${error.message}`); console.log(` Result: โŒ FAILED`); return { test: 'Attribute Preservation', passed: false, error: error.message }; } } /** * Run all tests */ export function runAllTests() { console.log('๐Ÿš€ Running All Style Preservation System Tests'); console.log('=============================================='); const styleResults = runStyleDetectionTests(); const htmlResults = runHTMLPreservationTests(); const totalPassed = styleResults.passed + htmlResults.passed; const totalTests = styleResults.total + htmlResults.total; console.log(`\n๐ŸŽฏ Overall Results: ${totalPassed}/${totalTests} tests passed`); if (totalPassed === totalTests) { console.log('๐ŸŽ‰ All tests passed! Style preservation system is working correctly.'); } else { console.log('โš ๏ธ Some tests failed. Review implementation before proceeding.'); } return { passed: totalPassed === totalTests, details: { styleResults, htmlResults } }; }