UNPKG

@rdfjs/traverser

Version:

Generic traverser for RDF/JS datasets

264 lines (229 loc) 5.71 kB
import { deepStrictEqual, strictEqual } from 'assert' import toNT from '@rdfjs/to-ntriples' import { datasetEqual } from 'rdf-test/assert.js' import rdf from './factory.js' const ns = rdf.namespace('http://example.org/') class Example { constructor ({ backward = false, dataset, filterCalls = [], filter = () => true, forEachCalls = [], forward = true, match, reduce, reduceCalls = [], term }) { this.backward = backward this.filterCalls = filterCalls.map(({ level, quad }) => { return { level, quad: rdf.quad(quad[0], quad[1], quad[2], quad[3]) } }) this.forEachCalls = forEachCalls.map(({ level, quad }) => { return { level, quad: rdf.quad(quad[0], quad[1], quad[2], quad[3]) } }) this.reduceCalls = reduceCalls.map(({ level, quad, result }) => { return [ { level, quad: rdf.quad(quad[0], quad[1], quad[2], quad[3]) }, result ] }) this.dataset = rdf.dataset(dataset.map(data => { return rdf.quad(data[0], data[1], data[2], data[3]) })) this.filterCallback = filter this.reduceCallback = reduce this.forward = forward this.match = rdf.dataset(match && match.map(data => { return rdf.quad(data[0], data[1], data[2], data[3]) })) this.term = term this.factory = rdf this.actualFilterCalls = [] this.actualForEachCalls = [] this.actualReduceCalls = [] this.filter = this._filter.bind(this) this.forEach = this._forEach.bind(this) this.reduce = this._reduce.bind(this) } get args () { return [this.filter, this] } _filter (...args) { this.actualFilterCalls.push(args) return this.filterCallback(...args) } _forEach (...args) { this.actualForEachCalls.push(args) } _reduce (...args) { this.actualReduceCalls.push(args) if (this.reduceCallback) { return this.reduceCallback(...args) } } checkFilterCalls () { strictEqual(this.actualFilterCalls.length, this.filterCalls.length) this.filterCalls.forEach((filterCall, index) => { const actualFilterCall = this.actualFilterCalls[index] strictEqual(toNT(actualFilterCall[0].quad), toNT(filterCall.quad)) strictEqual(actualFilterCall[0].dataset, this.dataset) strictEqual(actualFilterCall[0].level, filterCall.level) }) } checkForEachCalls () { strictEqual(this.actualForEachCalls.length, this.forEachCalls.length) this.forEachCalls.forEach((forEachCall, index) => { const actualForEachCall = this.actualForEachCalls[index] strictEqual(toNT(actualForEachCall[0].quad), toNT(forEachCall.quad)) strictEqual(actualForEachCall[0].dataset, this.dataset) strictEqual(actualForEachCall[0].level, forEachCall.level) }) } checkReduceCalls () { strictEqual(this.actualReduceCalls.length, this.reduceCalls.length) this.reduceCalls.forEach((reduceCall, index) => { const actualReduceCall = this.actualReduceCalls[index] strictEqual(toNT(actualReduceCall[0].quad), toNT(reduceCall[0].quad)) strictEqual(actualReduceCall[0].dataset, this.dataset) strictEqual(actualReduceCall[0].level, reduceCall[0].level) deepStrictEqual(actualReduceCall[1], reduceCall[1]) }) } checkMatch (result) { datasetEqual(result, this.match) } } function backwardStop () { return new Example({ forward: false, backward: true, term: ns.d, dataset: [ [ns.a, ns.p2, ns.b], [ns.b, ns.p2, ns.c], [ns.c, ns.p1, ns.d] ], filter: ({ quad }) => quad.predicate.equals(ns.p1), filterCalls: [{ level: 0, quad: [ns.c, ns.p1, ns.d] }, { level: 1, quad: [ns.b, ns.p2, ns.c] }] }) } function callbackCall () { return new Example({ term: ns.a, dataset: [ [ns.a, ns.p1, ns.b], [ns.b, ns.p1, ns.c], [ns.c, ns.p2, ns.d] ], filter: ({ quad }) => quad.predicate.equals(ns.p1), forEachCalls: [{ level: 0, quad: [ns.a, ns.p1, ns.b] }, { level: 1, quad: [ns.b, ns.p1, ns.c] }], reduceCalls: [{ level: 0, quad: [ns.a, ns.p1, ns.b] }, { level: 1, quad: [ns.b, ns.p1, ns.c] }] }) } function filterCall () { return new Example({ term: ns.a, dataset: [ [ns.a, ns.p1, ns.b], [ns.b, ns.p1, ns.c] ], filterCalls: [{ level: 0, quad: [ns.a, ns.p1, ns.b] }, { level: 1, quad: [ns.b, ns.p1, ns.c] }] }) } function forwardStop () { return new Example({ term: ns.a, dataset: [ [ns.a, ns.p1, ns.b], [ns.b, ns.p2, ns.c], [ns.c, ns.p2, ns.d] ], filter: ({ quad }) => quad.predicate.equals(ns.p1), filterCalls: [{ level: 0, quad: [ns.a, ns.p1, ns.b] }, { level: 1, quad: [ns.b, ns.p2, ns.c] }] }) } function visitOnce () { return new Example({ term: ns.a, dataset: [ [ns.a, ns.p1, ns.b], [ns.b, ns.p2, ns.a] ], filterCalls: [{ level: 0, quad: [ns.a, ns.p1, ns.b] }, { level: 1, quad: [ns.b, ns.p2, ns.a] }] }) } function visitOnceLevel () { return new Example({ term: ns.a, dataset: [ [ns.a, ns.p1, ns.a], [ns.a, ns.p2, ns.b] ], filterCalls: [{ level: 0, quad: [ns.a, ns.p1, ns.a] }, { level: 1, quad: [ns.a, ns.p2, ns.b] }, { level: 0, quad: [ns.a, ns.p2, ns.b] }] }) } export default Example export { backwardStop, callbackCall, filterCall, forwardStop, visitOnce, visitOnceLevel }