Mercurial
view markdown_converter/tests/test_wasm.js @ 194:fb28063dc490 hg-web
Adding few more images.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sun, 25 Jan 2026 20:19:42 -0800 |
| parents | cd35e600ae34 |
| children |
line wrap: on
line source
/** * Test suite for markdown_to_html WASM module */ const fs = require('fs'); // TODO: Fix the rules so that it can do relative import. const wasm = fs.readFileSync('markdown_converter/wasm/markdown_to_html_wasm.wasm'); let testsPassed = 0; let testsFailed = 0; function assertEqual(actual, expected, testName) { if (actual === expected) { console.log(`✓ ${testName}`); testsPassed++; } else { console.log(`✗ ${testName}`); console.log(` Expected: ${expected}`); console.log(` Actual: ${actual}`); testsFailed++; } } function assertContains(actual, expected, testName) { if (actual.includes(expected)) { console.log(`✓ ${testName}`); testsPassed++; } else { console.log(`✗ ${testName}`); console.log(` Expected to contain: ${expected}`); console.log(` Actual: ${actual}`); testsFailed++; } } async function runTests() { const module = await WebAssembly.instantiate(wasm, { env: {} }); const { malloc, heap_reset, markdown_to_html, memory } = module.instance.exports; function writeString(str) { const encoder = new TextEncoder(); const bytes = encoder.encode(str + '\0'); const ptr = malloc(bytes.length); new Uint8Array(memory.buffer).set(bytes, ptr); return ptr; } function readString(ptr) { const mem = new Uint8Array(memory.buffer); let end = ptr; while (mem[end] !== 0) end++; return new TextDecoder().decode(mem.slice(ptr, end)); } function convert(md) { heap_reset(); const inputPtr = writeString(md); const outputPtr = markdown_to_html(inputPtr); return readString(outputPtr); } console.log('Running markdown_to_html WASM tests...\n'); // Test: Headings console.log('--- Headings ---'); assertEqual(convert('# Hello'), '<h1>Hello</h1>', 'H1 heading'); assertEqual(convert('## World'), '<h2>World</h2>', 'H2 heading'); assertEqual(convert('### Level 3'), '<h3>Level 3</h3>', 'H3 heading'); assertEqual(convert('###### Level 6'), '<h6>Level 6</h6>', 'H6 heading'); // Test: Inline formatting console.log('\n--- Inline Formatting ---'); assertEqual(convert('**bold**'), '<p><strong>bold</strong></p>', 'Bold with **'); assertEqual(convert('__bold__'), '<p><strong>bold</strong></p>', 'Bold with __'); assertEqual(convert('*italic*'), '<p><em>italic</em></p>', 'Italic with *'); assertEqual(convert('_italic_'), '<p><em>italic</em></p>', 'Italic with _'); assertEqual(convert('~~strike~~'), '<p><del>strike</del></p>', 'Strikethrough'); assertEqual(convert('`code`'), '<p><code>code</code></p>', 'Inline code'); // Test: Links and Images console.log('\n--- Links and Images ---'); assertEqual(convert('[link](http://example.com)'), '<p><a href="http://example.com">link</a></p>', 'Link'); assertEqual(convert(''), '<p><img src="http://img.png" alt="alt"></p>', 'Image'); // Test: Lists console.log('\n--- Lists ---'); assertEqual(convert('- item1\n- item2'), '<ul><li>item1</li><li>item2</li></ul>', 'Unordered list with -'); assertEqual(convert('* item1\n* item2'), '<ul><li>item1</li><li>item2</li></ul>', 'Unordered list with *'); assertEqual(convert('1. first\n2. second'), '<ol><li>first</li><li>second</li></ol>', 'Ordered list'); // Test: Code block console.log('\n--- Code Block ---'); const codeBlock = '```\nfunction test() {\n return 42;\n}\n```'; assertContains(convert(codeBlock), '<pre><code>', 'Code block opens'); assertContains(convert(codeBlock), '</code></pre>', 'Code block closes'); // Test: Blockquote console.log('\n--- Blockquote ---'); assertEqual(convert('> quote'), '<blockquote>quote </blockquote>', 'Blockquote'); // Test: Horizontal rule console.log('\n--- Horizontal Rule ---'); assertEqual(convert('---'), '<hr>', 'HR with ---'); assertEqual(convert('***'), '<hr>', 'HR with ***'); assertEqual(convert('___'), '<hr>', 'HR with ___'); // Test: Tables console.log('\n--- Tables ---'); const table = '| Name | Age |\n|------|-----|\n| Alice | 30 |\n| Bob | 25 |'; const tableHtml = convert(table); assertContains(tableHtml, '<table>', 'Table opens'); assertContains(tableHtml, '</table>', 'Table closes'); assertContains(tableHtml, '<thead>', 'Table has thead'); assertContains(tableHtml, '<tbody>', 'Table has tbody'); assertContains(tableHtml, '<th>Name</th>', 'Table header cell'); assertContains(tableHtml, '<td>Alice</td>', 'Table body cell'); // Test: Complex table with inline formatting console.log('\n--- Table with Inline Formatting ---'); const complexTable = '| Feature | Status |\n|---------|--------|\n| **Bold** | *done* |'; const complexTableHtml = convert(complexTable); assertContains(complexTableHtml, '<strong>Bold</strong>', 'Bold in table cell'); assertContains(complexTableHtml, '<em>done</em>', 'Italic in table cell'); // Test: HTML escaping console.log('\n--- HTML Escaping ---'); assertContains(convert('<script>'), '<script>', 'Escapes < and >'); assertContains(convert('a & b'), '&', 'Escapes &'); // Test: Mixed content console.log('\n--- Mixed Content ---'); const mixed = '# Title\n\nSome **bold** text.\n\n- item 1\n- item 2'; const mixedHtml = convert(mixed); assertContains(mixedHtml, '<h1>Title</h1>', 'Mixed: heading'); assertContains(mixedHtml, '<strong>bold</strong>', 'Mixed: bold'); assertContains(mixedHtml, '<ul>', 'Mixed: list'); // Summary console.log('\n========================================'); console.log(`Tests passed: ${testsPassed}`); console.log(`Tests failed: ${testsFailed}`); if (testsFailed > 0) { process.exit(1); } } runTests().catch(err => { console.error('Test error:', err); process.exit(1); });