rdf-test-suite 2.5.0 → 2.6.0
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/README.md +13 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/TestSuiteRunner.d.ts +9 -0
- package/lib/TestSuiteRunner.js +29 -2
- package/lib/TestSuiteRunner.js.map +1 -1
- package/lib/testcase/TestCaseHandlers.js +2 -1
- package/lib/testcase/TestCaseHandlers.js.map +1 -1
- package/lib/testcase/sparql/IQueryEngine.d.ts +8 -0
- package/lib/testcase/sparql/IQueryEngine.js.map +1 -1
- package/lib/testcase/sparql/TestCaseServiceDescription.d.ts +30 -0
- package/lib/testcase/sparql/TestCaseServiceDescription.js +137 -0
- package/lib/testcase/sparql/TestCaseServiceDescription.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -241,6 +241,18 @@ $ rdf-test-suite myengine.js http://w3c.github.io/rdf-tests/sparql/sparql11/mani
|
|
|
241
241
|
-i '{ "myProperty": "myValue" }'
|
|
242
242
|
```
|
|
243
243
|
|
|
244
|
+
For the SPARQL 1.1 Service Description tests, the runner will call the optional
|
|
245
|
+
`startServiceDescriptionEndpoint` method on an `IQueryEngine`, use the returned
|
|
246
|
+
endpoint URL, and invoke its `close` method after the manifest completes. An explicitly
|
|
247
|
+
configured `serviceDescriptionEndpoint` takes precedence,
|
|
248
|
+
which allows testing an endpoint that is already running:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
$ rdf-test-suite myengine.js http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl \
|
|
252
|
+
-s http://www.w3.org/TR/sparql11-service-description/ \
|
|
253
|
+
-i '{ "serviceDescriptionEndpoint": "http://localhost:3000/sparql" }'
|
|
254
|
+
```
|
|
255
|
+
|
|
244
256
|
### Test timeouts
|
|
245
257
|
|
|
246
258
|
By default, all tests are allowed to run 3000 ms.
|
|
@@ -301,7 +313,7 @@ $ rdf-test-suite myengine.js https://w3c.github.io/rdf-tests/sparql/sparql11/man
|
|
|
301
313
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Results JSON](http://www.w3.org/TR/sparql11-results-json/) | [`IQueryEngine`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/sparql/IQueryEngine.ts) | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
302
314
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Federated Query](http://www.w3.org/TR/sparql11-federated-query/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
303
315
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Entailment](http://www.w3.org/TR/sparql11-entailment/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
304
|
-
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Service Description](http://www.w3.org/TR/sparql11-service-description/) |
|
|
316
|
+
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Service Description](http://www.w3.org/TR/sparql11-service-description/) | ✔ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
305
317
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Protocol](http://www.w3.org/TR/sparql11-protocol/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
306
318
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 HTTP RDF Update](http://www.w3.org/TR/sparql11-http-rdf-update/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
307
319
|
| [RDF/XML Syntax Tests](https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-xml/) | [RDF 1.1 XML Syntax](https://www.w3.org/TR/rdf-syntax-grammar/) | [`IParser`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/rdfsyntax/IParser.ts) | https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-xml/manifest.ttl |
|
package/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './lib/testcase/sparql/TestCaseCsvResultFormat';
|
|
|
18
18
|
export * from './lib/testcase/sparql/TestCaseNegativeSyntax';
|
|
19
19
|
export * from './lib/testcase/sparql/TestCasePositiveSyntax';
|
|
20
20
|
export * from './lib/testcase/sparql/TestCaseQueryEvaluation';
|
|
21
|
+
export * from './lib/testcase/sparql/TestCaseServiceDescription';
|
|
21
22
|
export * from './lib/testcase/sparql/TestCaseUpdateEvaluation';
|
|
22
23
|
export * from './lib/testcase/ITestCase';
|
|
23
24
|
export * from './lib/testcase/ITestCaseHandler';
|
package/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __exportStar(require("./lib/testcase/sparql/TestCaseCsvResultFormat"), exports);
|
|
|
34
34
|
__exportStar(require("./lib/testcase/sparql/TestCaseNegativeSyntax"), exports);
|
|
35
35
|
__exportStar(require("./lib/testcase/sparql/TestCasePositiveSyntax"), exports);
|
|
36
36
|
__exportStar(require("./lib/testcase/sparql/TestCaseQueryEvaluation"), exports);
|
|
37
|
+
__exportStar(require("./lib/testcase/sparql/TestCaseServiceDescription"), exports);
|
|
37
38
|
__exportStar(require("./lib/testcase/sparql/TestCaseUpdateEvaluation"), exports);
|
|
38
39
|
__exportStar(require("./lib/testcase/ITestCase"), exports);
|
|
39
40
|
__exportStar(require("./lib/testcase/ITestCaseHandler"), exports);
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wFAAsE;AACtE,uFAAqE;AACrE,sFAAoE;AACpE,8FAA4E;AAC5E,wEAAsD;AACtD,0EAAwD;AACxD,mEAAiD;AACjD,uEAAqD;AACrD,kFAAgE;AAChE,8EAA4D;AAC5D,qEAAmD;AACnD,wEAAsD;AACtD,sEAAoD;AACpD,4EAA0D;AAC1D,2EAAyD;AACzD,yEAAuD;AACvD,gFAA8D;AAC9D,+EAA6D;AAC7D,+EAA6D;AAC7D,gFAA8D;AAC9D,iFAA+D;AAC/D,2DAAyC;AACzC,kEAAgD;AAChD,qEAAmD;AACnD,kDAAgC;AAChC,uDAAqC;AACrC,wDAAsC;AACtC,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,6DAA2C;AAC3C,oEAAkD","sourcesContent":["export * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nexport * from './lib/testcase/rdfsyntax/TestCaseEval';\nexport * from './lib/testcase/rdfsyntax/TestCaseSyntax';\nexport * from './lib/testcase/rdfsyntax/IParser';\nexport * from './lib/testcase/rdfsyntax/ISerializer';\nexport * from './lib/testcase/rdfsyntax/ITestCaseFromRdfSyntax';\nexport * from './lib/testcase/rdfsyntax/ITestCaseRdfSyntax';\nexport * from './lib/testcase/sparql/IQueryEngine';\nexport * from './lib/testcase/sparql/ITestCaseSparql';\nexport * from './lib/testcase/sparql/IUpdateEngine';\nexport * from './lib/testcase/sparql/QueryResultBindings';\nexport * from './lib/testcase/sparql/QueryResultBoolean';\nexport * from './lib/testcase/sparql/QueryResultQuads';\nexport * from './lib/testcase/sparql/TestCaseCsvResultFormat';\nexport * from './lib/testcase/sparql/TestCaseNegativeSyntax';\nexport * from './lib/testcase/sparql/TestCasePositiveSyntax';\nexport * from './lib/testcase/sparql/TestCaseQueryEvaluation';\nexport * from './lib/testcase/sparql/TestCaseUpdateEvaluation';\nexport * from './lib/testcase/ITestCase';\nexport * from './lib/testcase/ITestCaseHandler';\nexport * from './lib/testcase/TestCaseUnsupported';\nexport * from './lib/IManifest';\nexport * from './lib/ManifestLoader';\nexport * from './lib/TestSuiteRunner';\nexport * from './lib/Util';\nexport * from './lib/ErrorSkipped';\nexport * from './lib/ErrorTest';\nexport * from './lib/DocumentLoaderCached';\nexport * from './lib/testcase/TestCaseMediaTypes';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wFAAsE;AACtE,uFAAqE;AACrE,sFAAoE;AACpE,8FAA4E;AAC5E,wEAAsD;AACtD,0EAAwD;AACxD,mEAAiD;AACjD,uEAAqD;AACrD,kFAAgE;AAChE,8EAA4D;AAC5D,qEAAmD;AACnD,wEAAsD;AACtD,sEAAoD;AACpD,4EAA0D;AAC1D,2EAAyD;AACzD,yEAAuD;AACvD,gFAA8D;AAC9D,+EAA6D;AAC7D,+EAA6D;AAC7D,gFAA8D;AAC9D,mFAAiE;AACjE,iFAA+D;AAC/D,2DAAyC;AACzC,kEAAgD;AAChD,qEAAmD;AACnD,kDAAgC;AAChC,uDAAqC;AACrC,wDAAsC;AACtC,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,6DAA2C;AAC3C,oEAAkD","sourcesContent":["export * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nexport * from './lib/testcase/rdfsyntax/TestCaseEval';\nexport * from './lib/testcase/rdfsyntax/TestCaseSyntax';\nexport * from './lib/testcase/rdfsyntax/IParser';\nexport * from './lib/testcase/rdfsyntax/ISerializer';\nexport * from './lib/testcase/rdfsyntax/ITestCaseFromRdfSyntax';\nexport * from './lib/testcase/rdfsyntax/ITestCaseRdfSyntax';\nexport * from './lib/testcase/sparql/IQueryEngine';\nexport * from './lib/testcase/sparql/ITestCaseSparql';\nexport * from './lib/testcase/sparql/IUpdateEngine';\nexport * from './lib/testcase/sparql/QueryResultBindings';\nexport * from './lib/testcase/sparql/QueryResultBoolean';\nexport * from './lib/testcase/sparql/QueryResultQuads';\nexport * from './lib/testcase/sparql/TestCaseCsvResultFormat';\nexport * from './lib/testcase/sparql/TestCaseNegativeSyntax';\nexport * from './lib/testcase/sparql/TestCasePositiveSyntax';\nexport * from './lib/testcase/sparql/TestCaseQueryEvaluation';\nexport * from './lib/testcase/sparql/TestCaseServiceDescription';\nexport * from './lib/testcase/sparql/TestCaseUpdateEvaluation';\nexport * from './lib/testcase/ITestCase';\nexport * from './lib/testcase/ITestCaseHandler';\nexport * from './lib/testcase/TestCaseUnsupported';\nexport * from './lib/IManifest';\nexport * from './lib/ManifestLoader';\nexport * from './lib/TestSuiteRunner';\nexport * from './lib/Util';\nexport * from './lib/ErrorSkipped';\nexport * from './lib/ErrorTest';\nexport * from './lib/DocumentLoaderCached';\nexport * from './lib/testcase/TestCaseMediaTypes';\n"]}
|
package/lib/TestSuiteRunner.d.ts
CHANGED
|
@@ -36,6 +36,15 @@ export declare class TestSuiteRunner {
|
|
|
36
36
|
* @return {Promise<ITestResult[]>} A promise resolving to an array of test results.
|
|
37
37
|
*/
|
|
38
38
|
runManifest(manifestUrl: string, handler: any, config: ITestSuiteConfig): Promise<ITestResult[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Run a manifest, starting an endpoint if the selected specification requires one.
|
|
41
|
+
* @param {string} manifest A manifest.
|
|
42
|
+
* @param handler The handler to run the tests with.
|
|
43
|
+
* @param config The test suite configuration.
|
|
44
|
+
* @param {ITestResult[]} results An array to append the test results to.
|
|
45
|
+
* @return {Promise<void>} A promise resolving when the tests are finished.
|
|
46
|
+
*/
|
|
47
|
+
private runManifestWithEndpoint;
|
|
39
48
|
/**
|
|
40
49
|
* Run the given manifest.
|
|
41
50
|
* @param {string} manifest A manifest.
|
package/lib/TestSuiteRunner.js
CHANGED
|
@@ -52,6 +52,7 @@ const quad = require('rdf-quad');
|
|
|
52
52
|
// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires
|
|
53
53
|
const streamifyArray = require('streamify-array').streamifyArray;
|
|
54
54
|
const DF = new rdf_data_factory_1.DataFactory();
|
|
55
|
+
const SERVICE_DESCRIPTION_SPECIFICATION = 'http://www.w3.org/TR/sparql11-service-description/';
|
|
55
56
|
/**
|
|
56
57
|
* TestSuiteRunner runs a certain test suite manifest.
|
|
57
58
|
*/
|
|
@@ -87,13 +88,39 @@ class TestSuiteRunner {
|
|
|
87
88
|
if (!manifest.specifications || !manifest.specifications[specification]) {
|
|
88
89
|
return [];
|
|
89
90
|
}
|
|
90
|
-
yield this.
|
|
91
|
+
yield this.runManifestWithEndpoint(manifest.specifications[specification], handler, config, results);
|
|
91
92
|
return results;
|
|
92
93
|
}
|
|
93
|
-
yield this.
|
|
94
|
+
yield this.runManifestWithEndpoint(manifest, handler, config, results);
|
|
94
95
|
return results;
|
|
95
96
|
});
|
|
96
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Run a manifest, starting an endpoint if the selected specification requires one.
|
|
100
|
+
* @param {string} manifest A manifest.
|
|
101
|
+
* @param handler The handler to run the tests with.
|
|
102
|
+
* @param config The test suite configuration.
|
|
103
|
+
* @param {ITestResult[]} results An array to append the test results to.
|
|
104
|
+
* @return {Promise<void>} A promise resolving when the tests are finished.
|
|
105
|
+
*/
|
|
106
|
+
runManifestWithEndpoint(manifest, handler, config, results) {
|
|
107
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
const engine = handler;
|
|
109
|
+
const customEngineOptions = config.customEngingeOptions;
|
|
110
|
+
if (config.specification === SERVICE_DESCRIPTION_SPECIFICATION &&
|
|
111
|
+
!customEngineOptions.serviceDescriptionEndpoint && engine.startServiceDescriptionEndpoint) {
|
|
112
|
+
const serviceDescription = yield engine.startServiceDescriptionEndpoint();
|
|
113
|
+
try {
|
|
114
|
+
yield this.runManifestConcrete(manifest, handler, Object.assign(Object.assign({}, config), { customEngingeOptions: Object.assign(Object.assign({}, customEngineOptions), { serviceDescriptionEndpoint: serviceDescription.endpoint }) }), results);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
yield serviceDescription.close();
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
yield this.runManifestConcrete(manifest, handler, config, results);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
97
124
|
/**
|
|
98
125
|
* Run the given manifest.
|
|
99
126
|
* @param {string} manifest A manifest.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestSuiteRunner.js","sourceRoot":"","sources":["TestSuiteRunner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,wDAA0C;AAC1C,uDAA+C;AAE/C,qDAAkD;AAElD,iCAA8B;AAI9B,qEAAqE;AACrE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACjC,qEAAqE;AACrE,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC;AAEjE,MAAM,EAAE,GAAG,IAAI,8BAAW,EAAE,CAAC;AAgB7B;;GAEG;AACH,MAAa,eAAe;IAC1B;;;;OAIG;IACI,sBAAsB,CAAC,gBAAyB;QACrD,MAAM,iBAAiB,GAAoC,EAAE,CAAC;QAC9D,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,CAAE,GAAG,EAAE,IAAI,CAAE,GAAa,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5D,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACU,WAAW,CAAC,WAAmB,EAAE,OAAY,EAAE,MAAwB;;YAClF,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;YAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAc,MAAM,IAAI,+BAAc,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC3G,MAAM,OAAO,GAAkB,EAAE,CAAC;YAElC,qEAAqE;YACrE,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;oBACxE,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjG,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACnE,OAAO,OAAO,CAAC;QACjB,CAAC;KAAA;IAED;;;;;;;OAOG;IACU,mBAAmB,CAC9B,QAAmB,EACnB,OAAY,EACZ,MAAwB,EACxB,OAAsB;;YAEtB,qCAAqC;YACrC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACzB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACxC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBACrH,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,uCAAuC,EAAE,CAAC;4BACrF,0CAA0C;4BAC1C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;wBACtF,CAAC;6BAAM,IAAI,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,KAAK,uCAAuC,EAAE,CAAC;4BAChG,0CAA0C;4BAC1C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;wBACrG,CAAC;6BAAM,CAAC;4BACN,IAAI,OAAO,GAAY,IAAI,CAAC;4BAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;4BACnC,IAAI,kBAAmD,CAAC;4BACxD,IAAI,CAAC;gCACH,MAAM,OAAO,CAAC,IAAI,CAAC;oCACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,oBAAoB,CAAC;yCAC5C,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;wCACf,IAAI,MAAM,EAAE,CAAC;4CACX,kBAAkB,GAAG,MAAM,CAAC;wCAC9B,CAAC;oCACH,CAAC,CAAC;oCACJ,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;wCACvB,4EAA4E;wCAC5E,OAAO,GAAG,UAAU,CAAC,UAAU,CAC7B,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,EACzD,MAAM,CAAC,eAAe,CACvB,CAAC;oCACJ,CAAC,CAAC;iCACH,CAAC,CAAC;4BACL,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,YAAY,CAAC,OAAO,CAAC,CAAC;gCACtB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAQ,KAAK,EAAE,OAAO,EAAS,KAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gCACtF,SAAS;4BACX,CAAC;4BACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;4BAC1C,YAAY,CAAC,OAAO,CAAC,CAAC;4BACtB,OAAO,CAAC,IAAI,iBAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAK,kBAAkB,EAAG,CAAC;wBAClH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC1B,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAED;;;;;OAKG;IACI,aAAa,CAAC,MAAmB,EAAE,OAAsB,EAAE,OAAgB;QAChF,MAAM,WAAW,GAAkB,EAAE,CAAC;QACtC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,WAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,WAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YAClJ,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC;EACnB,UAAU,CAAC,KAAK,IAAI,WAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAI,CAAC,QAAQ,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE;IACzB,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;IAC1D,WAAI,CAAC,SAAS,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,WAAI,CAAC,SAAS,CAAC;;CAElE,CAAC,CAAC;YACG,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,OAAO,CAAC;QACnB,IAAI,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,OAAO,MAAM,OAAO,CAAC,MAAM,oBAAoB,aAAa,IAAI,CAAC,CAAC;QAC1G,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,MAAM,OAAO,CAAC,MAAM,oBAAoB,aAAa,IAAI,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,aAAa,CAAC,OAAsB,EAAE,UAA2B,EAAE,QAAc;QACtF,qEAAqE;QACrE,MAAM,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,OAAO,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC;QAC9C,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,kBAAkB;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC1H,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/I,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtG,CAAC;QAED,uBAAuB;QACvB,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,UAAU,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAC7E,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,EAAE,IAAI,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,sBAAsB,EAAE,cAAc,CAAC,CAAC,CAAC;QACvE,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,EAAE,4DAA4D,CAAC,CAAC,CAAC;QACzG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,eAAe,EAAE,6BAA6B,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAC9G,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,cAAc,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,UAAU,CAAC,sBAAsB,MAAM,CAAC,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,aAAa,EAAE,IAAI,UAAU,CAAC,sBAAsB,MAAM,CAAC,CAAC,CAAC;QAE3F,mBAAmB;QACnB,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC;YAClE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,gBAAgB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,YAAY,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;YAC3E,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACtI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,EAAE,EAAE,CAAC;QACP,CAAC;QAED,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACI,2BAA2B,CAAC,WAAgB;QACjD,OAAO;YACL,kBAAkB,EAAE,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI;YACtG,sBAAsB,EAAE,WAAW,CAAC,WAAW;YAC/C,sBAAsB,EAAE,WAAW,CAAC,QAAQ;YAC5C,mBAAmB,EAAE,WAAW,CAAC,IAAI;YACrC,kBAAkB,EAAE,WAAW,CAAC,IAAI;YACpC,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,iCAAiC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI;YAC9F,OAAO,EAAE;gBACP;oBACE,QAAQ,EAAE,IAAI;oBACd,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,GAAG,EAAE,iCAAiC,WAAW,CAAC,IAAI,UAAU;iBACjE;aACF;YACD,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;YAC/E,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,EAAE;YACrB,OAAO,EAAE,WAAW,CAAC,OAAO;SAC7B,CAAC;IACJ,CAAC;CACF;AAtRD,0CAsRC","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport * as LogSymbols from 'log-symbols';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { IManifest } from './IManifest';\nimport { ManifestLoader } from './ManifestLoader';\nimport type { ITestCase } from './testcase/ITestCase';\nimport { Util } from './Util';\nimport WriteStream = NodeJS.WriteStream;\nimport Timeout = NodeJS.Timeout;\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst quad = require('rdf-quad');\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst streamifyArray = require('streamify-array').streamifyArray;\n\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 * 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 config The test suite configuration.\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 config The test suite configuration.\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.setTimeout is used here to avoid browser/node compatibility issues\n timeout = globalThis.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 = 0;\n let skipped = 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.colorGray)}`}\\n`);\n } else 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 if (!compact) {\n for (const result of failedTests) {\n stdout.write(`\n${LogSymbols.error} ${Util.withColor(result.test.name, Util.colorRed)}\n ${result.test.comment || ''}\n ${'test' in result.error ? result.error : result.error.stack}\n ${Util.withColor(`More info: ${result.test.uri}`, Util.colorBlue)}\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 // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\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(), 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`, 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 type * as RDF from '@rdfjs/types';\nimport * as LogSymbols from 'log-symbols';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { IManifest } from './IManifest';\nimport { ManifestLoader } from './ManifestLoader';\nimport type { ITestCase } from './testcase/ITestCase';\nimport type { IQueryEngine } from './testcase/sparql/IQueryEngine';\nimport { Util } from './Util';\nimport WriteStream = NodeJS.WriteStream;\nimport Timeout = NodeJS.Timeout;\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst quad = require('rdf-quad');\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst streamifyArray = require('streamify-array').streamifyArray;\n\nconst DF = new DataFactory();\nconst SERVICE_DESCRIPTION_SPECIFICATION = 'http://www.w3.org/TR/sparql11-service-description/';\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 * 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 config The test suite configuration.\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.runManifestWithEndpoint(manifest.specifications[specification], handler, config, results);\n return results;\n }\n\n await this.runManifestWithEndpoint(manifest, handler, config, results);\n return results;\n }\n\n /**\n * Run a manifest, starting an endpoint if the selected specification requires one.\n * @param {string} manifest A manifest.\n * @param handler The handler to run the tests with.\n * @param config The test suite configuration.\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 private async runManifestWithEndpoint(\n manifest: IManifest,\n handler: any,\n config: ITestSuiteConfig,\n results: ITestResult[],\n ): Promise<void> {\n const engine = <IQueryEngine> handler;\n const customEngineOptions = <Record<string, unknown>> config.customEngingeOptions;\n if (config.specification === SERVICE_DESCRIPTION_SPECIFICATION &&\n !customEngineOptions.serviceDescriptionEndpoint && engine.startServiceDescriptionEndpoint) {\n const serviceDescription = await engine.startServiceDescriptionEndpoint();\n try {\n await this.runManifestConcrete(manifest, handler, {\n ...config,\n customEngingeOptions: {\n ...customEngineOptions,\n serviceDescriptionEndpoint: serviceDescription.endpoint,\n },\n }, results);\n } finally {\n await serviceDescription.close();\n }\n return;\n }\n\n await this.runManifestConcrete(manifest, handler, config, 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 config The test suite configuration.\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.setTimeout is used here to avoid browser/node compatibility issues\n timeout = globalThis.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 = 0;\n let skipped = 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.colorGray)}`}\\n`);\n } else 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 if (!compact) {\n for (const result of failedTests) {\n stdout.write(`\n${LogSymbols.error} ${Util.withColor(result.test.name, Util.colorRed)}\n ${result.test.comment || ''}\n ${'test' in result.error ? result.error : result.error.stack}\n ${Util.withColor(`More info: ${result.test.uri}`, Util.colorBlue)}\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 // eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\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(), 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`, 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"]}
|
|
@@ -11,6 +11,7 @@ const TestCaseCsvResultFormat_1 = require("./sparql/TestCaseCsvResultFormat");
|
|
|
11
11
|
const TestCaseNegativeSyntax_1 = require("./sparql/TestCaseNegativeSyntax");
|
|
12
12
|
const TestCasePositiveSyntax_1 = require("./sparql/TestCasePositiveSyntax");
|
|
13
13
|
const TestCaseQueryEvaluation_1 = require("./sparql/TestCaseQueryEvaluation");
|
|
14
|
+
const TestCaseServiceDescription_1 = require("./sparql/TestCaseServiceDescription");
|
|
14
15
|
const TestCaseUpdateEvaluation_1 = require("./sparql/TestCaseUpdateEvaluation");
|
|
15
16
|
const TestCaseUnsupported_1 = require("./TestCaseUnsupported");
|
|
16
17
|
module.exports = {
|
|
@@ -27,7 +28,7 @@ module.exports = {
|
|
|
27
28
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest11': new TestCasePositiveSyntax_1.TestCasePositiveSyntaxHandler(),
|
|
28
29
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#UpdateEvaluationTest': new TestCaseUpdateEvaluation_1.TestCaseUpdateEvaluationHandler(),
|
|
29
30
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest': new TestCaseCsvResultFormat_1.TestCaseCsvResultFormatHandler(),
|
|
30
|
-
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest': new
|
|
31
|
+
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest': new TestCaseServiceDescription_1.TestCaseServiceDescriptionHandler(),
|
|
31
32
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ProtocolTest': new TestCaseUnsupported_1.TestCaseUnsupportedHandler('sparql:ProtocolTest'), // TODO: implement
|
|
32
33
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#GraphStoreProtocolTest': new TestCaseUnsupported_1.TestCaseUnsupportedHandler('sparql:GraphStoreProtocolTest'), // TODO: implement
|
|
33
34
|
// RDF/XML test suite
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseHandlers.js","sourceRoot":"","sources":["TestCaseHandlers.ts"],"names":[],"mappings":";;AAAA,oFAAwF;AACxF,oGAAwG;AACxG,kFAAsF;AACtF,gFAAoF;AACpF,gGAAoG;AACpG,2DAA+D;AAC/D,+DAAmE;AACnE,8EAAkF;AAClF,4EAAgF;AAChF,4EAAgF;AAChF,8EAAkF;AAClF,gFAAoF;AACpF,+DAAmE;AAEnE,MAAM,CAAC,OAAO,GAAG;IACf,oCAAoC;IACpC,6EAA6E,EAC3E,IAAI,sDAA6B,EAAE;IACrC,6EAA6E,EAC3E,IAAI,sDAA6B,EAAE;IACrC,mFAAmF,EACjF,IAAI,sDAA6B,EAAE;IACrC,mFAAmF,EACjF,IAAI,sDAA6B,EAAE;IACrC,8EAA8E,EAC5E,IAAI,wDAA8B,EAAE;IAEtC,wBAAwB;IACxB,+EAA+E,EAC7E,IAAI,sDAA6B,EAAE;IACrC,+EAA+E,EAC7E,IAAI,sDAA6B,EAAE;IACrC,qFAAqF,EACnF,IAAI,sDAA6B,EAAE;IACrC,qFAAqF,EACnF,IAAI,sDAA6B,EAAE;IACrC,+EAA+E,EAC7E,IAAI,0DAA+B,EAAE;IACvC,8EAA8E,EAC5E,IAAI,wDAA8B,EAAE;IACtC,iFAAiF,EAC/E,IAAI,
|
|
1
|
+
{"version":3,"file":"TestCaseHandlers.js","sourceRoot":"","sources":["TestCaseHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { TestCaseJsonLdFromRdfHandler } from './rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nimport { TestCaseJsonLdFromRdfNegativeHandler } from './rdfsyntax/jsonld/TestCaseJsonLdFromRdfNegative';\nimport { TestCaseJsonLdSyntaxHandler } from './rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nimport { TestCaseJsonLdToRdfHandler } from './rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nimport { TestCaseJsonLdToRdfNegativeHandler } from './rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nimport { TestCaseEvalHandler } from './rdfsyntax/TestCaseEval';\nimport { TestCaseSyntaxHandler } from './rdfsyntax/TestCaseSyntax';\nimport { TestCaseCsvResultFormatHandler } from './sparql/TestCaseCsvResultFormat';\nimport { TestCaseNegativeSyntaxHandler } from './sparql/TestCaseNegativeSyntax';\nimport { TestCasePositiveSyntaxHandler } from './sparql/TestCasePositiveSyntax';\nimport { TestCaseQueryEvaluationHandler } from './sparql/TestCaseQueryEvaluation';\nimport { TestCaseServiceDescriptionHandler } from './sparql/TestCaseServiceDescription';\nimport { TestCaseUpdateEvaluationHandler } from './sparql/TestCaseUpdateEvaluation';\nimport { TestCaseUnsupportedHandler } from './TestCaseUnsupported';\n\nmodule.exports = {\n // SPARQL 1.0, SPARQL 1.1 test suite\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeSyntaxTest':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeUpdateSyntaxTest':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest':\n new TestCaseQueryEvaluationHandler(),\n\n // SPARQL 1.1 test suite\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeSyntaxTest11':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest11':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeUpdateSyntaxTest11':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest11':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#UpdateEvaluationTest':\n new TestCaseUpdateEvaluationHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest':\n new TestCaseCsvResultFormatHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest':\n new TestCaseServiceDescriptionHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ProtocolTest':\n new TestCaseUnsupportedHandler('sparql:ProtocolTest'), // TODO: implement\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#GraphStoreProtocolTest':\n new TestCaseUnsupportedHandler('sparql:GraphStoreProtocolTest'), // TODO: implement\n\n // RDF/XML test suite\n 'http://www.w3.org/ns/rdftest#TestXMLEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestXMLNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // N-Triples test suite\n 'http://www.w3.org/ns/rdftest#TestNTriplesPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestNTriplesNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // N-Quads test suite\n 'http://www.w3.org/ns/rdftest#TestNQuadsPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestNQuadsNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // Turtle test suite\n 'http://www.w3.org/ns/rdftest#TestTurtleEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestTurtlePositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestTurtleNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'http://www.w3.org/ns/rdftest#TestTurtleNegativeEval':\n new TestCaseSyntaxHandler(false),\n\n // TriG test suite\n 'http://www.w3.org/ns/rdftest#TestTrigEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestTrigPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestTrigNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'http://www.w3.org/ns/rdftest#TestTrigNegativeEval':\n new TestCaseSyntaxHandler(false),\n\n // JSON-LD test suite\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveEvaluationTest':\n new TestCaseJsonLdToRdfHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveSyntaxTest':\n new TestCaseJsonLdSyntaxHandler(true),\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest':\n new TestCaseJsonLdToRdfNegativeHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveEvaluationTest':\n new TestCaseJsonLdFromRdfHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest':\n new TestCaseJsonLdFromRdfNegativeHandler(),\n\n // RDFa test suite\n 'http://rdfa.info/vocabs/rdfa-test#PositiveEvaluationTest':\n new TestCaseEvalHandler(),\n 'http://rdfa.info/vocabs/rdfa-test#NegativeEvaluationTest':\n new TestCaseSyntaxHandler(true), // RDFa test suite never expect errors, just empty documents\n\n // Microdata-RDF test suite\n 'http://www.w3.org/ns/rdftest#TestMicrodataEval':\n new TestCaseEvalHandler({ normalizeUrl: true }),\n 'http://www.w3.org/ns/rdftest#TestMicrodataNegativeSyntax':\n new TestCaseSyntaxHandler(true), // Microdata-RDF test suite never expect errors, just empty documents\n\n // N3 test suite\n 'https://w3c.github.io/N3/tests/test.n3#TestN3PositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'https://w3c.github.io/N3/tests/test.n3#TestN3NegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'https://w3c.github.io/N3/tests/test.n3#TestN3Eval':\n new TestCaseEvalHandler(),\n\n};\n"]}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type * as RDF from '@rdfjs/types';
|
|
2
|
+
/**
|
|
3
|
+
* A running endpoint for Service Description conformance tests.
|
|
4
|
+
*/
|
|
5
|
+
export interface IServiceDescriptionEndpoint {
|
|
6
|
+
endpoint: string;
|
|
7
|
+
close: () => Promise<void>;
|
|
8
|
+
}
|
|
2
9
|
/**
|
|
3
10
|
* A query engine handler.
|
|
4
11
|
*/
|
|
@@ -6,6 +13,7 @@ export interface IQueryEngine {
|
|
|
6
13
|
parse: (queryString: string, options: Record<string, any>) => Promise<void>;
|
|
7
14
|
query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;
|
|
8
15
|
queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;
|
|
16
|
+
startServiceDescriptionEndpoint?: () => Promise<IServiceDescriptionEndpoint>;
|
|
9
17
|
}
|
|
10
18
|
/**
|
|
11
19
|
* Super type for all query result types.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IQueryEngine.js","sourceRoot":"","sources":["IQueryEngine.ts"],"names":[],"mappings":"","sourcesContent":["import type * as RDF from '@rdfjs/types';\n\n/**\n * A query engine handler.\n */\nexport interface IQueryEngine {\n parse: (queryString: string, options: Record<string, any>) => Promise<void>;\n query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;\n queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;\n}\n\n/**\n * Super type for all query result types.\n */\nexport type IQueryResult = IQueryResultBoolean | IQueryResultQuads | IQueryResultBindings;\n\n/**\n * Holds a boolean query result.\n */\nexport interface IQueryResultBoolean {\n type: 'boolean';\n value: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds quad-based query results.\n */\nexport interface IQueryResultQuads {\n type: 'quads';\n value: RDF.Quad[];\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds bindings-based query results.\n */\nexport interface IQueryResultBindings {\n type: 'bindings';\n variables: string[];\n value: Record<string, RDF.Term>[];\n checkOrder: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IQueryEngine.js","sourceRoot":"","sources":["IQueryEngine.ts"],"names":[],"mappings":"","sourcesContent":["import type * as RDF from '@rdfjs/types';\n\n/**\n * A running endpoint for Service Description conformance tests.\n */\nexport interface IServiceDescriptionEndpoint {\n endpoint: string;\n close: () => Promise<void>;\n}\n\n/**\n * A query engine handler.\n */\nexport interface IQueryEngine {\n parse: (queryString: string, options: Record<string, any>) => Promise<void>;\n query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;\n queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;\n startServiceDescriptionEndpoint?: () => Promise<IServiceDescriptionEndpoint>;\n}\n\n/**\n * Super type for all query result types.\n */\nexport type IQueryResult = IQueryResultBoolean | IQueryResultQuads | IQueryResultBindings;\n\n/**\n * Holds a boolean query result.\n */\nexport interface IQueryResultBoolean {\n type: 'boolean';\n value: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds quad-based query results.\n */\nexport interface IQueryResultQuads {\n type: 'quads';\n value: RDF.Quad[];\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds bindings-based query results.\n */\nexport interface IQueryResultBindings {\n type: 'bindings';\n variables: string[];\n value: Record<string, RDF.Term>[];\n checkOrder: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Resource } from 'rdf-object';
|
|
2
|
+
import type { ITestCaseData } from '../ITestCase';
|
|
3
|
+
import type { ITestCaseHandler } from '../ITestCaseHandler';
|
|
4
|
+
import type { IQueryEngine } from './IQueryEngine';
|
|
5
|
+
import type { ITestCaseSparql } from './ITestCaseSparql';
|
|
6
|
+
export interface IServiceDescriptionTestOptions {
|
|
7
|
+
/** The SPARQL endpoint whose service description is under test. */
|
|
8
|
+
serviceDescriptionEndpoint?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TestCaseServiceDescriptionHandler implements ITestCaseHandler<TestCaseServiceDescription> {
|
|
14
|
+
resourceToTestCase(_resource: Resource, testCaseData: ITestCaseData): Promise<TestCaseServiceDescription>;
|
|
15
|
+
}
|
|
16
|
+
export declare class TestCaseServiceDescription implements ITestCaseSparql {
|
|
17
|
+
readonly type = "sparql";
|
|
18
|
+
readonly approval: string;
|
|
19
|
+
readonly approvedBy: string;
|
|
20
|
+
readonly comment: string;
|
|
21
|
+
readonly types: string[];
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly uri: string;
|
|
24
|
+
constructor(testCaseData: ITestCaseData);
|
|
25
|
+
test(_engine: IQueryEngine, injectArguments: IServiceDescriptionTestOptions): Promise<void>;
|
|
26
|
+
private static getEndpoint;
|
|
27
|
+
private static getServiceDescription;
|
|
28
|
+
private static validateSchema;
|
|
29
|
+
private static termKey;
|
|
30
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TestCaseServiceDescription = exports.TestCaseServiceDescriptionHandler = void 0;
|
|
13
|
+
const arrayify_stream_1 = require("arrayify-stream");
|
|
14
|
+
const ErrorTest_1 = require("../../ErrorTest");
|
|
15
|
+
const Util_1 = require("../../Util");
|
|
16
|
+
const RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';
|
|
17
|
+
const SD = 'http://www.w3.org/ns/sparql-service-description#';
|
|
18
|
+
/**
|
|
19
|
+
* Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest.
|
|
20
|
+
*/
|
|
21
|
+
class TestCaseServiceDescriptionHandler {
|
|
22
|
+
resourceToTestCase(_resource, testCaseData) {
|
|
23
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
return new TestCaseServiceDescription(testCaseData);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.TestCaseServiceDescriptionHandler = TestCaseServiceDescriptionHandler;
|
|
29
|
+
class TestCaseServiceDescription {
|
|
30
|
+
constructor(testCaseData) {
|
|
31
|
+
this.type = 'sparql';
|
|
32
|
+
Object.assign(this, testCaseData);
|
|
33
|
+
}
|
|
34
|
+
test(_engine, injectArguments) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
const endpoint = TestCaseServiceDescription.getEndpoint(injectArguments);
|
|
37
|
+
switch (this.name) {
|
|
38
|
+
case 'GET on endpoint returns RDF':
|
|
39
|
+
yield TestCaseServiceDescription.getServiceDescription(endpoint);
|
|
40
|
+
return;
|
|
41
|
+
case 'Service description contains a matching sd:endpoint triple': {
|
|
42
|
+
const serviceDescription = yield TestCaseServiceDescription.getServiceDescription(endpoint);
|
|
43
|
+
if (!serviceDescription.some(quad => quad.predicate.value === `${SD}endpoint` &&
|
|
44
|
+
quad.object.termType === 'NamedNode' && quad.object.value === endpoint)) {
|
|
45
|
+
throw new ErrorTest_1.ErrorTest(`Service description at ${endpoint} does not contain a matching sd:endpoint triple.`);
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
case 'Service description conforms to schema': {
|
|
50
|
+
const serviceDescription = yield TestCaseServiceDescription.getServiceDescription(endpoint);
|
|
51
|
+
TestCaseServiceDescription.validateSchema(serviceDescription, endpoint);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
default:
|
|
55
|
+
throw new ErrorTest_1.ErrorTest(`Unsupported SPARQL service-description test: ${this.name}`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
static getEndpoint(injectArguments) {
|
|
60
|
+
const endpoint = injectArguments && injectArguments.serviceDescriptionEndpoint;
|
|
61
|
+
if (!endpoint) {
|
|
62
|
+
throw new ErrorTest_1.ErrorTest('Service-description tests require an endpoint from startServiceDescriptionEndpoint or the serviceDescriptionEndpoint option.');
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const url = new URL(endpoint);
|
|
66
|
+
if (url.search || url.hash) {
|
|
67
|
+
throw new Error('The endpoint URL must not contain query parameters or a fragment');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new ErrorTest_1.ErrorTest(`Invalid serviceDescriptionEndpoint: ${error.message}`);
|
|
72
|
+
}
|
|
73
|
+
return endpoint;
|
|
74
|
+
}
|
|
75
|
+
static getServiceDescription(endpoint) {
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
try {
|
|
78
|
+
const response = yield Util_1.Util.fetchCached(endpoint, {}, {
|
|
79
|
+
headers: {
|
|
80
|
+
accept: 'text/turtle, application/rdf+xml;q=0.9, application/ld+json;q=0.8',
|
|
81
|
+
},
|
|
82
|
+
method: 'GET',
|
|
83
|
+
});
|
|
84
|
+
const contentType = Util_1.Util.identifyContentType(response.url, response.headers);
|
|
85
|
+
return yield (0, arrayify_stream_1.arrayifyStream)(Util_1.Util.parseRdfRaw(contentType, endpoint, response.body));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new ErrorTest_1.ErrorTest(`Could not retrieve an RDF service description from ${endpoint}: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
static validateSchema(serviceDescription, endpoint) {
|
|
93
|
+
const namedGraphs = new Set();
|
|
94
|
+
const namedGraphsWithName = new Set();
|
|
95
|
+
const datasets = new Set();
|
|
96
|
+
const datasetsWithDefaultGraph = new Set();
|
|
97
|
+
for (const quad of serviceDescription) {
|
|
98
|
+
const subject = TestCaseServiceDescription.termKey(quad.subject);
|
|
99
|
+
if (quad.predicate.value === `${SD}endpoint` && quad.object.termType !== 'NamedNode') {
|
|
100
|
+
throw new ErrorTest_1.ErrorTest(`The sd:endpoint value in the service description at ${endpoint} must be an IRI.`);
|
|
101
|
+
}
|
|
102
|
+
if (quad.predicate.value === `${SD}name`) {
|
|
103
|
+
if (quad.object.termType !== 'NamedNode') {
|
|
104
|
+
throw new ErrorTest_1.ErrorTest(`The sd:name value in the service description at ${endpoint} must be an IRI.`);
|
|
105
|
+
}
|
|
106
|
+
namedGraphsWithName.add(subject);
|
|
107
|
+
}
|
|
108
|
+
if (quad.predicate.value === `${SD}namedGraph`) {
|
|
109
|
+
namedGraphs.add(TestCaseServiceDescription.termKey(quad.object));
|
|
110
|
+
}
|
|
111
|
+
if (quad.predicate.value === `${SD}defaultGraph`) {
|
|
112
|
+
datasetsWithDefaultGraph.add(subject);
|
|
113
|
+
}
|
|
114
|
+
if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}NamedGraph`) {
|
|
115
|
+
namedGraphs.add(subject);
|
|
116
|
+
}
|
|
117
|
+
if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}Dataset`) {
|
|
118
|
+
datasets.add(subject);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (const namedGraph of namedGraphs) {
|
|
122
|
+
if (!namedGraphsWithName.has(namedGraph)) {
|
|
123
|
+
throw new ErrorTest_1.ErrorTest(`Each sd:NamedGraph in the service description at ${endpoint} must have an sd:name.`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const dataset of datasets) {
|
|
127
|
+
if (!datasetsWithDefaultGraph.has(dataset)) {
|
|
128
|
+
throw new ErrorTest_1.ErrorTest(`Each sd:Dataset in the service description at ${endpoint} must have an sd:defaultGraph.`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
static termKey(term) {
|
|
133
|
+
return `${term.termType}:${term.value}`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.TestCaseServiceDescription = TestCaseServiceDescription;
|
|
137
|
+
//# sourceMappingURL=TestCaseServiceDescription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestCaseServiceDescription.js","sourceRoot":"","sources":["TestCaseServiceDescription.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,qDAAiD;AAEjD,+CAA4C;AAC5C,qCAAkC;AAMlC,MAAM,QAAQ,GAAG,iDAAiD,CAAC;AACnE,MAAM,EAAE,GAAG,kDAAkD,CAAC;AAO9D;;GAEG;AACH,MAAa,iCAAiC;IAC/B,kBAAkB,CAAC,SAAmB,EAAE,YAA2B;;YAC9E,OAAO,IAAI,0BAA0B,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC;KAAA;CACF;AAJD,8EAIC;AAED,MAAa,0BAA0B;IASrC,YAAmB,YAA2B;QAR9B,SAAI,GAAG,QAAQ,CAAC;QAS9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACpC,CAAC;IAEY,IAAI,CAAC,OAAqB,EAAE,eAA+C;;YACtF,MAAM,QAAQ,GAAG,0BAA0B,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAEzE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,6BAA6B;oBAChC,MAAM,0BAA0B,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;oBACjE,OAAO;gBACT,KAAK,4DAA4D,CAAC,CAAC,CAAC;oBAClE,MAAM,kBAAkB,GAAG,MAAM,0BAA0B,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;oBAC5F,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,UAAU;wBAC3E,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;wBAC1E,MAAM,IAAI,qBAAS,CAAC,0BAA0B,QAAQ,kDAAkD,CAAC,CAAC;oBAC5G,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,KAAK,wCAAwC,CAAC,CAAC,CAAC;oBAC9C,MAAM,kBAAkB,GAAG,MAAM,0BAA0B,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;oBAC5F,0BAA0B,CAAC,cAAc,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;oBACxE,OAAO;gBACT,CAAC;gBACD;oBACE,MAAM,IAAI,qBAAS,CAAC,gDAAgD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;KAAA;IAEO,MAAM,CAAC,WAAW,CAAC,eAA+C;QACxE,MAAM,QAAQ,GAAG,eAAe,IAAI,eAAe,CAAC,0BAA0B,CAAC;QAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,qBAAS,CAAC,8HAA8H,CAAC,CAAC;QACtJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,qBAAS,CAAC,uCAAwC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,MAAM,CAAO,qBAAqB,CAAC,QAAgB;;YACzD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,WAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE;oBACpD,OAAO,EAAE;wBACP,MAAM,EAAE,mEAAmE;qBAC5E;oBACD,MAAM,EAAE,KAAK;iBACd,CAAC,CAAC;gBACH,MAAM,WAAW,GAAG,WAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC7E,OAAO,MAAM,IAAA,gCAAc,EAAC,WAAI,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACtF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,qBAAS,CAAC,sDAAsD,QAAQ,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACrH,CAAC;QACH,CAAC;KAAA;IAEO,MAAM,CAAC,cAAc,CAAC,kBAA8B,EAAE,QAAgB;QAC5E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnD,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACrF,MAAM,IAAI,qBAAS,CAAC,uDAAuD,QAAQ,kBAAkB,CAAC,CAAC;YACzG,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,MAAM,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;oBACzC,MAAM,IAAI,qBAAS,CAAC,mDAAmD,QAAQ,kBAAkB,CAAC,CAAC;gBACrG,CAAC;gBACD,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,YAAY,EAAE,CAAC;gBAC/C,WAAW,CAAC,GAAG,CAAC,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,cAAc,EAAE,CAAC;gBACjD,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,YAAY,EAAE,CAAC;gBACjF,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC;gBAC9E,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,qBAAS,CAAC,oDAAoD,QAAQ,wBAAwB,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,qBAAS,CAAC,iDAAiD,QAAQ,gCAAgC,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,OAAO,CAAC,IAAc;QACnC,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;CACF;AAnHD,gEAmHC","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport type { Resource } from 'rdf-object';\nimport { ErrorTest } from '../../ErrorTest';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\n\nconst RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';\nconst SD = 'http://www.w3.org/ns/sparql-service-description#';\n\nexport interface IServiceDescriptionTestOptions {\n /** The SPARQL endpoint whose service description is under test. */\n serviceDescriptionEndpoint?: string;\n}\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest.\n */\nexport class TestCaseServiceDescriptionHandler implements ITestCaseHandler<TestCaseServiceDescription> {\n public async resourceToTestCase(_resource: Resource, testCaseData: ITestCaseData): Promise<TestCaseServiceDescription> {\n return new TestCaseServiceDescription(testCaseData);\n }\n}\n\nexport class TestCaseServiceDescription 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 constructor(testCaseData: ITestCaseData) {\n Object.assign(this, testCaseData);\n }\n\n public async test(_engine: IQueryEngine, injectArguments: IServiceDescriptionTestOptions): Promise<void> {\n const endpoint = TestCaseServiceDescription.getEndpoint(injectArguments);\n\n switch (this.name) {\n case 'GET on endpoint returns RDF':\n await TestCaseServiceDescription.getServiceDescription(endpoint);\n return;\n case 'Service description contains a matching sd:endpoint triple': {\n const serviceDescription = await TestCaseServiceDescription.getServiceDescription(endpoint);\n if (!serviceDescription.some(quad => quad.predicate.value === `${SD}endpoint` &&\n quad.object.termType === 'NamedNode' && quad.object.value === endpoint)) {\n throw new ErrorTest(`Service description at ${endpoint} does not contain a matching sd:endpoint triple.`);\n }\n return;\n }\n case 'Service description conforms to schema': {\n const serviceDescription = await TestCaseServiceDescription.getServiceDescription(endpoint);\n TestCaseServiceDescription.validateSchema(serviceDescription, endpoint);\n return;\n }\n default:\n throw new ErrorTest(`Unsupported SPARQL service-description test: ${this.name}`);\n }\n }\n\n private static getEndpoint(injectArguments: IServiceDescriptionTestOptions): string {\n const endpoint = injectArguments && injectArguments.serviceDescriptionEndpoint;\n if (!endpoint) {\n throw new ErrorTest('Service-description tests require an endpoint from startServiceDescriptionEndpoint or the serviceDescriptionEndpoint option.');\n }\n try {\n const url = new URL(endpoint);\n if (url.search || url.hash) {\n throw new Error('The endpoint URL must not contain query parameters or a fragment');\n }\n } catch (error) {\n throw new ErrorTest(`Invalid serviceDescriptionEndpoint: ${(error as Error).message}`);\n }\n return endpoint;\n }\n\n private static async getServiceDescription(endpoint: string): Promise<RDF.Quad[]> {\n try {\n const response = await Util.fetchCached(endpoint, {}, {\n headers: {\n accept: 'text/turtle, application/rdf+xml;q=0.9, application/ld+json;q=0.8',\n },\n method: 'GET',\n });\n const contentType = Util.identifyContentType(response.url, response.headers);\n return await arrayifyStream(Util.parseRdfRaw(contentType, endpoint, response.body));\n } catch (error) {\n throw new ErrorTest(`Could not retrieve an RDF service description from ${endpoint}: ${(error as Error).message}`);\n }\n }\n\n private static validateSchema(serviceDescription: RDF.Quad[], endpoint: string): void {\n const namedGraphs = new Set<string>();\n const namedGraphsWithName = new Set<string>();\n const datasets = new Set<string>();\n const datasetsWithDefaultGraph = new Set<string>();\n\n for (const quad of serviceDescription) {\n const subject = TestCaseServiceDescription.termKey(quad.subject);\n if (quad.predicate.value === `${SD}endpoint` && quad.object.termType !== 'NamedNode') {\n throw new ErrorTest(`The sd:endpoint value in the service description at ${endpoint} must be an IRI.`);\n }\n if (quad.predicate.value === `${SD}name`) {\n if (quad.object.termType !== 'NamedNode') {\n throw new ErrorTest(`The sd:name value in the service description at ${endpoint} must be an IRI.`);\n }\n namedGraphsWithName.add(subject);\n }\n if (quad.predicate.value === `${SD}namedGraph`) {\n namedGraphs.add(TestCaseServiceDescription.termKey(quad.object));\n }\n if (quad.predicate.value === `${SD}defaultGraph`) {\n datasetsWithDefaultGraph.add(subject);\n }\n if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}NamedGraph`) {\n namedGraphs.add(subject);\n }\n if (quad.predicate.value === RDF_TYPE && quad.object.value === `${SD}Dataset`) {\n datasets.add(subject);\n }\n }\n\n for (const namedGraph of namedGraphs) {\n if (!namedGraphsWithName.has(namedGraph)) {\n throw new ErrorTest(`Each sd:NamedGraph in the service description at ${endpoint} must have an sd:name.`);\n }\n }\n for (const dataset of datasets) {\n if (!datasetsWithDefaultGraph.has(dataset)) {\n throw new ErrorTest(`Each sd:Dataset in the service description at ${endpoint} must have an sd:defaultGraph.`);\n }\n }\n }\n\n private static termKey(term: RDF.Term): string {\n return `${term.termType}:${term.value}`;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rdf-test-suite",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
|
|
5
5
|
"description": "Executes the RDF and SPARQL test suites.",
|
|
6
6
|
"typings": "index",
|