rdf-test-suite 2.1.3 → 2.1.5
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.
- package/bin/Runner.js +34 -1
- package/lib/IManifest.js +2 -2
- package/lib/IManifest.js.map +1 -1
- package/lib/TestSuiteRunner.js +36 -3
- package/lib/TestSuiteRunner.js.map +1 -1
- package/lib/Util.js.map +1 -1
- package/lib/testcase/rdfsyntax/TestCaseEval.js +1 -1
- package/lib/testcase/rdfsyntax/TestCaseEval.js.map +1 -1
- package/lib/testcase/rdfsyntax/TestCaseSyntax.js.map +1 -1
- package/lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf.js +1 -1
- package/lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf.js.map +1 -1
- package/lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdfNegative.js +1 -1
- package/lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdfNegative.js.map +1 -1
- package/lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative.d.ts +1 -1
- package/lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative.js.map +1 -1
- package/lib/testcase/sparql/QueryResultBindings.d.ts +1 -1
- package/lib/testcase/sparql/QueryResultBindings.js +4 -2
- package/lib/testcase/sparql/QueryResultBindings.js.map +1 -1
- package/lib/testcase/sparql/TestCaseQueryEvaluation.js +3 -3
- package/lib/testcase/sparql/TestCaseQueryEvaluation.js.map +1 -1
- package/package.json +10 -10
package/bin/Runner.js
CHANGED
|
@@ -1,10 +1,43 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
3
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
37
|
const fs_1 = require("fs");
|
|
5
38
|
const minimist = require("minimist");
|
|
6
39
|
const n3_1 = require("n3");
|
|
7
|
-
const Path = require("path");
|
|
40
|
+
const Path = __importStar(require("path"));
|
|
8
41
|
const TestSuiteRunner_1 = require("../lib/TestSuiteRunner");
|
|
9
42
|
// tslint:disable:no-console
|
|
10
43
|
// tslint:disable:no-var-requires
|
package/lib/IManifest.js
CHANGED
|
@@ -34,14 +34,14 @@ function manifestFromResource(testCaseHandlers, options, resource, objectLoader)
|
|
|
34
34
|
((resource.properties.include.length > 0 || !objectLoader)
|
|
35
35
|
? resource
|
|
36
36
|
: ((_b = (_a = objectLoader.resources) === null || _a === void 0 ? void 0 : _a[resource.value.slice(0, resource.value.lastIndexOf('.')).replace(/\/manifest$/, '#manifest')]) !== null && _b !== void 0 ? _b : resource))
|
|
37
|
-
.properties.include.map((includeList) => includeList.list.map(
|
|
37
|
+
.properties.include.map((includeList) => includeList.list.map(res => manifestFromResource(testCaseHandlers, options, res, objectLoader))))),
|
|
38
38
|
testEntries: (yield Promise.all([].concat.apply([],
|
|
39
39
|
// This is here because of the way the rdf-star test suite is published
|
|
40
40
|
// @see https://github.com/rubensworks/rdf-test-suite.js/pull/78/files#r1026326410
|
|
41
41
|
((resource.properties.entries.length > 0 || !objectLoader) ?
|
|
42
42
|
resource :
|
|
43
43
|
((_d = (_c = objectLoader.resources) === null || _c === void 0 ? void 0 : _c[resource.value.slice(0, resource.value.lastIndexOf('.')).replace(/\/manifest$/, '#manifest')]) !== null && _d !== void 0 ? _d : resource)).properties.entries.map((entryList) => (entryList.list || [entryList])
|
|
44
|
-
.map((
|
|
44
|
+
.map((res) => (0, ITestCase_1.testCaseFromResource)(testCaseHandlers, options, res, true))))))
|
|
45
45
|
.filter(v => v)
|
|
46
46
|
.flat(),
|
|
47
47
|
uri: resource.value,
|
package/lib/IManifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IManifest.js","sourceRoot":"","sources":["IManifest.ts"],"names":[],"mappings":";;;;;;;;;;;AAwBA,oDAkCC;AASD,8EAoBC;AAtFD,oDAAqE;AAErE,iCAA2C;AAc3C;;;;;;GAMG;AACH,SAAsB,oBAAoB,CAAC,gBAAmE,EACnE,OAAsB,EAAE,QAAkB,EAAE,YAA6B;;;QAClH,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAC3E,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YACrE,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,WAAI,CAAC,aAAa,CACzE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"IManifest.js","sourceRoot":"","sources":["IManifest.ts"],"names":[],"mappings":"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","sourcesContent":["import {RdfObjectLoader, Resource} from \"rdf-object\";\nimport {ITestCase, testCaseFromResource} from \"./testcase/ITestCase\";\nimport {ITestCaseHandler} from \"./testcase/ITestCaseHandler\";\nimport {IFetchOptions, Util} from \"./Util\";\n\n/**\n * A manifest data holder.\n */\nexport interface IManifest {\n uri: string;\n label?: string;\n comment?: string;\n subManifests?: IManifest[];\n testEntries?: ITestCase<any>[];\n specifications?: {[uri: string]: IManifest};\n}\n\n/**\n * Create a manifest object from a resource.\n * @param {{[uri: string]: ITestCaseHandler<ITestCase<any>>}} testCaseHandlers Handlers for constructing test cases.\n * @param {IFetchOptions} options The fetch options.\n * @param {Resource} resource A resource.\n * @return {Promise<IManifest>} A promise resolving to a manifest object.\n */\nexport async function manifestFromResource(testCaseHandlers: {[uri: string]: ITestCaseHandler<ITestCase<any>>},\n options: IFetchOptions, resource: Resource, objectLoader: RdfObjectLoader): Promise<IManifest> {\n return {\n comment: resource.property.comment ? resource.property.comment.value : null,\n label: resource.property.label ? resource.property.label.value : null,\n specifications: resource.property.specifications ? await Util.promiseValues<IManifest>(\n Object.assign.apply({}, <any> await Promise.all(\n resource.property.specifications.list\n .map((specificationResource: Resource) =>\n ({ [specificationResource.term.value]:\n manifestFromSpecificationResource(testCaseHandlers, options, specificationResource, objectLoader) }))))) : null,\n subManifests: await Promise.all<IManifest>([].concat.apply([],\n // This is here because of the way the rdf-star test suite is published\n // @see https://github.com/rubensworks/rdf-test-suite.js/pull/78/files#r1026326410\n <any> ((resource.properties.include.length > 0 || !objectLoader)\n ? resource\n : (objectLoader.resources?.[resource.value.slice(0, resource.value.lastIndexOf('.')).replace(/\\/manifest$/, '#manifest')] ?? resource)\n )\n .properties.include.map((includeList: Resource) =>\n includeList.list.map(res => manifestFromResource(testCaseHandlers, options, res, objectLoader))))),\n testEntries: (await Promise.all<ITestCase<any>>([].concat.apply([],\n // This is here because of the way the rdf-star test suite is published\n // @see https://github.com/rubensworks/rdf-test-suite.js/pull/78/files#r1026326410\n <any> (\n (resource.properties.entries.length > 0 || !objectLoader) ?\n resource :\n (objectLoader.resources?.[resource.value.slice(0, resource.value.lastIndexOf('.')).replace(/\\/manifest$/, '#manifest')] ?? resource)\n ).properties.entries.map(\n (entryList: Resource) => (entryList.list || [entryList])\n .map((res) => testCaseFromResource(testCaseHandlers, options, res, true))))))\n .filter(v => v)\n .flat(),\n uri: resource.value,\n };\n}\n\n/**\n * Create a manifest object from a specification resource.\n * @param {{[uri: string]: ITestCaseHandler<ITestCase<any>>}} testCaseHandlers Handlers for constructing test cases.\n * @param {IFetchOptions} options The fetch options.\n * @param {Resource} resource A resource.\n * @return {Promise<IManifest>} A promise resolving to a manifest object.\n */\nexport async function manifestFromSpecificationResource(testCaseHandlers: {[uri: string]:\n ITestCaseHandler<ITestCase<any>>},\n options: IFetchOptions,\n resource: Resource, objectLoader: RdfObjectLoader): Promise<IManifest> {\n if (resource.property.conformanceRequirements) {\n const subManifests = await Promise.all<IManifest>(resource.property.conformanceRequirements.list\n .map(resource => manifestFromResource(testCaseHandlers, options, resource, objectLoader)));\n return {\n comment: resource.property.comment ? resource.property.comment.value : null,\n label: resource.property.label ? resource.property.label.value : null,\n subManifests,\n uri: resource.value,\n };\n } else {\n return {\n comment: resource.property.comment ? resource.property.comment.value : null,\n label: resource.property.label ? resource.property.label.value : null,\n uri: resource.value,\n };\n }\n}\n"]}
|
package/lib/TestSuiteRunner.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
36
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
37
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -11,12 +44,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
45
|
exports.TestSuiteRunner = void 0;
|
|
13
46
|
const rdf_data_factory_1 = require("rdf-data-factory");
|
|
14
|
-
const LogSymbols = require("log-symbols");
|
|
47
|
+
const LogSymbols = __importStar(require("log-symbols"));
|
|
15
48
|
const ManifestLoader_1 = require("./ManifestLoader");
|
|
16
49
|
const Util_1 = require("./Util");
|
|
17
50
|
// tslint:disable:no-var-requires
|
|
18
51
|
const quad = require('rdf-quad');
|
|
19
|
-
const streamifyArray = require('streamify-array');
|
|
52
|
+
const streamifyArray = require('streamify-array').streamifyArray;
|
|
20
53
|
const DF = new rdf_data_factory_1.DataFactory();
|
|
21
54
|
/**
|
|
22
55
|
* TestSuiteRunner runs a certain test suite manifest.
|
|
@@ -106,7 +139,7 @@ class TestSuiteRunner {
|
|
|
106
139
|
}
|
|
107
140
|
catch (error) {
|
|
108
141
|
clearTimeout(timeout);
|
|
109
|
-
results.push({ test, ok: false, error, skipped: error.skipped });
|
|
142
|
+
results.push({ test, ok: false, error: error, skipped: error.skipped });
|
|
110
143
|
continue;
|
|
111
144
|
}
|
|
112
145
|
const timeEnd = process.hrtime(timeStart);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestSuiteRunner.js","sourceRoot":"","sources":["TestSuiteRunner.ts"],"names":[],"mappings":"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","sourcesContent":["import {DataFactory} from \"rdf-data-factory\";\nimport * as LogSymbols from \"log-symbols\";\nimport * as RDF from \"@rdfjs/types\";\nimport {IManifest} from \"./IManifest\";\nimport {ManifestLoader} from \"./ManifestLoader\";\nimport {ITestCase} from \"./testcase/ITestCase\";\nimport WriteStream = NodeJS.WriteStream;\nimport {Util} from \"./Util\";\nimport Timeout = NodeJS.Timeout;\n\n// tslint:disable:no-var-requires\nconst quad = require('rdf-quad');\nconst streamifyArray = require('streamify-array');\nconst DF = new DataFactory();\n\nexport interface ITestSuiteConfig {\n exitWithStatusCode0: boolean;\n explicitApproval?: boolean;\n runRejected?: boolean;\n outputFormat: string;\n timeOutDuration: number;\n customEngingeOptions: object;\n specification?: string;\n cachePath?: string;\n testRegex?: RegExp;\n skipRegex?: RegExp;\n urlToFileMapping?: string;\n}\n\n/**\n * TestSuiteRunner runs a certain test suite manifest.\n */\nexport class TestSuiteRunner {\n\n /**\n * Parse an URL to file mapping string.\n * @param {string} urlToFileMapping An URL to file mapping string\n * @return {{url: string; path: string}[]} A parsed URL to file mapping array.\n */\n public fromUrlToMappingString(urlToFileMapping?: string): { url: string, path: string }[] {\n const urlToFileMappings: { url: string, path: string }[] = [];\n if (urlToFileMapping) {\n const [ url, path ]: string[] = urlToFileMapping.split('~');\n urlToFileMappings.push({ url, path });\n }\n return urlToFileMappings;\n }\n\n /**\n * Run the manifest with the given URL.\n * @param {string} manifestUrl The URL of a manifest.\n * @param handler The handler to run the tests with.\n * @param {string} cachePath The base directory to cache files in. If falsy, then no cache will be used.\n * @param {string} specification An optional specification to scope the manifest tests by.\n * @param {RegExp} testRegex An optional regex to filter test IRIs by.\n * @param {any} injectArguments An optional set of arguments to pass to the handler.\n * @return {Promise<ITestResult[]>} A promise resolving to an array of test results.\n */\n public async runManifest(manifestUrl: string, handler: any, config: ITestSuiteConfig): Promise<ITestResult[]> {\n const { cachePath, specification, urlToFileMapping } = config;\n const urlToFileMappings = this.fromUrlToMappingString(urlToFileMapping);\n const manifest: IManifest = await new ManifestLoader().from(manifestUrl, { cachePath, urlToFileMappings });\n const results: ITestResult[] = [];\n\n // Only run the tests for the given specification if one was defined.\n if (specification) {\n if (!manifest.specifications || !manifest.specifications[specification]) {\n return [];\n }\n await this.runManifestConcrete(manifest.specifications[specification], handler, config, results);\n return results;\n }\n\n await this.runManifestConcrete(manifest, handler, config, results);\n return results;\n }\n\n /**\n * Run the given manifest.\n * @param {string} manifest A manifest.\n * @param handler The handler to run the tests with.\n * @param {RegExp} testRegex An optional regex to filter test IRIs by.\n * @param {any} injectArguments An optional set of arguments to pass to the handler.\n * @param {ITestResult[]} results An array to append the test results to\n * @return {Promise<void>} A promise resolving when the tests are finished.\n */\n public async runManifestConcrete(\n manifest: IManifest,\n handler: any,\n config: ITestSuiteConfig,\n results: ITestResult[],\n ) {\n // Execute all tests in this manifest\n if (manifest.testEntries) {\n for (const test of manifest.testEntries) {\n if ((!config.testRegex || config.testRegex.test(test.uri)) && !(config.skipRegex && config.skipRegex.test(test.uri)) ) {\n if (!config.runRejected && test.approval === 'http://www.w3.org/ns/rdftest#Rejected') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Rejected Test') });\n } else if (config.explicitApproval && test.approval !== 'http://www.w3.org/ns/rdftest#Approved') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Test not explicitly approved') });\n } else {\n let timeout: Timeout = null;\n const timeStart = process.hrtime();\n let testResultOverride: ITestResultOverride | undefined;\n try {\n await Promise.race([\n test.test(handler, config.customEngingeOptions)\n .then((result) => {\n if (result) {\n testResultOverride = result;\n }\n }),\n new Promise((res, rej) => {\n // global. is needed because TSC may otherwise pick the browser version of setTimeout, which returns int\n timeout = global.setTimeout(\n () => rej(new Error(`Test case '${test.uri}' timed out`)),\n config.timeOutDuration);\n },\n ),\n ]);\n } catch (error) {\n clearTimeout(timeout);\n results.push({ test, ok: false, error, skipped: error.skipped });\n continue;\n }\n const timeEnd = process.hrtime(timeStart);\n clearTimeout(timeout);\n results.push({ test, ok: true, duration: (timeEnd[0] * 1000) + (timeEnd[1] / 1000000), ...(testResultOverride || {}) });\n }\n }\n }\n }\n\n // Recursively handle all sub-manifests\n if (manifest.subManifests) {\n for (const subManifest of manifest.subManifests) {\n await (this.runManifestConcrete(subManifest, handler, config, results));\n }\n }\n }\n\n /**\n * Print the given test results to a text stream.\n * @param {WriteStream} stdout The output stream to write to.\n * @param {ITestResult[]} results An array of test results.\n * @param {boolean} compact If the results should be printed in compact-mode.\n */\n public resultsToText(stdout: WriteStream, results: ITestResult[], compact: boolean) {\n const failedTests: ITestResult[] = [];\n let success: number = 0;\n let skipped: number = 0;\n for (const result of results) {\n if (result.ok) {\n success++;\n stdout.write(`${LogSymbols.success} ${result.test.name} (${result.test.uri})${` ${Util.withColor(`${result.duration}ms`, Util.COLOR_GRAY)}`}\\n`);\n } else {\n if (result.skipped) {\n skipped++;\n stdout.write(`${LogSymbols.info} ${result.test.name} (${result.test.uri})\\n`);\n } else {\n failedTests.push(result);\n stdout.write(`${LogSymbols.error} ${result.test.name} (${result.test.uri})\\n`);\n }\n }\n }\n\n if (!compact) {\n for (const result of failedTests) {\n stdout.write(`\n${LogSymbols.error} ${Util.withColor(result.test.name, Util.COLOR_RED)}\n ${result.test.comment || ''}\n ${'test' in result.error ? result.error : result.error.stack}\n ${Util.withColor(`More info: ${result.test.uri}`, Util.COLOR_BLUE)}\n\n`);\n }\n }\n\n const skippedString = skipped ? ` (skipped ${skipped})` : '';\n success += skipped;\n if (success === results.length) {\n stdout.write(`${LogSymbols.success} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n } else {\n stdout.write(`${LogSymbols.error} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n }\n }\n\n /**\n * Convert test results to an RDF stream.\n * @param {ITestResult[]} results Test results.\n * @param {IEarlProperties} properties EARL properties.\n * @param {Date} testDate The date at which the tests were executed.\n * @return {Stream} An RDF stream of quads.\n */\n public resultsToEarl(results: ITestResult[], properties: IEarlProperties, testDate: Date): RDF.Stream {\n const p = require('./prefixes.json');\n const dateRaw = testDate.toISOString();\n const date = '\"' + dateRaw + '\"^^' + p.xsd + 'dateTime';\n const quads: RDF.Quad[] = [];\n\n // Describe report\n const report = properties.reportUri || '';\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(p.foaf + 'primaryTopic'), DF.namedNode(properties.applicationUri)));\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(p.dc + 'issued'), DF.literal(testDate.toISOString(),\n DF.namedNode(p.xsd + 'dateTime'))));\n for (const author of properties.authors) {\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(p.foaf + 'maker'), DF.namedNode(author.uri)));\n }\n\n // Describe application\n const app = properties.applicationUri;\n quads.push(quad(app, p.rdf + 'type', p.earl + 'Software'));\n quads.push(quad(app, p.rdf + 'type', p.earl + 'TestSubject'));\n quads.push(quad(app, p.rdf + 'type', p.doap + 'Project'));\n quads.push(quad(app, p.doap + 'name', '\"' + properties.applicationNameFull + '\"'));\n quads.push(quad(app, p.dc + 'title', '\"' + properties.applicationNameFull + '\"'));\n if (properties.version) {\n quads.push(quad(app, p.doap + 'release', '_:b_release'));\n quads.push(quad('_:b_release', p.doap + 'revision', '\"' + properties.version + '\"'));\n }\n quads.push(quad(app, p.doap + 'homepage', properties.applicationHomepageUrl));\n quads.push(quad(app, p.doap + 'license', properties.licenseUri));\n quads.push(quad(app, p.doap + 'programming-language', '\"JavaScript\"'));\n for (const spec of properties.specificationUris) {\n quads.push(quad(app, p.doap + 'implements', spec));\n }\n quads.push(quad(app, p.doap + 'category', 'http://dbpedia.org/resource/Resource_Description_Framework'));\n quads.push(quad(app, p.doap + 'download-page', 'https://npmjs.org/package/' + properties.applicationNameNpm));\n if (properties.applicationBugsUrl) {\n quads.push(quad(app, p.doap + 'bug-database', properties.applicationBugsUrl));\n }\n if (properties.applicationBlogUrl) {\n quads.push(quad(app, p.doap + 'blog', properties.applicationBlogUrl));\n }\n for (const author of properties.authors) {\n quads.push(quad(app, p.doap + 'developer', author.uri));\n quads.push(quad(app, p.doap + 'maintainer', author.uri));\n quads.push(quad(app, p.doap + 'documenter', author.uri));\n quads.push(quad(app, p.doap + 'maker', author.uri));\n quads.push(quad(app, p.dc + 'creator', author.uri));\n }\n quads.push(quad(app, p.dc + 'description', '\"' + properties.applicationDescription + '\"@en'));\n quads.push(quad(app, p.doap + 'description', '\"' + properties.applicationDescription + '\"@en'));\n\n // Describe authors\n for (const author of properties.authors) {\n quads.push(quad(author.uri, p.rdf + 'type', p.foaf + 'Person'));\n quads.push(quad(author.uri, p.rdf + 'type', p.earl + 'Assertor'));\n if (author.name) {\n quads.push(quad(author.uri, p.foaf + 'name', '\"' + author.name + '\"'));\n }\n if (author.homepage) {\n quads.push(quad(author.uri, p.foaf + 'homepage', author.homepage));\n }\n if (author.primaryTopic) {\n quads.push(quad(author.uri, p.foaf + 'primaryTopicOf', author.primaryTopic));\n }\n }\n\n // Describe test results\n let id = 0;\n for (const result of results) {\n const testUri = result.test.uri;\n quads.push(quad(testUri, p.rdf + 'type', p.earl + 'TestCriterion'));\n quads.push(quad(testUri, p.rdf + 'type', p.earl + 'TestCase'));\n quads.push(quad(testUri, p.dc + 'title', '\"' + result.test.name + '\"'));\n if (result.test.comment) {\n quads.push(quad(testUri, p.dc + 'description', '\"' + result.test.comment + '\"'));\n }\n quads.push(quad(testUri, p.earl + 'assertions', '_:assertions' + id));\n quads.push(quad('_:assertions' + id, p.rdf + 'first', '_:assertion' + id));\n quads.push(quad('_:assertions' + id, p.rdf + 'rest', p.rdf + 'nil'));\n quads.push(quad('_:assertion' + id, p.rdf + 'type', p.earl + 'Assertion'));\n for (const author of properties.authors) {\n quads.push(quad('_:assertion' + id, p.earl + 'assertedBy', author.uri));\n }\n quads.push(quad('_:assertion' + id, p.earl + 'test', testUri));\n quads.push(quad('_:assertion' + id, p.earl + 'subject', app));\n quads.push(quad('_:assertion' + id, p.earl + 'mode', p.earl + 'automatic'));\n quads.push(quad('_:assertion' + id, p.earl + 'result', '_:result' + id));\n quads.push(quad('_:result' + id, p.rdf + 'type', p.earl + 'TestResult'));\n quads.push(quad('_:result' + id, p.earl + 'outcome',\n p.earl + (result.ok ? 'passed' : result.skipped ? 'inapplicable' : 'failed')));\n quads.push(quad('_:result' + id, p.dc + 'date', date));\n id++;\n }\n\n return streamifyArray(quads);\n }\n\n /**\n * Create an {#link IEarlProperties} data object based on package.json contents.\n * @param packageJson Package.json contents.\n * @return {IEarlProperties} A data object.\n */\n public packageJsonToEarlProperties(packageJson: any): IEarlProperties {\n return {\n applicationBugsUrl: packageJson.bugs && packageJson.bugs.url ? packageJson.bugs.url : packageJson.bugs,\n applicationDescription: packageJson.description,\n applicationHomepageUrl: packageJson.homepage,\n applicationNameFull: packageJson.name,\n applicationNameNpm: packageJson.name,\n applicationUri: packageJson.name ? 'https://www.npmjs.com/package/' + packageJson.name + '/' : null,\n authors: [\n {\n homepage: null,\n name: packageJson.author,\n uri: 'https://www.npmjs.com/package/' + packageJson.name + '/#author',\n },\n ],\n licenseUri: packageJson.license ? Util.licenseToUri(packageJson.license) : null,\n reportUri: null,\n specificationUris: [],\n version: packageJson.version,\n };\n }\n}\n\nexport interface IEarlProperties {\n reportUri: string;\n authors: IAuthor[];\n licenseUri: string;\n applicationUri: string;\n applicationHomepageUrl: string;\n applicationBugsUrl?: string;\n applicationBlogUrl?: string;\n applicationNameFull: string;\n applicationNameNpm: string;\n applicationDescription: string;\n specificationUris: string[];\n version?: string;\n}\n\nexport interface IAuthor {\n uri: string;\n name?: string;\n homepage?: string;\n primaryTopic?: string;\n}\n\nexport interface ITestResult extends ITestResultOverride{\n test: ITestCase<any>;\n ok: boolean;\n error?: Error;\n skipped?: boolean;\n}\n\nexport interface ITestResultOverride {\n duration?: number; // In ms\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestSuiteRunner.js","sourceRoot":"","sources":["TestSuiteRunner.ts"],"names":[],"mappings":"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","sourcesContent":["import {DataFactory} from \"rdf-data-factory\";\nimport * as LogSymbols from \"log-symbols\";\nimport * as RDF from \"@rdfjs/types\";\nimport {IManifest} from \"./IManifest\";\nimport {ManifestLoader} from \"./ManifestLoader\";\nimport {ITestCase} from \"./testcase/ITestCase\";\nimport WriteStream = NodeJS.WriteStream;\nimport {Util} from \"./Util\";\nimport Timeout = NodeJS.Timeout;\n\n// tslint:disable:no-var-requires\nconst quad = require('rdf-quad');\nconst streamifyArray = require('streamify-array').streamifyArray;\nconst DF = new DataFactory();\n\nexport interface ITestSuiteConfig {\n exitWithStatusCode0: boolean;\n explicitApproval?: boolean;\n runRejected?: boolean;\n outputFormat: string;\n timeOutDuration: number;\n customEngingeOptions: object;\n specification?: string;\n cachePath?: string;\n testRegex?: RegExp;\n skipRegex?: RegExp;\n urlToFileMapping?: string;\n}\n\n/**\n * TestSuiteRunner runs a certain test suite manifest.\n */\nexport class TestSuiteRunner {\n\n /**\n * Parse an URL to file mapping string.\n * @param {string} urlToFileMapping An URL to file mapping string\n * @return {{url: string; path: string}[]} A parsed URL to file mapping array.\n */\n public fromUrlToMappingString(urlToFileMapping?: string): { url: string, path: string }[] {\n const urlToFileMappings: { url: string, path: string }[] = [];\n if (urlToFileMapping) {\n const [ url, path ]: string[] = urlToFileMapping.split('~');\n urlToFileMappings.push({ url, path });\n }\n return urlToFileMappings;\n }\n\n /**\n * Run the manifest with the given URL.\n * @param {string} manifestUrl The URL of a manifest.\n * @param handler The handler to run the tests with.\n * @param {string} cachePath The base directory to cache files in. If falsy, then no cache will be used.\n * @param {string} specification An optional specification to scope the manifest tests by.\n * @param {RegExp} testRegex An optional regex to filter test IRIs by.\n * @param {any} injectArguments An optional set of arguments to pass to the handler.\n * @return {Promise<ITestResult[]>} A promise resolving to an array of test results.\n */\n public async runManifest(manifestUrl: string, handler: any, config: ITestSuiteConfig): Promise<ITestResult[]> {\n const { cachePath, specification, urlToFileMapping } = config;\n const urlToFileMappings = this.fromUrlToMappingString(urlToFileMapping);\n const manifest: IManifest = await new ManifestLoader().from(manifestUrl, { cachePath, urlToFileMappings });\n const results: ITestResult[] = [];\n\n // Only run the tests for the given specification if one was defined.\n if (specification) {\n if (!manifest.specifications || !manifest.specifications[specification]) {\n return [];\n }\n await this.runManifestConcrete(manifest.specifications[specification], handler, config, results);\n return results;\n }\n\n await this.runManifestConcrete(manifest, handler, config, results);\n return results;\n }\n\n /**\n * Run the given manifest.\n * @param {string} manifest A manifest.\n * @param handler The handler to run the tests with.\n * @param {RegExp} testRegex An optional regex to filter test IRIs by.\n * @param {any} injectArguments An optional set of arguments to pass to the handler.\n * @param {ITestResult[]} results An array to append the test results to\n * @return {Promise<void>} A promise resolving when the tests are finished.\n */\n public async runManifestConcrete(\n manifest: IManifest,\n handler: any,\n config: ITestSuiteConfig,\n results: ITestResult[],\n ) {\n // Execute all tests in this manifest\n if (manifest.testEntries) {\n for (const test of manifest.testEntries) {\n if ((!config.testRegex || config.testRegex.test(test.uri)) && !(config.skipRegex && config.skipRegex.test(test.uri)) ) {\n if (!config.runRejected && test.approval === 'http://www.w3.org/ns/rdftest#Rejected') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Rejected Test') });\n } else if (config.explicitApproval && test.approval !== 'http://www.w3.org/ns/rdftest#Approved') {\n // Skip tests that are explicitly rejected\n results.push({ test, ok: false, skipped: true, error: new Error('Test not explicitly approved') });\n } else {\n let timeout: Timeout = null;\n const timeStart = process.hrtime();\n let testResultOverride: ITestResultOverride | undefined;\n try {\n await Promise.race([\n test.test(handler, config.customEngingeOptions)\n .then((result) => {\n if (result) {\n testResultOverride = result;\n }\n }),\n new Promise((res, rej) => {\n // global. is needed because TSC may otherwise pick the browser version of setTimeout, which returns int\n timeout = global.setTimeout(\n () => rej(new Error(`Test case '${test.uri}' timed out`)),\n config.timeOutDuration);\n },\n ),\n ]);\n } catch (error) {\n clearTimeout(timeout);\n results.push({ test, ok: false, error: <any> error, skipped: (<any> error).skipped });\n continue;\n }\n const timeEnd = process.hrtime(timeStart);\n clearTimeout(timeout);\n results.push({ test, ok: true, duration: (timeEnd[0] * 1000) + (timeEnd[1] / 1000000), ...(testResultOverride || {}) });\n }\n }\n }\n }\n\n // Recursively handle all sub-manifests\n if (manifest.subManifests) {\n for (const subManifest of manifest.subManifests) {\n await (this.runManifestConcrete(subManifest, handler, config, results));\n }\n }\n }\n\n /**\n * Print the given test results to a text stream.\n * @param {WriteStream} stdout The output stream to write to.\n * @param {ITestResult[]} results An array of test results.\n * @param {boolean} compact If the results should be printed in compact-mode.\n */\n public resultsToText(stdout: WriteStream, results: ITestResult[], compact: boolean) {\n const failedTests: ITestResult[] = [];\n let success: number = 0;\n let skipped: number = 0;\n for (const result of results) {\n if (result.ok) {\n success++;\n stdout.write(`${LogSymbols.success} ${result.test.name} (${result.test.uri})${` ${Util.withColor(`${result.duration}ms`, Util.COLOR_GRAY)}`}\\n`);\n } else {\n if (result.skipped) {\n skipped++;\n stdout.write(`${LogSymbols.info} ${result.test.name} (${result.test.uri})\\n`);\n } else {\n failedTests.push(result);\n stdout.write(`${LogSymbols.error} ${result.test.name} (${result.test.uri})\\n`);\n }\n }\n }\n\n if (!compact) {\n for (const result of failedTests) {\n stdout.write(`\n${LogSymbols.error} ${Util.withColor(result.test.name, Util.COLOR_RED)}\n ${result.test.comment || ''}\n ${'test' in result.error ? result.error : result.error.stack}\n ${Util.withColor(`More info: ${result.test.uri}`, Util.COLOR_BLUE)}\n\n`);\n }\n }\n\n const skippedString = skipped ? ` (skipped ${skipped})` : '';\n success += skipped;\n if (success === results.length) {\n stdout.write(`${LogSymbols.success} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n } else {\n stdout.write(`${LogSymbols.error} ${success} / ${results.length} tests succeeded!${skippedString}\\n`);\n }\n }\n\n /**\n * Convert test results to an RDF stream.\n * @param {ITestResult[]} results Test results.\n * @param {IEarlProperties} properties EARL properties.\n * @param {Date} testDate The date at which the tests were executed.\n * @return {Stream} An RDF stream of quads.\n */\n public resultsToEarl(results: ITestResult[], properties: IEarlProperties, testDate: Date): RDF.Stream {\n const p = require('./prefixes.json');\n const dateRaw = testDate.toISOString();\n const date = '\"' + dateRaw + '\"^^' + p.xsd + 'dateTime';\n const quads: RDF.Quad[] = [];\n\n // Describe report\n const report = properties.reportUri || '';\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(p.foaf + 'primaryTopic'), DF.namedNode(properties.applicationUri)));\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(p.dc + 'issued'), DF.literal(testDate.toISOString(),\n DF.namedNode(p.xsd + 'dateTime'))));\n for (const author of properties.authors) {\n quads.push(DF.quad(DF.namedNode(report), DF.namedNode(p.foaf + 'maker'), DF.namedNode(author.uri)));\n }\n\n // Describe application\n const app = properties.applicationUri;\n quads.push(quad(app, p.rdf + 'type', p.earl + 'Software'));\n quads.push(quad(app, p.rdf + 'type', p.earl + 'TestSubject'));\n quads.push(quad(app, p.rdf + 'type', p.doap + 'Project'));\n quads.push(quad(app, p.doap + 'name', '\"' + properties.applicationNameFull + '\"'));\n quads.push(quad(app, p.dc + 'title', '\"' + properties.applicationNameFull + '\"'));\n if (properties.version) {\n quads.push(quad(app, p.doap + 'release', '_:b_release'));\n quads.push(quad('_:b_release', p.doap + 'revision', '\"' + properties.version + '\"'));\n }\n quads.push(quad(app, p.doap + 'homepage', properties.applicationHomepageUrl));\n quads.push(quad(app, p.doap + 'license', properties.licenseUri));\n quads.push(quad(app, p.doap + 'programming-language', '\"JavaScript\"'));\n for (const spec of properties.specificationUris) {\n quads.push(quad(app, p.doap + 'implements', spec));\n }\n quads.push(quad(app, p.doap + 'category', 'http://dbpedia.org/resource/Resource_Description_Framework'));\n quads.push(quad(app, p.doap + 'download-page', 'https://npmjs.org/package/' + properties.applicationNameNpm));\n if (properties.applicationBugsUrl) {\n quads.push(quad(app, p.doap + 'bug-database', properties.applicationBugsUrl));\n }\n if (properties.applicationBlogUrl) {\n quads.push(quad(app, p.doap + 'blog', properties.applicationBlogUrl));\n }\n for (const author of properties.authors) {\n quads.push(quad(app, p.doap + 'developer', author.uri));\n quads.push(quad(app, p.doap + 'maintainer', author.uri));\n quads.push(quad(app, p.doap + 'documenter', author.uri));\n quads.push(quad(app, p.doap + 'maker', author.uri));\n quads.push(quad(app, p.dc + 'creator', author.uri));\n }\n quads.push(quad(app, p.dc + 'description', '\"' + properties.applicationDescription + '\"@en'));\n quads.push(quad(app, p.doap + 'description', '\"' + properties.applicationDescription + '\"@en'));\n\n // Describe authors\n for (const author of properties.authors) {\n quads.push(quad(author.uri, p.rdf + 'type', p.foaf + 'Person'));\n quads.push(quad(author.uri, p.rdf + 'type', p.earl + 'Assertor'));\n if (author.name) {\n quads.push(quad(author.uri, p.foaf + 'name', '\"' + author.name + '\"'));\n }\n if (author.homepage) {\n quads.push(quad(author.uri, p.foaf + 'homepage', author.homepage));\n }\n if (author.primaryTopic) {\n quads.push(quad(author.uri, p.foaf + 'primaryTopicOf', author.primaryTopic));\n }\n }\n\n // Describe test results\n let id = 0;\n for (const result of results) {\n const testUri = result.test.uri;\n quads.push(quad(testUri, p.rdf + 'type', p.earl + 'TestCriterion'));\n quads.push(quad(testUri, p.rdf + 'type', p.earl + 'TestCase'));\n quads.push(quad(testUri, p.dc + 'title', '\"' + result.test.name + '\"'));\n if (result.test.comment) {\n quads.push(quad(testUri, p.dc + 'description', '\"' + result.test.comment + '\"'));\n }\n quads.push(quad(testUri, p.earl + 'assertions', '_:assertions' + id));\n quads.push(quad('_:assertions' + id, p.rdf + 'first', '_:assertion' + id));\n quads.push(quad('_:assertions' + id, p.rdf + 'rest', p.rdf + 'nil'));\n quads.push(quad('_:assertion' + id, p.rdf + 'type', p.earl + 'Assertion'));\n for (const author of properties.authors) {\n quads.push(quad('_:assertion' + id, p.earl + 'assertedBy', author.uri));\n }\n quads.push(quad('_:assertion' + id, p.earl + 'test', testUri));\n quads.push(quad('_:assertion' + id, p.earl + 'subject', app));\n quads.push(quad('_:assertion' + id, p.earl + 'mode', p.earl + 'automatic'));\n quads.push(quad('_:assertion' + id, p.earl + 'result', '_:result' + id));\n quads.push(quad('_:result' + id, p.rdf + 'type', p.earl + 'TestResult'));\n quads.push(quad('_:result' + id, p.earl + 'outcome',\n p.earl + (result.ok ? 'passed' : result.skipped ? 'inapplicable' : 'failed')));\n quads.push(quad('_:result' + id, p.dc + 'date', date));\n id++;\n }\n\n return streamifyArray(quads);\n }\n\n /**\n * Create an {#link IEarlProperties} data object based on package.json contents.\n * @param packageJson Package.json contents.\n * @return {IEarlProperties} A data object.\n */\n public packageJsonToEarlProperties(packageJson: any): IEarlProperties {\n return {\n applicationBugsUrl: packageJson.bugs && packageJson.bugs.url ? packageJson.bugs.url : packageJson.bugs,\n applicationDescription: packageJson.description,\n applicationHomepageUrl: packageJson.homepage,\n applicationNameFull: packageJson.name,\n applicationNameNpm: packageJson.name,\n applicationUri: packageJson.name ? 'https://www.npmjs.com/package/' + packageJson.name + '/' : null,\n authors: [\n {\n homepage: null,\n name: packageJson.author,\n uri: 'https://www.npmjs.com/package/' + packageJson.name + '/#author',\n },\n ],\n licenseUri: packageJson.license ? Util.licenseToUri(packageJson.license) : null,\n reportUri: null,\n specificationUris: [],\n version: packageJson.version,\n };\n }\n}\n\nexport interface IEarlProperties {\n reportUri: string;\n authors: IAuthor[];\n licenseUri: string;\n applicationUri: string;\n applicationHomepageUrl: string;\n applicationBugsUrl?: string;\n applicationBlogUrl?: string;\n applicationNameFull: string;\n applicationNameNpm: string;\n applicationDescription: string;\n specificationUris: string[];\n version?: string;\n}\n\nexport interface IAuthor {\n uri: string;\n name?: string;\n homepage?: string;\n primaryTopic?: string;\n}\n\nexport interface ITestResult extends ITestResultOverride{\n test: ITestCase<any>;\n ok: boolean;\n error?: Error;\n skipped?: boolean;\n}\n\nexport interface ITestResultOverride {\n duration?: number; // In ms\n}\n"]}
|
package/lib/Util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Util.js","sourceRoot":"","sources":["Util.ts"],"names":[],"mappings":"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","sourcesContent":["import {createReadStream, createWriteStream, existsSync, readFileSync, writeFileSync} from \"fs\";\nimport {JsonLdParser} from \"jsonld-streaming-parser\";\nimport * as RDF from \"@rdfjs/types\";\nimport {RdfXmlParser} from \"rdfxml-streaming-parser\";\nimport {PassThrough} from \"stream\";\nimport {DocumentLoaderCached} from \"./DocumentLoaderCached\";\nimport {GeneralizedN3StreamParser} from \"./GeneralizedN3StreamParser\";\nimport {ReadableWebToNodeStream} from 'readable-web-to-node-stream';\n\n// tslint:disable-next-line:no-var-requires\nconst isStream = require('is-stream');\n\n/**\n * Utility functions\n */\nexport class Util {\n\n public static COLOR_RESET: string = '\\x1b[0m';\n public static COLOR_RED: string = '\\x1b[31m';\n public static COLOR_GREEN: string = '\\x1b[32m';\n public static COLOR_YELLOW: string = '\\x1b[33m';\n public static COLOR_BLUE: string = '\\x1b[34m';\n public static COLOR_MAGENTA: string = '\\x1b[35m';\n public static COLOR_CYAN: string = '\\x1b[36m';\n public static COLOR_GRAY: string = '\\x1b[90m';\n\n protected static readonly EXTENSION_TO_CONTENTTYPE: {[extension: string]: string} = {\n jsonld: 'application/ld+json',\n nq: 'application/n-quads',\n nt: 'application/n-triples',\n srj: 'application/sparql-results+json',\n srx: 'application/sparql-results+xml',\n ttl: 'text/turtle',\n };\n\n /**\n * Determine the content type of the given URL based on the headers.\n * @param {string} url The URL to get the content type from.\n * @param {Headers} headers The headers of the given URL.\n * @return {string} The content type.\n */\n public static identifyContentType(url: string, headers: Headers): string {\n const contentType = headers.get('Content-Type');\n return (contentType && contentType.indexOf('application/octet-stream') < 0 ? contentType : false)\n || Util.EXTENSION_TO_CONTENTTYPE[url.substr(url.lastIndexOf('\\.') + 1)]\n || 'unknown';\n }\n\n /**\n * Convert https to http\n * @param {string} url A URL.\n * @return {string} An http URL.\n */\n public static normalizeBaseUrl(url: string) {\n if (url.startsWith('https://')) {\n return url.replace('https', 'http');\n }\n return url;\n }\n\n /**\n * Fetch the given RDF document and parse it.\n * @param {string} url A URL.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Promise<[string , Stream]>} A promise resolving to a pair of a URL and a parsed RDF stream.\n */\n public static async fetchRdf(url: string, options: IFetchOptions = {}): Promise<[string, RDF.Stream]> {\n const response = await Util.fetchCached(url, options);\n const contentType = Util.identifyContentType(response.url, response.headers);\n return [response.url, Util.parseRdfRaw(contentType,\n options.normalizeUrl ? Util.normalizeBaseUrl(response.url) : response.url, response.body, options)];\n }\n\n /**\n * Parses RDF based on the content type.\n * @param {string} contentType The content type of the given text stream.\n * @param {string} baseIRI The base IRI of the stream.\n * @param {NodeJS.ReadableStream} data Text stream in a certain RDF serialization.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Stream} A parsed RDF stream.\n */\n public static parseRdfRaw(contentType: string, baseIRI: string,\n data: NodeJS.ReadableStream, options: IFetchOptions = {}): RDF.Stream {\n if (contentType.indexOf('application/x-turtle') >= 0\n || contentType.indexOf('text/turtle') >= 0\n || contentType.indexOf('application/n-triples') >= 0\n || contentType.indexOf('application/n-quads') >= 0\n || contentType.indexOf('application/trig') >= 0) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: contentType, }));\n }\n if (contentType.indexOf('application/rdf+xml') >= 0) {\n return data.pipe(new RdfXmlParser({ baseIRI }));\n }\n if (contentType.indexOf('application/ld+json') >= 0) {\n const documentLoader = new DocumentLoaderCached(options);\n return data.pipe(new JsonLdParser({ baseIRI, documentLoader }));\n }\n if (baseIRI.endsWith('.ttl')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'text/turtle', }));\n }\n if (baseIRI.endsWith('.trig')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'application/trig', }));\n }\n\n throw new Error(`Could not parse the RDF serialization ${contentType} on ${baseIRI}`);\n }\n\n /**\n * Fetch the given URL or retrieve it from a local file cache.\n * @param {string} url The URL to fetch.\n * @param {IFetchOptions} options Options for fetching.\n * @param {RequestInit} init Fetch init options.\n * @return {Promise<IFetchResponse>} A promise resolving to the response.\n */\n public static async fetchCached(url: string, options: IFetchOptions = {},\n init?: RequestInit): Promise<IFetchResponse> {\n // First check local file mappings\n if (options.urlToFileMappings) {\n for (const urlToFileMapping of options.urlToFileMappings) {\n if (url.startsWith(urlToFileMapping.url)) {\n let pathSuffix = url.substr(urlToFileMapping.url.length);\n\n // Remove hashes from path\n const hashPos = pathSuffix.indexOf('#');\n if (hashPos >= 0) {\n pathSuffix = pathSuffix.substr(0, hashPos);\n }\n\n // Resolve file path\n const filePath = urlToFileMapping.path + pathSuffix;\n if (!existsSync(filePath)) {\n throw new Error(`Could not find file ` + filePath);\n }\n return {\n body: createReadStream(filePath),\n headers: new Headers({}),\n url: urlToFileMapping.url + pathSuffix,\n };\n }\n }\n }\n\n const encodedUrl = encodeURIComponent(url);\n const cachePathLocal: string = options.cachePath && encodedUrl.length <= 255 ? options.cachePath + encodedUrl : null;\n if (cachePathLocal && existsSync(cachePathLocal)) {\n // Read from cache\n return {\n body: createReadStream(cachePathLocal),\n headers: new Headers(JSON.parse(readFileSync(cachePathLocal + '.headers', { encoding: 'utf8' }))),\n url: readFileSync(cachePathLocal + '.url', { encoding: 'utf8' }),\n };\n } else {\n // Do actual fetch\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(`Could not find ${url}`);\n }\n /* istanbul ignore next */\n const body: NodeJS.ReadableStream = isStream(response.body) || response.body === null ?\n <any> response.body :\n new ReadableWebToNodeStream(response.body);\n const body1 = body.pipe(new PassThrough());\n const body2 = body.pipe(new PassThrough());\n\n // Remove unneeded headers (copy to make sure the Headers object is not immutable)\n const headers = new Headers(response.headers);\n headers.delete('content-length');\n headers.delete('content-encoding');\n\n if (cachePathLocal) {\n // Save in cache\n const writeStream = createWriteStream(cachePathLocal, 'utf8');\n body1.pipe(writeStream);\n await new Promise((resolve) => setImmediate(resolve)); // To fix the problem of files being empty sometimes\n try {\n writeFileSync(cachePathLocal + '.url', response.url || url);\n const headersRaw: any = {};\n headers.forEach((value: string, key: string) => headersRaw[key] = value);\n writeFileSync(cachePathLocal + '.headers', JSON.stringify(headersRaw));\n } catch (error) {\n // Silently ignore errors if name is too long\n if (error.code === 'ENAMETOOLONG') {\n console.error(error.toString());\n } else {\n throw error;\n }\n }\n }\n\n return {\n body: body2,\n headers: headers,\n url: response.url || url,\n };\n }\n }\n\n /**\n * Resolve all values in a hash.\n * @param {{[p: string]: Promise<T>}} data A hash with promise values.\n * @return {Promise<{[p: string]: T}>} A hash with resolved promise values.\n */\n public static async promiseValues<T>(data: {[id: string]: Promise<T>}): Promise<{[id: string]: T}> {\n const newData: {[id: string]: T} = {};\n for (const key in data) {\n newData[key] = await data[key];\n }\n return newData;\n }\n\n /**\n * Convert a license string to a URI.\n * @param {string} license A license string.\n * @return {string} A license URI.\n */\n public static licenseToUri(license: string) {\n // TODO: make this more error-prone like here:\n // https://github.com/LinkedSoftwareDependencies/npm-extraction-server/blob/master/lib/npm/NpmContext.js#L151\n return 'http://opensource.org/licenses/' + license;\n }\n\n /**\n * Return a string in a given color\n * @param str The string that should be printed in\n * @param color A given color\n */\n public static withColor(str: any, color: string) {\n return `${color}${str}${Util.COLOR_RESET}`;\n }\n\n}\n\n/**\n * A fetch response.\n */\nexport interface IFetchResponse {\n body: NodeJS.ReadableStream;\n headers: Headers;\n url: string;\n}\n\nexport interface IFetchOptions {\n /**\n * The base directory to cache files in. If falsy, then no cache will be used.\n */\n cachePath?: string;\n /**\n * If the base URL should be converted from https to http.\n */\n normalizeUrl?: boolean;\n /**\n * URL to local path mapping.\n */\n urlToFileMappings?: { url: string, path: string }[];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Util.js","sourceRoot":"","sources":["Util.ts"],"names":[],"mappings":"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","sourcesContent":["import {createReadStream, createWriteStream, existsSync, readFileSync, writeFileSync} from \"fs\";\nimport {JsonLdParser} from \"jsonld-streaming-parser\";\nimport * as RDF from \"@rdfjs/types\";\nimport {RdfXmlParser} from \"rdfxml-streaming-parser\";\nimport {PassThrough} from \"stream\";\nimport {DocumentLoaderCached} from \"./DocumentLoaderCached\";\nimport {GeneralizedN3StreamParser} from \"./GeneralizedN3StreamParser\";\nimport {ReadableWebToNodeStream} from 'readable-web-to-node-stream';\n\n// tslint:disable-next-line:no-var-requires\nconst isStream = require('is-stream');\n\n/**\n * Utility functions\n */\nexport class Util {\n\n public static COLOR_RESET: string = '\\x1b[0m';\n public static COLOR_RED: string = '\\x1b[31m';\n public static COLOR_GREEN: string = '\\x1b[32m';\n public static COLOR_YELLOW: string = '\\x1b[33m';\n public static COLOR_BLUE: string = '\\x1b[34m';\n public static COLOR_MAGENTA: string = '\\x1b[35m';\n public static COLOR_CYAN: string = '\\x1b[36m';\n public static COLOR_GRAY: string = '\\x1b[90m';\n\n protected static readonly EXTENSION_TO_CONTENTTYPE: {[extension: string]: string} = {\n jsonld: 'application/ld+json',\n nq: 'application/n-quads',\n nt: 'application/n-triples',\n srj: 'application/sparql-results+json',\n srx: 'application/sparql-results+xml',\n ttl: 'text/turtle',\n };\n\n /**\n * Determine the content type of the given URL based on the headers.\n * @param {string} url The URL to get the content type from.\n * @param {Headers} headers The headers of the given URL.\n * @return {string} The content type.\n */\n public static identifyContentType(url: string, headers: Headers): string {\n const contentType = headers.get('Content-Type');\n return (contentType && contentType.indexOf('application/octet-stream') < 0 ? contentType : false)\n || Util.EXTENSION_TO_CONTENTTYPE[url.substr(url.lastIndexOf('\\.') + 1)]\n || 'unknown';\n }\n\n /**\n * Convert https to http\n * @param {string} url A URL.\n * @return {string} An http URL.\n */\n public static normalizeBaseUrl(url: string) {\n if (url.startsWith('https://')) {\n return url.replace('https', 'http');\n }\n return url;\n }\n\n /**\n * Fetch the given RDF document and parse it.\n * @param {string} url A URL.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Promise<[string , Stream]>} A promise resolving to a pair of a URL and a parsed RDF stream.\n */\n public static async fetchRdf(url: string, options: IFetchOptions = {}): Promise<[string, RDF.Stream]> {\n const response = await Util.fetchCached(url, options);\n const contentType = Util.identifyContentType(response.url, response.headers);\n return [response.url, Util.parseRdfRaw(contentType,\n options.normalizeUrl ? Util.normalizeBaseUrl(response.url) : response.url, response.body, options)];\n }\n\n /**\n * Parses RDF based on the content type.\n * @param {string} contentType The content type of the given text stream.\n * @param {string} baseIRI The base IRI of the stream.\n * @param {NodeJS.ReadableStream} data Text stream in a certain RDF serialization.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Stream} A parsed RDF stream.\n */\n public static parseRdfRaw(contentType: string, baseIRI: string,\n data: NodeJS.ReadableStream, options: IFetchOptions = {}): RDF.Stream {\n if (contentType.indexOf('application/x-turtle') >= 0\n || contentType.indexOf('text/turtle') >= 0\n || contentType.indexOf('application/n-triples') >= 0\n || contentType.indexOf('application/n-quads') >= 0\n || contentType.indexOf('application/trig') >= 0) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: contentType, }));\n }\n if (contentType.indexOf('application/rdf+xml') >= 0) {\n return data.pipe(new RdfXmlParser({ baseIRI }));\n }\n if (contentType.indexOf('application/ld+json') >= 0) {\n const documentLoader = new DocumentLoaderCached(options);\n return data.pipe(new JsonLdParser({ baseIRI, documentLoader }));\n }\n if (baseIRI.endsWith('.ttl')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'text/turtle', }));\n }\n if (baseIRI.endsWith('.trig')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'application/trig', }));\n }\n\n throw new Error(`Could not parse the RDF serialization ${contentType} on ${baseIRI}`);\n }\n\n /**\n * Fetch the given URL or retrieve it from a local file cache.\n * @param {string} url The URL to fetch.\n * @param {IFetchOptions} options Options for fetching.\n * @param {RequestInit} init Fetch init options.\n * @return {Promise<IFetchResponse>} A promise resolving to the response.\n */\n public static async fetchCached(url: string, options: IFetchOptions = {},\n init?: RequestInit): Promise<IFetchResponse> {\n // First check local file mappings\n if (options.urlToFileMappings) {\n for (const urlToFileMapping of options.urlToFileMappings) {\n if (url.startsWith(urlToFileMapping.url)) {\n let pathSuffix = url.substr(urlToFileMapping.url.length);\n\n // Remove hashes from path\n const hashPos = pathSuffix.indexOf('#');\n if (hashPos >= 0) {\n pathSuffix = pathSuffix.substr(0, hashPos);\n }\n\n // Resolve file path\n const filePath = urlToFileMapping.path + pathSuffix;\n if (!existsSync(filePath)) {\n throw new Error(`Could not find file ` + filePath);\n }\n return {\n body: createReadStream(filePath),\n headers: new Headers({}),\n url: urlToFileMapping.url + pathSuffix,\n };\n }\n }\n }\n\n const encodedUrl = encodeURIComponent(url);\n const cachePathLocal: string = options.cachePath && encodedUrl.length <= 255 ? options.cachePath + encodedUrl : null;\n if (cachePathLocal && existsSync(cachePathLocal)) {\n // Read from cache\n return {\n body: createReadStream(cachePathLocal),\n headers: new Headers(JSON.parse(readFileSync(cachePathLocal + '.headers', { encoding: 'utf8' }))),\n url: readFileSync(cachePathLocal + '.url', { encoding: 'utf8' }),\n };\n } else {\n // Do actual fetch\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(`Could not find ${url}`);\n }\n /* istanbul ignore next */\n const body: NodeJS.ReadableStream = isStream(response.body) || response.body === null ?\n <any> response.body :\n new ReadableWebToNodeStream(response.body);\n const body1 = body.pipe(new PassThrough());\n const body2 = body.pipe(new PassThrough());\n\n // Remove unneeded headers (copy to make sure the Headers object is not immutable)\n const headers = new Headers(response.headers);\n headers.delete('content-length');\n headers.delete('content-encoding');\n\n if (cachePathLocal) {\n // Save in cache\n const writeStream = createWriteStream(cachePathLocal, 'utf8');\n body1.pipe(writeStream);\n await new Promise((resolve) => setImmediate(resolve)); // To fix the problem of files being empty sometimes\n try {\n writeFileSync(cachePathLocal + '.url', response.url || url);\n const headersRaw: any = {};\n headers.forEach((value: string, key: string) => headersRaw[key] = value);\n writeFileSync(cachePathLocal + '.headers', JSON.stringify(headersRaw));\n } catch (error) {\n // Silently ignore errors if name is too long\n if ((<any> error).code === 'ENAMETOOLONG') {\n console.error(error.toString());\n } else {\n throw error;\n }\n }\n }\n\n return {\n body: body2,\n headers: headers,\n url: response.url || url,\n };\n }\n }\n\n /**\n * Resolve all values in a hash.\n * @param {{[p: string]: Promise<T>}} data A hash with promise values.\n * @return {Promise<{[p: string]: T}>} A hash with resolved promise values.\n */\n public static async promiseValues<T>(data: {[id: string]: Promise<T>}): Promise<{[id: string]: T}> {\n const newData: {[id: string]: T} = {};\n for (const key in data) {\n newData[key] = await data[key];\n }\n return newData;\n }\n\n /**\n * Convert a license string to a URI.\n * @param {string} license A license string.\n * @return {string} A license URI.\n */\n public static licenseToUri(license: string) {\n // TODO: make this more error-prone like here:\n // https://github.com/LinkedSoftwareDependencies/npm-extraction-server/blob/master/lib/npm/NpmContext.js#L151\n return 'http://opensource.org/licenses/' + license;\n }\n\n /**\n * Return a string in a given color\n * @param str The string that should be printed in\n * @param color A given color\n */\n public static withColor(str: any, color: string) {\n return `${color}${str}${Util.COLOR_RESET}`;\n }\n\n}\n\n/**\n * A fetch response.\n */\nexport interface IFetchResponse {\n body: NodeJS.ReadableStream;\n headers: Headers;\n url: string;\n}\n\nexport interface IFetchOptions {\n /**\n * The base directory to cache files in. If falsy, then no cache will be used.\n */\n cachePath?: string;\n /**\n * If the base URL should be converted from https to http.\n */\n normalizeUrl?: boolean;\n /**\n * URL to local path mapping.\n */\n urlToFileMappings?: { url: string, path: string }[];\n}\n"]}
|
|
@@ -32,7 +32,7 @@ class TestCaseEvalHandler {
|
|
|
32
32
|
if (!resource.property.result) {
|
|
33
33
|
throw new Error(`Missing mf:result in ${resource}`);
|
|
34
34
|
}
|
|
35
|
-
return new TestCaseEval(testCaseData, yield stringifyStream((yield Util_1.Util.fetchCached(resource.property.action.value, options)).body), yield (0, arrayify_stream_1.
|
|
35
|
+
return new TestCaseEval(testCaseData, yield stringifyStream((yield Util_1.Util.fetchCached(resource.property.action.value, options)).body), yield (0, arrayify_stream_1.arrayifyStream)((yield Util_1.Util.fetchRdf(resource.property.result.value, Object.assign(Object.assign({}, options), { normalizeUrl: this.shouldNormalizeUrl })))[1]), this.normalizeUrl(resource.property.action.value));
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
normalizeUrl(url) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseEval.js","sourceRoot":"","sources":["TestCaseEval.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAA0C;AAG1C,2CAA4C;AAC5C,+CAA0C;AAC1C,qCAA+C;AAK/C,
|
|
1
|
+
{"version":3,"file":"TestCaseEval.js","sourceRoot":"","sources":["TestCaseEval.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAA0C;AAG1C,2CAA4C;AAC5C,+CAA0C;AAC1C,qCAA+C;AAK/C,qDAAiD;AAEjD,iCAAiC;AACjC,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAa,mBAAmB;IAG9B,YAAY,OAAoC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,MAAK,IAAI,CAAC;IAC3D,CAAC;IAEY,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAC/C,OAAuB;;YACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,YAAY,CAAC,YAAY,EAClC,MAAM,eAAe,CAAC,CAAC,MAAM,WAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAC7F,MAAM,IAAA,gCAAc,EAAO,CAAC,MAAM,WAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,kCACxE,OAAO,KAAE,YAAY,EAAE,IAAI,CAAC,kBAAkB,IAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5D,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;KAAA;IAES,YAAY,CAAC,GAAW;QAChC,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,CAAC;CACF;AAzBD,kDAyBC;AAED,MAAa,YAAY;IAavB,YAAY,YAA2B,EAAE,IAAY,EAAE,QAAoB,EAAE,OAAe;QAZ5E,SAAI,GAAG,WAAW,CAAC;QAajC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEY,IAAI,CAAC,MAAe,EAAE,eAAoB;;YACrD,MAAM,KAAK,GAAe,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;YAC7F,IAAI,CAAC,IAAA,2BAAU,EAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,qBAAS,CAAC;WACf,IAAI,CAAC,IAAI;;cAEN,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,6BAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;;SAEpE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,6BAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;CAC/D,CAAC,CAAC;YACC,CAAC;QACH,CAAC;KAAA;CAEF;AAjCD,oCAiCC","sourcesContent":["import {isomorphic} from \"rdf-isomorphic\";\nimport * as RDF from \"@rdfjs/types\";\nimport {Resource} from \"rdf-object\";\nimport {quadToStringQuad} from \"rdf-string\";\nimport {ErrorTest} from \"../../ErrorTest\";\nimport {IFetchOptions, Util} from \"../../Util\";\nimport {ITestCaseData} from \"../ITestCase\";\nimport {ITestCaseHandler} from \"../ITestCaseHandler\";\nimport {IParser} from \"./IParser\";\nimport {ITestCaseRdfSyntax} from \"./ITestCaseRdfSyntax\";\nimport { arrayifyStream } from \"arrayify-stream\";\n\n// tslint:disable:no-var-requires\nconst stringifyStream = require('stream-to-string');\n\n/**\n * Test case handler for testing if two RDF serialization are isomorphic.\n */\nexport class TestCaseEvalHandler implements ITestCaseHandler<TestCaseEval> {\n private shouldNormalizeUrl: boolean;\n\n constructor(options?: { normalizeUrl?: boolean }) {\n this.shouldNormalizeUrl = options?.normalizeUrl === true;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<TestCaseEval> {\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 return new TestCaseEval(testCaseData,\n await stringifyStream((await Util.fetchCached(resource.property.action.value, options)).body),\n await arrayifyStream(<any> (await Util.fetchRdf(resource.property.result.value,\n {...options, normalizeUrl: this.shouldNormalizeUrl }))[1]),\n this.normalizeUrl(resource.property.action.value));\n }\n\n protected normalizeUrl(url: string) {\n return this.shouldNormalizeUrl ? Util.normalizeBaseUrl(url) : url;\n }\n}\n\nexport class TestCaseEval implements ITestCaseRdfSyntax {\n public readonly type = \"rdfsyntax\";\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 data: string;\n public readonly expected: RDF.Quad[];\n public readonly baseIRI: string;\n\n constructor(testCaseData: ITestCaseData, data: string, expected: RDF.Quad[], baseIRI: string) {\n Object.assign(this, testCaseData);\n this.data = data;\n this.expected = expected;\n this.baseIRI = baseIRI;\n }\n\n public async test(parser: IParser, injectArguments: any): Promise<void> {\n const quads: RDF.Quad[] = await parser.parse(this.data, this.baseIRI, injectArguments, this);\n if (!isomorphic(quads, this.expected)) {\n throw new ErrorTest(`Invalid data parsing\n Input: ${this.data}\n\n Expected: ${JSON.stringify(this.expected.map(quadToStringQuad), null, ' ')}\n\n Got: ${JSON.stringify(quads.map(quadToStringQuad), null, ' ')}\n`);\n }\n }\n\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseSyntax.js","sourceRoot":"","sources":["TestCaseSyntax.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,+CAA0C;AAC1C,qCAA+C;AAK/C,2CAA2C;AAC3C,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAa,qBAAqB;IAIhC,YAAY,aAAsB;QAChC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAEY,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAC/C,OAAuB;;YACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EACnE,MAAM,eAAe,CAAC,CAAC,MAAM,WAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAC7F,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;KAAA;IAES,gBAAgB;QACxB,OAAO,cAAc,CAAC;IACxB,CAAC;IAES,YAAY,CAAC,GAAW;QAChC,OAAO,WAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;CAEF;AA1BD,sDA0BC;AAED,MAAa,cAAc;IAazB,YAAY,YAA2B,EAAE,WAAoB,EAAE,IAAY,EAAE,OAAe;QAZ5E,SAAI,GAAG,WAAW,CAAC;QAajC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEY,IAAI,CAAC,MAAe,EAAE,eAAoB;;YACrD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,
|
|
1
|
+
{"version":3,"file":"TestCaseSyntax.js","sourceRoot":"","sources":["TestCaseSyntax.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,+CAA0C;AAC1C,qCAA+C;AAK/C,2CAA2C;AAC3C,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAa,qBAAqB;IAIhC,YAAY,aAAsB;QAChC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAEY,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAC/C,OAAuB;;YACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EACnE,MAAM,eAAe,CAAC,CAAC,MAAM,WAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAC7F,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;KAAA;IAES,gBAAgB;QACxB,OAAO,cAAc,CAAC;IACxB,CAAC;IAES,YAAY,CAAC,GAAW;QAChC,OAAO,WAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;CAEF;AA1BD,sDA0BC;AAED,MAAa,cAAc;IAazB,YAAY,YAA2B,EAAE,WAAoB,EAAE,IAAY,EAAE,OAAe;QAZ5E,SAAI,GAAG,WAAW,CAAC;QAajC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEY,IAAI,CAAC,MAAe,EAAE,eAAoB;;YACrD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAW,CAAE,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,CAAC,CAAC;gBACV,CAAC;gBAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,MAAM,IAAI,qBAAS,CAAC;WACjB,IAAI,CAAC,IAAI;WACT,CAAC;CACX,CAAC,CAAC;gBACG,CAAC;gBAED,IAAI,CAAC,aAAa,CAAS,CAAC,EAAE,eAAe,CAAC,CAAC;gBAE/C,OAAO;YACT,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,IAAI,qBAAS,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE;WACxC,IAAI,CAAC,IAAI;CACnB,CAAC,CAAC;YACC,CAAC;QACH,CAAC;KAAA;IAEM,aAAa,CAAC,KAAY,EAAE,eAAoB;QACrD,cAAc;IAChB,CAAC;IAEM,eAAe;QACpB,OAAO,0CAA0C,CAAC;IACpD,CAAC;CACF;AArDD,wCAqDC","sourcesContent":["import {Resource} from \"rdf-object\";\nimport {ErrorTest} from \"../../ErrorTest\";\nimport {IFetchOptions, Util} from \"../../Util\";\nimport {ITestCaseData} from \"../ITestCase\";\nimport {ITestCaseHandler} from \"../ITestCaseHandler\";\nimport {IParser} from \"./IParser\";\nimport {ITestCaseRdfSyntax} from \"./ITestCaseRdfSyntax\";\n// tslint:disable-next-line:no-var-requires\nconst stringifyStream = require('stream-to-string');\n\n/**\n * Test case handler for checking if a syntax is valid or not.\n */\nexport class TestCaseSyntaxHandler implements ITestCaseHandler<TestCaseSyntax> {\n\n private readonly expectNoError: boolean;\n\n constructor(expectNoError: boolean) {\n this.expectNoError = expectNoError;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<TestCaseSyntax> {\n if (!resource.property.action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n return new (this.getTestCaseClass())(testCaseData, this.expectNoError,\n await stringifyStream((await Util.fetchCached(resource.property.action.value, options)).body),\n this.normalizeUrl(resource.property.action.value));\n }\n\n protected getTestCaseClass(): any {\n return TestCaseSyntax;\n }\n\n protected normalizeUrl(url: string) {\n return Util.normalizeBaseUrl(url);\n }\n\n}\n\nexport class TestCaseSyntax implements ITestCaseRdfSyntax {\n public readonly type = \"rdfsyntax\";\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 expectNoError: boolean;\n public readonly data: string;\n public readonly baseIRI: string;\n\n constructor(testCaseData: ITestCaseData, expectError: boolean, data: string, baseIRI: string) {\n Object.assign(this, testCaseData);\n this.expectNoError = expectError;\n this.data = data;\n this.baseIRI = baseIRI;\n }\n\n public async test(parser: IParser, injectArguments: any): Promise<void> {\n try {\n await parser.parse(this.data, this.baseIRI, injectArguments, this);\n } catch (e) {\n if ((<any> e).skipped) {\n throw e;\n }\n\n if (this.expectNoError) {\n throw new ErrorTest(`Expected not throw an error when parsing.\n Input: ${this.data}\n Error: ${e}\n`);\n }\n\n this.validateError(<Error> e, injectArguments);\n\n return;\n }\n if (!this.expectNoError) {\n throw new ErrorTest(`${this.getErrorMessage()}\n Input: ${this.data}\n`);\n }\n }\n\n public validateError(error: Error, injectArguments: any) {\n // Overridable\n }\n\n public getErrorMessage() {\n return 'Expected to throw an error when parsing.';\n }\n}\n"]}
|
|
@@ -34,7 +34,7 @@ class TestCaseJsonLdFromRdfHandler {
|
|
|
34
34
|
if (!resource.property.result) {
|
|
35
35
|
throw new Error(`Missing mf:result in ${resource}`);
|
|
36
36
|
}
|
|
37
|
-
return new TestCaseJsonLdFromRdf(testCaseData, yield (0, arrayify_stream_1.
|
|
37
|
+
return new TestCaseJsonLdFromRdf(testCaseData, yield (0, arrayify_stream_1.arrayifyStream)((yield Util_1.Util.fetchRdf(resource.property.action.value, Object.assign(Object.assign({}, options), { normalizeUrl: true })))[1]), yield stringifyStream((yield Util_1.Util.fetchCached(resource.property.result.value, options)).body), resource.property.action.value, Object.assign(Object.assign({}, options), { normalizeUrl: true }));
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
resourceToTestCase(resource, testCaseData, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseJsonLdFromRdf.js","sourceRoot":"","sources":["TestCaseJsonLdFromRdf.ts"],"names":[],"mappings":";;;;;;;;;;;;AAqFA,8CA2CC;AAED,kCAEC;AAlID,2CAA4C;AAC5C,wCAAkD;AAKlD,+DAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"TestCaseJsonLdFromRdf.js","sourceRoot":"","sources":["TestCaseJsonLdFromRdf.ts"],"names":[],"mappings":";;;;;;;;;;;;AAqFA,8CA2CC;AAED,kCAEC;AAlID,2CAA4C;AAC5C,wCAAkD;AAKlD,+DAAiE;AACjE,qDAAiD;AAEjD,iCAAiC;AACjC,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,MAAa,4BAA4B;IAE1B,uBAAuB,CAAC,QAAkB,EAAE,YAA2B,EAC/C,OAAuB;;YAC1D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,qBAAqB,CAAC,YAAY,EAC3C,MAAM,IAAA,gCAAc,EAAO,CAAC,MAAM,WAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,kCACxE,OAAO,KAAE,YAAY,EAAE,IAAI,IAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EACxC,MAAM,eAAe,CAAC,CAAC,MAAM,WAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAC7F,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,kCAAM,OAAO,KAAE,YAAY,EAAE,IAAI,IAAE,CAAC;QACtE,CAAC;KAAA;IAEY,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAC/C,OAAuB;;YACrD,OAAO,gDAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACnH,CAAC;KAAA;CAEF;AAtBD,oEAsBC;AAED,MAAa,qBAAqB;IAchC,YAAY,YAA2B,EAAE,IAAgB,EAAE,QAAgB,EAAE,OAAe,EAAE,OAAY;QAb1F,SAAI,GAAG,eAAe,CAAC;QAcrC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEY,IAAI,CAAC,UAAuB,EAAE,eAAoB;;YAC7D,MAAM,UAAU,GAAW,MAAM,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,kCACtE,IAAI,CAAC,OAAO,GAAK,eAAe,EAAG,CAAC;YAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC1E,MAAM,IAAI,KAAK,CAAC;;MAEhB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,6BAAgB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;;cAEvE,IAAI,CAAC,QAAQ;;SAElB,UAAU;CAClB,CAAC,CAAC;YACC,CAAC;QACH,CAAC;KAAA;CAEF;AArCD,sDAqCC;AAED,uBAAuB;AACvB,SAAgB,iBAAiB,CAAC,IAAS,EAAE,IAAS,EAAE,UAAqC;IAC3F,OAAO,EAAE,KAAK;IACd,gBAAgB,EAAE,KAAK;CACxB,EAAE,SAAkB;IACnB,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5F,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,gCAAgC;QAChC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,KAAK,QAAQ;gBACX,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;oBACpF,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,mCAAmC;gBACnC,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;uBACpD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7D,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,iBAAiB;YACjB;gBACE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxB,OAAO,KAAK,CAAC;gBACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,WAAW,CAAC,IAAS,EAAE,IAAS;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,CAAC","sourcesContent":["import * as RDF from \"@rdfjs/types\";\nimport {Resource} from \"rdf-object\";\nimport {quadToStringQuad} from \"rdf-string\";\nimport {IFetchOptions, Util} from \"../../../Util\";\nimport {ITestCaseData} from \"../../ITestCase\";\nimport {ITestCaseHandler} from \"../../ITestCaseHandler\";\nimport {ISerializer} from \"../ISerializer\";\nimport {ITestCaseFromRdfSyntax} from \"../ITestCaseFromRdfSyntax\";\nimport {TestCaseJsonLdToRdfHandler} from \"./TestCaseJsonLdToRdf\";\nimport { arrayifyStream } from \"arrayify-stream\";\n\n// tslint:disable:no-var-requires\nconst stringifyStream = require('stream-to-string');\n\n/**\n * Test case handler for:\n * * https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest\n * * https://w3c.github.io/json-ld-api/tests/vocab#PositiveEvaluationTest\n *\n * It will check if the serialization from RDF to JSON-LD matches with the expected JSON-LD document.\n */\nexport class TestCaseJsonLdFromRdfHandler implements ITestCaseHandler<TestCaseJsonLdFromRdf> {\n\n public async resourceToTestCaseInner(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<TestCaseJsonLdFromRdf> {\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 return new TestCaseJsonLdFromRdf(testCaseData,\n await arrayifyStream(<any> (await Util.fetchRdf(resource.property.action.value,\n {...options, normalizeUrl: true}))[1]),\n await stringifyStream((await Util.fetchCached(resource.property.result.value, options)).body),\n resource.property.action.value, {...options, normalizeUrl: true});\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<TestCaseJsonLdFromRdf> {\n return TestCaseJsonLdToRdfHandler.wrap(this.resourceToTestCaseInner.bind(this), resource, testCaseData, options);\n }\n\n}\n\nexport class TestCaseJsonLdFromRdf implements ITestCaseFromRdfSyntax {\n public readonly type = \"fromrdfsyntax\";\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 data: RDF.Quad[];\n public readonly expected: string;\n public readonly baseIRI: string;\n public readonly options: any;\n\n constructor(testCaseData: ITestCaseData, data: RDF.Quad[], expected: string, baseIRI: string, options: any) {\n Object.assign(this, testCaseData);\n this.data = data;\n this.expected = expected;\n this.baseIRI = baseIRI;\n this.options = options;\n }\n\n public async test(serializer: ISerializer, injectArguments: any): Promise<void> {\n const serialized: string = await serializer.serialize(this.data, this.baseIRI,\n { ...this.options, ...injectArguments });\n if (!objectsIsomorphic(JSON.parse(serialized), JSON.parse(this.expected))) {\n throw new Error(`Invalid data serialization\n Input:\n ${this.data.map((quad) => JSON.stringify(quadToStringQuad(quad))).join(',\\n ')}\n\n Expected: ${this.expected}\n\n Got: ${serialized}\n`);\n }\n }\n\n}\n\n// tslint:disable:align\nexport function objectsIsomorphic(obj1: any, obj2: any, options: IObjectsIsomorphicOptions = {\n ordered: false,\n strictBlankNodes: false,\n}, parentKey?: string) {\n if (parentKey !== '@list' && !options.ordered && Array.isArray(obj1) && Array.isArray(obj2)) {\n obj1 = obj1.sort(arraySorter);\n obj2 = obj2.sort(arraySorter);\n }\n\n // Loop through properties in object 1\n for (const p in obj1) {\n // Check property exists on obj2\n if (!(p in obj2)) {\n return false;\n }\n\n switch (typeof (obj1[p])) {\n case 'object':\n if (typeof obj2[p] !== 'object' || !objectsIsomorphic(obj1[p], obj2[p], options, p)) {\n return false;\n }\n break;\n case 'string':\n // Don't match blank nodes strictly\n if (!options.strictBlankNodes && obj1[p].startsWith('_:')\n && typeof obj2[p] === 'string' && obj2[p].startsWith('_:')) {\n return true;\n }\n // Compare values\n default:\n if (obj1[p] !== obj2[p]) {\n return false;\n }\n }\n }\n\n // Check object 2 for any extra properties\n for (const p in obj2) {\n if (!(p in obj1)) {\n return false;\n }\n }\n return true;\n}\n\nexport function arraySorter(obj1: any, obj2: any): number {\n return JSON.stringify(obj1).localeCompare(JSON.stringify(obj2));\n}\n\nexport interface IObjectsIsomorphicOptions {\n ordered?: boolean;\n strictBlankNodes?: boolean;\n}\n"]}
|
|
@@ -29,7 +29,7 @@ class TestCaseJsonLdFromRdfNegativeHandler {
|
|
|
29
29
|
if (!resource.property.result) {
|
|
30
30
|
throw new Error(`Missing mf:result in ${resource}`);
|
|
31
31
|
}
|
|
32
|
-
return new TestCaseJsonLdFromRdfHandlerNegative(testCaseData, resource.property.result.value, yield (0, arrayify_stream_1.
|
|
32
|
+
return new TestCaseJsonLdFromRdfHandlerNegative(testCaseData, resource.property.result.value, yield (0, arrayify_stream_1.arrayifyStream)((yield Util_1.Util.fetchRdf(resource.property.action.value, Object.assign(Object.assign({}, options), { normalizeUrl: true })))[1]), resource.property.action.value, Object.assign(Object.assign({}, options), { normalizeUrl: true }));
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
35
|
resourceToTestCase(resource, testCaseData, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseJsonLdFromRdfNegative.js","sourceRoot":"","sources":["TestCaseJsonLdFromRdfNegative.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,2CAA4C;AAC5C,kDAA6C;AAC7C,wCAAkD;AAKlD,+DAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"TestCaseJsonLdFromRdfNegative.js","sourceRoot":"","sources":["TestCaseJsonLdFromRdfNegative.ts"],"names":[],"mappings":"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","sourcesContent":["import * as RDF from \"@rdfjs/types\";\nimport {Resource} from \"rdf-object\";\nimport {quadToStringQuad} from \"rdf-string\";\nimport {ErrorTest} from \"../../../ErrorTest\";\nimport {IFetchOptions, Util} from \"../../../Util\";\nimport {ITestCaseData} from \"../../ITestCase\";\nimport {ITestCaseHandler} from \"../../ITestCaseHandler\";\nimport {ISerializer} from \"../ISerializer\";\nimport {ITestCaseFromRdfSyntax} from \"../ITestCaseFromRdfSyntax\";\nimport {TestCaseJsonLdToRdfHandler} from \"./TestCaseJsonLdToRdf\";\nimport { arrayifyStream } from \"arrayify-stream\";\n\n/**\n * Test case handler for:\n * * https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest\n * * https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest\n */\nexport class TestCaseJsonLdFromRdfNegativeHandler implements ITestCaseHandler<TestCaseJsonLdFromRdfHandlerNegative> {\n\n public async resourceToTestCaseInner(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<TestCaseJsonLdFromRdfHandlerNegative> {\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 return new TestCaseJsonLdFromRdfHandlerNegative(\n testCaseData,\n resource.property.result.value,\n await arrayifyStream(<any> (await Util.fetchRdf(resource.property.action.value,\n {...options, normalizeUrl: true}))[1]),\n resource.property.action.value,\n {...options, normalizeUrl: true},\n );\n }\n\n public resourceToTestCase(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<TestCaseJsonLdFromRdfHandlerNegative> {\n return TestCaseJsonLdToRdfHandler.wrap(this.resourceToTestCaseInner.bind(this), resource, testCaseData, options);\n }\n\n}\n\nexport class TestCaseJsonLdFromRdfHandlerNegative implements ITestCaseFromRdfSyntax {\n public readonly type = \"fromrdfsyntax\";\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 data: RDF.Quad[];\n public readonly expectErrorCode: string;\n public readonly baseIRI: string;\n public readonly options: any;\n\n constructor(testCaseData: ITestCaseData, expectErrorCode: string, data: RDF.Quad[], baseIRI: string, options: any) {\n Object.assign(this, testCaseData);\n this.data = data;\n this.expectErrorCode = expectErrorCode;\n this.baseIRI = baseIRI;\n this.options = options;\n }\n\n public async test(serializer: ISerializer, injectArguments: any): Promise<void> {\n try {\n await serializer.serialize(this.data, this.baseIRI, {...this.options, ...injectArguments});\n } catch (e) {\n if ((<any> e).skipped) {\n throw e;\n }\n\n this.validateError((<Error> e), injectArguments);\n\n return;\n }\n throw new ErrorTest(`${this.getErrorMessage()}\n Input:\n ${this.data.map((quad) => JSON.stringify(quadToStringQuad(quad))).join(',\\n ')}\n`);\n }\n\n public validateError(error: Error, injectArguments: any) {\n if ((<any> error).code !== this.expectErrorCode) {\n throw new Error('Received invalid error code, expected ' + this.expectErrorCode\n + ', but got ' + (<any> error).code + ' (' + error.message + ')');\n }\n }\n\n public getErrorMessage() {\n return `Expected to throw an error with code '${this.expectErrorCode}' when parsing.`;\n }\n\n}\n"]}
|
|
@@ -9,7 +9,7 @@ import { TestCaseSyntax, TestCaseSyntaxHandler } from "../TestCaseSyntax";
|
|
|
9
9
|
*/
|
|
10
10
|
export declare class TestCaseJsonLdToRdfNegativeHandler extends TestCaseSyntaxHandler {
|
|
11
11
|
constructor();
|
|
12
|
-
resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<
|
|
12
|
+
resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseSyntax>;
|
|
13
13
|
protected normalizeUrl(url: string): string;
|
|
14
14
|
protected getTestCaseClass(): any;
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseJsonLdToRdfNegative.js","sourceRoot":"","sources":["TestCaseJsonLdToRdfNegative.ts"],"names":[],"mappings":";;;AAGA,sDAAwE;AACxE,+DAAiE;AAEjE;;;;GAIG;AACH,MAAa,kCAAmC,SAAQ,sCAAqB;IAE3E;QACE,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEM,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAC/C,OAAuB;QAC/C,OAAO,gDAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC/G,CAAC;IAES,YAAY,CAAC,GAAW;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAES,gBAAgB;QACxB,OAAO,kCAAkC,CAAC;IAC5C,CAAC;CAEF;AAnBD,gFAmBC;AAED,MAAa,kCAAmC,SAAQ,+BAAc;IAIpE,YAAY,YAA2B,EAAE,WAAoB,EAAE,IAAY,EAAE,OAAe;QAC1F,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAEM,aAAa,CAAC,KAAY,EAAE,eAAoB;QACrD,IAAW,KAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,IAAI,CAAC,eAAe;kBAC3E,YAAY,GAAU,KAAM,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAEM,eAAe;QACpB,OAAO,yCAAyC,IAAI,CAAC,eAAe,iBAAiB,CAAC;IACxF,CAAC;CAEF;AAtBD,gFAsBC","sourcesContent":["import {Resource} from \"rdf-object\";\nimport {IFetchOptions} from \"../../../Util\";\nimport {ITestCaseData} from \"../../ITestCase\";\nimport {TestCaseSyntax, TestCaseSyntaxHandler} from \"../TestCaseSyntax\";\nimport {TestCaseJsonLdToRdfHandler} from \"./TestCaseJsonLdToRdf\";\n\n/**\n * Test case handler for:\n * * https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest\n * * https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest\n */\nexport class TestCaseJsonLdToRdfNegativeHandler extends TestCaseSyntaxHandler {\n\n constructor() {\n super(false);\n }\n\n public resourceToTestCase(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<
|
|
1
|
+
{"version":3,"file":"TestCaseJsonLdToRdfNegative.js","sourceRoot":"","sources":["TestCaseJsonLdToRdfNegative.ts"],"names":[],"mappings":";;;AAGA,sDAAwE;AACxE,+DAAiE;AAEjE;;;;GAIG;AACH,MAAa,kCAAmC,SAAQ,sCAAqB;IAE3E;QACE,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEM,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAC/C,OAAuB;QAC/C,OAAO,gDAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC/G,CAAC;IAES,YAAY,CAAC,GAAW;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAES,gBAAgB;QACxB,OAAO,kCAAkC,CAAC;IAC5C,CAAC;CAEF;AAnBD,gFAmBC;AAED,MAAa,kCAAmC,SAAQ,+BAAc;IAIpE,YAAY,YAA2B,EAAE,WAAoB,EAAE,IAAY,EAAE,OAAe;QAC1F,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAEM,aAAa,CAAC,KAAY,EAAE,eAAoB;QACrD,IAAW,KAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,IAAI,CAAC,eAAe;kBAC3E,YAAY,GAAU,KAAM,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAEM,eAAe;QACpB,OAAO,yCAAyC,IAAI,CAAC,eAAe,iBAAiB,CAAC;IACxF,CAAC;CAEF;AAtBD,gFAsBC","sourcesContent":["import {Resource} from \"rdf-object\";\nimport {IFetchOptions} from \"../../../Util\";\nimport {ITestCaseData} from \"../../ITestCase\";\nimport {TestCaseSyntax, TestCaseSyntaxHandler} from \"../TestCaseSyntax\";\nimport {TestCaseJsonLdToRdfHandler} from \"./TestCaseJsonLdToRdf\";\n\n/**\n * Test case handler for:\n * * https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest\n * * https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest\n */\nexport class TestCaseJsonLdToRdfNegativeHandler extends TestCaseSyntaxHandler {\n\n constructor() {\n super(false);\n }\n\n public resourceToTestCase(resource: Resource, testCaseData: ITestCaseData,\n options?: IFetchOptions): Promise<TestCaseSyntax> {\n return TestCaseJsonLdToRdfHandler.wrap(super.resourceToTestCase.bind(this), resource, testCaseData, options);\n }\n\n protected normalizeUrl(url: string) {\n return url;\n }\n\n protected getTestCaseClass(): any {\n return TestCaseJsonLdToRdfHandlerNegative;\n }\n\n}\n\nexport class TestCaseJsonLdToRdfHandlerNegative extends TestCaseSyntax {\n\n public readonly expectErrorCode: string;\n\n constructor(testCaseData: ITestCaseData, expectError: boolean, data: string, baseIRI: string) {\n super(testCaseData, expectError, data, baseIRI);\n if (!this.expectErrorCode) {\n throw new Error('Invalid test case definition, no expected error code was defined.');\n }\n }\n\n public validateError(error: Error, injectArguments: any) {\n if ((<any> error).code !== this.expectErrorCode) {\n throw new Error('Received invalid error code, expected ' + this.expectErrorCode\n + ', but got ' + (<any> error).code + ' (' + error.message + ')');\n }\n }\n\n public getErrorMessage() {\n return `Expected to throw an error with code '${this.expectErrorCode}' when parsing.`;\n }\n\n}\n"]}
|
|
@@ -20,7 +20,7 @@ export declare class QueryResultBindings implements IQueryResultBindings {
|
|
|
20
20
|
[variable: string]: RDF.Term;
|
|
21
21
|
}, blankNodeCounters: {
|
|
22
22
|
[label: string]: number;
|
|
23
|
-
}):
|
|
23
|
+
}): any;
|
|
24
24
|
static hashBindings(bindings: {
|
|
25
25
|
[variable: string]: RDF.Term;
|
|
26
26
|
}[], blankNodeCounters: {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.QueryResultBindings = void 0;
|
|
4
|
-
const stringify = require("json-stable-stringify");
|
|
5
4
|
const rdf_literal_1 = require("rdf-literal");
|
|
6
5
|
const rdf_string_1 = require("rdf-string");
|
|
6
|
+
// tslint:disable-next-line:no-var-requires
|
|
7
|
+
const stringify = require('json-stable-stringify');
|
|
7
8
|
/**
|
|
8
9
|
* Holds bindings-based query results.
|
|
9
10
|
*/
|
|
@@ -71,7 +72,8 @@ class QueryResultBindings {
|
|
|
71
72
|
if (that.type !== 'bindings') {
|
|
72
73
|
return false;
|
|
73
74
|
}
|
|
74
|
-
if (
|
|
75
|
+
if ((this.value.length > 0 || that.value.length > 0) &&
|
|
76
|
+
JSON.stringify(this.variables.sort()) !== JSON.stringify(that.variables.sort())) {
|
|
75
77
|
return false;
|
|
76
78
|
}
|
|
77
79
|
if (laxCardinality) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryResultBindings.js","sourceRoot":"","sources":["QueryResultBindings.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"QueryResultBindings.js","sourceRoot":"","sources":["QueryResultBindings.ts"],"names":[],"mappings":"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","sourcesContent":["import * as RDF from \"@rdfjs/types\";\nimport {fromRdf} from \"rdf-literal\";\nimport {termToString} from \"rdf-string\";\nimport {IQueryResult, IQueryResultBindings} from \"./IQueryEngine\";\n// tslint:disable-next-line:no-var-requires\nconst stringify = require('json-stable-stringify');\n\n/**\n * Holds bindings-based query results.\n */\nexport class QueryResultBindings implements IQueryResultBindings {\n public readonly type = 'bindings';\n public variables: string[];\n public value: {[variable: string]: RDF.Term}[];\n public checkOrder: boolean;\n\n constructor(variables: string[], value: {[variable: string]: RDF.Term}[], checkOrder: boolean) {\n this.variables = variables;\n this.value = value;\n this.checkOrder = checkOrder;\n }\n\n public static serializeTerm(term: RDF.Term, blankNodeCounters: {[label: string]: number}): any {\n switch (term.termType) {\n case 'Literal':\n return fromRdf(term);\n case 'BlankNode':\n if (!(term.value in blankNodeCounters)) {\n blankNodeCounters[term.value] = Object.keys(blankNodeCounters).length;\n }\n const blankNodeCounter = blankNodeCounters[term.value];\n return '_:' + blankNodeCounter;\n case 'Quad':\n return `<<${QueryResultBindings.serializeTerm(term.subject, blankNodeCounters)\n } ${QueryResultBindings.serializeTerm(term.predicate, blankNodeCounters)\n } ${QueryResultBindings.serializeTerm(term.object, blankNodeCounters)\n } ${QueryResultBindings.serializeTerm(term.graph, blankNodeCounters)\n }>>`\n default:\n return termToString(term);\n }\n }\n\n public static hashBinding(binding: {[variable: string]: RDF.Term},\n blankNodeCounters: {[label: string]: number}) {\n const bHash: {[id: string]: string} = {};\n for (const variable of Object.keys(binding).sort()) {\n bHash[variable] = QueryResultBindings.serializeTerm(binding[variable], blankNodeCounters);\n }\n return stringify(bHash);\n }\n\n public static hashBindings(bindings: {[variable: string]: RDF.Term}[],\n blankNodeCounters: {[label: string]: number}, checkOrder: boolean): string {\n const hash = [];\n if (!checkOrder) {\n // Sort *before* we normalize blank nodes, otherwise isomorphic bindings may end up being sorted differently.\n // We do this sorting using fresh blank node counters for each binding.\n bindings = bindings.sort((binding1, binding2) => QueryResultBindings.hashBinding(binding1, {})\n .localeCompare(QueryResultBindings.hashBinding(binding2, {})));\n }\n for (const b of bindings) {\n hash.push(QueryResultBindings.hashBinding(b, blankNodeCounters));\n }\n return hash.join('');\n }\n\n public static hashBindingsCount(bindings: {[variable: string]: RDF.Term}[],\n blankNodeCounters: {[label: string]: number}): {[hash: string]: number} {\n const hash: {[hash: string]: number} = {};\n for (const b of bindings) {\n const bHash: {[id: string]: string} = {};\n for (const variable in b) {\n bHash[variable] = QueryResultBindings.serializeTerm(b[variable], blankNodeCounters);\n }\n const bString: string = JSON.stringify(bHash);\n if (!hash[bString]) {\n hash[bString] = 1;\n } else {\n hash[bString]++;\n }\n }\n return hash;\n }\n\n public equals(that: IQueryResult, laxCardinality?: boolean): boolean {\n if (that.type !== 'bindings') {\n return false;\n }\n if ((this.value.length > 0 || that.value.length > 0) &&\n JSON.stringify(this.variables.sort()) !== JSON.stringify(that.variables.sort())) {\n return false;\n }\n if (laxCardinality) {\n // This is applicable for REDUCED.\n // The actual results can contain duplicates.\n // The expected results contains the upper limit of how many duplicates there can be. The lower limit is 1.\n const countedBindingsExpected: {[hash: string]: number} = QueryResultBindings.hashBindingsCount(this.value, {});\n const countedBindingsActual: {[hash: string]: number} = QueryResultBindings.hashBindingsCount(that.value, {});\n if (Object.keys(countedBindingsExpected).sort().join() !== Object.keys(countedBindingsActual).sort().join()) {\n // The fully distinct keys are not equal\n return false;\n }\n\n // At this point, the keys are equal, so we check if the actual count is not more than the expected count\n for (const key in countedBindingsActual) {\n if (countedBindingsActual[key] > countedBindingsExpected[key]) {\n // The actual value contains *more* occurrences for this binding than allowed\n return false;\n }\n }\n\n return true;\n } else {\n return QueryResultBindings.hashBindings(this.value, {}, this.checkOrder)\n === QueryResultBindings.hashBindings(that.value, {}, that.checkOrder);\n }\n }\n\n public toString(): string {\n return `[QueryResultBindings:\n Variables: ${JSON.stringify(this.variables, null, ' ')}\n Bindings: ${JSON.stringify(this.value, null, ' ')}\n]`;\n }\n\n}\n"]}
|
|
@@ -48,7 +48,7 @@ class TestCaseQueryEvaluationHandler {
|
|
|
48
48
|
let queryResult;
|
|
49
49
|
try {
|
|
50
50
|
const rdfStream = Util_1.Util.parseRdfRaw(contentType, url, data);
|
|
51
|
-
queryResult = new QueryResultQuads_1.QueryResultQuads(yield (0, arrayify_stream_1.
|
|
51
|
+
queryResult = new QueryResultQuads_1.QueryResultQuads(yield (0, arrayify_stream_1.arrayifyStream)(rdfStream));
|
|
52
52
|
}
|
|
53
53
|
catch (e) {
|
|
54
54
|
// Fallthrough to the next cases
|
|
@@ -98,7 +98,7 @@ class TestCaseQueryEvaluationHandler {
|
|
|
98
98
|
.on('variables', resolve)
|
|
99
99
|
.on('end', _ => resolve([]));
|
|
100
100
|
}),
|
|
101
|
-
(0, arrayify_stream_1.
|
|
101
|
+
(0, arrayify_stream_1.arrayifyStream)(bindingsStream),
|
|
102
102
|
]);
|
|
103
103
|
// Parse both in parallel, and silence the errors
|
|
104
104
|
let bindingsError = null;
|
|
@@ -224,7 +224,7 @@ class TestCaseQueryEvaluationHandler {
|
|
|
224
224
|
return __awaiter(this, void 0, void 0, function* () {
|
|
225
225
|
let queryData = [];
|
|
226
226
|
for (const queryDataLink of queryDataLinks) {
|
|
227
|
-
let queryDataThis = yield (0, arrayify_stream_1.
|
|
227
|
+
let queryDataThis = yield (0, arrayify_stream_1.arrayifyStream)((yield Util_1.Util.fetchRdf(queryDataLink.dataUri, Object.assign(Object.assign({}, options), { normalizeUrl: true })))[1]);
|
|
228
228
|
if (queryDataLink.dataGraph) {
|
|
229
229
|
queryDataThis = queryDataThis.map((quad) => (0, rdf_terms_1.mapTerms)(quad, (value, key) => key === 'graph' ? queryDataLink.dataGraph : value));
|
|
230
230
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":"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","sourcesContent":["import {DataFactory} from \"rdf-data-factory\";\nimport * as RDF from \"@rdfjs/types\";\nimport {RdfObjectLoader, Resource} from \"rdf-object\";\nimport {stringToTerm} from \"rdf-string\";\nimport {mapTerms, QuadTermName} from \"rdf-terms\";\nimport {SparqlJsonParser} from \"sparqljson-parse\";\nimport {SparqlXmlParser} from \"sparqlxml-parse\";\nimport {ErrorTest} from \"../../ErrorTest\";\nimport {IFetchOptions, IFetchResponse, Util} from \"../../Util\";\nimport {ITestCaseData} from \"../ITestCase\";\nimport {ITestCaseHandler} from \"../ITestCaseHandler\";\nimport {IQueryEngine, IQueryResult, IQueryResultBindings} from \"./IQueryEngine\";\nimport {ITestCaseSparql} from \"./ITestCaseSparql\";\nimport {QueryResultBindings} from \"./QueryResultBindings\";\nimport {QueryResultBoolean} from \"./QueryResultBoolean\";\nimport {QueryResultQuads} from \"./QueryResultQuads\";\nimport arrayifyStream from \"arrayify-stream\";\n\n// tslint:disable:no-var-requires\nconst stringifyStream = require('stream-to-string');\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 /**\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,\n 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 (e) {\n // Fallthrough to the next cases\n }\n if (contentType.indexOf('application/sparql-results+xml') >= 0 || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.indexOf('application/sparql-results+json') >= 0) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', 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[], { [variable: 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 } else if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => '?' + variable.value),\n parsingResults[1][1], false);\n } else {\n throw new Error('Found no valid ASK or SELECT query.\\n'\n + bindingsError.message + '\\n' + booleanError.message);\n }\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>} A promise resolving to a bindings results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings> {\n // Construct resources for easier interpretation of the bindings\n // tslint:disable:object-literal-sort-keys\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 // tslint:enable:object-literal-sort-keys\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: boolean = 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) => {\n return parseInt(solution1.property.index.value, 10) - parseInt(solution2.property.index.value, 10);\n });\n }\n\n // Collect the bindings as object\n const value: {[variable: string]: RDF.Term}[] = solutions.map((solution: Resource) => {\n return solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings['?' + binding.property.variable.value] = binding.property.value.term;\n return bindings;\n }, {});\n });\n\n return new QueryResultBindings(variables, value, checkOrder);\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(Util.normalizeBaseUrl(graphData.property.label.value)),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(Util.normalizeBaseUrl(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,\n {...options, normalizeUrl: true}))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map((quad) => mapTerms(quad,\n (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,\n 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: boolean = 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: Util.normalizeBaseUrl(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, queryResponse.body),\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(this.queryData, this.queryString,\n { baseIRI: this.baseIRI, ...injectArguments });\n if (!await 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}\n"]}
|
|
1
|
+
{"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":"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","sourcesContent":["import {DataFactory} from \"rdf-data-factory\";\nimport * as RDF from \"@rdfjs/types\";\nimport {RdfObjectLoader, Resource} from \"rdf-object\";\nimport {stringToTerm} from \"rdf-string\";\nimport {mapTerms, QuadTermName} from \"rdf-terms\";\nimport {SparqlJsonParser} from \"sparqljson-parse\";\nimport {SparqlXmlParser} from \"sparqlxml-parse\";\nimport {ErrorTest} from \"../../ErrorTest\";\nimport {IFetchOptions, IFetchResponse, Util} from \"../../Util\";\nimport {ITestCaseData} from \"../ITestCase\";\nimport {ITestCaseHandler} from \"../ITestCaseHandler\";\nimport {IQueryEngine, IQueryResult, IQueryResultBindings} from \"./IQueryEngine\";\nimport {ITestCaseSparql} from \"./ITestCaseSparql\";\nimport {QueryResultBindings} from \"./QueryResultBindings\";\nimport {QueryResultBoolean} from \"./QueryResultBoolean\";\nimport {QueryResultQuads} from \"./QueryResultQuads\";\nimport { arrayifyStream } from \"arrayify-stream\";\n\n// tslint:disable:no-var-requires\nconst stringifyStream = require('stream-to-string');\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 /**\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,\n 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 (e) {\n // Fallthrough to the next cases\n }\n if (contentType.indexOf('application/sparql-results+xml') >= 0 || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.indexOf('application/sparql-results+json') >= 0) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', 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[], { [variable: 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 } else if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => '?' + variable.value),\n parsingResults[1][1], false);\n } else {\n throw new Error('Found no valid ASK or SELECT query.\\n'\n + bindingsError.message + '\\n' + booleanError.message);\n }\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>} A promise resolving to a bindings results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings> {\n // Construct resources for easier interpretation of the bindings\n // tslint:disable:object-literal-sort-keys\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 // tslint:enable:object-literal-sort-keys\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: boolean = 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) => {\n return parseInt(solution1.property.index.value, 10) - parseInt(solution2.property.index.value, 10);\n });\n }\n\n // Collect the bindings as object\n const value: {[variable: string]: RDF.Term}[] = solutions.map((solution: Resource) => {\n return solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings['?' + binding.property.variable.value] = binding.property.value.term;\n return bindings;\n }, {});\n });\n\n return new QueryResultBindings(variables, value, checkOrder);\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(Util.normalizeBaseUrl(graphData.property.label.value)),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(Util.normalizeBaseUrl(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,\n {...options, normalizeUrl: true}))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map((quad) => mapTerms(quad,\n (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,\n 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: boolean = 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: Util.normalizeBaseUrl(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, queryResponse.body),\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(this.queryData, this.queryString,\n { baseIRI: this.baseIRI, ...injectArguments });\n if (!await 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}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rdf-test-suite",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.5",
|
|
4
4
|
"description": "Executes the RDF and SPARQL test suites.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sparql",
|
|
@@ -44,19 +44,19 @@
|
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@comunica/actor-http-proxy": "^4.0.2",
|
|
46
46
|
"@comunica/query-sparql": "^4.0.2",
|
|
47
|
-
"@types/jest": "^
|
|
47
|
+
"@types/jest": "^30.0.0",
|
|
48
48
|
"coveralls": "^3.0.0",
|
|
49
|
-
"jest": "^
|
|
49
|
+
"jest": "^30.0.0",
|
|
50
50
|
"jest-rdf": "^2.0.0",
|
|
51
51
|
"manual-git-changelog": "^1.0.1",
|
|
52
52
|
"pre-commit": "^1.2.2",
|
|
53
53
|
"rdf-parse": "^4.0.0",
|
|
54
|
-
"rimraf": "^
|
|
55
|
-
"streamify-array": "^
|
|
54
|
+
"rimraf": "^6.0.0",
|
|
55
|
+
"streamify-array": "^2.0.0",
|
|
56
56
|
"ts-jest": "^29.0.0",
|
|
57
57
|
"tslint": "^6.0.0",
|
|
58
58
|
"tslint-eslint-rules": "^5.3.1",
|
|
59
|
-
"typescript": "^
|
|
59
|
+
"typescript": "^6.0.0"
|
|
60
60
|
},
|
|
61
61
|
"jest": {
|
|
62
62
|
"transform": {
|
|
@@ -106,14 +106,14 @@
|
|
|
106
106
|
"@types/minimist": "^1.2.0",
|
|
107
107
|
"@types/n3": "^1.10.3",
|
|
108
108
|
"@types/sax": "^1.0.1",
|
|
109
|
-
"arrayify-stream": "^
|
|
110
|
-
"cross-fetch": "^
|
|
109
|
+
"arrayify-stream": "^3.0.0",
|
|
110
|
+
"cross-fetch": "^4.0.0",
|
|
111
111
|
"is-stream": "^2.0.0",
|
|
112
112
|
"json-stable-stringify": "^1.0.1",
|
|
113
|
-
"jsonld-streaming-parser": "^
|
|
113
|
+
"jsonld-streaming-parser": "^5.0.0",
|
|
114
114
|
"log-symbols": "^4.0.0",
|
|
115
115
|
"minimist": "^1.2.0",
|
|
116
|
-
"n3": "^
|
|
116
|
+
"n3": "^2.0.0",
|
|
117
117
|
"rdf-data-factory": "^2.0.0",
|
|
118
118
|
"rdf-isomorphic": "^2.0.0",
|
|
119
119
|
"rdf-literal": "^2.0.0",
|