UNPKG

rdf-ext

Version:

RDF-Ext is a developer-friendly extension for RDF/JS

391 lines (290 loc) 13.1 kB
import { deepStrictEqual, rejects, strictEqual } from 'assert' import { describe, it } from 'mocha' import { Readable } from 'readable-stream' import chunks from 'stream-chunks/chunks.js' import rdf from '../index.js' import Dataset from '../lib/Dataset.js' import example from './support/exampleData.js' import spogFilter from './support/spogFilter.js' describe('Dataset', () => { describe('.addAll', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.addAll, 'function') }) it('should import all quads from the given iterable', () => { const dataset1 = new Dataset([example.quad1]) const dataset2 = new Dataset([example.quad2]) const dataset3 = dataset1.addAll(dataset2) strictEqual(dataset1.size, 2) strictEqual(dataset2.size, 1) strictEqual(dataset3.size, 2) }) }) describe('.clone', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.clone, 'function') }) it('should create a new dataset instance that contains all quads of the original', () => { const dataset = new Dataset() dataset.add(example.quad) const clone = dataset.clone() strictEqual(dataset === clone, false) strictEqual(clone.has(example.quad), true) }) }) describe('.difference', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.difference, 'function') }) it('should return a dataset with quads not included in the other dataset', () => { const dataset1 = new Dataset([example.quad1, example.quad2]) const dataset2 = new Dataset([example.quad2, example.quad3]) const difference = dataset1.difference(dataset2) strictEqual(difference.size, 1) strictEqual(difference.has(example.quad1), true) }) }) describe('.every', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.every, 'function') }) it('should return true if every quad pass the filter test', () => { const dataset = new Dataset([example.quad1, example.quad2]) strictEqual(dataset.every(spogFilter(example.subject, null, null)), true) strictEqual(dataset.every(spogFilter(null, null, example.object3)), false) }) }) describe('.filter', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.filter, 'function') }) it('.filter should return a new dataset that contains all quads that pass the filter test', () => { const dataset = new Dataset([example.quad1, example.quad2]) strictEqual(dataset.filter(spogFilter(example.subject, null, null)).size, 2) strictEqual(dataset.filter(spogFilter(null, null, example.object1)).size, 1) strictEqual(dataset.filter(spogFilter(null, null, example.object3)).size, 0) }) }) describe('.forEach', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.forEach, 'function') }) it('should call the callback function for every quad', () => { const objects = [] const dataset = new Dataset([example.quad1, example.quad2]) dataset.forEach(quad => objects.push(quad.object.value)) deepStrictEqual(objects, ['1', '2']) }) }) describe('.import', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.import, 'function') }) it('.import should import quads from stream', async () => { const stream = Readable.from([example.quad1, example.quad2]) const dataset = new Dataset() await dataset.import(stream) strictEqual(dataset.has(example.quad1), true) strictEqual(dataset.has(example.quad2), true) }) it('.import should forward stream errors', async () => { const stream = new Readable({ read: () => { stream.destroy(new Error('example')) } }) const dataset = new Dataset() await rejects(async () => { await dataset.import(stream) }) }) }) describe('.intersection', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.intersection, 'function') }) it('should return a dataset with quads included also in the other dataset', () => { const dataset1 = new Dataset([example.quad1, example.quad2]) const dataset2 = new Dataset([example.quad2, example.quad3]) const intersection = dataset1.intersection(dataset2) strictEqual(intersection.size, 1) strictEqual(intersection.has(example.quad2), true) }) }) describe('.map', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.map, 'function') }) it('should call the callback function for every quad and return a Dataset that contains the new quads', () => { const mappedQuad = rdf.quad(example.subject, example.predicate, rdf.literal('11')) const dataset = new Dataset([example.quad1]) const mappedDataset = dataset.map(quad => { return rdf.quad(quad.subject, quad.predicate, rdf.literal(quad.object.value + '1')) }) strictEqual(mappedDataset.size, 1) strictEqual(mappedDataset.has(mappedQuad), true) }) }) describe('.merge', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.merge, 'function') }) it('should return a new dataset that contains all quads from the dataset and the given dataset', () => { const dataset1 = new Dataset([example.quad1]) const dataset2 = new Dataset([example.quad2]) const dataset3 = dataset1.merge(dataset2) strictEqual(dataset1.size, 1) strictEqual(dataset2.size, 1) strictEqual(dataset3.size, 2) }) }) describe('.deleteMatches', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.deleteMatches, 'function') }) it('should remove all quads that pass the subject match pattern and return the dataset itself', () => { const quad1 = rdf.quad(example.subject1, example.predicate, example.object, example.graph) const quad2 = rdf.quad(example.subject2, example.predicate, example.object, example.graph) const dataset = new Dataset([quad1, quad2]) strictEqual(dataset.deleteMatches(example.subject3, null, null, null).size, 2) strictEqual(dataset.deleteMatches(example.subject2, null, null, null).size, 1) strictEqual(dataset.deleteMatches(example.subject1, null, null, null).size, 0) }) it('should remove all quads that pass the predicate match pattern and return the dataset itself', () => { const quad1 = rdf.quad(example.subject, example.predicate1, example.object, example.graph) const quad2 = rdf.quad(example.subject, example.predicate2, example.object, example.graph) const dataset = new Dataset([quad1, quad2]) strictEqual(dataset.deleteMatches(null, example.predicate3, null, null).size, 2) strictEqual(dataset.deleteMatches(null, example.predicate2, null, null).size, 1) strictEqual(dataset.deleteMatches(null, example.predicate1, null, null).size, 0) }) it('should remove all quads that pass the object match pattern and return the dataset itself', () => { const quad1 = rdf.quad(example.subject, example.predicate, example.object1, example.graph) const quad2 = rdf.quad(example.subject, example.predicate, example.object2, example.graph) const dataset = new Dataset([quad1, quad2]) strictEqual(dataset.deleteMatches(null, null, example.object3, null).size, 2) strictEqual(dataset.deleteMatches(null, null, example.object2, null).size, 1) strictEqual(dataset.deleteMatches(null, null, example.object1, null).size, 0) }) it('should remove all quads that pass the graph match pattern and return the dataset itself', () => { const quad1 = rdf.quad(example.subject, example.predicate, example.object, example.graph1) const quad2 = rdf.quad(example.subject, example.predicate, example.object, example.graph2) const dataset = new Dataset([quad1, quad2]) strictEqual(dataset.deleteMatches(null, null, null, example.graph3).size, 2) strictEqual(dataset.deleteMatches(null, null, null, example.graph2).size, 1) strictEqual(dataset.deleteMatches(null, null, null, example.graph1).size, 0) }) }) describe('.reduce', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.reduce, 'function') }) it('should call the callback function with the result of the previous value as first argument', () => { const dataset = new Dataset([example.quad1, example.quad2]) const result = dataset.reduce((value, quad) => value + quad.object.value, '') strictEqual(result, '12') }) it('should call the callback function for every quad with the quad as second argument', () => { const objects = [] const dataset = new Dataset([example.quad1, example.quad2]) dataset.reduce((accumulator, quad) => objects.push(quad.object.value)) deepStrictEqual(objects, ['1', '2']) }) it('should call the callback function with the index as third argument', () => { const dataset = new Dataset([example.quad1, example.quad2]) const result = dataset.reduce((value, quad, index) => value + index, '') strictEqual(result, '01') }) it('should call the callback function with the dataset as fourth argument', () => { const datasets = [] const dataset = new Dataset([example.quad1, example.quad2]) dataset.reduce((value, quad, index, dataset) => datasets.push(dataset)) strictEqual(datasets.length, 2) strictEqual(datasets[0], dataset) strictEqual(datasets[1], dataset) }) it('should use the initial value', () => { const objects = [] const dataset = new Dataset([example.quad1, example.quad2]) const result = dataset.reduce((value, quad) => value + objects.push(quad.object.value), '0') strictEqual(result, '012') }) }) describe('.some', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.some, 'function') }) it('should return true if any quad passes the filter test', () => { const dataset = new Dataset([example.quad1, example.quad2]) strictEqual(dataset.some(spogFilter(null, null, example.object2)), true) strictEqual(dataset.some(spogFilter(null, null, example.object3)), false) }) }) describe('.toStream', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.toStream, 'function') }) it('should return a stream which emits all quads of the dataset', async () => { const dataset = new Dataset([example.quad1, example.quad2]) const stream = dataset.toStream() const output = await chunks(stream) strictEqual(output.length, 2) strictEqual(dataset.has(output[0]), true) strictEqual(dataset.has(output[1]), true) strictEqual(output[0].equals(output[1]), false) }) }) describe('.equals', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.equals, 'function') }) it('should compare the other graph for equality', () => { const quad1a = rdf.quad(example.subject, example.predicate, rdf.blankNode()) const quad1b = rdf.quad(example.subject, example.predicate, rdf.blankNode()) const dataset1a = rdf.dataset([quad1a]) const dataset1b = rdf.dataset([quad1b]) const dataset2 = rdf.dataset([example.quad2]) strictEqual(dataset1a.equals(dataset1b), true) strictEqual(dataset1a.equals(dataset2), false) }) }) describe('.toCanonical', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.toCanonical, 'function') }) it('should return the canonical representation', () => { const quad = rdf.quad(example.subject, example.predicate, rdf.blankNode()) const quadNT = `${quad.subject.toCanonical()} ${quad.predicate.toCanonical()} _:c14n0 .\n` const dataset = rdf.dataset([quad]) strictEqual(dataset.toCanonical(), quadNT, true) }) }) describe('.toString', () => { it('should be a method', () => { const dataset = new Dataset() strictEqual(typeof dataset.toString, 'function') }) it('should return N-Quads', () => { const quad = rdf.quad(example.subject, example.predicate, example.object, example.graph) const quadNT = `${quad.toString()}\n` const dataset = rdf.dataset([quad]) strictEqual(dataset.toString(), quadNT) }) }) })