From 8c4c32c4bfa6ed0f899bdfe8a09fa7361a003a4d Mon Sep 17 00:00:00 2001 From: KoloMl Date: Sun, 14 Jun 2026 00:29:33 +0400 Subject: [PATCH] Covering quoted term decoding/encoding behavior --- tests/lib/philomena/search/QueryLexer.spec.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 tests/lib/philomena/search/QueryLexer.spec.ts diff --git a/tests/lib/philomena/search/QueryLexer.spec.ts b/tests/lib/philomena/search/QueryLexer.spec.ts new file mode 100644 index 0000000..1c7e9d3 --- /dev/null +++ b/tests/lib/philomena/search/QueryLexer.spec.ts @@ -0,0 +1,31 @@ +import { QueryLexer, QuotedTermToken, Token } from "$lib/philomena/search/QueryLexer"; + +describe('QueryLexer', () => { + function parseQuery(query: string): Token[] { + return new QueryLexer(query).parse(); + } + + describe('QuotedTermToken', () => { + it('should decode and encode quotes and backslash', () => { + const encodedQuote = `"term with \\\" inside of it"`; + const decodedQuote = 'term with " inside of it'; + + expect(QuotedTermToken.decode(encodedQuote)).toBe(decodedQuote); + expect(QuotedTermToken.encode(decodedQuote)).toBe(encodedQuote); + + const encodedBackslash = `"term with \\\\ inside of it"`; + const decodedBackslash = 'term with \\ inside of it'; + + expect(QuotedTermToken.decode(encodedBackslash)).toBe(decodedBackslash); + expect(QuotedTermToken.encode(decodedBackslash)).toBe(encodedBackslash); + }); + + it('should not care for anything else', () => { + const encodedTerm = '"operators: , && || AND OR NOT ! ^ ? *"'; + const decodedTerm = 'operators: , && || AND OR NOT ! ^ ? *'; + + expect(QuotedTermToken.decode(encodedTerm)).toBe(decodedTerm); + expect(QuotedTermToken.encode(decodedTerm)).toBe(encodedTerm); + }); + }); +});