import { assert, describe, expect, it } from "vitest"; import { Quad, NamedNode } from "n3"; import { Patch, QuadPattern } from "./patch"; import * as N3 from "n3"; const node1 = new NamedNode("http://example.com/node1"); const node2 = new NamedNode("http://example.com/node2"); const node3 = new NamedNode("http://example.com/node3"); const decimalDT = new NamedNode("http://www.w3.org/2001/XMLSchema#decimal"); function QP( subject: N3.Quad_Subject | null, // predicate: N3.Quad_Predicate | null, object: N3.Quad_Object | null, graph: N3.Quad_Graph | null ): QuadPattern { return { subject, predicate, object, graph }; } describe("Patch.matches", () => { it("matches any quads against an open pattern", () => { const quad1 = new Quad(node1, node2, node3); const quad2 = new Quad(node1, node2, node3); const quad3 = new Quad(node1, node2, node3); const pattern = QP(null, null, null, null); const p = new Patch([quad1, quad2], [quad3]); assert.isTrue(p.matches(pattern)); }); it("doesn't match when the patch is empty", () => { const p = new Patch([], []); assert.isFalse(p.matches(QP(null, null, null, null))); }); it("compares terms correctly", () => { assert.isTrue(new Patch([new Quad(node1, node2, node3)], []).matches(QP(node1, null, null, null))); assert.isFalse(new Patch([new Quad(node1, node2, node3)], []).matches(QP(node2, null, null, null))); }); it("matches on just one set term", () => { assert.isTrue(new Patch([new Quad(node1, node2, node3)], []).matches(QP(node1, null, null, null))); assert.isTrue(new Patch([new Quad(node1, node2, node3)], []).matches(QP(null, node2, null, null))); assert.isTrue(new Patch([new Quad(node1, node2, node3)], []).matches(QP(null, null, node3, null))); }); }); describe("Patch.empty", () => { it("works with no quads", () => { const p = new Patch([], []); assert.isTrue(p.isEmpty()); }); it("works with unmatched quads", () => { const p = new Patch([], [new Quad(node1, node2, node3)]); assert.isFalse(p.isEmpty()); }); it("understands floats are equal", () => { const p = new Patch( [new Quad(node1, node2, N3.DataFactory.literal((0.12345).toPrecision(3), decimalDT))], [new Quad(node1, node2, N3.DataFactory.literal((0.1234).toPrecision(3), decimalDT))] ); assert.isTrue(p.isEmpty()); }); it("...and when they're not", () => { const p = new Patch( [new Quad(node1, node2, N3.DataFactory.literal(0.123, decimalDT))], // [new Quad(node1, node2, N3.DataFactory.literal(0.124, decimalDT))] ); assert.isFalse(p.isEmpty()); }); it("understands literals are equal", () => { const p = new Patch( [new Quad(node1, node2, node3)], // [new Quad(node1, node2, new NamedNode("http://example.com/node" + "3"))] ); assert.isTrue(p.isEmpty()); }); });