/* global describe, it */ import assert from "node:assert"; import dataModel from "@rdfjs/data-model"; import { Store } from "../pkg/oxigraph.js"; const ex = dataModel.namedNode("http://example.com"); const triple = dataModel.quad( dataModel.blankNode("s"), dataModel.namedNode("http://example.com/p"), dataModel.literal("o"), ); describe("Store", () => { describe("#add()", () => { it("an added quad should be in the store", () => { const store = new Store(); store.add(dataModel.quad(ex, ex, triple)); assert(store.has(dataModel.quad(ex, ex, triple))); }); }); describe("#delete()", () => { it("an removed quad should not be in the store anymore", () => { const store = new Store([dataModel.quad(triple, ex, ex)]); assert(store.has(dataModel.quad(triple, ex, ex))); store.delete(dataModel.quad(triple, ex, ex)); assert(!store.has(dataModel.quad(triple, ex, ex))); }); }); describe("#has()", () => { it("an added quad should be in the store", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); assert(store.has(dataModel.quad(ex, ex, ex))); }); }); describe("#size()", () => { it("A store with one quad should have 1 for size", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); assert.strictEqual(1, store.size); }); }); describe("#match_quads()", () => { it("blank pattern should return all quads", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.match(); assert.strictEqual(1, results.length); assert(dataModel.quad(ex, ex, ex).equals(results[0])); }); }); describe("#query()", () => { it("ASK true", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); assert.strictEqual(true, store.query("ASK { ?s ?s ?s }")); }); it("ASK false", () => { const store = new Store(); assert.strictEqual(false, store.query("ASK { FILTER(false)}")); }); it("CONSTRUCT", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query("CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }"); assert.strictEqual(1, results.length); assert(dataModel.quad(ex, ex, ex).equals(results[0])); }); it("SELECT", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query("SELECT ?s WHERE { ?s ?p ?o }"); assert.strictEqual(1, results.length); assert(ex.equals(results[0].get("s"))); }); it("SELECT with NOW()", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query( "SELECT * WHERE { FILTER(2022 <= YEAR(NOW()) && YEAR(NOW()) <= 2100) }", ); assert.strictEqual(1, results.length); }); it("SELECT with RAND()", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query("SELECT (RAND() AS ?y) WHERE {}"); assert.strictEqual(1, results.length); }); it("SELECT with base IRI", () => { const store = new Store(); const results = store.query("SELECT * WHERE { BIND( AS ?t) }", { base_iri: "http://example.com/", }); assert.strictEqual(1, results.length); }); it("SELECT with union graph", () => { const store = new Store([dataModel.quad(ex, ex, ex, ex)]); const results = store.query("SELECT * WHERE { ?s ?p ?o }", { use_default_graph_as_union: true, }); assert.strictEqual(1, results.length); }); }); describe("#update()", () => { it("INSERT DATA", () => { const store = new Store(); store.update( "INSERT DATA { }", ); assert.strictEqual(1, store.size); }); it("DELETE DATA", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); store.update( "DELETE DATA { }", ); assert.strictEqual(0, store.size); }); it("DELETE WHERE", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); store.update("DELETE WHERE { ?v ?v ?v }"); assert.strictEqual(0, store.size); }); }); describe("#load()", () => { it("load NTriples in the default graph", () => { const store = new Store(); store.load( " .", "application/n-triples", ); assert(store.has(dataModel.quad(ex, ex, ex))); }); it("load NTriples in an other graph", () => { const store = new Store(); store.load( " .", "application/n-triples", null, ex, ); assert(store.has(dataModel.quad(ex, ex, ex, ex))); }); it("load Turtle with a base IRI", () => { const store = new Store(); store.load( " <> .", "text/turtle", "http://example.com", ); assert(store.has(dataModel.quad(ex, ex, ex))); }); it("load NQuads", () => { const store = new Store(); store.load( " .", "application/n-quads", ); assert(store.has(dataModel.quad(ex, ex, ex, ex))); }); it("load TriG with a base IRI", () => { const store = new Store(); store.load( "GRAPH <> { <> }", "application/trig", "http://example.com", ); assert(store.has(dataModel.quad(ex, ex, ex, ex))); }); }); describe("#dump()", () => { it("dump dataset content", () => { const store = new Store([dataModel.quad(ex, ex, ex, ex)]); assert.strictEqual( " .\n", store.dump("application/n-quads"), ); }); it("dump named graph content", () => { const store = new Store([dataModel.quad(ex, ex, ex, ex)]); assert.strictEqual( " .\n", store.dump("application/n-triples", ex), ); }); it("dump default graph content", () => { const store = new Store([dataModel.quad(ex, ex, ex, ex)]); assert.strictEqual("", store.dump("application/n-triples", dataModel.defaultGraph())); }); }); });