'use strict'; const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const test = require('node:test'); const { execFileSync } = require('node:child_process'); const root = path.resolve(__dirname, '..', '..'); const read = (file) => fs.readFileSync(path.join(root, file), 'utf8'); test('TOC widget renders one escaped title and asset eligibility follows saved article settings', () => { const fixture = JSON.parse(execFileSync(process.env.PHP_BINARY || 'php', [path.join(__dirname, 'posts-toc-render-harness.php')], { encoding: 'utf8' })); assert.equal(fixture.dynamic_headings, true, 'shortcode headings must get the directory script'); assert.equal(fixture.global_disabled, false); assert.equal(fixture.post_disabled, false); assert.equal(fixture.other_page, false); assert.equal(fixture.non_article_widget, ''); assert.deepEqual(fixture.widget_fields, ['title', 'mini_title', 'in_affix'], 'TOC exposes only its three reference settings'); assert.match(fixture.widget, /^
|class="title-theme"|aksrt-widget-shell/); }); test('article TOC renderer owns its reference container and title without the generic title wrapper', () => { const frontend = read('src/WidgetSystem/FrontendRenderer.php'); const start = frontend.indexOf("if ($definition->slug() === 'posts_toc')"); const end = frontend.indexOf("if (in_array($definition->slug(), ['user_card'", start); assert.ok(start >= 0 && end > start, 'TOC needs its dedicated render branch'); const branch = frontend.slice(start, end); assert.match(branch, /echo \$content/); assert.doesNotMatch(branch, /reference_title|before_widget|after_widget/); assert.doesNotMatch(frontend.slice(frontend.indexOf("if (in_array($definition->slug(), ["), frontend.indexOf('$classes = [', frontend.indexOf("if (in_array($definition->slug(), ["))), /posts_toc/); const renderer = read('src/WidgetSystem/Renderers/GeneralRenderer.php'); assert.match(renderer, /return '