3
0
mirror of https://github.com/larvit/adf-codec.git synced 2026-11-12 11:48:29 +01:00

Answer stability round 1: 0 🔴, 2 🟡 (0 misread); assert the reduced task list whole and list the README codes by one match

This commit is contained in:
2026-11-09 08:28:13 +01:00
committed by Lillem4n
parent 32e295eff8
commit 38e7bcfaca
2 changed files with 18 additions and 28 deletions
@@ -158,28 +158,23 @@ test('spells a task list as a bullet list whose items lead with their state', ()
assert.equal(portable(node('taskList', {}, task('DONE', 'a'), node('taskList', {}, task('TODO', '')))), '- [x] a\n - [ ]\n')
})
test('leaves a block task item only when it opens with a paragraph', () => {
const task = (state: string, value: string): AdfNode => node('taskItem', { state }, text(value))
test('leaves a block task item only when it opens with two or more paragraphs', () => {
const task = (value: string): AdfNode => node('taskItem', { state: 'TODO' }, text(value))
const blockTask = (...content: AdfNode[]): AdfNode => node('blockTaskItem', { state: 'TODO' }, ...content)
const codeBlock: AdfNode = { content: [text('x')], type: 'codeBlock' }
const nested = node('taskList', {}, task('TODO', 'n'))
const lists = [
node('taskList', {}, blockTask(said('a'), said('b')), blockTask(codeBlock, said('c')), blockTask(bulletList(item(said('d'))), said('e'))),
node('taskList', {}, blockTask(nested, said('f')), blockTask(said('g'), codeBlock, said('h')), blockTask(), blockTask(said('i'))),
node('taskList', {}, blockTask(said('j'), nested, said('k'), nested), blockTask(said('l'), said('m'), nested)),
]
const reduced = reduceToPortable(document(...lists))
assert.ok(reduced.ok)
const pending = [...(reduced.value.content ?? [])]
let blockTasks = 0
for (let at = pending.pop(); at !== undefined; at = pending.pop()) {
for (const child of at.content ?? []) pending.push(child)
if (at.type !== 'blockTaskItem') continue
blockTasks += 1
assert.equal(at.content?.[0]?.type, 'paragraph')
assert.ok((at.content ?? []).filter((child) => child.type === 'paragraph').length >= 2)
}
assert.equal(blockTasks, 2)
const taskList = (...content: AdfNode[]): AdfNode => ({ content, type: 'taskList' })
const nested = taskList(task('n'))
const reduced = reduceToPortable(
document(node('taskList', {}, blockTask(said('a'), said('b')), blockTask(codeBlock, said('c')), blockTask(said('d'), codeBlock), blockTask(said('e'), said('f'), node('taskList', {}, task('n'))))),
)
assert.deepEqual(reduced.ok && reduced.value.content, [
taskList(blockTask(said('a'), said('b')), { attrs: { state: 'TODO' }, type: 'taskItem' }),
codeBlock,
said('c'),
taskList(task('d')),
codeBlock,
taskList(blockTask(said('e'), said('f')), nested),
])
})
test('spells a decision list as a plain bullet list', () => {
+3 -8
View File
@@ -48,14 +48,9 @@ for (const [code, cause] of Object.entries(causes)) {
})
}
// A code added or removed must reach the README's tables, which are the contract a consumer switches on.
test('the README error tables list exactly the codes ConvertErrorCode holds', () => {
const readme = readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'README.md'), 'utf8')
const section = readme.slice(readme.indexOf('\n## The errors\n'))
const listed = new Set<string>()
for (const line of section.slice(1, section.indexOf('\n## ', 1)).split('\n')) {
const code = /^\| `([a-z-]+)` \|/.exec(line)?.[1]
if (code !== undefined) listed.add(code)
}
assert.deepEqual([...listed].sort(), Object.keys(causes).sort())
const section = readme.slice(readme.indexOf('\n## The errors\n') + 1, readme.indexOf('\n## ', readme.indexOf('\n## The errors\n') + 1))
const listed = [...section.matchAll(/^\| `([a-z-]+)` \|/gm)].map((match) => match[1])
assert.deepEqual(listed.sort(), Object.keys(causes).sort())
})