rdf-test-suite 2.3.2 → 2.3.3

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.
@@ -39,19 +39,30 @@ class ManifestLoader {
39
39
  }
40
40
  import(objectLoader, urlInitial, options) {
41
41
  return __awaiter(this, void 0, void 0, function* () {
42
- var _a, _b, _c, _d;
42
+ // Fragment of the URL the caller asked for (e.g. 'manifest'), if any.
43
+ const hashIndex = urlInitial.indexOf('#');
44
+ const requestedFragment = hashIndex >= 0 ? urlInitial.slice(hashIndex + 1) : undefined;
43
45
  const [url, parsed] = yield Util_1.Util.fetchRdf(urlInitial, options);
44
46
  // Dereference the URL and load it
45
47
  yield objectLoader.import(parsed);
48
+ function findManifest() {
49
+ const extLess = url.slice(0, url.lastIndexOf('.'));
50
+ let result;
51
+ // Highest priority: the resource the caller explicitly named via a fragment,
52
+ // resolved against the fetched (fragment-less) document URL.
53
+ if (requestedFragment) {
54
+ result = objectLoader.resources[`${url}#${requestedFragment}`];
55
+ }
56
+ // Second try the same URL as the document URL
57
+ result !== null && result !== void 0 ? result : (result = objectLoader.resources[url]);
58
+ // Also try extension-less manifest URL (needed for RDFa test suite)
59
+ result !== null && result !== void 0 ? result : (result = objectLoader.resources[extLess]);
60
+ // Also try extension-less and with the last '/' replaced with a '#' (needed for RDFstar test suite)
61
+ // @see https://github.com/w3c/rdf-star/issues/269
62
+ return result !== null && result !== void 0 ? result : objectLoader.resources[extLess.replace(/\/manifest$/u, '#manifest')];
63
+ }
46
64
  // Import all sub-manifests
47
- let manifest =
48
- // First try the same URL as the document URL
49
- (_b = (_a = objectLoader.resources[url]) !== null && _a !== void 0 ? _a :
50
- // Also try extension-less manifest URL (needed for RDFa test suite)
51
- objectLoader.resources[url.slice(0, url.lastIndexOf('.'))]) !== null && _b !== void 0 ? _b :
52
- // Also try extension-less and with the last '/' replaced with a '#' (needed for RDFstar test suite)
53
- // @see https://github.com/w3c/rdf-star/issues/269
54
- objectLoader.resources[url.slice(0, url.lastIndexOf('.')).replace(/\/manifest$/u, '#manifest')];
65
+ let manifest = findManifest();
55
66
  if (!manifest) {
56
67
  throw new Error(`Could not find a resource ${url} in the document at ${url}`);
57
68
  }
@@ -65,14 +76,8 @@ class ManifestLoader {
65
76
  }
66
77
  }
67
78
  yield Promise.all(includeJobs);
68
- manifest =
69
- // First try the same URL as the document URL
70
- (_d = (_c = objectLoader.resources[url]) !== null && _c !== void 0 ? _c :
71
- // Also try extension-less manifest URL (needed for RDFa test suite)
72
- objectLoader.resources[url.slice(0, url.lastIndexOf('.'))]) !== null && _d !== void 0 ? _d :
73
- // Also try extension-less and with the last '/' replaced with a '#' (needed for RDFstar test suite)
74
- // @see https://github.com/w3c/rdf-star/issues/269
75
- objectLoader.resources[url.slice(0, url.lastIndexOf('.')).replace(/\/manifest$/u, '#manifest')];
79
+ // Re-resolve, as sub-manifest imports may have extended the manifest resource
80
+ manifest = findManifest();
76
81
  return manifest;
77
82
  });
