@traqula/test-utils 1.0.7 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +33 -3
  2. package/dist/cjs/lib/Sparql11NotesTest.js +6 -0
  3. package/dist/cjs/lib/Sparql11NotesTest.js.map +1 -1
  4. package/dist/cjs/lib/fileUtils.js +10 -0
  5. package/dist/cjs/lib/fileUtils.js.map +1 -1
  6. package/dist/cjs/lib/generators/algebraGenerators.js +10 -0
  7. package/dist/cjs/lib/generators/algebraGenerators.js.map +1 -1
  8. package/dist/cjs/lib/generators/generators.js +13 -0
  9. package/dist/cjs/lib/generators/generators.js.map +1 -1
  10. package/dist/cjs/lib/generators/utils.js +5 -0
  11. package/dist/cjs/lib/generators/utils.js.map +1 -1
  12. package/dist/esm/lib/Sparql11NotesTest.d.ts +6 -0
  13. package/dist/esm/lib/Sparql11NotesTest.js +6 -0
  14. package/dist/esm/lib/Sparql11NotesTest.js.map +1 -1
  15. package/dist/esm/lib/fileUtils.d.ts +10 -0
  16. package/dist/esm/lib/fileUtils.js +10 -0
  17. package/dist/esm/lib/fileUtils.js.map +1 -1
  18. package/dist/esm/lib/generators/algebraGenerators.d.ts +19 -2
  19. package/dist/esm/lib/generators/algebraGenerators.js +10 -0
  20. package/dist/esm/lib/generators/algebraGenerators.js.map +1 -1
  21. package/dist/esm/lib/generators/generators.d.ts +13 -0
  22. package/dist/esm/lib/generators/generators.js +13 -0
  23. package/dist/esm/lib/generators/generators.js.map +1 -1
  24. package/dist/esm/lib/generators/utils.d.ts +5 -0
  25. package/dist/esm/lib/generators/utils.js +5 -0
  26. package/dist/esm/lib/generators/utils.js.map +1 -1
  27. package/package.json +2 -2
  28. package/statics/algebra/canonical-sparql/base/sparql-1.1/values/values-many-once.sparql +1 -1
  29. package/statics/algebra/canonical-sparql/blank-to-var/sparql-1.1/values/values-many-once.sparql +1 -1
