diacritic-search-ts
Version:
A Node.js/TypeScript package for diacritic-insensitive search using regex
105 lines (104 loc) • 6.69 kB
JavaScript
// src/__tests__/index.test.ts
import { diacriticInsensitiveTransform, searchDiacriticInsensitive, searchMultiWordDiacriticInsensitive, slovakDiacriticMap, czechDiacriticMap, slovakCzechDiacriticMap } from '../index.js'; // Použite .js rozšírenie pre ESM
describe('diacriticInsensitiveTransform', () => {
it('should transform a simple query with Slovak map', () => {
const query = 'cesta';
const transformed = diacriticInsensitiveTransform(query, slovakDiacriticMap);
expect(transformed).toBe('[c,č][e,é][s,š][t,ť][a,á,ä]'); // Transform all characters with their diacritic variants
});
it('should transform a query with a character from Slovak map', () => {
const query = 'ludi'; // for 'ľudí'
const transformed = diacriticInsensitiveTransform(query, slovakDiacriticMap);
expect(transformed).toBe('[l,ľ,ĺ][u,ú][d,ď][i,í]'); // All characters transformed with their variants
});
it('should transform a query with diacritics using Slovak map (normalizes first)', () => {
const query = 'Košice'; // User types with diacritic
const transformed = diacriticInsensitiveTransform(query, slovakDiacriticMap);
expect(transformed).toBe('K[o,ó,ô][s,š][i,í][c,č][e,é]'); // All characters transformed
});
it('should transform a query with diacritics using Czech map (normalizes first)', () => {
const query = 'Plzeň'; // User types with diacritic
const transformed = diacriticInsensitiveTransform(query, czechDiacriticMap);
expect(transformed).toBe('Pl[z,ž][e,é,ě][n,ň]'); // All characters transformed
});
it('should escape special regex characters', () => {
const query = 'test.pdf?';
const transformed = diacriticInsensitiveTransform(query, slovakDiacriticMap);
expect(transformed).toBe('[t,ť][e,é][s,š][t,ť]\\.p[d,ď]f\\?'); // Characters transformed and special chars escaped
});
it('should handle empty string', () => {
const transformed = diacriticInsensitiveTransform('', slovakDiacriticMap);
expect(transformed).toBe('');
});
});
describe('searchDiacriticInsensitive', () => {
const textSK = 'Žijeme v Košiciach s riaditeľom.';
const textCZ = 'Potřebuji zajít do Plzně na oběd s přítelkyní.';
it('should find exact match (slovak)', () => {
expect(searchDiacriticInsensitive(textSK, 'Košiciach', slovakDiacriticMap)).toBe(true); // Fixed to match actual text
});
it('should find match with missing diacritics (slovak)', () => {
expect(searchDiacriticInsensitive(textSK, 'Kosiciach', slovakDiacriticMap)).toBe(true); // Fixed to match actual text
});
it('should find match for character variants (slovak)', () => {
expect(searchDiacriticInsensitive(textSK, 'zijeme', slovakDiacriticMap)).toBe(true); // 'Ž' in text
expect(searchDiacriticInsensitive(textSK, 'riaditelom', slovakDiacriticMap)).toBe(true); // 'i'
});
it('should not find non-existent word (slovak)', () => {
expect(searchDiacriticInsensitive(textSK, 'Bratislava', slovakDiacriticMap)).toBe(false);
});
it('should find exact match (czech)', () => {
expect(searchDiacriticInsensitive(textCZ, 'Plzně', czechDiacriticMap)).toBe(true);
});
it('should find match with missing diacritics (czech)', () => {
expect(searchDiacriticInsensitive(textCZ, 'Plzne', czechDiacriticMap)).toBe(true);
});
it('should find match for character variants (czech)', () => {
expect(searchDiacriticInsensitive(textCZ, 'potrebuji', czechDiacriticMap)).toBe(true); // 'Potřebuji'
expect(searchDiacriticInsensitive(textCZ, 'obed', czechDiacriticMap)).toBe(true); // 'oběd'
expect(searchDiacriticInsensitive(textCZ, 'pritelkyni', czechDiacriticMap)).toBe(true); // 'přítelkyní'
});
it('should respect case sensitivity', () => {
expect(searchDiacriticInsensitive('Hello', 'hello', slovakDiacriticMap, true)).toBe(false);
expect(searchDiacriticInsensitive('Hello', 'Hello', slovakDiacriticMap, true)).toBe(true);
});
it('should be case insensitive by default', () => {
expect(searchDiacriticInsensitive('Hello', 'hello', slovakDiacriticMap)).toBe(true);
});
it('should handle empty text or query', () => {
expect(searchDiacriticInsensitive('', 'query', slovakDiacriticMap)).toBe(false);
expect(searchDiacriticInsensitive('text', '', slovakDiacriticMap)).toBe(false);
expect(searchDiacriticInsensitive('', '', slovakDiacriticMap)).toBe(false);
});
});
describe('searchMultiWordDiacriticInsensitive', () => {
const text = 'Chcem navštíviť hlavné mesto Slovenska, Bratislavu a Město Touškov.';
it('should find multiple words in correct order with diacritics', () => {
expect(searchMultiWordDiacriticInsensitive(text, 'hlavné mesto Slovenska', slovakCzechDiacriticMap)).toBe(true);
});
it('should find multiple words with missing diacritics', () => {
expect(searchMultiWordDiacriticInsensitive(text, 'hlavne mesto slovenska', slovakCzechDiacriticMap)).toBe(true);
});
it('should find words with mixed diacritic maps', () => {
expect(searchMultiWordDiacriticInsensitive(text, 'Mesto Touškov', slovakCzechDiacriticMap)).toBe(true);
});
it('should not find words in wrong order', () => {
expect(searchMultiWordDiacriticInsensitive(text, 'Slovenska hlavne mesto', slovakCzechDiacriticMap)).toBe(false);
});
it('should not find if one word is missing', () => {
expect(searchMultiWordDiacriticInsensitive(text, 'hlavne mesto Fiktivno', slovakCzechDiacriticMap)).toBe(false);
});
it('should handle extra spaces in query', () => {
expect(searchMultiWordDiacriticInsensitive(text, ' hlavne mesto slovenska ', slovakCzechDiacriticMap)).toBe(true);
});
it('should respect case sensitivity', () => {
expect(searchMultiWordDiacriticInsensitive(text, 'Hlavne Mesto Slovenska', slovakCzechDiacriticMap, true)).toBe(false);
// Test case sensitivity with a match that will work - using exact casing from the text
expect(searchMultiWordDiacriticInsensitive(text, 'navštíviť', slovakCzechDiacriticMap, true)).toBe(true);
});
it('should handle empty text or query', () => {
expect(searchMultiWordDiacriticInsensitive('', 'word', slovakCzechDiacriticMap)).toBe(false);
expect(searchMultiWordDiacriticInsensitive('text', '', slovakCzechDiacriticMap)).toBe(false);
expect(searchMultiWordDiacriticInsensitive('', '', slovakCzechDiacriticMap)).toBe(false);
});
});