| 1 | import assert from "node:assert/strict"; |
| 2 | import { JSDOM } from "jsdom"; |
| 3 | import React, { act } from "react"; |
| 4 | import { createRoot } from "react-dom/client"; |
| 5 | import { EffortSwitcher } from "../components/EffortSwitcher"; |
| 6 | const dom = new JSDOM('<div id="root"></div>', { url: "http://localhost/", pretendToBeVisual: true }); |
| 7 | Object.assign(globalThis, {window: dom.window, document: dom.window.document, HTMLElement: dom.window.HTMLElement, Node: dom.window.Node, IS_REACT_ACT_ENVIRONMENT: true}); |
| 8 | dom.window.matchMedia = (() => ({matches:true, addEventListener(){},removeEventListener(){}})) as typeof window.matchMedia; |
| 9 | const rootEl = document.getElementById("root")!; |
| 10 | const root = createRoot(rootEl); |
| 11 | let selected = ""; |
| 12 | const effort = {supported:true,current:"deliberate",default:"deliberate",levels:["auto","invalid-legacy-level"],options:[{id:"deliberate",name:"Deliberate"},{id:"brief",name:"Brief"}]}; |
| 13 | const render = async (disabled: boolean) => act(async () => root.render(<EffortSwitcher disabled={disabled} onPick={id => {selected=id;}} effort={effort} />)); |
| 14 | await render(false); |
| 15 | assert.match(rootEl.textContent!, /Deliberate/); |
| 16 | await act(async () => rootEl.querySelector("button")!.click()); |
| 17 | const options = Array.from(document.querySelectorAll<HTMLButtonElement>('[role="option"]')); |
| 18 | assert.deepEqual(options.map(option=>option.textContent),["auto","Deliberate","Brief"]); |
| 19 | await act(async () => { |
| 20 | options[2].click(); |
| 21 | await new Promise<void>((resolve) => window.requestAnimationFrame(() => resolve())); |
| 22 | await new Promise((resolve) => setTimeout(resolve, 0)); |
| 23 | }); |
| 24 | assert.equal(selected,"brief","UI submits adapter ID, not display label or global alias"); |
| 25 | await act(async () => rootEl.querySelector("button")!.click()); |
| 26 | assert.ok(document.querySelector('[role="listbox"]')); |
| 27 | await render(true); |
| 28 | await render(false); |
| 29 | assert.equal(document.querySelector('[role="listbox"]'), null, "disabled then enabled does not reopen effort menu"); |
| 30 | await act(async () => root.unmount()); |
| 31 | console.log("PASS adapter-owned effort options and exact selection"); |
| 32 |