mirror of
https://github.com/denoland/std.git
synced 2024-11-21 20:50:22 +00:00
93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
|
|
import { escape } from "./escape.ts";
|
|
import { assertEquals, assertMatch, assertNotMatch } from "@std/assert";
|
|
|
|
const ALL_ASCII =
|
|
"\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F";
|
|
const ALL_REGEXP_FLAGS = "gimsuy";
|
|
|
|
Deno.test("escape() works with examples", async (t) => {
|
|
await t.step("`.` matches literal `.`", () => {
|
|
const re = new RegExp(`^${escape(".")}$`, "u");
|
|
|
|
assertEquals("^\\.$", re.source);
|
|
assertMatch(".", re);
|
|
assertNotMatch("a", re);
|
|
});
|
|
await t.step("`$` matches literal `$`", () => {
|
|
const re = new RegExp(`^${escape("$")}$`);
|
|
|
|
assertMatch("$", re);
|
|
assertNotMatch("", re);
|
|
});
|
|
await t.step("`*` matches literal `*`", () => {
|
|
const re = new RegExp(`^${escape("a*")}$`);
|
|
|
|
assertMatch("a*", re);
|
|
assertNotMatch("", re);
|
|
assertNotMatch("aaa", re);
|
|
});
|
|
await t.step("escapes works correctly within character class", () => {
|
|
const re = new RegExp(`^[${escape(".$*+[](){}|\\<>")}]$`);
|
|
|
|
assertMatch(".", re);
|
|
assertMatch("$", re);
|
|
assertMatch("*", re);
|
|
assertMatch("+", re);
|
|
assertMatch("[", re);
|
|
assertMatch("]", re);
|
|
assertMatch("(", re);
|
|
assertMatch(")", re);
|
|
assertMatch("{", re);
|
|
assertMatch("}", re);
|
|
assertMatch("|", re);
|
|
assertMatch("\\", re);
|
|
assertMatch("<", re);
|
|
assertMatch(">", re);
|
|
|
|
assertNotMatch("a", re);
|
|
});
|
|
});
|
|
Deno.test("escape() works with all ASCII", async (t) => {
|
|
await t.step("interpolates without erroring", async (t) => {
|
|
await t.step("outside character class", () => {
|
|
for (const char of ALL_ASCII) {
|
|
for (const flag of ALL_REGEXP_FLAGS) {
|
|
new RegExp(escape(char), flag);
|
|
}
|
|
}
|
|
});
|
|
await t.step("within character class", () => {
|
|
for (const char of ALL_ASCII) {
|
|
for (const flag of ALL_REGEXP_FLAGS) {
|
|
new RegExp(`[${escape(char)}]`, flag);
|
|
}
|
|
}
|
|
});
|
|
await t.step("matches self", () => {
|
|
for (const char of ALL_ASCII) {
|
|
for (const flag of ALL_REGEXP_FLAGS) {
|
|
assertMatch(char, new RegExp(`^${escape(char)}$`, flag));
|
|
}
|
|
}
|
|
});
|
|
await t.step("doesn't match any other chars", () => {
|
|
for (const char of ALL_ASCII) {
|
|
for (const flag of ALL_REGEXP_FLAGS) {
|
|
if (flag === "i") continue;
|
|
|
|
for (const char2 of ALL_ASCII) {
|
|
if (char2 === char) continue;
|
|
|
|
assertNotMatch(
|
|
char2,
|
|
new RegExp(`^${escape(char)}$`, flag),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|