diff --git a/test/integration/test_wysiwyg.js b/test/integration/test_wysiwyg.js index f0349b0..02cc4b3 100644 --- a/test/integration/test_wysiwyg.js +++ b/test/integration/test_wysiwyg.js @@ -26,6 +26,10 @@ const PORT = (() => { const portArg = process.argv.find(arg => arg.startsWith('--port=')); return portArg ? parseInt(portArg.split('=')[1]) : 5023; })(); +const FILTER = (() => { + const filterArg = process.argv.find(arg => arg.startsWith('--filter=')); + return filterArg ? filterArg.split('=')[1] : null; +})(); const DELAY = 20; // ms between keystrokes // ── State ───────────────────────────────────────────────────────────────────── @@ -169,6 +173,9 @@ function assert(condition, message) { } async function test(name, fn) { + if (FILTER && !name.toLowerCase().includes(FILTER.toLowerCase())) { + return; + } try { await fn(); passed++; @@ -286,6 +293,60 @@ async function runTests() { assert(markdown === '***both***', `Expected "***both***", got: "${markdown}"`); }); + await test('nested bold and italic are handled correctly', async() => { + const NESTED_CASES = [ + { + name: 'close-side ambiguity, outer=bold (bold *italic***)', + markdown: '**bold *italic***', + outerClass: 'md-bold', + innerClass: 'md-italic', + }, + { + name: 'close-side ambiguity, outer=italic (*italic **bold***)', + markdown: '*italic **bold***', + outerClass: 'md-italic', + innerClass: 'md-bold', + }, + { + name: 'open-side ambiguity, outer=bold (***italic* bold**)', + markdown: '***italic* bold**', + outerClass: 'md-bold', + innerClass: 'md-italic', + }, + { + name: 'open-side ambiguity, outer=italic (***bold** italic*)', + markdown: '***bold** italic*', + outerClass: 'md-italic', + innerClass: 'md-bold', + }, + ]; + + for (const testCase of NESTED_CASES) { + await test(testCase.name, async () => { + await resetEditor(); + await typeString(testCase.markdown); + + const markdown = await getMarkdown(); + assert( + markdown === testCase.markdown, + `Round-trip failed.\nExpected: "${testCase.markdown}"\nGot: "${markdown}"` + ); + + const html = await getHTML(); + const outerIndex = html.indexOf(testCase.outerClass); + const innerIndex = html.indexOf(testCase.innerClass); + assert( + outerIndex !== -1 && innerIndex !== -1, + `Missing expected classes (${testCase.outerClass}, ${testCase.innerClass}) in: ${html}` + ); + assert( + outerIndex < innerIndex, + `Expected ${testCase.outerClass} to wrap (appear before) ${testCase.innerClass} in: ${html}` + ); + }); + } + }); + await test('`code` produces md-code span', async () => { await resetEditor(); await typeString('`code`');