78
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ManifestLoader.js","sourceRoot":"","sources":["ManifestLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { termToString } from 'rdf-string';\nimport type { IManifest } from './IManifest';\nimport { manifestFromResource } from './IManifest';\nimport type { ITestCase } from './testcase/ITestCase';\nimport type { ITestCaseHandler } from './testcase/ITestCaseHandler';\nimport type { IFetchOptions } from './Util';\nimport { Util } from './Util';\n\n/**\n * A ManifestLoader loads test suites from URLs.\n */\nexport class ManifestLoader {\n // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\n public static readonly defaultTestCaseHandlers: Record<string, ITestCaseHandler<ITestCase<any>>> = require('./testcase/TestCaseHandlers') as Record<string, ITestCaseHandler<ITestCase<any>>>;\n\n // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\n public static readonly loaderContext: Record<string, unknown> = require('./context-manifest.json') as Record<string, unknown>;\n\n private readonly testCaseHandlers: Record<string, ITestCaseHandler<ITestCase<any>>>;\n\n public constructor(args?: IManifestLoaderArgs) {\n if (!args) {\n args = {};\n }\n this.testCaseHandlers = args.testCaseHandlers || ManifestLoader.defaultTestCaseHandlers;\n }\n\n /**\n * Load the manifest from the given URL.\n * @param {string} url The URL of a manifest.\n * @param {IFetchOptions} options The fetch options.\n * @return {Promise<IManifest>} A promise that resolves to a manifest object.\n */\n public async from(url: string, options?: IFetchOptions): Promise<IManifest> {\n const objectLoader = new RdfObjectLoader({ context: ManifestLoader.loaderContext });\n const manifest: Resource = await this.import(objectLoader, url, options);\n return manifestFromResource(this.testCaseHandlers, options, manifest, objectLoader);\n }\n\n protected async import(objectLoader: RdfObjectLoader, urlInitial: string, options?: IFetchOptions): Promise<Resource> {\n const [ url, parsed ] = await Util.fetchRdf(urlInitial, options);\n // Dereference the URL and load it\n await objectLoader.import(parsed);\n\n // Import all sub-manifests\n let manifest: Resource =\n // First try the same URL as the document URL\n objectLoader.resources[url] ??\n // Also try extension-less manifest URL (needed for RDFa test suite)\n objectLoader.resources[url.slice(0, url.lastIndexOf('.'))] ??\n // Also try extension-less and with the last '/' replaced with a '#' (needed for RDFstar test suite)\n // @see https://github.com/w3c/rdf-star/issues/269\n objectLoader.resources[url.slice(0, url.lastIndexOf('.')).replace(/\\/manifest$/u, '#manifest')];\n\n if (!manifest) {\n throw new Error(`Could not find a resource ${url} in the document at ${url}`);\n }\n const includeJobs: Promise<any>[] = [];\n for (const includeList of manifest.properties.include) {\n for (const include of includeList.list) {\n if (include.term.termType !== 'NamedNode') {\n throw new Error(`Found invalid manifest term ${termToString(include.term)} when parsing ${url}`);\n }\n includeJobs.push(this.import(objectLoader, include.value, options));\n }\n }\n\n await Promise.all(includeJobs);\n\n manifest =\n // First try the same URL as the document URL\n objectLoader.resources[url] ??\n // Also try extension-less manifest URL (needed for RDFa test suite)\n objectLoader.resources[url.slice(0, url.lastIndexOf('.'))] ??\n // Also try extension-less and with the last '/' replaced with a '#' (needed for RDFstar test suite)\n // @see https://github.com/w3c/rdf-star/issues/269\n objectLoader.resources[url.slice(0, url.lastIndexOf('.')).replace(/\\/manifest$/u, '#manifest')];\n\n return manifest;\n }\n}\n\nexport interface IManifestLoaderArgs {\n testCaseHandlers?: Record<string, ITestCaseHandler<ITestCase<any>>>;\n}\n"]}
1
+ {"version":3,"file":"ManifestLoader.js","sourceRoot":"","sources":["ManifestLoader.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,2CAA6C;AAC7C,2CAA0C;AAE1C,2CAAmD;AAInD,iCAA8B;AAE9B;;GAEG;AACH,MAAa,cAAc;IASzB,YAAmB,IAA0B;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,cAAc,CAAC,uBAAuB,CAAC;IAC1F,CAAC;IAED;;;;;OAKG;IACU,IAAI,CAAC,GAAW,EAAE,OAAuB;;YACpD,MAAM,YAAY,GAAG,IAAI,4BAAe,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;YACpF,MAAM,QAAQ,GAAa,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YACzE,OAAO,IAAA,gCAAoB,EAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACtF,CAAC;KAAA;IAEe,MAAM,CAAC,YAA6B,EAAE,UAAkB,EAAE,OAAuB;;YAC/F,sEAAsE;YACtE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,iBAAiB,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEvF,MAAM,CAAE,GAAG,EAAE,MAAM,CAAE,GAAG,MAAM,WAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjE,kCAAkC;YAClC,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAElC,SAAS,YAAY;gBACnB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnD,IAAI,MAA4B,CAAC;gBACjC,6EAA6E;gBAC7E,6DAA6D;gBAC7D,IAAI,iBAAiB,EAAE,CAAC;oBACtB,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAC,CAAC;gBACjE,CAAC;gBACD,8CAA8C;gBAC9C,MAAM,aAAN,MAAM,cAAN,MAAM,IAAN,MAAM,GAAK,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,EAAC;gBACvC,oEAAoE;gBACpE,MAAM,aAAN,MAAM,cAAN,MAAM,IAAN,MAAM,GAAK,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,EAAC;gBAC3C,oGAAoG;gBACpG,kDAAkD;gBAClD,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;YACxF,CAAC;YAED,2BAA2B;YAC3B,IAAI,QAAQ,GAAa,YAAY,EAAE,CAAC;YAExC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,WAAW,GAAmB,EAAE,CAAC;YACvC,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACtD,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;oBACvC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;wBAC1C,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAA,yBAAY,EAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;oBACnG,CAAC;oBACD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAED,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAE/B,8EAA8E;YAC9E,QAAQ,GAAG,YAAY,EAAE,CAAC;YAE1B,OAAO,QAAQ,CAAC;QAClB,CAAC;KAAA;;AA5EH,wCA6EC;AA5EC,qEAAqE;AAC9C,sCAAuB,GAAqD,OAAO,CAAC,6BAA6B,CAAqD,CAAC;AAE9L,qEAAqE;AAC9C,4BAAa,GAA4B,OAAO,CAAC,yBAAyB,CAA4B,CAAC","sourcesContent":["import type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { termToString } from 'rdf-string';\nimport type { IManifest } from './IManifest';\nimport { manifestFromResource } from './IManifest';\nimport type { ITestCase } from './testcase/ITestCase';\nimport type { ITestCaseHandler } from './testcase/ITestCaseHandler';\nimport type { IFetchOptions } from './Util';\nimport { Util } from './Util';\n\n/**\n * A ManifestLoader loads test suites from URLs.\n */\nexport class ManifestLoader {\n // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\n public static readonly defaultTestCaseHandlers: Record<string, ITestCaseHandler<ITestCase<any>>> = require('./testcase/TestCaseHandlers') as Record<string, ITestCaseHandler<ITestCase<any>>>;\n\n // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\n public static readonly loaderContext: Record<string, unknown> = require('./context-manifest.json') as Record<string, unknown>;\n\n private readonly testCaseHandlers: Record<string, ITestCaseHandler<ITestCase<any>>>;\n\n public constructor(args?: IManifestLoaderArgs) {\n if (!args) {\n args = {};\n }\n this.testCaseHandlers = args.testCaseHandlers || ManifestLoader.defaultTestCaseHandlers;\n }\n\n /**\n * Load the manifest from the given URL.\n * @param {string} url The URL of a manifest.\n * @param {IFetchOptions} options The fetch options.\n * @return {Promise<IManifest>} A promise that resolves to a manifest object.\n */\n public async from(url: string, options?: IFetchOptions): Promise<IManifest> {\n const objectLoader = new RdfObjectLoader({ context: ManifestLoader.loaderContext });\n const manifest: Resource = await this.import(objectLoader, url, options);\n return manifestFromResource(this.testCaseHandlers, options, manifest, objectLoader);\n }\n\n protected async import(objectLoader: RdfObjectLoader, urlInitial: string, options?: IFetchOptions): Promise<Resource> {\n // Fragment of the URL the caller asked for (e.g. 'manifest'), if any.\n const hashIndex = urlInitial.indexOf('#');\n const requestedFragment = hashIndex >= 0 ? urlInitial.slice(hashIndex + 1) : undefined;\n\n const [ url, parsed ] = await Util.fetchRdf(urlInitial, options);\n // Dereference the URL and load it\n await objectLoader.import(parsed);\n\n function findManifest(): Resource {\n const extLess = url.slice(0, url.lastIndexOf('.'));\n let result: Resource | undefined;\n // Highest priority: the resource the caller explicitly named via a fragment,\n // resolved against the fetched (fragment-less) document URL.\n if (requestedFragment) {\n result = objectLoader.resources[`${url}#${requestedFragment}`];\n }\n // Second try the same URL as the document URL\n result ??= objectLoader.resources[url];\n // Also try extension-less manifest URL (needed for RDFa test suite)\n result ??= objectLoader.resources[extLess];\n // Also try extension-less and with the last '/' replaced with a '#' (needed for RDFstar test suite)\n // @see https://github.com/w3c/rdf-star/issues/269\n return result ?? objectLoader.resources[extLess.replace(/\\/manifest$/u, '#manifest')];\n }\n\n // Import all sub-manifests\n let manifest: Resource = findManifest();\n\n if (!manifest) {\n throw new Error(`Could not find a resource ${url} in the document at ${url}`);\n }\n const includeJobs: Promise<any>[] = [];\n for (const includeList of manifest.properties.include) {\n for (const include of includeList.list) {\n if (include.term.termType !== 'NamedNode') {\n throw new Error(`Found invalid manifest term ${termToString(include.term)} when parsing ${url}`);\n }\n includeJobs.push(this.import(objectLoader, include.value, options));\n }\n }\n\n await Promise.all(includeJobs);\n\n // Re-resolve, as sub-manifest imports may have extended the manifest resource\n manifest = findManifest();\n\n return manifest;\n }\n}\n\nexport interface IManifestLoaderArgs {\n testCaseHandlers?: Record<string, ITestCaseHandler<ITestCase<any>>>;\n}\n"]}
@@ -58,7 +58,7 @@ class TestCaseQueryEvaluationHandler {
58
58
  contentType = 'application/sparql-results+xml';
59
59
  queryResult = yield TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);
60
60
  }
61
- if (contentType.includes('application/sparql-results+json')) {
61
+ if (contentType.includes('application/sparql-results+json') || url.endsWith('.srj')) {
62
62
  queryResult = yield TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);
63
63
  }
64
64
  if (contentType.includes('text/tab-separated-values') || url.endsWith('.tsv')) {
@@ -1 +1 @@
1
- {"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { stringToTerm } from 'rdf-string';\nimport { stringToTerm as stringToTtlTerm } from 'rdf-string-ttl';\nimport type { QuadTermName } from 'rdf-terms';\nimport { mapTerms } from 'rdf-terms';\nimport { SparqlJsonParser } from 'sparqljson-parse';\nimport { SparqlXmlParser } from 'sparqlxml-parse';\nimport { ErrorTest } from '../../ErrorTest';\nimport type { IFetchOptions, IFetchResponse } from '../../Util';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine, IQueryResult, IQueryResultBindings, IQueryResultBoolean } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\nimport { QueryResultBindings } from './QueryResultBindings';\nimport { QueryResultBoolean } from './QueryResultBoolean';\nimport { QueryResultQuads } from './QueryResultQuads';\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst stringifyStream = require('stream-to-string');\n\nconst DF = new DataFactory();\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest.\n */\nexport class TestCaseQueryEvaluationHandler implements ITestCaseHandler<TestCaseQueryEvaluation> {\n /**\n * Parse SPARQL query results in any of the following content types:\n * * application/sparql-results+xml (bindings/ask)\n * * application/sparql-results+json (bindings/ask)\n * * Any RDF serialization (quads)\n *\n * If the results has as first triple '[] a <http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet>',\n * the it will be considered as a DAWG result set, and parsed as such. (bindings)\n *\n * @param {string} contentType The content type.\n * @param {string} url The base IRI.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseQueryResult(contentType: string, url: string, data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let queryResult: IQueryResult;\n try {\n const rdfStream: RDF.Stream = Util.parseRdfRaw(contentType, url, data);\n queryResult = new QueryResultQuads(await arrayifyStream(rdfStream));\n } catch {\n // Fallthrough to the next cases\n }\n if (contentType.includes('application/sparql-results+xml') || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.includes('application/sparql-results+json')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);\n }\n if (contentType.includes('text/tab-separated-values') || url.endsWith('.tsv')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlTsvResults(data);\n }\n\n if (!queryResult) {\n throw new Error(`Could not parse the query result with content type ${contentType} at ${url}`);\n }\n\n // Discover DAWG result sets\n if (queryResult.type === 'quads' && queryResult.value.length > 0 &&\n queryResult.value[0].predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' &&\n queryResult.value[0].object.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet') {\n return await TestCaseQueryEvaluationHandler.parseDawgResultSet(queryResult.value);\n }\n\n return queryResult;\n }\n\n /**\n * Parses query results in either SPARQL/JSON or SPARQL/XML query results syntax.\n * @param {string} type json or xml\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlResults(type: 'json' | 'xml', data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let booleanPromise: Promise<boolean>;\n let bindingsStream: NodeJS.ReadableStream;\n if (type === 'json') {\n const parser = new SparqlJsonParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseJsonBooleanStream(data);\n bindingsStream = parser.parseJsonResultsStream(data);\n } else {\n const parser = new SparqlXmlParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseXmlBooleanStream(data);\n bindingsStream = parser.parseXmlResultsStream(data);\n }\n const bindingsPromise: Promise<[RDF.Variable[], Record<string, RDF.Term>[]]> = Promise.all([\n new Promise<RDF.Variable[]>((resolve) => {\n bindingsStream\n .on('variables', resolve)\n .on('end', _ => resolve([]));\n }),\n arrayifyStream(bindingsStream),\n ]);\n\n // Parse both in parallel, and silence the errors\n let bindingsError: Error = null;\n let booleanError: Error = null;\n const parsingResults = await Promise.all([\n booleanPromise.catch((e): any => {\n booleanError = e;\n return null;\n }),\n bindingsPromise.catch((e): any => {\n bindingsError = e;\n return null;\n }),\n ]);\n\n if (!booleanError) {\n return new QueryResultBoolean(parsingResults[0]);\n }\n if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => `?${variable.value}`), parsingResults[1][1], false);\n }\n throw new Error(`Found no valid ASK or SELECT query.\\n${\n bindingsError.message}\\n${booleanError.message}`);\n }\n\n /**\n * Parses query results in the DAWG vocabulary.\n * https://www.w3.org/2001/sw/DataAccess/tests/test-dawg.n3\n * @param {Quad[]} quads An array of quads.\n * @return {Promise<IQueryResultBindings | IQueryResultBoolean>} A promise resolving to a bindings or boolean results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings | IQueryResultBoolean> {\n // Check for a boolean result (ASK query)\n if (quads[1] && quads[1].predicate.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#boolean') {\n return new QueryResultBoolean(quads[1].object.value === 'true');\n }\n\n // Construct resources for easier interpretation of the bindings\n const objectLoader = new RdfObjectLoader({\n context: {\n result: 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#',\n bindings: 'result:binding',\n index: 'result:index',\n resultVariables: 'result:resultVariable',\n solutions: 'result:solution',\n value: 'result:value',\n variable: 'result:variable',\n },\n });\n await objectLoader.importArray(quads);\n let resultSet: Resource = null;\n for (const resourceName in objectLoader.resources) {\n if (objectLoader.resources[resourceName]\n .isA(stringToTerm('http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet'))) {\n resultSet = objectLoader.resources[resourceName];\n break;\n }\n }\n\n if (!resultSet) {\n throw new Error(`No valid DAWG result set was found in ${quads}`);\n }\n\n // Get the variable names\n const variables: string[] = resultSet.properties.resultVariables\n .map((resource: Resource) => `?${resource.value}`);\n\n // Check if any binding has .index\n let checkOrder = false;\n const s = resultSet.properties.solutions;\n for (const solution of s) {\n if (solution.property.index) {\n checkOrder = true;\n break;\n }\n }\n\n // Ensure that the solutions are sorted by index\n const solutions = resultSet.properties.solutions;\n if (checkOrder) {\n solutions.sort((solution1: Resource, solution2: Resource) => Number.parseInt(solution1.property.index.value, 10) - Number.parseInt(solution2.property.index.value, 10));\n }\n\n // Collect the bindings as object\n const value: Record<string, RDF.Term>[] = solutions.map((solution: Resource) => solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings[`?${binding.property.variable.value}`] = binding.property.value.term;\n return bindings;\n }, {}));\n\n return new QueryResultBindings(variables, value, checkOrder);\n }\n\n /**\n * Parses query results from a SPARQL TSV stream.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlTsvResults(data: NodeJS.ReadableStream): Promise<IQueryResult> {\n const text: string = await stringifyStream(data);\n const lines = text.replace(/\\r?\\n$/u, '').split(/\\r?\\n/u);\n\n if (lines.length === 1) {\n const singleLine = lines[0].trim().toLowerCase();\n if (singleLine === 'true') {\n return new QueryResultBoolean(true);\n }\n if (singleLine === 'false') {\n return new QueryResultBoolean(false);\n }\n }\n\n const variables: string[] = [];\n\n if (lines[0].trim() !== '') {\n const rawVariables = lines[0].split('\\t');\n\n for (const raw of rawVariables) {\n const variable = raw.trim();\n\n if (variable === '') {\n throw new Error('Invalid TSV result: Empty column on the first row.');\n }\n\n if ((!variable.startsWith('?') && !variable.startsWith('$')) || variable.length < 2) {\n throw new Error(`Invalid TSV variable: ${variable}`);\n }\n\n if (variables.includes(variable)) {\n throw new Error(`Invalid TSV result: The variable ${variable} is declared twice.`);\n }\n\n variables.push(variable);\n }\n }\n\n const value: Record<string, RDF.Term>[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const fields = lines[i].split('\\t');\n\n const isZeroVariableResultRow = variables.length === 0 && fields.length === 1 && fields[0] === '';\n\n if (fields.length !== variables.length && !isZeroVariableResultRow) {\n throw new Error(`Invalid TSV row (Line ${i + 1}): expected ${variables.length} fields but found ${fields.length}.`);\n }\n\n const binding: Record<string, RDF.Term> = {};\n\n for (const [ j, variable ] of variables.entries()) {\n const field = fields[j].trim();\n\n if (field.length > 0) {\n try {\n binding[variable] = TestCaseQueryEvaluationHandler.parseTsvTerm(field);\n } catch (error: any) {\n throw new Error(\n `Failed to parse TSV value on Line ${i + 1}, Column '${variable}': ` +\n `Invalid Turtle syntax in \"${field}\".\\nOriginal error: ${error.message}`,\n );\n }\n }\n }\n value.push(binding);\n }\n\n return new QueryResultBindings(variables, value, false);\n }\n\n /**\n * Parse a single field from a SPARQL TSV result into an RDF term.\n * @param {string} term The TSV field value.\n * @return {RDF.Term} The corresponding RDF term.\n */\n public static parseTsvTerm(term: string): RDF.Term {\n if (/^[+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+)$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#decimal'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+|[0-9]+)[eE][+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#double'));\n }\n if (term === 'true' || term === 'false') {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#boolean'));\n }\n\n return stringToTtlTerm(term);\n }\n\n /**\n * Obtain all data links for the given query test action.\n * @param action A query test action.\n */\n public static getQueryDataLinks(action: Resource): IQueryDataLink[] {\n const queryDataLinks: IQueryDataLink[] = [];\n if (action.property.data) {\n queryDataLinks.push({\n dataUri: action.property.data.value,\n });\n }\n for (const graphData of action.properties.graphData) {\n if (graphData.property.graph) {\n queryDataLinks.push({\n dataUri: graphData.property.graph.value,\n dataGraph: DF.namedNode(graphData.property.label.value),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(graphData.value),\n });\n }\n }\n return queryDataLinks;\n }\n\n /**\n * Determine the quads for the given query data links.\n * @param queryDataLinks Links to query data.\n * @param options Fetch options.\n */\n public static async resolveQueryDataLinks(queryDataLinks: IQueryDataLink[], options?: IFetchOptions): Promise<RDF.Quad[]> {\n let queryData: RDF.Quad[] = [];\n for (const queryDataLink of queryDataLinks) {\n let queryDataThis: RDF.Quad[] = await arrayifyStream((await Util.fetchRdf(queryDataLink.dataUri, options))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map(quad => mapTerms(quad, (value: RDF.Term, key: QuadTermName) => key === 'graph' ? queryDataLink.dataGraph : value));\n }\n queryData = [ ...queryData, ...queryDataThis ];\n }\n return queryData;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseQueryEvaluation> {\n if (!resource.property.action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n if (!resource.property.result) {\n throw new Error(`Missing mf:result in ${resource}`);\n }\n const action = resource.property.action;\n if (!action.property.query) {\n throw new Error(`Missing qt:query in mf:action of ${resource}`);\n }\n\n // Determine links to data\n const queryDataLinks: IQueryDataLink[] = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);\n\n // Check for lax cardinality property\n let laxCardinality = false;\n if (resource.property.resultCardinality && resource.property.resultCardinality.value ===\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#LaxCardinality') {\n laxCardinality = true;\n }\n\n // Collect all query data\n const queryData: RDF.Quad[] = await TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);\n\n const queryResponse = await Util.fetchCached(resource.property.result.value, options);\n return new TestCaseQueryEvaluation(\n testCaseData,\n {\n baseIRI: action.property.query.value,\n queryDataLinks,\n laxCardinality,\n queryData,\n queryResult: await TestCaseQueryEvaluationHandler.parseQueryResult(\n Util.identifyContentType(queryResponse.url, queryResponse.headers),\n queryResponse.url,\n queryResponse.body,\n ),\n queryString: await stringifyStream((await Util.fetchCached(action.property.query.value, options)).body),\n resultSource: queryResponse,\n },\n );\n }\n}\n\nexport interface ITestCaseQueryEvaluationProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n queryResult: IQueryResult;\n laxCardinality: boolean;\n resultSource: IFetchResponse;\n queryDataLinks: IQueryDataLink[];\n}\n\nexport interface IQueryDataLink {\n dataUri: string;\n dataGraph?: RDF.NamedNode;\n}\n\nexport class TestCaseQueryEvaluation implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public readonly baseIRI: string;\n public readonly queryString: string;\n public readonly queryData: RDF.Quad[];\n public readonly queryResult: IQueryResult;\n public readonly laxCardinality: boolean;\n public readonly queryDataLinks: IQueryDataLink[];\n public readonly resultSource: IFetchResponse;\n\n constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps) {\n Object.assign(this, testCaseData);\n Object.assign(this, props);\n }\n\n public static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string {\n return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\\n ');\n }\n\n public async test(engine: IQueryEngine, injectArguments: any): Promise<void> {\n const result: IQueryResult = await engine.query(\n this.queryData,\n this.queryString,\n {\n baseIRI: this.baseIRI,\n checkOrder: this.queryResult.type === 'bindings' ?\n this.queryResult.checkOrder :\n false,\n ...injectArguments,\n },\n );\n if (!this.queryResult.equals(result, this.laxCardinality)) {\n throw new ErrorTest(`Invalid query evaluation\n\n Query:\\n\\n${this.queryString}\n\n Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}\n\n Result Source: ${this.resultSource.url}\n\n Expected: ${this.queryResult.toString()}\n\n Got: \\n ${result.toString()}\n`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { stringToTerm } from 'rdf-string';\nimport { stringToTerm as stringToTtlTerm } from 'rdf-string-ttl';\nimport type { QuadTermName } from 'rdf-terms';\nimport { mapTerms } from 'rdf-terms';\nimport { SparqlJsonParser } from 'sparqljson-parse';\nimport { SparqlXmlParser } from 'sparqlxml-parse';\nimport { ErrorTest } from '../../ErrorTest';\nimport type { IFetchOptions, IFetchResponse } from '../../Util';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine, IQueryResult, IQueryResultBindings, IQueryResultBoolean } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\nimport { QueryResultBindings } from './QueryResultBindings';\nimport { QueryResultBoolean } from './QueryResultBoolean';\nimport { QueryResultQuads } from './QueryResultQuads';\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst stringifyStream = require('stream-to-string');\n\nconst DF = new DataFactory();\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest.\n */\nexport class TestCaseQueryEvaluationHandler implements ITestCaseHandler<TestCaseQueryEvaluation> {\n /**\n * Parse SPARQL query results in any of the following content types:\n * * application/sparql-results+xml (bindings/ask)\n * * application/sparql-results+json (bindings/ask)\n * * Any RDF serialization (quads)\n *\n * If the results has as first triple '[] a <http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet>',\n * the it will be considered as a DAWG result set, and parsed as such. (bindings)\n *\n * @param {string} contentType The content type.\n * @param {string} url The base IRI.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseQueryResult(contentType: string, url: string, data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let queryResult: IQueryResult;\n try {\n const rdfStream: RDF.Stream = Util.parseRdfRaw(contentType, url, data);\n queryResult = new QueryResultQuads(await arrayifyStream(rdfStream));\n } catch {\n // Fallthrough to the next cases\n }\n if (contentType.includes('application/sparql-results+xml') || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.includes('application/sparql-results+json') || url.endsWith('.srj')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);\n }\n if (contentType.includes('text/tab-separated-values') || url.endsWith('.tsv')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlTsvResults(data);\n }\n\n if (!queryResult) {\n throw new Error(`Could not parse the query result with content type ${contentType} at ${url}`);\n }\n\n // Discover DAWG result sets\n if (queryResult.type === 'quads' && queryResult.value.length > 0 &&\n queryResult.value[0].predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' &&\n queryResult.value[0].object.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet') {\n return await TestCaseQueryEvaluationHandler.parseDawgResultSet(queryResult.value);\n }\n\n return queryResult;\n }\n\n /**\n * Parses query results in either SPARQL/JSON or SPARQL/XML query results syntax.\n * @param {string} type json or xml\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlResults(type: 'json' | 'xml', data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let booleanPromise: Promise<boolean>;\n let bindingsStream: NodeJS.ReadableStream;\n if (type === 'json') {\n const parser = new SparqlJsonParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseJsonBooleanStream(data);\n bindingsStream = parser.parseJsonResultsStream(data);\n } else {\n const parser = new SparqlXmlParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseXmlBooleanStream(data);\n bindingsStream = parser.parseXmlResultsStream(data);\n }\n const bindingsPromise: Promise<[RDF.Variable[], Record<string, RDF.Term>[]]> = Promise.all([\n new Promise<RDF.Variable[]>((resolve) => {\n bindingsStream\n .on('variables', resolve)\n .on('end', _ => resolve([]));\n }),\n arrayifyStream(bindingsStream),\n ]);\n\n // Parse both in parallel, and silence the errors\n let bindingsError: Error = null;\n let booleanError: Error = null;\n const parsingResults = await Promise.all([\n booleanPromise.catch((e): any => {\n booleanError = e;\n return null;\n }),\n bindingsPromise.catch((e): any => {\n bindingsError = e;\n return null;\n }),\n ]);\n\n if (!booleanError) {\n return new QueryResultBoolean(parsingResults[0]);\n }\n if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => `?${variable.value}`), parsingResults[1][1], false);\n }\n throw new Error(`Found no valid ASK or SELECT query.\\n${\n bindingsError.message}\\n${booleanError.message}`);\n }\n\n /**\n * Parses query results in the DAWG vocabulary.\n * https://www.w3.org/2001/sw/DataAccess/tests/test-dawg.n3\n * @param {Quad[]} quads An array of quads.\n * @return {Promise<IQueryResultBindings | IQueryResultBoolean>} A promise resolving to a bindings or boolean results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings | IQueryResultBoolean> {\n // Check for a boolean result (ASK query)\n if (quads[1] && quads[1].predicate.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#boolean') {\n return new QueryResultBoolean(quads[1].object.value === 'true');\n }\n\n // Construct resources for easier interpretation of the bindings\n const objectLoader = new RdfObjectLoader({\n context: {\n result: 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#',\n bindings: 'result:binding',\n index: 'result:index',\n resultVariables: 'result:resultVariable',\n solutions: 'result:solution',\n value: 'result:value',\n variable: 'result:variable',\n },\n });\n await objectLoader.importArray(quads);\n let resultSet: Resource = null;\n for (const resourceName in objectLoader.resources) {\n if (objectLoader.resources[resourceName]\n .isA(stringToTerm('http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet'))) {\n resultSet = objectLoader.resources[resourceName];\n break;\n }\n }\n\n if (!resultSet) {\n throw new Error(`No valid DAWG result set was found in ${quads}`);\n }\n\n // Get the variable names\n const variables: string[] = resultSet.properties.resultVariables\n .map((resource: Resource) => `?${resource.value}`);\n\n // Check if any binding has .index\n let checkOrder = false;\n const s = resultSet.properties.solutions;\n for (const solution of s) {\n if (solution.property.index) {\n checkOrder = true;\n break;\n }\n }\n\n // Ensure that the solutions are sorted by index\n const solutions = resultSet.properties.solutions;\n if (checkOrder) {\n solutions.sort((solution1: Resource, solution2: Resource) => Number.parseInt(solution1.property.index.value, 10) - Number.parseInt(solution2.property.index.value, 10));\n }\n\n // Collect the bindings as object\n const value: Record<string, RDF.Term>[] = solutions.map((solution: Resource) => solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings[`?${binding.property.variable.value}`] = binding.property.value.term;\n return bindings;\n }, {}));\n\n return new QueryResultBindings(variables, value, checkOrder);\n }\n\n /**\n * Parses query results from a SPARQL TSV stream.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlTsvResults(data: NodeJS.ReadableStream): Promise<IQueryResult> {\n const text: string = await stringifyStream(data);\n const lines = text.replace(/\\r?\\n$/u, '').split(/\\r?\\n/u);\n\n if (lines.length === 1) {\n const singleLine = lines[0].trim().toLowerCase();\n if (singleLine === 'true') {\n return new QueryResultBoolean(true);\n }\n if (singleLine === 'false') {\n return new QueryResultBoolean(false);\n }\n }\n\n const variables: string[] = [];\n\n if (lines[0].trim() !== '') {\n const rawVariables = lines[0].split('\\t');\n\n for (const raw of rawVariables) {\n const variable = raw.trim();\n\n if (variable === '') {\n throw new Error('Invalid TSV result: Empty column on the first row.');\n }\n\n if ((!variable.startsWith('?') && !variable.startsWith('$')) || variable.length < 2) {\n throw new Error(`Invalid TSV variable: ${variable}`);\n }\n\n if (variables.includes(variable)) {\n throw new Error(`Invalid TSV result: The variable ${variable} is declared twice.`);\n }\n\n variables.push(variable);\n }\n }\n\n const value: Record<string, RDF.Term>[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const fields = lines[i].split('\\t');\n\n const isZeroVariableResultRow = variables.length === 0 && fields.length === 1 && fields[0] === '';\n\n if (fields.length !== variables.length && !isZeroVariableResultRow) {\n throw new Error(`Invalid TSV row (Line ${i + 1}): expected ${variables.length} fields but found ${fields.length}.`);\n }\n\n const binding: Record<string, RDF.Term> = {};\n\n for (const [ j, variable ] of variables.entries()) {\n const field = fields[j].trim();\n\n if (field.length > 0) {\n try {\n binding[variable] = TestCaseQueryEvaluationHandler.parseTsvTerm(field);\n } catch (error: any) {\n throw new Error(\n `Failed to parse TSV value on Line ${i + 1}, Column '${variable}': ` +\n `Invalid Turtle syntax in \"${field}\".\\nOriginal error: ${error.message}`,\n );\n }\n }\n }\n value.push(binding);\n }\n\n return new QueryResultBindings(variables, value, false);\n }\n\n /**\n * Parse a single field from a SPARQL TSV result into an RDF term.\n * @param {string} term The TSV field value.\n * @return {RDF.Term} The corresponding RDF term.\n */\n public static parseTsvTerm(term: string): RDF.Term {\n if (/^[+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+)$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#decimal'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+|[0-9]+)[eE][+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#double'));\n }\n if (term === 'true' || term === 'false') {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#boolean'));\n }\n\n return stringToTtlTerm(term);\n }\n\n /**\n * Obtain all data links for the given query test action.\n * @param action A query test action.\n */\n public static getQueryDataLinks(action: Resource): IQueryDataLink[] {\n const queryDataLinks: IQueryDataLink[] = [];\n if (action.property.data) {\n queryDataLinks.push({\n dataUri: action.property.data.value,\n });\n }\n for (const graphData of action.properties.graphData) {\n if (graphData.property.graph) {\n queryDataLinks.push({\n dataUri: graphData.property.graph.value,\n dataGraph: DF.namedNode(graphData.property.label.value),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(graphData.value),\n });\n }\n }\n return queryDataLinks;\n }\n\n /**\n * Determine the quads for the given query data links.\n * @param queryDataLinks Links to query data.\n * @param options Fetch options.\n */\n public static async resolveQueryDataLinks(queryDataLinks: IQueryDataLink[], options?: IFetchOptions): Promise<RDF.Quad[]> {\n let queryData: RDF.Quad[] = [];\n for (const queryDataLink of queryDataLinks) {\n let queryDataThis: RDF.Quad[] = await arrayifyStream((await Util.fetchRdf(queryDataLink.dataUri, options))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map(quad => mapTerms(quad, (value: RDF.Term, key: QuadTermName) => key === 'graph' ? queryDataLink.dataGraph : value));\n }\n queryData = [ ...queryData, ...queryDataThis ];\n }\n return queryData;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseQueryEvaluation> {\n if (!resource.property.action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n if (!resource.property.result) {\n throw new Error(`Missing mf:result in ${resource}`);\n }\n const action = resource.property.action;\n if (!action.property.query) {\n throw new Error(`Missing qt:query in mf:action of ${resource}`);\n }\n\n // Determine links to data\n const queryDataLinks: IQueryDataLink[] = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);\n\n // Check for lax cardinality property\n let laxCardinality = false;\n if (resource.property.resultCardinality && resource.property.resultCardinality.value ===\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#LaxCardinality') {\n laxCardinality = true;\n }\n\n // Collect all query data\n const queryData: RDF.Quad[] = await TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);\n\n const queryResponse = await Util.fetchCached(resource.property.result.value, options);\n return new TestCaseQueryEvaluation(\n testCaseData,\n {\n baseIRI: action.property.query.value,\n queryDataLinks,\n laxCardinality,\n queryData,\n queryResult: await TestCaseQueryEvaluationHandler.parseQueryResult(\n Util.identifyContentType(queryResponse.url, queryResponse.headers),\n queryResponse.url,\n queryResponse.body,\n ),\n queryString: await stringifyStream((await Util.fetchCached(action.property.query.value, options)).body),\n resultSource: queryResponse,\n },\n );\n }\n}\n\nexport interface ITestCaseQueryEvaluationProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n queryResult: IQueryResult;\n laxCardinality: boolean;\n resultSource: IFetchResponse;\n queryDataLinks: IQueryDataLink[];\n}\n\nexport interface IQueryDataLink {\n dataUri: string;\n dataGraph?: RDF.NamedNode;\n}\n\nexport class TestCaseQueryEvaluation implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public readonly baseIRI: string;\n public readonly queryString: string;\n public readonly queryData: RDF.Quad[];\n public readonly queryResult: IQueryResult;\n public readonly laxCardinality: boolean;\n public readonly queryDataLinks: IQueryDataLink[];\n public readonly resultSource: IFetchResponse;\n\n constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps) {\n Object.assign(this, testCaseData);\n Object.assign(this, props);\n }\n\n public static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string {\n return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\\n ');\n }\n\n public async test(engine: IQueryEngine, injectArguments: any): Promise<void> {\n const result: IQueryResult = await engine.query(\n this.queryData,\n this.queryString,\n {\n baseIRI: this.baseIRI,\n checkOrder: this.queryResult.type === 'bindings' ?\n this.queryResult.checkOrder :\n false,\n ...injectArguments,\n },\n );\n if (!this.queryResult.equals(result, this.laxCardinality)) {\n throw new ErrorTest(`Invalid query evaluation\n\n Query:\\n\\n${this.queryString}\n\n Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}\n\n Result Source: ${this.resultSource.url}\n\n Expected: ${this.queryResult.toString()}\n\n Got: \\n ${result.toString()}\n`);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rdf-test-suite",
3
- "version": "2.3.2",
3
+ "version": "2.3.3",
4
4
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
5
5
  "description": "Executes the RDF and SPARQL test suites.",
6
6
  "typings": "index",