Mercurial
diff markdown_converter/tests/test_wasm.js @ 156:cd35e600ae34
[MarkDown Converter] Fixed few things and made a test
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Mon, 12 Jan 2026 15:20:39 -0800 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/markdown_converter/tests/test_wasm.js Mon Jan 12 15:20:39 2026 -0800 @@ -0,0 +1,150 @@ +/** + * 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); +});