metis-desk/packages/rdx-ui/src/lib/text-search.test.ts

74 lines
2.6 KiB
TypeScript
Raw Normal View History

2026-10-24 23:19:17 +00:00
import assert from "node:assert/strict";
import { test } from "node:test";
import { createTextMatcher, normalizeSearchText } from "./text-search";
test("la comparación parcial pliega vocales, caja y representaciones Unicode equivalentes", () => {
for (const [query, value] of [
["portatil", "Mi portátil 24"],
[" APLICACION ", "Aplicación"],
["alvaro", "Álvaro"],
["administracion", "Administración"],
["Á", "A\u0301"],
["aguero", "Agüero"],
["AEIOU", "Àèìòù"],
["a", "a\u0301\u0308"],
["a\u0327", "a\u0327\u0301"],
]) {
assert.ok(query && value);
assert.equal(createTextMatcher(query)(value), true, `${query}: ${value}`);
assert.equal(normalizeSearchText(value), normalizeSearchText(value.normalize("NFD")));
}
});
test("ñ conserva identidad compuesta y descompuesta y otras escrituras no se transliteran", () => {
for (const [query, value] of [
["Pena", "Peña"],
["ano", "año"],
["canon", "cañón"],
["c", "ç"],
["a", "а"],
["か", "が"],
["α", "ά"],
]) {
assert.ok(query && value);
assert.equal(createTextMatcher(query)(value), false, `${query}: ${value}`);
}
assert.equal(createTextMatcher("PEN\u0303A")("Peña"), true);
assert.equal(createTextMatcher("cañon")("cañón"), true);
assert.equal(createTextMatcher("東京")("東京支社"), true);
assert.equal(normalizeSearchText("Ñ\u0301"), normalizeSearchText("N\u0303\u0301"));
});
test("puntuación técnica, números y espacios interiores siguen siendo significativos", () => {
for (const value of [
"192.168.5.201",
"AA:BB:01:02:03:04",
"AA-BB-01",
"\\\\srv\\Área",
"/srv/Área",
"PC-001",
"a b",
]) {
const matches = createTextMatcher(` ${value} `);
assert.equal(matches(value), true);
assert.equal(matches(value.replace(/[.:/\\ -]/gu, "")), false);
assert.equal(matches(value), true);
}
assert.equal(createTextMatcher("001")(1001), true);
assert.equal(createTextMatcher("false")(false), true);
assert.equal(createTextMatcher("0")(0), true);
});
test("vacíos y valores sin texto no serializan objetos arbitrarios", () => {
for (const value of ["", null, undefined, 0, false, { name: "portátil" }, ["portátil"]]) {
assert.equal(createTextMatcher(" ")(value), true);
}
for (const value of [null, undefined, { name: "portátil" }, ["portátil"], Symbol("portátil")]) {
assert.equal(createTextMatcher("portatil")(value), false);
}
assert.equal(normalizeSearchText(""), "");
assert.equal(normalizeSearchText(normalizeSearchText(" ÁÑÜ ")), "añu");
});