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"); });