package/README.md CHANGED
@@ -2,16 +2,46 @@
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/@traqula%2Ftest-utils.svg)](https://www.npmjs.com/package/@traqula/test-utils)
4
4
 
5
- Traqula test utils contains some developer dependencies for testing packages and engines from the Traqula project.
5
+ Traqula test utils contains developer utilities for testing parsers, generators, and algebra transformers within the Traqula project.
6
6
 
7
7
  ## Installation
8
8
 
9
9
  ```bash
10
- npm install -D @traqula/test-utils.ts
10
+ npm install -D @traqula/test-utils
11
11
  ```
12
12
 
13
13
  or
14
14
 
15
15
  ```bash
16
- yarn add -D @traqula/test-utils.ts
16
+ yarn add -D @traqula/test-utils
17
+ ```
18
+
19
+ ## Exports
20
+
21
+ | Export | Description |
22
+ |--------|-------------|
23
+ | `positiveTest(type)` | Generator yielding positive parser test cases (query + expected AST) |
24
+ | `negativeTest(type)` | Generator yielding negative parser test cases (queries that should fail) |
25
+ | `sparqlAlgebraTests(suite, ...)` | Generator yielding algebra transformation test cases |
26
+ | `sparqlAlgebraNegativeTests(suite)` | Generator yielding negative algebra test cases |
27
+ | `sparqlQueries(suite)` | Generator yielding raw SPARQL query strings |
28
+ | `toEqualParsedQuery` | Vitest matcher for deep-comparing parsed ASTs (with RDF term support) |
29
+ | `toEqualParsedQueryIgnoring` | Vitest matcher for comparing ASTs while ignoring specified keys |
30
+ | `importSparql11NoteTests(parser, DF)` | Registers a suite of SPARQL 1.1 specification note tests |
31
+ | `readFile(path)` | Async file reader with line-ending normalization |
32
+ | `readFileSync(path)` | Sync file reader with line-ending normalization |
33
+ | `getStaticFilePath(...paths)` | Resolves paths relative to the test statics directory |
34
+
35
+ ## Usage
36
+
37
+ ```typescript
38
+ import { positiveTest, sparqlAlgebraTests } from '@traqula/test-utils';
39
+
40
+ // Iterate parser test cases
41
+ for (const test of positiveTest('sparql-1-1')) {
42
+ it(test.name, async () => {
43
+ const { query, astWithSource } = await test.statics();
44
+ expect(parser.parse(query)).toEqualParsedQuery(astWithSource);
45
+ });
46
+ }
17
47
  ```
@@ -2,6 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.importSparql11NoteTests = importSparql11NoteTests;
4
4
  const vitest_1 = require("vitest");
5
+ /**
6
+ * Register a suite of parser tests derived from the notes and errata of the SPARQL 1.1 specification.
7
+ * Tests cover error handling, blank node reuse validation, VALUES cardinality, and more.
8
+ * @param parser - A parser instance with a `parse` method.
9
+ * @param _DF - A DataFactory instance (currently unused, reserved for future tests).
10
+ */
5
11
  function importSparql11NoteTests(parser, _DF) {
6
12
  function testErroneousQuery(query, _errorMsg) {
7
13
  return ({ expect }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"Sparql11NotesTest.js","sourceRoot":"","sources":["../../../lib/Sparql11NotesTest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseQuad } from '@rdfjs/types';\nimport type { DataFactory } from 'rdf-data-factory';\nimport { describe, it } from 'vitest';\nimport type { TestFunction } from 'vitest';\n\ninterface Parser {\n parse: (query: string, context?: { prefixes?: Record<string, string>; baseIRI?: string }) => unknown;\n}\n\nexport function importSparql11NoteTests(parser: Parser, _DF: DataFactory<BaseQuad>): void {\n function testErroneousQuery(query: string, _errorMsg: string): TestFunction<object> {\n return ({ expect }) => {\n let error: any;\n try {\n parser.parse(query);\n } catch (e) {\n error = e;\n }\n expect(error).not.toBeUndefined();\n expect(error).toBeInstanceOf(Error);\n // Expect(error.message).toContain(errorMsg);\n };\n }\n\n it('should throw an error on an invalid query', testErroneousQuery('invalid', 'Parse error on line 1'));\n\n it('should throw an error on a projection of ungrouped variable', testErroneousQuery(\n 'PREFIX : <http://www.example.org/> SELECT ?o WHERE { ?s ?p ?o } GROUP BY ?s',\n 'Projection of ungrouped variable (?o)',\n ));\n\n it('should throw an error on a values class with LESS variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ) { ( true false ) }',\n 'Number of dataBlockValues does not match number of variables. Too much values.',\n ));\n\n it('should throw an error on a values class with MORE variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ?O ) { ( true ) }',\n 'Number of dataBlockValues does not match number of variables. Too few values.',\n ));\n\n it('should NOT throw on a values class with correct amount of values', ({ expect }) => {\n const query = 'SELECT * WHERE { } VALUES ( ?S ) { ( true ) }';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on an invalid selectscope', testErroneousQuery(\n 'SELECT (1 AS ?X ) { SELECT (2 AS ?X ) {} }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should throw an error on bind to variable in scope', testErroneousQuery(\n 'SELECT * { ?s ?p ?o BIND(?o AS ?o) }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should parse when not ending in newline', ({ expect }) => {\n const query = 'select?s{?s?p?o}#wow, what a query';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should preserve BGP and filter pattern order', ({ expect }) => {\n const query = 'SELECT * { ?s ?p \"1\" . FILTER(true) . ?s ?p \"2\" }';\n expect(parser.parse(query)).toMatchObject({\n where: {\n patterns: [\n { subType: 'bgp' },\n { subType: 'filter' },\n { subType: 'bgp' },\n ],\n },\n });\n });\n\n it('should throw an error on an aggregate function within an aggregate function', testErroneousQuery(\n 'SELECT (SUM(COUNT(?lprice)) AS ?totalPrice) { }',\n 'An aggregate function is not allowed within an aggregate function',\n ));\n\n describe('with pre-defined prefixes', () => {\n const prefixes = { a: 'ex:abc#', b: 'ex:def#' };\n\n it.todo('should use those prefixes');\n\n it.todo('should allow temporarily overriding prefixes');\n\n it('should not change the original prefixes', ({ expect }) => {\n expect(prefixes).toEqual({ a: 'ex:abc#', b: 'ex:def#' });\n });\n });\n\n describe('with pre-defined base IRI', () => {\n const _context = { baseIRI: 'http://ex.org/' };\n\n it.todo('contains the base');\n\n it.todo('using prefixed as relative iri');\n\n it.todo('should use the base IRI');\n\n it.todo('should work after a previous query failed');\n });\n\n it.todo('should throw an error on relative IRIs if no base IRI is specified');\n\n describe('with group collapsing disabled', () => {\n it.todo('should keep explicit pattern group');\n\n it.todo('should still collapse immediate union groups');\n });\n\n describe('for update queries', () => {\n it('should throw an error on blank nodes in DELETE clause', testErroneousQuery(\n 'DELETE { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should not throw on blank nodes in INSERT clause', ({ expect }) => {\n const query = 'INSERT { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on blank nodes in compact DELETE clause', testErroneousQuery(\n 'DELETE WHERE { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should throw an error on blank nodes in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause with GRAPH', testErroneousQuery(\n 'DELETE DATA { GRAPH ?a { <ex:s> <ex:p> <ex:o> } }',\n 'Detected illegal variable in GRAPH',\n ));\n\n it('should throw an error on variables in INSERT DATA clause', testErroneousQuery(\n 'INSERT DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should not throw on reused blank nodes in one INSERT DATA clause', ({ expect }) => {\n const query = 'INSERT DATA { _:a <ex:p> <ex:o> . _:a <ex:p> <ex:o> . }';\n // Todo: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { _:a <ex:p> <ex:o> }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses with GRAPH', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { GRAPH <ex:g> { _:a <ex:p> <ex:o> } }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should not throw on comment between INSERT and DATA', ({ expect }) => {\n const query = `INSERT\n# Comment\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should not throw on comment after INSERT that could be confused with DATA', ({ expect }) => {\n const query = `INSERT # DATA\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on commented DATA after INSERT', testErroneousQuery(\n 'INSERT # DATA { GRAPH <ex:G> { <ex:s> <ex:p> \\'o1\\', \\'o2\\', \\'o3\\' } }',\n 'Parse error',\n ));\n });\n\n it('should throw an error on unicode codepoint escaping in literal with partial surrogate pair', testErroneousQuery(\n 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\' }',\n 'Invalid unicode codepoint of surrogate pair without corresponding codepoint',\n ));\n\n it(\n 'should not throw an error on unicode codepoint escaping in literal with complete surrogate pair',\n ({ expect }) => {\n const query = 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\uDFFF\\' }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n },\n );\n}\n"]}
1
+ {"version":3,"file":"Sparql11NotesTest.js","sourceRoot":"","sources":["../../../lib/Sparql11NotesTest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseQuad } from '@rdfjs/types';\nimport type { DataFactory } from 'rdf-data-factory';\nimport { describe, it } from 'vitest';\nimport type { TestFunction } from 'vitest';\n\ninterface Parser {\n parse: (query: string, context?: { prefixes?: Record<string, string>; baseIRI?: string }) => unknown;\n}\n\n/**\n * Register a suite of parser tests derived from the notes and errata of the SPARQL 1.1 specification.\n * Tests cover error handling, blank node reuse validation, VALUES cardinality, and more.\n * @param parser - A parser instance with a `parse` method.\n * @param _DF - A DataFactory instance (currently unused, reserved for future tests).\n */\nexport function importSparql11NoteTests(parser: Parser, _DF: DataFactory<BaseQuad>): void {\n function testErroneousQuery(query: string, _errorMsg: string): TestFunction<object> {\n return ({ expect }) => {\n let error: any;\n try {\n parser.parse(query);\n } catch (e) {\n error = e;\n }\n expect(error).not.toBeUndefined();\n expect(error).toBeInstanceOf(Error);\n // Expect(error.message).toContain(errorMsg);\n };\n }\n\n it('should throw an error on an invalid query', testErroneousQuery('invalid', 'Parse error on line 1'));\n\n it('should throw an error on a projection of ungrouped variable', testErroneousQuery(\n 'PREFIX : <http://www.example.org/> SELECT ?o WHERE { ?s ?p ?o } GROUP BY ?s',\n 'Projection of ungrouped variable (?o)',\n ));\n\n it('should throw an error on a values class with LESS variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ) { ( true false ) }',\n 'Number of dataBlockValues does not match number of variables. Too much values.',\n ));\n\n it('should throw an error on a values class with MORE variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ?O ) { ( true ) }',\n 'Number of dataBlockValues does not match number of variables. Too few values.',\n ));\n\n it('should NOT throw on a values class with correct amount of values', ({ expect }) => {\n const query = 'SELECT * WHERE { } VALUES ( ?S ) { ( true ) }';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on an invalid selectscope', testErroneousQuery(\n 'SELECT (1 AS ?X ) { SELECT (2 AS ?X ) {} }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should throw an error on bind to variable in scope', testErroneousQuery(\n 'SELECT * { ?s ?p ?o BIND(?o AS ?o) }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should parse when not ending in newline', ({ expect }) => {\n const query = 'select?s{?s?p?o}#wow, what a query';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should preserve BGP and filter pattern order', ({ expect }) => {\n const query = 'SELECT * { ?s ?p \"1\" . FILTER(true) . ?s ?p \"2\" }';\n expect(parser.parse(query)).toMatchObject({\n where: {\n patterns: [\n { subType: 'bgp' },\n { subType: 'filter' },\n { subType: 'bgp' },\n ],\n },\n });\n });\n\n it('should throw an error on an aggregate function within an aggregate function', testErroneousQuery(\n 'SELECT (SUM(COUNT(?lprice)) AS ?totalPrice) { }',\n 'An aggregate function is not allowed within an aggregate function',\n ));\n\n describe('with pre-defined prefixes', () => {\n const prefixes = { a: 'ex:abc#', b: 'ex:def#' };\n\n it.todo('should use those prefixes');\n\n it.todo('should allow temporarily overriding prefixes');\n\n it('should not change the original prefixes', ({ expect }) => {\n expect(prefixes).toEqual({ a: 'ex:abc#', b: 'ex:def#' });\n });\n });\n\n describe('with pre-defined base IRI', () => {\n const _context = { baseIRI: 'http://ex.org/' };\n\n it.todo('contains the base');\n\n it.todo('using prefixed as relative iri');\n\n it.todo('should use the base IRI');\n\n it.todo('should work after a previous query failed');\n });\n\n it.todo('should throw an error on relative IRIs if no base IRI is specified');\n\n describe('with group collapsing disabled', () => {\n it.todo('should keep explicit pattern group');\n\n it.todo('should still collapse immediate union groups');\n });\n\n describe('for update queries', () => {\n it('should throw an error on blank nodes in DELETE clause', testErroneousQuery(\n 'DELETE { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should not throw on blank nodes in INSERT clause', ({ expect }) => {\n const query = 'INSERT { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on blank nodes in compact DELETE clause', testErroneousQuery(\n 'DELETE WHERE { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should throw an error on blank nodes in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause with GRAPH', testErroneousQuery(\n 'DELETE DATA { GRAPH ?a { <ex:s> <ex:p> <ex:o> } }',\n 'Detected illegal variable in GRAPH',\n ));\n\n it('should throw an error on variables in INSERT DATA clause', testErroneousQuery(\n 'INSERT DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should not throw on reused blank nodes in one INSERT DATA clause', ({ expect }) => {\n const query = 'INSERT DATA { _:a <ex:p> <ex:o> . _:a <ex:p> <ex:o> . }';\n // Todo: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { _:a <ex:p> <ex:o> }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses with GRAPH', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { GRAPH <ex:g> { _:a <ex:p> <ex:o> } }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should not throw on comment between INSERT and DATA', ({ expect }) => {\n const query = `INSERT\n# Comment\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should not throw on comment after INSERT that could be confused with DATA', ({ expect }) => {\n const query = `INSERT # DATA\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on commented DATA after INSERT', testErroneousQuery(\n 'INSERT # DATA { GRAPH <ex:G> { <ex:s> <ex:p> \\'o1\\', \\'o2\\', \\'o3\\' } }',\n 'Parse error',\n ));\n });\n\n it('should throw an error on unicode codepoint escaping in literal with partial surrogate pair', testErroneousQuery(\n 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\' }',\n 'Invalid unicode codepoint of surrogate pair without corresponding codepoint',\n ));\n\n it(\n 'should not throw an error on unicode codepoint escaping in literal with complete surrogate pair',\n ({ expect }) => {\n const query = 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\uDFFF\\' }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n },\n );\n}\n"]}
@@ -7,10 +7,20 @@ exports.readFile = readFile;
7
7
  exports.readFileSync = readFileSync;
8
8
  const node_fs_1 = __importDefault(require("node:fs"));
9
9
  const promises_1 = __importDefault(require("node:fs/promises"));
10
+ /**
11
+ * Read a file asynchronously, normalizing line endings to `\n`.
12
+ * @param path - The file path or handle to read.
13
+ * @param encoding - The encoding to use (default: `'utf-8'`).
14
+ */
10
15
  async function readFile(path, encoding = 'utf-8') {
11
16
  const content = await promises_1.default.readFile(path, encoding);
12
17
  return content.replaceAll(/\r?\n/gu, '\n');
13
18
  }
19
+ /**
20
+ * Read a file synchronously, normalizing line endings to `\n`.
21
+ * @param path - The file path to read.
22
+ * @param encoding - The encoding to use (default: `'utf-8'`).
23
+ */
14
24
  function readFileSync(path, encoding = 'utf-8') {
15
25
  // eslint-disable-next-line no-sync
16
26
  const content = node_fs_1.default.readFileSync(path, encoding);
@@ -1 +1 @@
1
- {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../../lib/fileUtils.ts"],"names":[],"mappings":";;;;;AAMA,4BAGC;AAED,oCAIC;AAbD,sDAAyB;AAEzB,gEAAmC;AAE5B,KAAK,UAAU,QAAQ,CAAC,IAA2B,EAAE,WAA2B,OAAO;IAC5F,MAAM,OAAO,GAAG,MAAM,kBAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,WAA2B,OAAO;IAC3E,mCAAmC;IACnC,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport type { PathLike } from 'node:fs';\nimport fs from 'node:fs';\nimport type { FileHandle } from 'node:fs/promises';\nimport fsp from 'node:fs/promises';\n\nexport async function readFile(path: PathLike | FileHandle, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n const content = await fsp.readFile(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n\nexport function readFileSync(path: string, encoding: BufferEncoding = 'utf-8'): string {\n // eslint-disable-next-line no-sync\n const content = fs.readFileSync(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n"]}
1
+ {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../../lib/fileUtils.ts"],"names":[],"mappings":";;;;;AAWA,4BAGC;AAOD,oCAIC;AAvBD,sDAAyB;AAEzB,gEAAmC;AAEnC;;;;GAIG;AACI,KAAK,UAAU,QAAQ,CAAC,IAA2B,EAAE,WAA2B,OAAO;IAC5F,MAAM,OAAO,GAAG,MAAM,kBAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,WAA2B,OAAO;IAC3E,mCAAmC;IACnC,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport type { PathLike } from 'node:fs';\nimport fs from 'node:fs';\nimport type { FileHandle } from 'node:fs/promises';\nimport fsp from 'node:fs/promises';\n\n/**\n * Read a file asynchronously, normalizing line endings to `\\n`.\n * @param path - The file path or handle to read.\n * @param encoding - The encoding to use (default: `'utf-8'`).\n */\nexport async function readFile(path: PathLike | FileHandle, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n const content = await fsp.readFile(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n\n/**\n * Read a file synchronously, normalizing line endings to `\\n`.\n * @param path - The file path to read.\n * @param encoding - The encoding to use (default: `'utf-8'`).\n */\nexport function readFileSync(path: string, encoding: BufferEncoding = 'utf-8'): string {\n // eslint-disable-next-line no-sync\n const content = fs.readFileSync(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n"]}
@@ -42,6 +42,10 @@ function* sparqlAlgebraTests(suite, blankToVariable, getSPARQL) {
42
42
  yield* subGen(suite);
43
43
  }
44
44
  }
45
+ /**
46
+ * Yields raw SPARQL query strings from the static test fixtures for a given suite.
47
+ * @param suite - The test suite to iterate.
48
+ */
45
49
  function* sparqlQueries(suite) {
46
50
  function* subGen(relativePath) {
47
51
  const absolutePath = (0, node_path_1.join)(rootSparql, relativePath);
@@ -65,6 +69,12 @@ function* sparqlQueries(suite) {
65
69
  yield* subGen(suite);
66
70
  }
67
71
  }
72
+ /**
73
+ * Yields test cases for negative (invalid) algebra-level tests.
74
+ * Each test provides a SPARQL query that should fail during algebra transformation.
75
+ * @param suite - The negative test suite to iterate.
76
+ * @param filter - Optional filter predicate applied to the test file name.
77
+ */
68
78
  function* sparqlAlgebraNegativeTests(suite, filter) {
69
79
  const astDir = (0, utils_js_1.getStaticFilePath)('algebra');
70
80
  const sparqlDir = (0, node_path_1.join)(astDir, 'sparql', suite);
@@ -1 +1 @@
1
- {"version":3,"file":"algebraGenerators.js","sourceRoot":"","sources":["../../../../lib/generators/algebraGenerators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { lstatSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile, readFileSync } from '../fileUtils.js';\nimport type { NegativeTest } from './generators.js';\nimport { getStaticFilePath } from './utils.js';\n\nconst rootDir = getStaticFilePath('algebra');\nconst rootSparql = join(rootDir, 'sparql');\nconst rootJson = join(rootDir, 'algebra');\nconst rootJsonBlankToVariable = join(rootDir, 'algebra-blank-to-var');\nconst rootCanonicalSparql = join(rootDir, 'canonical-sparql', 'base');\nconst rootCanonicalSparqlBlankToVar = join(rootDir, 'canonical-sparql', 'blank-to-var');\n\nexport interface algebraTestGen {\n name: string;\n json: unknown;\n quads: boolean;\n sparql: string | undefined;\n canonicalSparql: string | undefined;\n}\n\nexport type AlgebraTestSuite = 'dawg-syntax' | 'sparql-1.1' | 'sparql11-query' | 'sparql12';\n\nexport function sparqlAlgebraTests(suites: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: true):\nGenerator<algebraTestGen & { sparql: string; canonicalSparql: string }>;\nexport function sparqlAlgebraTests(suites: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen>;\nexport function* sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen> {\n // Relative path starting from roots declared above.\n function* subGen(relativePath: string): Generator<algebraTestGen> {\n const absolutePath = join(blankToVariable ? rootJsonBlankToVariable : rootJson, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.json$/u, '');\n const sparqlPath = join(rootSparql, relativePath.replace(/\\.json/u, '.sparql'));\n const canonicalSparqlPath = join(\n blankToVariable ? rootCanonicalSparqlBlankToVar : rootCanonicalSparql,\n relativePath.replace(/\\.json/u, '.sparql'),\n );\n yield {\n name,\n json: JSON.parse(readFileSync(absolutePath)),\n sparql: getSPARQL ? readFileSync(sparqlPath, 'utf8') : undefined,\n canonicalSparql: getSPARQL ? readFileSync(canonicalSparqlPath, 'utf-8') : undefined,\n quads: name.endsWith('-quads'),\n };\n }\n }\n\n const subfolders = readdirSync(blankToVariable ? rootJsonBlankToVariable : rootJson);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\ntype GenQuery = { query: string; name: string };\nexport function* sparqlQueries(suite: AlgebraTestSuite): Generator<GenQuery> {\n function* subGen(relativePath: string): Generator<GenQuery> {\n const absolutePath = join(rootSparql, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.sparql$/u, '');\n const content = readFileSync(absolutePath, 'utf-8');\n yield {\n name,\n query: content.replaceAll(/\\r?\\n/gu, '\\n'),\n };\n }\n }\n\n const subfolders = readdirSync(rootSparql);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\nexport type NegativeAlgebraSuite = 'sparql-1.1-negative' | 'sparql-1.2-negative';\n\nexport function* sparqlAlgebraNegativeTests(\n suite: NegativeAlgebraSuite,\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('algebra');\n const sparqlDir = join(astDir, 'sparql', suite);\n const statics = readdirSync(sparqlDir);\n for (const file of statics.filter(f => f.endsWith('.sparql'))) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"algebraGenerators.js","sourceRoot":"","sources":["../../../../lib/generators/algebraGenerators.ts"],"names":[],"mappings":";;AAmCA,gDA+BC;AAOD,sCAsBC;AAUD,gEAsBC;AA/HD,6CAA6C;AAC7C,qCAAiD;AACjD,yCAAiC;AACjC,kDAAyD;AAEzD,yCAA+C;AAE/C,MAAM,OAAO,GAAG,IAAA,4BAAiB,EAAC,SAAS,CAAC,CAAC;AAC7C,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC1C,MAAM,uBAAuB,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;AACtE,MAAM,mBAAmB,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACtE,MAAM,6BAA6B,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAuBxF,QAAe,CAAC,CAAC,kBAAkB,CAAC,KAAuB,EAAE,eAAwB,EAAE,SAAkB;IAEvG,oDAAoD;IACpD,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAoB;QACnC,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9F,IAAI,IAAA,mBAAS,EAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1C,YAAY;YACZ,KAAK,MAAM,GAAG,IAAI,IAAA,qBAAW,EAAC,YAAY,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,CAAC,MAAM,CAAC,IAAA,gBAAI,EAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;YAChF,MAAM,mBAAmB,GAAG,IAAA,gBAAI,EAC9B,eAAe,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,mBAAmB,EACrE,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAC3C,CAAC;YACF,MAAM;gBACJ,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAA,2BAAY,EAAC,YAAY,CAAC,CAAC;gBAC5C,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAA,2BAAY,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBAChE,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,IAAA,2BAAY,EAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAC/B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,qBAAW,EAAC,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrF,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAGD;;;GAGG;AACH,QAAe,CAAC,CAAC,aAAa,CAAC,KAAuB;IACpD,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAoB;QACnC,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACpD,IAAI,IAAA,mBAAS,EAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1C,YAAY;YACZ,KAAK,MAAM,GAAG,IAAI,IAAA,qBAAW,EAAC,YAAY,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,CAAC,MAAM,CAAC,IAAA,gBAAI,EAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,IAAA,2BAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM;gBACJ,IAAI;gBACJ,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC;aAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,qBAAW,EAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAID;;;;;GAKG;AACH,QAAe,CAAC,CAAC,0BAA0B,CACzC,KAA2B,EAC3B,MAAkC;IAElC,MAAM,MAAM,GAAG,IAAA,4BAAiB,EAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAA,gBAAI,EAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,SAAS,CAAC,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM;YACJ,IAAI;YACJ,OAAO,EAAE,KAAK,IAAG,EAAE;gBACjB,MAAM,KAAK,GAAG,MAAM,IAAA,uBAAQ,EAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;gBACpD,OAAO;oBACL,KAAK;iBACN,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { lstatSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile, readFileSync } from '../fileUtils.js';\nimport type { NegativeTest } from './generators.js';\nimport { getStaticFilePath } from './utils.js';\n\nconst rootDir = getStaticFilePath('algebra');\nconst rootSparql = join(rootDir, 'sparql');\nconst rootJson = join(rootDir, 'algebra');\nconst rootJsonBlankToVariable = join(rootDir, 'algebra-blank-to-var');\nconst rootCanonicalSparql = join(rootDir, 'canonical-sparql', 'base');\nconst rootCanonicalSparqlBlankToVar = join(rootDir, 'canonical-sparql', 'blank-to-var');\n\nexport interface algebraTestGen {\n name: string;\n json: unknown;\n quads: boolean;\n sparql: string | undefined;\n canonicalSparql: string | undefined;\n}\n\nexport type AlgebraTestSuite = 'dawg-syntax' | 'sparql-1.1' | 'sparql11-query' | 'sparql12';\n\n/**\n * Yields algebra-level test cases from the static test fixtures.\n * Each test provides a SPARQL query, expected algebra JSON, and optionally a canonical SPARQL string.\n * @param suite - The test suite to iterate.\n * @param blankToVariable - Whether to use the blank-to-variable fixture variant.\n * @param getSPARQL - Whether to load the SPARQL and canonical SPARQL strings.\n */\nexport function sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: true):\nGenerator<algebraTestGen & { sparql: string; canonicalSparql: string }>;\nexport function sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen>;\nexport function* sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen> {\n // Relative path starting from roots declared above.\n function* subGen(relativePath: string): Generator<algebraTestGen> {\n const absolutePath = join(blankToVariable ? rootJsonBlankToVariable : rootJson, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.json$/u, '');\n const sparqlPath = join(rootSparql, relativePath.replace(/\\.json/u, '.sparql'));\n const canonicalSparqlPath = join(\n blankToVariable ? rootCanonicalSparqlBlankToVar : rootCanonicalSparql,\n relativePath.replace(/\\.json/u, '.sparql'),\n );\n yield {\n name,\n json: JSON.parse(readFileSync(absolutePath)),\n sparql: getSPARQL ? readFileSync(sparqlPath, 'utf8') : undefined,\n canonicalSparql: getSPARQL ? readFileSync(canonicalSparqlPath, 'utf-8') : undefined,\n quads: name.endsWith('-quads'),\n };\n }\n }\n\n const subfolders = readdirSync(blankToVariable ? rootJsonBlankToVariable : rootJson);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\ntype GenQuery = { query: string; name: string };\n/**\n * Yields raw SPARQL query strings from the static test fixtures for a given suite.\n * @param suite - The test suite to iterate.\n */\nexport function* sparqlQueries(suite: AlgebraTestSuite): Generator<GenQuery> {\n function* subGen(relativePath: string): Generator<GenQuery> {\n const absolutePath = join(rootSparql, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.sparql$/u, '');\n const content = readFileSync(absolutePath, 'utf-8');\n yield {\n name,\n query: content.replaceAll(/\\r?\\n/gu, '\\n'),\n };\n }\n }\n\n const subfolders = readdirSync(rootSparql);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\nexport type NegativeAlgebraSuite = 'sparql-1.1-negative' | 'sparql-1.2-negative';\n\n/**\n * Yields test cases for negative (invalid) algebra-level tests.\n * Each test provides a SPARQL query that should fail during algebra transformation.\n * @param suite - The negative test suite to iterate.\n * @param filter - Optional filter predicate applied to the test file name.\n */\nexport function* sparqlAlgebraNegativeTests(\n suite: NegativeAlgebraSuite,\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('algebra');\n const sparqlDir = join(astDir, 'sparql', suite);\n const statics = readdirSync(sparqlDir);\n for (const file of statics.filter(f => f.endsWith('.sparql'))) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
@@ -7,6 +7,13 @@ const node_fs_1 = require("node:fs");
7
7
  const node_path_1 = require("node:path");
8
8
  const fileUtils_js_1 = require("../fileUtils.js");
9
9
  const utils_js_1 = require("./utils.js");
10
+ /**
11
+ * Yields test cases for positive SPARQL parser tests.
12
+ * Each test provides the query string, expected ASTs (with and without source tracking),
13
+ * and auto-generated query strings (pretty-printed and compact).
14
+ * @param type - The test suite to use.
15
+ * @param filter - Optional filter predicate applied to the test file name (without extension).
16
+ */
10
17
  function* positiveTest(type, filter) {
11
18
  const astDir = (0, utils_js_1.getStaticFilePath)('ast');
12
19
  const jsonSourceTrackedDir = (0, node_path_1.join)(astDir, 'ast-source-tracked', type);
@@ -53,6 +60,12 @@ function* positiveTest(type, filter) {
53
60
  };
54
61
  }
55
62
  }
63
+ /**
64
+ * Yields test cases for negative (invalid) SPARQL parser tests.
65
+ * Each test provides a query string that should fail to parse.
66
+ * @param type - The test suite to use.
67
+ * @param filter - Optional filter predicate applied to the test file name (without extension).
68
+ */
56
69
  function* negativeTest(type, filter) {
57
70
  const astDir = (0, utils_js_1.getStaticFilePath)('ast');
58
71
  const sparqlGeneratedDir = (0, node_path_1.join)(astDir, 'sparql', type);
@@ -1 +1 @@
1
- {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../../lib/generators/generators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile } from '../fileUtils.js';\nimport { getStaticFilePath } from './utils.js';\n\ninterface PositiveTest {\n name: string;\n statics: () => Promise<{\n query: string;\n astWithSource: unknown;\n astNoSource: unknown;\n autoGen: string;\n autoGenCompact: string;\n }>;\n}\n\nexport function* positiveTest(\n type: 'paths' | 'sparql-1-1' | 'sparql-1-2',\n filter?: (name: string) => boolean,\n): Generator<PositiveTest> {\n const astDir = getStaticFilePath('ast');\n const jsonSourceTrackedDir = join(astDir, 'ast-source-tracked', type);\n const jsonNonSourceTrackedDir = join(astDir, 'ast-no-source-tracked', type);\n const sparqlDir = join(astDir, 'sparql', type);\n const sparqlGeneratedDir = join(astDir, 'sparql-generated', type);\n const sparqlGenCompactDir = join(astDir, 'sparql-generated-compact', type);\n const statics = readdirSync(jsonSourceTrackedDir);\n for (const file of statics) {\n if (filter && !filter(file.replace('.json', ''))) {\n continue;\n }\n const name = file.replace(/\\.json$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, `${name}.sparql`));\n const sourceTracked = await readFile(join(jsonSourceTrackedDir, file));\n let noSourceTracked: string;\n try {\n noSourceTracked = await readFile(join(jsonNonSourceTrackedDir, file));\n } catch {\n noSourceTracked = '{}';\n }\n let autoGen = '';\n try {\n autoGen = await readFile(join(sparqlGeneratedDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n let autoGenCompact = '';\n try {\n autoGenCompact = await readFile(join(sparqlGenCompactDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n return {\n query,\n astWithSource: JSON.parse(sourceTracked),\n astNoSource: JSON.parse(noSourceTracked),\n autoGen,\n autoGenCompact,\n };\n },\n };\n }\n}\n\nexport interface NegativeTest {\n name: string;\n statics: () => Promise<{\n query: string;\n }>;\n}\n\nexport function* negativeTest(\n type: 'sparql-1-1-invalid' | 'sparql-1-2-invalid',\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('ast');\n const sparqlGeneratedDir = join(astDir, 'sparql', type);\n const statics = readdirSync(sparqlGeneratedDir).filter(f => f.endsWith('.sparql'));\n for (const file of statics) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlGeneratedDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../../lib/generators/generators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile } from '../fileUtils.js';\nimport { getStaticFilePath } from './utils.js';\n\ninterface PositiveTest {\n name: string;\n statics: () => Promise<{\n query: string;\n astWithSource: unknown;\n astNoSource: unknown;\n autoGen: string;\n autoGenCompact: string;\n }>;\n}\n\n/**\n * Yields test cases for positive SPARQL parser tests.\n * Each test provides the query string, expected ASTs (with and without source tracking),\n * and auto-generated query strings (pretty-printed and compact).\n * @param type - The test suite to use.\n * @param filter - Optional filter predicate applied to the test file name (without extension).\n */\nexport function* positiveTest(\n type: 'paths' | 'sparql-1-1' | 'sparql-1-2',\n filter?: (name: string) => boolean,\n): Generator<PositiveTest> {\n const astDir = getStaticFilePath('ast');\n const jsonSourceTrackedDir = join(astDir, 'ast-source-tracked', type);\n const jsonNonSourceTrackedDir = join(astDir, 'ast-no-source-tracked', type);\n const sparqlDir = join(astDir, 'sparql', type);\n const sparqlGeneratedDir = join(astDir, 'sparql-generated', type);\n const sparqlGenCompactDir = join(astDir, 'sparql-generated-compact', type);\n const statics = readdirSync(jsonSourceTrackedDir);\n for (const file of statics) {\n if (filter && !filter(file.replace('.json', ''))) {\n continue;\n }\n const name = file.replace(/\\.json$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, `${name}.sparql`));\n const sourceTracked = await readFile(join(jsonSourceTrackedDir, file));\n let noSourceTracked: string;\n try {\n noSourceTracked = await readFile(join(jsonNonSourceTrackedDir, file));\n } catch {\n noSourceTracked = '{}';\n }\n let autoGen = '';\n try {\n autoGen = await readFile(join(sparqlGeneratedDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n let autoGenCompact = '';\n try {\n autoGenCompact = await readFile(join(sparqlGenCompactDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n return {\n query,\n astWithSource: JSON.parse(sourceTracked),\n astNoSource: JSON.parse(noSourceTracked),\n autoGen,\n autoGenCompact,\n };\n },\n };\n }\n}\n\nexport interface NegativeTest {\n name: string;\n statics: () => Promise<{\n query: string;\n }>;\n}\n\n/**\n * Yields test cases for negative (invalid) SPARQL parser tests.\n * Each test provides a query string that should fail to parse.\n * @param type - The test suite to use.\n * @param filter - Optional filter predicate applied to the test file name (without extension).\n */\nexport function* negativeTest(\n type: 'sparql-1-1-invalid' | 'sparql-1-2-invalid',\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('ast');\n const sparqlGeneratedDir = join(astDir, 'sparql', type);\n const statics = readdirSync(sparqlGeneratedDir).filter(f => f.endsWith('.sparql'));\n for (const file of statics) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlGeneratedDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
@@ -9,6 +9,11 @@ const node_path_1 = __importDefault(require("node:path"));
9
9
  // Path.resolve() returns process.cwd() — the monorepo root when running via vitest.
10
10
  // This avoids __dirname (CJS-only) and import.meta.url (ESM-only).
11
11
  const staticsPath = node_path_1.default.resolve('packages/test-utils/statics');
12
+ /**
13
+ * Resolve a path relative to the test-utils statics directory.
14
+ * @param paths - Path segments to join after the statics root.
15
+ * @returns The absolute path to the static fixture.
16
+ */
12
17
  function getStaticFilePath(...paths) {
13
18
  return node_path_1.default.join(staticsPath, ...paths);
14
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/generators/utils.ts"],"names":[],"mappings":";;;;;AAOA,8CAEC;AATD,6CAA6C;AAC7C,0DAA6B;AAE7B,oFAAoF;AACpF,mEAAmE;AACnE,MAAM,WAAW,GAAG,mBAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAEhE,SAAgB,iBAAiB,CAAC,GAAG,KAAe;IAClD,OAAO,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport path from 'node:path';\n\n// Path.resolve() returns process.cwd() — the monorepo root when running via vitest.\n// This avoids __dirname (CJS-only) and import.meta.url (ESM-only).\nconst staticsPath = path.resolve('packages/test-utils/statics');\n\nexport function getStaticFilePath(...paths: string[]): string {\n return path.join(staticsPath, ...paths);\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/generators/utils.ts"],"names":[],"mappings":";;;;;AAYA,8CAEC;AAdD,6CAA6C;AAC7C,0DAA6B;AAE7B,oFAAoF;AACpF,mEAAmE;AACnE,MAAM,WAAW,GAAG,mBAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAEhE;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,GAAG,KAAe;IAClD,OAAO,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport path from 'node:path';\n\n// Path.resolve() returns process.cwd() — the monorepo root when running via vitest.\n// This avoids __dirname (CJS-only) and import.meta.url (ESM-only).\nconst staticsPath = path.resolve('packages/test-utils/statics');\n\n/**\n * Resolve a path relative to the test-utils statics directory.\n * @param paths - Path segments to join after the statics root.\n * @returns The absolute path to the static fixture.\n */\nexport function getStaticFilePath(...paths: string[]): string {\n return path.join(staticsPath, ...paths);\n}\n"]}
@@ -6,5 +6,11 @@ interface Parser {
6
6
  baseIRI?: string;
7
7
  }) => unknown;
8
8
  }
9
+ /**
10
+ * Register a suite of parser tests derived from the notes and errata of the SPARQL 1.1 specification.
11
+ * Tests cover error handling, blank node reuse validation, VALUES cardinality, and more.
12
+ * @param parser - A parser instance with a `parse` method.
13
+ * @param _DF - A DataFactory instance (currently unused, reserved for future tests).
14
+ */
9
15
  export declare function importSparql11NoteTests(parser: Parser, _DF: DataFactory<BaseQuad>): void;
10
16
  export {};
@@ -1,4 +1,10 @@
1
1
  import { describe, it } from 'vitest';
2
+ /**
3
+ * Register a suite of parser tests derived from the notes and errata of the SPARQL 1.1 specification.
4
+ * Tests cover error handling, blank node reuse validation, VALUES cardinality, and more.
5
+ * @param parser - A parser instance with a `parse` method.
6
+ * @param _DF - A DataFactory instance (currently unused, reserved for future tests).
7
+ */
2
8
  export function importSparql11NoteTests(parser, _DF) {
3
9
  function testErroneousQuery(query, _errorMsg) {
4
10
  return ({ expect }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"Sparql11NotesTest.js","sourceRoot":"","sources":["../../../lib/Sparql11NotesTest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseQuad } from '@rdfjs/types';\nimport type { DataFactory } from 'rdf-data-factory';\nimport { describe, it } from 'vitest';\nimport type { TestFunction } from 'vitest';\n\ninterface Parser {\n parse: (query: string, context?: { prefixes?: Record<string, string>; baseIRI?: string }) => unknown;\n}\n\nexport function importSparql11NoteTests(parser: Parser, _DF: DataFactory<BaseQuad>): void {\n function testErroneousQuery(query: string, _errorMsg: string): TestFunction<object> {\n return ({ expect }) => {\n let error: any;\n try {\n parser.parse(query);\n } catch (e) {\n error = e;\n }\n expect(error).not.toBeUndefined();\n expect(error).toBeInstanceOf(Error);\n // Expect(error.message).toContain(errorMsg);\n };\n }\n\n it('should throw an error on an invalid query', testErroneousQuery('invalid', 'Parse error on line 1'));\n\n it('should throw an error on a projection of ungrouped variable', testErroneousQuery(\n 'PREFIX : <http://www.example.org/> SELECT ?o WHERE { ?s ?p ?o } GROUP BY ?s',\n 'Projection of ungrouped variable (?o)',\n ));\n\n it('should throw an error on a values class with LESS variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ) { ( true false ) }',\n 'Number of dataBlockValues does not match number of variables. Too much values.',\n ));\n\n it('should throw an error on a values class with MORE variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ?O ) { ( true ) }',\n 'Number of dataBlockValues does not match number of variables. Too few values.',\n ));\n\n it('should NOT throw on a values class with correct amount of values', ({ expect }) => {\n const query = 'SELECT * WHERE { } VALUES ( ?S ) { ( true ) }';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on an invalid selectscope', testErroneousQuery(\n 'SELECT (1 AS ?X ) { SELECT (2 AS ?X ) {} }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should throw an error on bind to variable in scope', testErroneousQuery(\n 'SELECT * { ?s ?p ?o BIND(?o AS ?o) }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should parse when not ending in newline', ({ expect }) => {\n const query = 'select?s{?s?p?o}#wow, what a query';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should preserve BGP and filter pattern order', ({ expect }) => {\n const query = 'SELECT * { ?s ?p \"1\" . FILTER(true) . ?s ?p \"2\" }';\n expect(parser.parse(query)).toMatchObject({\n where: {\n patterns: [\n { subType: 'bgp' },\n { subType: 'filter' },\n { subType: 'bgp' },\n ],\n },\n });\n });\n\n it('should throw an error on an aggregate function within an aggregate function', testErroneousQuery(\n 'SELECT (SUM(COUNT(?lprice)) AS ?totalPrice) { }',\n 'An aggregate function is not allowed within an aggregate function',\n ));\n\n describe('with pre-defined prefixes', () => {\n const prefixes = { a: 'ex:abc#', b: 'ex:def#' };\n\n it.todo('should use those prefixes');\n\n it.todo('should allow temporarily overriding prefixes');\n\n it('should not change the original prefixes', ({ expect }) => {\n expect(prefixes).toEqual({ a: 'ex:abc#', b: 'ex:def#' });\n });\n });\n\n describe('with pre-defined base IRI', () => {\n const _context = { baseIRI: 'http://ex.org/' };\n\n it.todo('contains the base');\n\n it.todo('using prefixed as relative iri');\n\n it.todo('should use the base IRI');\n\n it.todo('should work after a previous query failed');\n });\n\n it.todo('should throw an error on relative IRIs if no base IRI is specified');\n\n describe('with group collapsing disabled', () => {\n it.todo('should keep explicit pattern group');\n\n it.todo('should still collapse immediate union groups');\n });\n\n describe('for update queries', () => {\n it('should throw an error on blank nodes in DELETE clause', testErroneousQuery(\n 'DELETE { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should not throw on blank nodes in INSERT clause', ({ expect }) => {\n const query = 'INSERT { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on blank nodes in compact DELETE clause', testErroneousQuery(\n 'DELETE WHERE { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should throw an error on blank nodes in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause with GRAPH', testErroneousQuery(\n 'DELETE DATA { GRAPH ?a { <ex:s> <ex:p> <ex:o> } }',\n 'Detected illegal variable in GRAPH',\n ));\n\n it('should throw an error on variables in INSERT DATA clause', testErroneousQuery(\n 'INSERT DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should not throw on reused blank nodes in one INSERT DATA clause', ({ expect }) => {\n const query = 'INSERT DATA { _:a <ex:p> <ex:o> . _:a <ex:p> <ex:o> . }';\n // Todo: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { _:a <ex:p> <ex:o> }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses with GRAPH', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { GRAPH <ex:g> { _:a <ex:p> <ex:o> } }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should not throw on comment between INSERT and DATA', ({ expect }) => {\n const query = `INSERT\n# Comment\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should not throw on comment after INSERT that could be confused with DATA', ({ expect }) => {\n const query = `INSERT # DATA\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on commented DATA after INSERT', testErroneousQuery(\n 'INSERT # DATA { GRAPH <ex:G> { <ex:s> <ex:p> \\'o1\\', \\'o2\\', \\'o3\\' } }',\n 'Parse error',\n ));\n });\n\n it('should throw an error on unicode codepoint escaping in literal with partial surrogate pair', testErroneousQuery(\n 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\' }',\n 'Invalid unicode codepoint of surrogate pair without corresponding codepoint',\n ));\n\n it(\n 'should not throw an error on unicode codepoint escaping in literal with complete surrogate pair',\n ({ expect }) => {\n const query = 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\uDFFF\\' }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n },\n );\n}\n"]}
1
+ {"version":3,"file":"Sparql11NotesTest.js","sourceRoot":"","sources":["../../../lib/Sparql11NotesTest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseQuad } from '@rdfjs/types';\nimport type { DataFactory } from 'rdf-data-factory';\nimport { describe, it } from 'vitest';\nimport type { TestFunction } from 'vitest';\n\ninterface Parser {\n parse: (query: string, context?: { prefixes?: Record<string, string>; baseIRI?: string }) => unknown;\n}\n\n/**\n * Register a suite of parser tests derived from the notes and errata of the SPARQL 1.1 specification.\n * Tests cover error handling, blank node reuse validation, VALUES cardinality, and more.\n * @param parser - A parser instance with a `parse` method.\n * @param _DF - A DataFactory instance (currently unused, reserved for future tests).\n */\nexport function importSparql11NoteTests(parser: Parser, _DF: DataFactory<BaseQuad>): void {\n function testErroneousQuery(query: string, _errorMsg: string): TestFunction<object> {\n return ({ expect }) => {\n let error: any;\n try {\n parser.parse(query);\n } catch (e) {\n error = e;\n }\n expect(error).not.toBeUndefined();\n expect(error).toBeInstanceOf(Error);\n // Expect(error.message).toContain(errorMsg);\n };\n }\n\n it('should throw an error on an invalid query', testErroneousQuery('invalid', 'Parse error on line 1'));\n\n it('should throw an error on a projection of ungrouped variable', testErroneousQuery(\n 'PREFIX : <http://www.example.org/> SELECT ?o WHERE { ?s ?p ?o } GROUP BY ?s',\n 'Projection of ungrouped variable (?o)',\n ));\n\n it('should throw an error on a values class with LESS variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ) { ( true false ) }',\n 'Number of dataBlockValues does not match number of variables. Too much values.',\n ));\n\n it('should throw an error on a values class with MORE variables than value', testErroneousQuery(\n 'SELECT * WHERE { } VALUES ( ?S ?O ) { ( true ) }',\n 'Number of dataBlockValues does not match number of variables. Too few values.',\n ));\n\n it('should NOT throw on a values class with correct amount of values', ({ expect }) => {\n const query = 'SELECT * WHERE { } VALUES ( ?S ) { ( true ) }';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on an invalid selectscope', testErroneousQuery(\n 'SELECT (1 AS ?X ) { SELECT (2 AS ?X ) {} }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should throw an error on bind to variable in scope', testErroneousQuery(\n 'SELECT * { ?s ?p ?o BIND(?o AS ?o) }',\n 'Target id of \\'AS\\' (?X) already used in subquery',\n ));\n\n it('should parse when not ending in newline', ({ expect }) => {\n const query = 'select?s{?s?p?o}#wow, what a query';\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should preserve BGP and filter pattern order', ({ expect }) => {\n const query = 'SELECT * { ?s ?p \"1\" . FILTER(true) . ?s ?p \"2\" }';\n expect(parser.parse(query)).toMatchObject({\n where: {\n patterns: [\n { subType: 'bgp' },\n { subType: 'filter' },\n { subType: 'bgp' },\n ],\n },\n });\n });\n\n it('should throw an error on an aggregate function within an aggregate function', testErroneousQuery(\n 'SELECT (SUM(COUNT(?lprice)) AS ?totalPrice) { }',\n 'An aggregate function is not allowed within an aggregate function',\n ));\n\n describe('with pre-defined prefixes', () => {\n const prefixes = { a: 'ex:abc#', b: 'ex:def#' };\n\n it.todo('should use those prefixes');\n\n it.todo('should allow temporarily overriding prefixes');\n\n it('should not change the original prefixes', ({ expect }) => {\n expect(prefixes).toEqual({ a: 'ex:abc#', b: 'ex:def#' });\n });\n });\n\n describe('with pre-defined base IRI', () => {\n const _context = { baseIRI: 'http://ex.org/' };\n\n it.todo('contains the base');\n\n it.todo('using prefixed as relative iri');\n\n it.todo('should use the base IRI');\n\n it.todo('should work after a previous query failed');\n });\n\n it.todo('should throw an error on relative IRIs if no base IRI is specified');\n\n describe('with group collapsing disabled', () => {\n it.todo('should keep explicit pattern group');\n\n it.todo('should still collapse immediate union groups');\n });\n\n describe('for update queries', () => {\n it('should throw an error on blank nodes in DELETE clause', testErroneousQuery(\n 'DELETE { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should not throw on blank nodes in INSERT clause', ({ expect }) => {\n const query = 'INSERT { ?a <ex:knows> [] . } WHERE { ?a <ex:knows> \"Alan\" . }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on blank nodes in compact DELETE clause', testErroneousQuery(\n 'DELETE WHERE { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should throw an error on blank nodes in DELETE DATA clause', testErroneousQuery(\n 'DELETE DATA { _:a <ex:p> <ex:o> }',\n 'Detected illegal blank node in BGP',\n ));\n\n it('should throw an error on variables in DELETE DATA clause with GRAPH', testErroneousQuery(\n 'DELETE DATA { GRAPH ?a { <ex:s> <ex:p> <ex:o> } }',\n 'Detected illegal variable in GRAPH',\n ));\n\n it('should throw an error on variables in INSERT DATA clause', testErroneousQuery(\n 'INSERT DATA { ?a <ex:p> <ex:o> }',\n 'Detected illegal variable in BGP',\n ));\n\n it('should not throw on reused blank nodes in one INSERT DATA clause', ({ expect }) => {\n const query = 'INSERT DATA { _:a <ex:p> <ex:o> . _:a <ex:p> <ex:o> . }';\n // Todo: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { _:a <ex:p> <ex:o> }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should throw an error on reused blank nodes across INSERT DATA clauses with GRAPH', testErroneousQuery(\n 'INSERT DATA { _:a <ex:p> <ex:o> }; INSERT DATA { GRAPH <ex:g> { _:a <ex:p> <ex:o> } }',\n 'Detected reuse blank node across different INSERT DATA clauses',\n ));\n\n it('should not throw on comment between INSERT and DATA', ({ expect }) => {\n const query = `INSERT\n# Comment\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should not throw on comment after INSERT that could be confused with DATA', ({ expect }) => {\n const query = `INSERT # DATA\nDATA { GRAPH <ex:G> { <ex:s> <ex:p> 'o1', 'o2', 'o3' } }`;\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n });\n\n it('should throw an error on commented DATA after INSERT', testErroneousQuery(\n 'INSERT # DATA { GRAPH <ex:G> { <ex:s> <ex:p> \\'o1\\', \\'o2\\', \\'o3\\' } }',\n 'Parse error',\n ));\n });\n\n it('should throw an error on unicode codepoint escaping in literal with partial surrogate pair', testErroneousQuery(\n 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\' }',\n 'Invalid unicode codepoint of surrogate pair without corresponding codepoint',\n ));\n\n it(\n 'should not throw an error on unicode codepoint escaping in literal with complete surrogate pair',\n ({ expect }) => {\n const query = 'SELECT * WHERE { ?s <ex:p> \\'\\uD800\\uDFFF\\' }';\n // TODO: add proper test\n expect(parser.parse(query)).toMatchObject({});\n },\n );\n}\n"]}
@@ -1,4 +1,14 @@
1
1
  import type { PathLike } from 'node:fs';
2
2
  import type { FileHandle } from 'node:fs/promises';
3
+ /**
4
+ * Read a file asynchronously, normalizing line endings to `\n`.
5
+ * @param path - The file path or handle to read.
6
+ * @param encoding - The encoding to use (default: `'utf-8'`).
7
+ */
3
8
  export declare function readFile(path: PathLike | FileHandle, encoding?: BufferEncoding): Promise<string>;
9
+ /**
10
+ * Read a file synchronously, normalizing line endings to `\n`.
11
+ * @param path - The file path to read.
12
+ * @param encoding - The encoding to use (default: `'utf-8'`).
13
+ */
4
14
  export declare function readFileSync(path: string, encoding?: BufferEncoding): string;
@@ -1,9 +1,19 @@
1
1
  import fs from 'node:fs';
2
2
  import fsp from 'node:fs/promises';
3
+ /**
4
+ * Read a file asynchronously, normalizing line endings to `\n`.
5
+ * @param path - The file path or handle to read.
6
+ * @param encoding - The encoding to use (default: `'utf-8'`).
7
+ */
3
8
  export async function readFile(path, encoding = 'utf-8') {
4
9
  const content = await fsp.readFile(path, encoding);
5
10
  return content.replaceAll(/\r?\n/gu, '\n');
6
11
  }
12
+ /**
13
+ * Read a file synchronously, normalizing line endings to `\n`.
14
+ * @param path - The file path to read.
15
+ * @param encoding - The encoding to use (default: `'utf-8'`).
16
+ */
7
17
  export function readFileSync(path, encoding = 'utf-8') {
8
18
  // eslint-disable-next-line no-sync
9
19
  const content = fs.readFileSync(path, encoding);
@@ -1 +1 @@
1
- {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../../lib/fileUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAA2B,EAAE,WAA2B,OAAO;IAC5F,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,WAA2B,OAAO;IAC3E,mCAAmC;IACnC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport type { PathLike } from 'node:fs';\nimport fs from 'node:fs';\nimport type { FileHandle } from 'node:fs/promises';\nimport fsp from 'node:fs/promises';\n\nexport async function readFile(path: PathLike | FileHandle, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n const content = await fsp.readFile(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n\nexport function readFileSync(path: string, encoding: BufferEncoding = 'utf-8'): string {\n // eslint-disable-next-line no-sync\n const content = fs.readFileSync(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n"]}
1
+ {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../../lib/fileUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAA2B,EAAE,WAA2B,OAAO;IAC5F,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,WAA2B,OAAO;IAC3E,mCAAmC;IACnC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport type { PathLike } from 'node:fs';\nimport fs from 'node:fs';\nimport type { FileHandle } from 'node:fs/promises';\nimport fsp from 'node:fs/promises';\n\n/**\n * Read a file asynchronously, normalizing line endings to `\\n`.\n * @param path - The file path or handle to read.\n * @param encoding - The encoding to use (default: `'utf-8'`).\n */\nexport async function readFile(path: PathLike | FileHandle, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n const content = await fsp.readFile(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n\n/**\n * Read a file synchronously, normalizing line endings to `\\n`.\n * @param path - The file path to read.\n * @param encoding - The encoding to use (default: `'utf-8'`).\n */\nexport function readFileSync(path: string, encoding: BufferEncoding = 'utf-8'): string {\n // eslint-disable-next-line no-sync\n const content = fs.readFileSync(path, encoding);\n return content.replaceAll(/\\r?\\n/gu, '\\n');\n}\n"]}
@@ -7,16 +7,33 @@ export interface algebraTestGen {
7
7
  canonicalSparql: string | undefined;
8
8
  }
9
9
  export type AlgebraTestSuite = 'dawg-syntax' | 'sparql-1.1' | 'sparql11-query' | 'sparql12';
10
- export declare function sparqlAlgebraTests(suites: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: true): Generator<algebraTestGen & {
10
+ /**
11
+ * Yields algebra-level test cases from the static test fixtures.
12
+ * Each test provides a SPARQL query, expected algebra JSON, and optionally a canonical SPARQL string.
13
+ * @param suite - The test suite to iterate.
14
+ * @param blankToVariable - Whether to use the blank-to-variable fixture variant.
15
+ * @param getSPARQL - Whether to load the SPARQL and canonical SPARQL strings.
16
+ */
17
+ export declare function sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: true): Generator<algebraTestGen & {
11
18
  sparql: string;
12
19
  canonicalSparql: string;
13
20
  }>;
14
- export declare function sparqlAlgebraTests(suites: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean): Generator<algebraTestGen>;
21
+ export declare function sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean): Generator<algebraTestGen>;
15
22
  type GenQuery = {
16
23
  query: string;
17
24
  name: string;
18
25
  };
26
+ /**
27
+ * Yields raw SPARQL query strings from the static test fixtures for a given suite.
28
+ * @param suite - The test suite to iterate.
29
+ */
19
30
  export declare function sparqlQueries(suite: AlgebraTestSuite): Generator<GenQuery>;
20
31
  export type NegativeAlgebraSuite = 'sparql-1.1-negative' | 'sparql-1.2-negative';
32
+ /**
33
+ * Yields test cases for negative (invalid) algebra-level tests.
34
+ * Each test provides a SPARQL query that should fail during algebra transformation.
35
+ * @param suite - The negative test suite to iterate.
36
+ * @param filter - Optional filter predicate applied to the test file name.
37
+ */
21
38
  export declare function sparqlAlgebraNegativeTests(suite: NegativeAlgebraSuite, filter?: (name: string) => boolean): Generator<NegativeTest>;
22
39
  export {};
@@ -37,6 +37,10 @@ export function* sparqlAlgebraTests(suite, blankToVariable, getSPARQL) {
37
37
  yield* subGen(suite);
38
38
  }
39
39
  }
40
+ /**
41
+ * Yields raw SPARQL query strings from the static test fixtures for a given suite.
42
+ * @param suite - The test suite to iterate.
43
+ */
40
44
  export function* sparqlQueries(suite) {
41
45
  function* subGen(relativePath) {
42
46
  const absolutePath = join(rootSparql, relativePath);
@@ -60,6 +64,12 @@ export function* sparqlQueries(suite) {
60
64
  yield* subGen(suite);
61
65
  }
62
66
  }
67
+ /**
68
+ * Yields test cases for negative (invalid) algebra-level tests.
69
+ * Each test provides a SPARQL query that should fail during algebra transformation.
70
+ * @param suite - The negative test suite to iterate.
71
+ * @param filter - Optional filter predicate applied to the test file name.
72
+ */
63
73
  export function* sparqlAlgebraNegativeTests(suite, filter) {
64
74
  const astDir = getStaticFilePath('algebra');
65
75
  const sparqlDir = join(astDir, 'sparql', suite);
@@ -1 +1 @@
1
- {"version":3,"file":"algebraGenerators.js","sourceRoot":"","sources":["../../../../lib/generators/algebraGenerators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { lstatSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile, readFileSync } from '../fileUtils.js';\nimport type { NegativeTest } from './generators.js';\nimport { getStaticFilePath } from './utils.js';\n\nconst rootDir = getStaticFilePath('algebra');\nconst rootSparql = join(rootDir, 'sparql');\nconst rootJson = join(rootDir, 'algebra');\nconst rootJsonBlankToVariable = join(rootDir, 'algebra-blank-to-var');\nconst rootCanonicalSparql = join(rootDir, 'canonical-sparql', 'base');\nconst rootCanonicalSparqlBlankToVar = join(rootDir, 'canonical-sparql', 'blank-to-var');\n\nexport interface algebraTestGen {\n name: string;\n json: unknown;\n quads: boolean;\n sparql: string | undefined;\n canonicalSparql: string | undefined;\n}\n\nexport type AlgebraTestSuite = 'dawg-syntax' | 'sparql-1.1' | 'sparql11-query' | 'sparql12';\n\nexport function sparqlAlgebraTests(suites: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: true):\nGenerator<algebraTestGen & { sparql: string; canonicalSparql: string }>;\nexport function sparqlAlgebraTests(suites: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen>;\nexport function* sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen> {\n // Relative path starting from roots declared above.\n function* subGen(relativePath: string): Generator<algebraTestGen> {\n const absolutePath = join(blankToVariable ? rootJsonBlankToVariable : rootJson, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.json$/u, '');\n const sparqlPath = join(rootSparql, relativePath.replace(/\\.json/u, '.sparql'));\n const canonicalSparqlPath = join(\n blankToVariable ? rootCanonicalSparqlBlankToVar : rootCanonicalSparql,\n relativePath.replace(/\\.json/u, '.sparql'),\n );\n yield {\n name,\n json: JSON.parse(readFileSync(absolutePath)),\n sparql: getSPARQL ? readFileSync(sparqlPath, 'utf8') : undefined,\n canonicalSparql: getSPARQL ? readFileSync(canonicalSparqlPath, 'utf-8') : undefined,\n quads: name.endsWith('-quads'),\n };\n }\n }\n\n const subfolders = readdirSync(blankToVariable ? rootJsonBlankToVariable : rootJson);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\ntype GenQuery = { query: string; name: string };\nexport function* sparqlQueries(suite: AlgebraTestSuite): Generator<GenQuery> {\n function* subGen(relativePath: string): Generator<GenQuery> {\n const absolutePath = join(rootSparql, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.sparql$/u, '');\n const content = readFileSync(absolutePath, 'utf-8');\n yield {\n name,\n query: content.replaceAll(/\\r?\\n/gu, '\\n'),\n };\n }\n }\n\n const subfolders = readdirSync(rootSparql);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\nexport type NegativeAlgebraSuite = 'sparql-1.1-negative' | 'sparql-1.2-negative';\n\nexport function* sparqlAlgebraNegativeTests(\n suite: NegativeAlgebraSuite,\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('algebra');\n const sparqlDir = join(astDir, 'sparql', suite);\n const statics = readdirSync(sparqlDir);\n for (const file of statics.filter(f => f.endsWith('.sparql'))) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"algebraGenerators.js","sourceRoot":"","sources":["../../../../lib/generators/algebraGenerators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { lstatSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile, readFileSync } from '../fileUtils.js';\nimport type { NegativeTest } from './generators.js';\nimport { getStaticFilePath } from './utils.js';\n\nconst rootDir = getStaticFilePath('algebra');\nconst rootSparql = join(rootDir, 'sparql');\nconst rootJson = join(rootDir, 'algebra');\nconst rootJsonBlankToVariable = join(rootDir, 'algebra-blank-to-var');\nconst rootCanonicalSparql = join(rootDir, 'canonical-sparql', 'base');\nconst rootCanonicalSparqlBlankToVar = join(rootDir, 'canonical-sparql', 'blank-to-var');\n\nexport interface algebraTestGen {\n name: string;\n json: unknown;\n quads: boolean;\n sparql: string | undefined;\n canonicalSparql: string | undefined;\n}\n\nexport type AlgebraTestSuite = 'dawg-syntax' | 'sparql-1.1' | 'sparql11-query' | 'sparql12';\n\n/**\n * Yields algebra-level test cases from the static test fixtures.\n * Each test provides a SPARQL query, expected algebra JSON, and optionally a canonical SPARQL string.\n * @param suite - The test suite to iterate.\n * @param blankToVariable - Whether to use the blank-to-variable fixture variant.\n * @param getSPARQL - Whether to load the SPARQL and canonical SPARQL strings.\n */\nexport function sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: true):\nGenerator<algebraTestGen & { sparql: string; canonicalSparql: string }>;\nexport function sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen>;\nexport function* sparqlAlgebraTests(suite: AlgebraTestSuite, blankToVariable: boolean, getSPARQL: boolean):\nGenerator<algebraTestGen> {\n // Relative path starting from roots declared above.\n function* subGen(relativePath: string): Generator<algebraTestGen> {\n const absolutePath = join(blankToVariable ? rootJsonBlankToVariable : rootJson, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.json$/u, '');\n const sparqlPath = join(rootSparql, relativePath.replace(/\\.json/u, '.sparql'));\n const canonicalSparqlPath = join(\n blankToVariable ? rootCanonicalSparqlBlankToVar : rootCanonicalSparql,\n relativePath.replace(/\\.json/u, '.sparql'),\n );\n yield {\n name,\n json: JSON.parse(readFileSync(absolutePath)),\n sparql: getSPARQL ? readFileSync(sparqlPath, 'utf8') : undefined,\n canonicalSparql: getSPARQL ? readFileSync(canonicalSparqlPath, 'utf-8') : undefined,\n quads: name.endsWith('-quads'),\n };\n }\n }\n\n const subfolders = readdirSync(blankToVariable ? rootJsonBlankToVariable : rootJson);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\ntype GenQuery = { query: string; name: string };\n/**\n * Yields raw SPARQL query strings from the static test fixtures for a given suite.\n * @param suite - The test suite to iterate.\n */\nexport function* sparqlQueries(suite: AlgebraTestSuite): Generator<GenQuery> {\n function* subGen(relativePath: string): Generator<GenQuery> {\n const absolutePath = join(rootSparql, relativePath);\n if (lstatSync(absolutePath).isDirectory()) {\n // Recursion\n for (const sub of readdirSync(absolutePath)) {\n yield* subGen(join(relativePath, sub));\n }\n } else {\n const name = relativePath.replace(/\\.sparql$/u, '');\n const content = readFileSync(absolutePath, 'utf-8');\n yield {\n name,\n query: content.replaceAll(/\\r?\\n/gu, '\\n'),\n };\n }\n }\n\n const subfolders = readdirSync(rootSparql);\n if (subfolders.includes(suite)) {\n yield* subGen(suite);\n }\n}\n\nexport type NegativeAlgebraSuite = 'sparql-1.1-negative' | 'sparql-1.2-negative';\n\n/**\n * Yields test cases for negative (invalid) algebra-level tests.\n * Each test provides a SPARQL query that should fail during algebra transformation.\n * @param suite - The negative test suite to iterate.\n * @param filter - Optional filter predicate applied to the test file name.\n */\nexport function* sparqlAlgebraNegativeTests(\n suite: NegativeAlgebraSuite,\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('algebra');\n const sparqlDir = join(astDir, 'sparql', suite);\n const statics = readdirSync(sparqlDir);\n for (const file of statics.filter(f => f.endsWith('.sparql'))) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
@@ -8,6 +8,13 @@ interface PositiveTest {
8
8
  autoGenCompact: string;
9
9
  }>;
10
10
  }
11
+ /**
12
+ * Yields test cases for positive SPARQL parser tests.
13
+ * Each test provides the query string, expected ASTs (with and without source tracking),
14
+ * and auto-generated query strings (pretty-printed and compact).
15
+ * @param type - The test suite to use.
16
+ * @param filter - Optional filter predicate applied to the test file name (without extension).
17
+ */
11
18
  export declare function positiveTest(type: 'paths' | 'sparql-1-1' | 'sparql-1-2', filter?: (name: string) => boolean): Generator<PositiveTest>;
12
19
  export interface NegativeTest {
13
20
  name: string;
@@ -15,5 +22,11 @@ export interface NegativeTest {
15
22
  query: string;
16
23
  }>;
17
24
  }
25
+ /**
26
+ * Yields test cases for negative (invalid) SPARQL parser tests.
27
+ * Each test provides a query string that should fail to parse.
28
+ * @param type - The test suite to use.
29
+ * @param filter - Optional filter predicate applied to the test file name (without extension).
30
+ */
18
31
  export declare function negativeTest(type: 'sparql-1-1-invalid' | 'sparql-1-2-invalid', filter?: (name: string) => boolean): Generator<NegativeTest>;
19
32
  export {};
@@ -3,6 +3,13 @@ import { readdirSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { readFile } from '../fileUtils.js';
5
5
  import { getStaticFilePath } from './utils.js';
6
+ /**
7
+ * Yields test cases for positive SPARQL parser tests.
8
+ * Each test provides the query string, expected ASTs (with and without source tracking),
9
+ * and auto-generated query strings (pretty-printed and compact).
10
+ * @param type - The test suite to use.
11
+ * @param filter - Optional filter predicate applied to the test file name (without extension).
12
+ */
6
13
  export function* positiveTest(type, filter) {
7
14
  const astDir = getStaticFilePath('ast');
8
15
  const jsonSourceTrackedDir = join(astDir, 'ast-source-tracked', type);
@@ -49,6 +56,12 @@ export function* positiveTest(type, filter) {
49
56
  };
50
57
  }
51
58
  }
59
+ /**
60
+ * Yields test cases for negative (invalid) SPARQL parser tests.
61
+ * Each test provides a query string that should fail to parse.
62
+ * @param type - The test suite to use.
63
+ * @param filter - Optional filter predicate applied to the test file name (without extension).
64
+ */
52
65
  export function* negativeTest(type, filter) {
53
66
  const astDir = getStaticFilePath('ast');
54
67
  const sparqlGeneratedDir = join(astDir, 'sparql', type);
@@ -1 +1 @@
1
- {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../../lib/generators/generators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile } from '../fileUtils.js';\nimport { getStaticFilePath } from './utils.js';\n\ninterface PositiveTest {\n name: string;\n statics: () => Promise<{\n query: string;\n astWithSource: unknown;\n astNoSource: unknown;\n autoGen: string;\n autoGenCompact: string;\n }>;\n}\n\nexport function* positiveTest(\n type: 'paths' | 'sparql-1-1' | 'sparql-1-2',\n filter?: (name: string) => boolean,\n): Generator<PositiveTest> {\n const astDir = getStaticFilePath('ast');\n const jsonSourceTrackedDir = join(astDir, 'ast-source-tracked', type);\n const jsonNonSourceTrackedDir = join(astDir, 'ast-no-source-tracked', type);\n const sparqlDir = join(astDir, 'sparql', type);\n const sparqlGeneratedDir = join(astDir, 'sparql-generated', type);\n const sparqlGenCompactDir = join(astDir, 'sparql-generated-compact', type);\n const statics = readdirSync(jsonSourceTrackedDir);\n for (const file of statics) {\n if (filter && !filter(file.replace('.json', ''))) {\n continue;\n }\n const name = file.replace(/\\.json$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, `${name}.sparql`));\n const sourceTracked = await readFile(join(jsonSourceTrackedDir, file));\n let noSourceTracked: string;\n try {\n noSourceTracked = await readFile(join(jsonNonSourceTrackedDir, file));\n } catch {\n noSourceTracked = '{}';\n }\n let autoGen = '';\n try {\n autoGen = await readFile(join(sparqlGeneratedDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n let autoGenCompact = '';\n try {\n autoGenCompact = await readFile(join(sparqlGenCompactDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n return {\n query,\n astWithSource: JSON.parse(sourceTracked),\n astNoSource: JSON.parse(noSourceTracked),\n autoGen,\n autoGenCompact,\n };\n },\n };\n }\n}\n\nexport interface NegativeTest {\n name: string;\n statics: () => Promise<{\n query: string;\n }>;\n}\n\nexport function* negativeTest(\n type: 'sparql-1-1-invalid' | 'sparql-1-2-invalid',\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('ast');\n const sparqlGeneratedDir = join(astDir, 'sparql', type);\n const statics = readdirSync(sparqlGeneratedDir).filter(f => f.endsWith('.sparql'));\n for (const file of statics) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlGeneratedDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../../lib/generators/generators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport { readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readFile } from '../fileUtils.js';\nimport { getStaticFilePath } from './utils.js';\n\ninterface PositiveTest {\n name: string;\n statics: () => Promise<{\n query: string;\n astWithSource: unknown;\n astNoSource: unknown;\n autoGen: string;\n autoGenCompact: string;\n }>;\n}\n\n/**\n * Yields test cases for positive SPARQL parser tests.\n * Each test provides the query string, expected ASTs (with and without source tracking),\n * and auto-generated query strings (pretty-printed and compact).\n * @param type - The test suite to use.\n * @param filter - Optional filter predicate applied to the test file name (without extension).\n */\nexport function* positiveTest(\n type: 'paths' | 'sparql-1-1' | 'sparql-1-2',\n filter?: (name: string) => boolean,\n): Generator<PositiveTest> {\n const astDir = getStaticFilePath('ast');\n const jsonSourceTrackedDir = join(astDir, 'ast-source-tracked', type);\n const jsonNonSourceTrackedDir = join(astDir, 'ast-no-source-tracked', type);\n const sparqlDir = join(astDir, 'sparql', type);\n const sparqlGeneratedDir = join(astDir, 'sparql-generated', type);\n const sparqlGenCompactDir = join(astDir, 'sparql-generated-compact', type);\n const statics = readdirSync(jsonSourceTrackedDir);\n for (const file of statics) {\n if (filter && !filter(file.replace('.json', ''))) {\n continue;\n }\n const name = file.replace(/\\.json$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlDir, `${name}.sparql`));\n const sourceTracked = await readFile(join(jsonSourceTrackedDir, file));\n let noSourceTracked: string;\n try {\n noSourceTracked = await readFile(join(jsonNonSourceTrackedDir, file));\n } catch {\n noSourceTracked = '{}';\n }\n let autoGen = '';\n try {\n autoGen = await readFile(join(sparqlGeneratedDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n let autoGenCompact = '';\n try {\n autoGenCompact = await readFile(join(sparqlGenCompactDir, `${name}.sparql`));\n } catch { /* Already initialized */ }\n return {\n query,\n astWithSource: JSON.parse(sourceTracked),\n astNoSource: JSON.parse(noSourceTracked),\n autoGen,\n autoGenCompact,\n };\n },\n };\n }\n}\n\nexport interface NegativeTest {\n name: string;\n statics: () => Promise<{\n query: string;\n }>;\n}\n\n/**\n * Yields test cases for negative (invalid) SPARQL parser tests.\n * Each test provides a query string that should fail to parse.\n * @param type - The test suite to use.\n * @param filter - Optional filter predicate applied to the test file name (without extension).\n */\nexport function* negativeTest(\n type: 'sparql-1-1-invalid' | 'sparql-1-2-invalid',\n filter?: (name: string) => boolean,\n): Generator<NegativeTest> {\n const astDir = getStaticFilePath('ast');\n const sparqlGeneratedDir = join(astDir, 'sparql', type);\n const statics = readdirSync(sparqlGeneratedDir).filter(f => f.endsWith('.sparql'));\n for (const file of statics) {\n if (filter && !filter(file.replace('.sparql', ''))) {\n continue;\n }\n const name = file.replace(/\\.sparql$/u, '');\n yield {\n name,\n statics: async() => {\n const query = await readFile(join(sparqlGeneratedDir, file));\n return {\n query,\n };\n },\n };\n }\n}\n"]}
@@ -1 +1,6 @@
1
+ /**
2
+ * Resolve a path relative to the test-utils statics directory.
3
+ * @param paths - Path segments to join after the statics root.
4
+ * @returns The absolute path to the static fixture.
5
+ */
1
6
  export declare function getStaticFilePath(...paths: string[]): string;
@@ -3,6 +3,11 @@ import path from 'node:path';
3
3
  // Path.resolve() returns process.cwd() — the monorepo root when running via vitest.
4
4
  // This avoids __dirname (CJS-only) and import.meta.url (ESM-only).
5
5
  const staticsPath = path.resolve('packages/test-utils/statics');
6
+ /**
7
+ * Resolve a path relative to the test-utils statics directory.
8
+ * @param paths - Path segments to join after the statics root.
9
+ * @returns The absolute path to the static fixture.
10
+ */
6
11
  export function getStaticFilePath(...paths) {
7
12
  return path.join(staticsPath, ...paths);
8
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/generators/utils.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,oFAAoF;AACpF,mEAAmE;AACnE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAEhE,MAAM,UAAU,iBAAiB,CAAC,GAAG,KAAe;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport path from 'node:path';\n\n// Path.resolve() returns process.cwd() — the monorepo root when running via vitest.\n// This avoids __dirname (CJS-only) and import.meta.url (ESM-only).\nconst staticsPath = path.resolve('packages/test-utils/statics');\n\nexport function getStaticFilePath(...paths: string[]): string {\n return path.join(staticsPath, ...paths);\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/generators/utils.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,oFAAoF;AACpF,mEAAmE;AACnE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAG,KAAe;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/* eslint-disable import/no-nodejs-modules */\nimport path from 'node:path';\n\n// Path.resolve() returns process.cwd() — the monorepo root when running via vitest.\n// This avoids __dirname (CJS-only) and import.meta.url (ESM-only).\nconst staticsPath = path.resolve('packages/test-utils/statics');\n\n/**\n * Resolve a path relative to the test-utils statics directory.\n * @param paths - Path segments to join after the statics root.\n * @returns The absolute path to the static fixture.\n */\nexport function getStaticFilePath(...paths: string[]): string {\n return path.join(staticsPath, ...paths);\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@traqula/test-utils",
3
3
  "type": "module",
4
- "version": "1.0.7",
4
+ "version": "1.1.1",
5
5
  "description": "Test utils used by the Traqula monorepo",
6
6
  "lsd:module": true,
7
7
  "license": "MIT",
@@ -49,5 +49,5 @@
49
49
  "devDependencies": {
50
50
  "@rdfjs/types": "^2.0.0"
51
51
  },
52
- "gitHead": "e0f102abaf3cad07d6d8ef7c2ad00ea8448c6e9c"
52
+ "gitHead": "51799d80873e4f0fb0ca6ab778861f526d3a66d1"
53
53
  }
@@ -1,5 +1,5 @@
1
1
  SELECT ?y ?z WHERE {
2
2
  VALUES( ?y ?z ){
3
- ( <http://example.com/ns#a><http://example.com/ns#b> )
3
+ ( <http://example.com/ns#a> <http://example.com/ns#b> )
4
4
  }
5
5
  }
@@ -1,5 +1,5 @@
1
1
  SELECT ?y ?z WHERE {
2
2
  VALUES( ?y ?z ){
3
- ( <http://example.com/ns#a><http://example.com/ns#b> )
3
+ ( <http://example.com/ns#a> <http://example.com/ns#b> )
4
4
  }
5
5
  }