UNPKG

diacritic-search-ts

Version:

A Node.js/TypeScript package for diacritic-insensitive search using regex

105 lines (104 loc) 6.69 kB
// 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); }); });