import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { resetStoreFields } from "../../stores/signal-field"; import { reviewGate } from "../../stores/stream"; import { applyCandidateResolution, applyFinalReviewStatus, markCandidateReady, } from "./candidate"; class FakeClassList { readonly tokens = new Set(); constructor(initial?: string) { if (initial) for (const t of initial.split(/\s+/).filter(Boolean)) this.tokens.add(t); } add(...names: string[]): void { for (const n of names) this.tokens.add(n); } remove(...names: string[]): void { for (const n of names) this.tokens.delete(n); } contains(name: string): boolean { return this.tokens.has(name); } toggle(name: string, force?: boolean): boolean { if (force === true) this.add(name); else if (force === false) this.remove(name); else if (this.tokens.has(name)) this.remove(name); else this.add(name); return this.tokens.has(name); } get value(): string { return [...this.tokens].join(" "); } } class FakeEl { tagName: string; _id = ""; classList: FakeClassList; children: FakeEl[] = []; parent: FakeEl | null = null; dataset: Record = {}; style: Record = {}; _text = ""; _html = ""; ownerDocument: FakeDoc; _messageText?: string; constructor(tag: string, doc: FakeDoc) { this.tagName = tag.toUpperCase(); this.ownerDocument = doc; this.classList = new FakeClassList(); } get id(): string { return this._id; } set id(value: string) { this._id = value; if (value) this.ownerDocument.registerId(value, this); } get className(): string { return this.classList.value; } set className(value: string) { this.classList = new FakeClassList(value); } get textContent(): string { if (this.children.length) return this.children.map((c) => c.textContent).join(""); return this._text; } set textContent(value: string) { this.children = []; this._text = value == null ? "" : String(value); } get innerHTML(): string { return this._html || this.textContent; } set innerHTML(value: string) { this._html = value; this.children = []; // To a fixed point: one pass leaves `<script>` as `