import { describe, expect, test } from "bun:test" import { extractHtml } from "./html-text-map.mjs" /** {T} is the target sentence: every row runs once with English text and once with Korean text. */ const TARGET = { en: "Target length is 999 m.", ko: "\ubaa9\ud45c \uae38\uc774\ub294 999 m\uc774\ub2e4." } const CONTROL = "Control length is 410 m." type Row = { form: string; html: string; expected: "hidden" | "visible" } const css = (sheet: string, element = '

{T}

') => `${element}` const ROWS: Row[] = [ // conditional and grouping at-rules: only an unconditional rule hides; a conditional one never does { form: "@media (max-width:600px)", html: css("@media (max-width:600px){.x{display:none}}"), expected: "visible" }, { form: "@media print", html: css("@media print{.x{display:none}}"), expected: "visible" }, { form: "@media screen and (min-width:0)", html: css("@media screen and (min-width: 0){.x{display:none}}"), expected: "visible" }, { form: "@media not print", html: css("@media not print{.x{display:none}}"), expected: "visible" }, { form: "@media all", html: css("@media all{.x{display:none}}"), expected: "hidden" }, { form: "@media all and (min-width:1px)", html: css("@media all and (min-width:1px){.x{display:none}}"), expected: "visible" }, { form: "@supports (display:grid)", html: css("@supports (display:grid){.x{display:none}}"), expected: "visible" }, { form: "@container (min-width:400px)", html: css("@container (min-width: 400px){.x{display:none}}"), expected: "visible" }, { form: "@scope (.card)", html: css("@scope (.card){.x{display:none}}", '

{T}

'), expected: "visible" }, { form: "@starting-style", html: css("@starting-style{.x{display:none}}"), expected: "visible" }, { form: "@document url-prefix()", html: css("@-moz-document url-prefix(){.x{display:none}}"), expected: "visible" }, { form: "@layer base (block)", html: css("@layer base{.x{display:none}}"), expected: "hidden" }, { form: "@layer statement then block", html: css("@layer a, b; @layer b{.x{display:none}}"), expected: "hidden" }, { form: "@layer inside @media", html: css("@media print{@layer a{.x{display:none}}}"), expected: "visible" }, { form: "@media inside @layer", html: css("@layer a{@media print{.x{display:none}}}"), expected: "visible" }, { form: "@media inside @supports", html: css("@supports (display:grid){@media (min-width:1px){.x{display:none}}}"), expected: "visible" }, { form: "@media nested in a style rule", html: css(".x{color:red;@media print{display:none}}"), expected: "visible" }, { form: "@import before a rule", html: css('@import url("print.css") print; .x{display:none}'), expected: "hidden" }, { form: "@font-face before a rule", html: css("@font-face{font-family:F;src:url(f.woff2)} .x{display:none}"), expected: "hidden" }, { form: "@keyframes hiding steps", html: css("@keyframes k{from{visibility:hidden}to{display:none}} .x{animation:k 1s}"), expected: "visible" }, { form: "@page", html: css("@page{display:none} .y{display:none}"), expected: "visible" }, { form: "CSS nesting (combinator, not evaluated)", html: css(".card{.x{display:none}}", '

{T}

'), expected: "visible" }, { form: "conditional rule after an unconditional one", html: css(".x{display:none} @media print{.x{color:red}}"), expected: "hidden" }, // comments { form: "rule inside a comment", html: css("/* .x{display:none} */"), expected: "visible" }, { form: "comment before the declaration", html: css(".x{/* display:block */display:none}"), expected: "hidden" }, { form: "comment inside the value", html: css(".x{display:/**/none}"), expected: "hidden" }, { form: "HTML comment markers in ', expected: "hidden" }, { form: " in <head>", html: "<head><title>{T}", expected: "hidden" }, { form: " text", html: "{T}", expected: "hidden" }, { form: "closed ", html: "

{T}

", expected: "hidden" }, { form: "open ", html: "

{T}

", expected: "visible" }, { form: "closed
body", html: "
More

{T}

", expected: "visible" }, // which

{T}

', expected: "visible" }, { form: "

{T}

', expected: "visible" }, { form: "

{T}

', expected: "hidden" }, { form: "

{T}

', expected: "hidden" }, { form: '

{T}

', expected: "visible" }, { form: '

{T}

', expected: "hidden" }, { form: '

{T}

', expected: "visible" }, { form: "external stylesheet (not evaluated)", html: '

{T}

', expected: "visible" }, ] const CASES = ROWS.flatMap((row) => (["en", "ko"] as const).map((lang) => [`${row.form} [${lang}] -> ${row.expected}`, row.html.replaceAll("{T}", TARGET[lang]), TARGET[lang], row.expected] as const), ) describe("reader-visible text: one row per hiding form, English and Korean", () => { test.each(CASES)("#given %s #when extracted #then the target is that", (_name, html, target, expected) => { const { text } = extractHtml(`${html}
${CONTROL}
`) expect(text).toContain(CONTROL) expect(text.includes(target) ? "visible" : "hidden").toBe(expected) }) })