deno.land / std@0.224.0 / html / entities_test.ts
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { escape, unescape } from "./entities.ts";import { assertEquals } from "../assert/mod.ts";import entityList from "./named_entity_list.json" with { type: "json" };
Deno.test("escape()", async (t) => { await t.step('escapes &<>"', () => { assertEquals(escape("&<>'\""), "&<>'""); }); await t.step("escapes ' to ' (not ')", () => { assertEquals(escape("'"), "'"); }); await t.step("doesn't escape non-breaking space", () => { assertEquals(escape("\xa0"), "\xa0"); }); await t.step( "doesn't escape other characters, even if they have named entities", () => { assertEquals(escape("þð"), "þð"); }, );});
Deno.test("unescape()", async (t) => { await t.step("round-trips with escape", () => { const chars = "&<>'\""; assertEquals(unescape(escape(chars)), chars); });
await t.step("named entities", async (t) => { await t.step("default options", async (t) => { await t.step("unescapes ' as alias for ' '", () => { assertEquals(unescape("'"), "'"); }); await t.step("unescapes ", () => { assertEquals(unescape(" "), "\xa0"); }); await t.step("doesn't unescape other named entities", () => { assertEquals(unescape("þð"), "þð"); }); });
await t.step("full entity list", async (t) => { await t.step("unescapes arbitrary named entities", () => { assertEquals(unescape("þð", { entityList }), "þð"); }); await t.step( "unescapes truncated named entity (no trailing semicolon) if it is listed", () => { assertEquals(unescape("&", { entityList }), "&"); }, ); await t.step( "consumes full named entity even when a truncated version is specified", () => { assertEquals(unescape("&", { entityList }), "&"); }, ); await t.step( "doesn't unescape truncated named entity if it isn't listed", () => { assertEquals( unescape("∴ &therefore", { entityList }), "∴ &therefore", ); }, ); }); });
await t.step("unescape() handles decimal", async (t) => { await t.step("unescapes decimal", () => { assertEquals(unescape("."), "."); }); await t.step("unescapes max decimal codepoint", () => { assertEquals(unescape(""), "\u{10ffff}"); }); await t.step("unescapes decimal with leading zero", () => { assertEquals(unescape("."), "."); }); await t.step( "unescapes invalid decimal codepoint to replacement character", () => { assertEquals(unescape("�"), "�"); }, ); });
await t.step("unescape() handles hex", async (t) => { await t.step("unescapes lower-case hex", () => { assertEquals(unescape("."), "."); }); await t.step("unescapes upper-case hex", () => { assertEquals(unescape("."), "."); }); await t.step("unescapes hex with leading zero", () => { assertEquals(unescape("."), "."); }); await t.step("unescapes max hex codepoint", () => { assertEquals(unescape(""), "\u{10ffff}"); }); await t.step( "unescapes invalid hex codepoint to replacement character", () => { assertEquals(unescape("�"), "�"); }, ); });});
Version Info