import { test } from 'node:test' import assert from 'node:assert/strict' import { render } from './render.mjs' test('replaces placeholders', () => { assert.equal(render('Hi {{name}}', { name: 'Al' }), 'Hi Al') }) test('value containing $ and braces is inserted literally', () => { assert.equal(render('v={{x}}', { x: '${FOO} a{b}c }}' }), 'v=${FOO} a{b}c }}') }) test('strips HTML comments used as template guides', () => { assert.equal(render('ab', {}), 'ab') }) test('missing key throws (no silent blank)', () => { assert.throws(() => render('{{missing}}', {}), /missing/) }) test('inherited prototype keys are treated as missing (not silently rendered)', () => { // {{constructor}} / {{toString}} 不应沿原型链命中继承函数渲染出垃圾 assert.throws(() => render('{{constructor}}', {}), /missing var "constructor"/) assert.throws(() => render('{{toString}}', {}), /missing var "toString"/) // 但 own 属性即便名为 constructor 也应正常渲染 assert.equal(render('{{constructor}}', { constructor: 'X' }), 'X') })