/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.graph.test; import java.util.function.Function ; import junit.framework.TestSuite ; import org.apache.jena.graph.BlankNodeId ; import org.apache.jena.graph.Node ; import org.apache.jena.graph.NodeFactory ; import org.apache.jena.graph.Triple ; import org.apache.jena.graph.impl.LiteralLabel ; import org.apache.jena.graph.impl.LiteralLabelFactory ; import org.apache.jena.shared.PrefixMapping ; public class TestTriple extends GraphTestBase { public TestTriple(String name) { super( name ); } public static TestSuite suite() { return new TestSuite( TestTriple.class ); } private static final String U = "http://some.domain.name/magic/spells.incant"; private static final String N = "Alice"; private static final LiteralLabel L = LiteralLabelFactory.create( "ashes are burning", "en", false ); public void testTripleEquals() { // create some nodes to test BlankNodeId id = BlankNodeId.create(); LiteralLabel L2 = LiteralLabelFactory.create(id.toString(), "", false); String U2 = id.toString(); String N2 = id.toString(); Node[] nodes = new Node[] { Node.ANY, NodeFactory.createBlankNode(id), NodeFactory.createBlankNode(), NodeFactory.createLiteral(L), NodeFactory.createLiteral(L2), NodeFactory.createURI(U), NodeFactory.createURI(U2), NodeFactory.createVariable(N), NodeFactory.createVariable(N2) }; Triple[] triples = new Triple [nodes.length * nodes.length * nodes.length]; for (int i=0; i<nodes.length; i++) { for (int j=0; j<nodes.length; j++) { for (int k=0; k<nodes.length; k++) { triples[i*nodes.length*nodes.length + j*nodes.length + k] = new Triple(nodes[i], nodes[j], nodes[k]); } } } // set up the expected results matrix // a expected[i][j] is true if triples[i] equals triples[j] // triples are expected to be equals if there components are equal boolean[][] expected = new boolean[triples.length][triples.length]; for (int i1=0; i1<nodes.length; i1++) { for (int j1=0; j1<nodes.length; j1++) { for (int k1=0; k1<nodes.length; k1++) { for (int i2=0; i2<nodes.length; i2++) { for (int j2=0; j2<nodes.length; j2++) { for (int k2=0; k2<nodes.length; k2++) { expected[i1*nodes.length*nodes.length + j1*nodes.length + k1] [i2*nodes.length*nodes.length + j2*nodes.length + k2] = nodes[i1].equals(nodes[i2]) && nodes[j1].equals(nodes[j2]) && nodes[k1].equals(nodes[k2]); } } } } } } assertEquals("triple, null", triples[0].equals(null), false); assertDiffer("triple, string", triples[0], "string"); // now compare each triple with each other triple for (int i=0; i<triples.length; i++) { for (int j=0; j<triples.length; j++) { if (expected[i][j]) { assertEquals("triples " + i + ", " + j , triples[i], triples[j]); } else { assertDiffer("triples" + i + ", " + j, triples[i], triples[j]); } } } } public void testTripleCreate() { Node S = NodeCreateUtils.create( "s" ), P = NodeCreateUtils.create( "p" ), O = NodeCreateUtils.create( "o" ); assertEquals( new Triple( S, P, O ), Triple.create( S, P, O ) ); } public void testTripleCreateFromString() { Node S = NodeCreateUtils.create( "a" ), P = NodeCreateUtils.create( "_P" ), O = NodeCreateUtils.create( "?c" ); assertEquals( new Triple( S, P, O ), NodeCreateUtils.createTriple( "a _P ?c") ); } /** Test that triple-creation respects prefixes, assuming that node creation does. */ public void testTriplePrefixes() { Node S = NodeCreateUtils.create( "rdf:alpha" ), P = NodeCreateUtils.create( "dc:creator" ); Node O = NodeCreateUtils.create( "spoo:notmapped" ); Triple t = NodeCreateUtils.createTriple( "rdf:alpha dc:creator spoo:notmapped" ); assertEquals( new Triple( S, P, O ), t ); } public void testTripleCreationMapped() { PrefixMapping pm = PrefixMapping.Factory.create() .setNsPrefix( "a", "ftp://foo/" ) .setNsPrefix( "b", "http://spoo/" ) ; Triple wanted = NodeCreateUtils.createTriple( "ftp://foo/x http://spoo/y c:z" ); Triple got = NodeCreateUtils.createTriple( pm, "a:x b:y c:z" ); assertEquals( wanted, got ); } public void testPlainTripleMatches() { testMatches( "S P O" ); testMatches( "_S _P _O" ); testMatches( "1 2 3" ); } public void testAnyTripleMatches() { testMatches( "?? P O", "Z P O" ); testMatches( "S ?? O", "S Q O" ); testMatches( "S P ??", "S P oh" ); testMatches( "?? ?? ??", "X Y Z" ); testMatches( "?? ?? ??", "X Y 1" ); testMatches( "?? ?? ??", "_X Y Z" ); testMatches( "?? ?? ??", "X _Y Z" ); } private void testMatches( String triple ) { testMatches( triple, triple ); } private void testMatches( String pattern, String triple ) { assertTrue( NodeCreateUtils.createTriple( pattern ).matches( NodeCreateUtils.createTriple( triple ) ) ); } public void testPlainTripleDoesntMatch() { testMatchFails( "S P O", "Z P O" ); testMatchFails( "S P O", "S Q O" ); testMatchFails( "S P O", "S P oh" ); } public void testAnyTripleDoesntMatch() { testMatchFails( "?? P O", "S P oh" ); testMatchFails( "S ?? O", "Z R O" ); testMatchFails( "S P ??", "Z P oh" ); } public void testMatchFails( String pattern, String triple ) { assertFalse( NodeCreateUtils.createTriple( pattern ).matches( NodeCreateUtils.createTriple( triple ) ) ); } public void testMatchesNodes() { assertTrue( NodeCreateUtils.createTriple( "S P O" ).matches( node("S" ), node( "P" ), node( "O" ) ) ); assertTrue( NodeCreateUtils.createTriple( "?? P O" ).matches( node("Z" ), node( "P" ), node( "O" ) ) ); assertTrue( NodeCreateUtils.createTriple( "S ?? O" ).matches( node("S" ), node( "Q" ), node( "O" ) ) ); assertTrue( NodeCreateUtils.createTriple( "S P ??" ).matches( node("S" ), node( "P" ), node( "I" ) ) ); /* */ assertFalse( NodeCreateUtils.createTriple( "S P O" ).matches( node("Z" ), node( "P" ), node( "O" ) ) ); assertFalse( NodeCreateUtils.createTriple( "S P O" ).matches( node("S" ), node( "Q" ), node( "O" ) ) ); assertFalse( NodeCreateUtils.createTriple( "S P O" ).matches( node("Z" ), node( "P" ), node( "I" ) ) ); } public void testElementMatches() { assertTrue( NodeCreateUtils.createTriple( "S P O" ).subjectMatches( node( "S" ) ) ); assertTrue( NodeCreateUtils.createTriple( "S P O" ).predicateMatches( node( "P" ) ) ); assertTrue( NodeCreateUtils.createTriple( "S P O" ).objectMatches( node( "O" ) ) ); /* */ assertFalse( NodeCreateUtils.createTriple( "S P O" ).subjectMatches( node( "Z" ) ) ); assertFalse( NodeCreateUtils.createTriple( "S P O" ).predicateMatches( node( "Q" ) ) ); assertFalse( NodeCreateUtils.createTriple( "S P O" ).objectMatches( node( "I" ) ) ); /* */ assertTrue( NodeCreateUtils.createTriple( "?? P O" ).subjectMatches( node( "SUB" ) ) ); assertTrue( NodeCreateUtils.createTriple( "S ?? O" ).predicateMatches( node( "PRED" ) ) ); assertTrue( NodeCreateUtils.createTriple( "S P ??" ).objectMatches( node( "OBJ" ) ) ); } public void testConcrete() { assertTrue( NodeCreateUtils.createTriple( "S P O" ).isConcrete() ); assertTrue( NodeCreateUtils.createTriple( "S P 11").isConcrete() ); assertTrue( NodeCreateUtils.createTriple( "S P _X").isConcrete() ); assertTrue( NodeCreateUtils.createTriple( "S _P 11").isConcrete() ); assertTrue( NodeCreateUtils.createTriple( "_S _P _O").isConcrete() ); assertTrue( NodeCreateUtils.createTriple( "10 11 12").isConcrete() ); assertTrue( NodeCreateUtils.createTriple( "S P 11").isConcrete() ); assertFalse( NodeCreateUtils.createTriple( "?? P 11").isConcrete() ); assertFalse( NodeCreateUtils.createTriple( "S ?? 11").isConcrete() ); assertFalse( NodeCreateUtils.createTriple( "S P ??").isConcrete() ); assertFalse( NodeCreateUtils.createTriple( "?S P 11").isConcrete() ); assertFalse( NodeCreateUtils.createTriple( "S ?P 11").isConcrete() ); assertFalse( NodeCreateUtils.createTriple( "S P ?O").isConcrete() ); } /** Primarily to make sure that literals get quoted and stuff comes out in some kind of coherent order. */ public void testTripleToStringOrdering() { Triple t1 = NodeCreateUtils.createTriple( "subject predicate object" ); assertTrue( "subject must be present", t1.toString().contains( "subject" ) ); assertTrue( "subject must preceed predicate", t1.toString().indexOf( "subject" ) < t1.toString().indexOf( "predicate" ) ); assertTrue( "predicate must preceed object", t1.toString().indexOf( "predicate" ) < t1.toString().indexOf( "object" ) ); } public void testTripleToStringQuoting() { Triple t1 = NodeCreateUtils.createTriple( "subject predicate 'object'" ); assertTrue( t1.toString().indexOf( "\"object\"") > 0 ); } public void testTripleToStringWithPrefixing() { PrefixMapping pm = PrefixMapping.Factory.create(); pm.setNsPrefix( "spoo", "eg://domain.dom/spoo#" ); Triple t1 = NodeCreateUtils.createTriple( "eg://domain.dom/spoo#a b c" ); assertEquals( "spoo:a @eh:/b eh:/c", t1.toString( pm ) ); } public void testTripleMaps() { assertEquals( node( "x" ), getSubject.apply( NodeCreateUtils.createTriple( "x P z" ) ) ); assertEquals( node( "P" ), getPredicate.apply( NodeCreateUtils.createTriple( "x P z" ) ) ); assertEquals( node( "z" ), getObject.apply( NodeCreateUtils.createTriple( "x P z" ) ) ); } public static final Function<Triple, Node> getSubject = t -> t.getSubject(); public static final Function<Triple, Node> getPredicate = t -> t.getPredicate(); public static final Function<Triple, Node> getObject = t -> t.getObject(); }