/*
* 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.rdf.model.test;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.Triple ;
import org.apache.jena.graph.test.GraphTestBase ;
import org.apache.jena.graph.test.NodeCreateUtils ;
import org.apache.jena.rdf.model.* ;
import org.apache.jena.rdf.model.test.helpers.ModelHelper ;
import org.apache.jena.rdf.model.test.helpers.TestingModelFactory ;
import org.apache.jena.test.JenaTestBase ;
import org.junit.Assert;
public class TestModel extends AbstractModelTestBase
{
/**
* Test cases for RemoveSPO(); each entry is a triple (add, remove, result).
* <ul>
* <li>add - the triples to add to the graph to start with
* <li>remove - the pattern to use in the removal
* <li>result - the triples that should remain in the graph
* </ul>
*/
protected String[][] cases = { { "x R y", "x R y", "" },
{ "x R y; a P b", "x R y", "a P b" },
{ "x R y; a P b", "?? R y", "a P b" },
{ "x R y; a P b", "x R ??", "a P b" },
{ "x R y; a P b", "x ?? y", "a P b" },
{ "x R y; a P b", "?? ?? ??", "" },
{ "x R y; a P b; c P d", "?? P ??", "x R y" },
{ "x R y; a P b; x S y", "x ?? ??", "a P b" }, };
public TestModel( final TestingModelFactory modelFactory, final String name )
{
super(modelFactory, name);
}
protected Model copy( final Model m )
{
return createModel().add(m);
}
public void testAsRDF()
{
testPresentAsRDFNode(GraphTestBase.node("a"), Resource.class);
testPresentAsRDFNode(GraphTestBase.node("17"), Literal.class);
testPresentAsRDFNode(GraphTestBase.node("_b"), Resource.class);
}
public void testContainsResource()
{
ModelHelper.modelAdd(model, "x R y; _a P _b");
Assert.assertTrue(model.containsResource(ModelHelper.resource(model,
"x")));
Assert.assertTrue(model.containsResource(ModelHelper.resource(model,
"R")));
Assert.assertTrue(model.containsResource(ModelHelper.resource(model,
"y")));
Assert.assertTrue(model.containsResource(ModelHelper.resource(model,
"_a")));
Assert.assertTrue(model.containsResource(ModelHelper.resource(model,
"P")));
Assert.assertTrue(model.containsResource(ModelHelper.resource(model,
"_b")));
Assert.assertFalse(model.containsResource(ModelHelper.resource(model,
"i")));
Assert.assertFalse(model.containsResource(ModelHelper.resource(model,
"_j")));
}
public void testCreateBlankFromNode()
{
final RDFNode S = model.getRDFNode(NodeCreateUtils.create("_Blank"));
JenaTestBase.assertInstanceOf(Resource.class, S);
Assert.assertEquals(new AnonId("_Blank"), ((Resource) S).getId());
}
public void testCreateLiteralFromNode()
{
final RDFNode S = model.getRDFNode(NodeCreateUtils.create("42"));
JenaTestBase.assertInstanceOf(Literal.class, S);
Assert.assertEquals("42", ((Literal) S).getLexicalForm());
}
public void testCreateResourceFromNode()
{
final RDFNode S = model.getRDFNode(NodeCreateUtils.create("spoo:S"));
JenaTestBase.assertInstanceOf(Resource.class, S);
Assert.assertEquals("spoo:S", ((Resource) S).getURI());
}
/**
* Test the new version of getProperty(), which delivers null for not-found
* properties.
*/
public void testGetProperty()
{
ModelHelper.modelAdd(model, "x P a; x P b; x R c");
final Resource x = ModelHelper.resource(model, "x");
Assert.assertEquals(ModelHelper.resource(model, "c"),
x.getProperty(ModelHelper.property(model, "R")).getObject());
final RDFNode ob = x.getProperty(ModelHelper.property(model, "P"))
.getObject();
Assert.assertTrue(ob.equals(ModelHelper.resource(model, "a"))
|| ob.equals(ModelHelper.resource(model, "b")));
Assert.assertNull(x.getProperty(ModelHelper.property(model,
"noSuchPropertyHere")));
}
public void testIsClosedDelegatedToGraph()
{
Assert.assertFalse(model.isClosed());
model.close();
Assert.assertTrue(model.isClosed());
}
public void testIsEmpty()
{
final Statement S1 = ModelHelper.statement(model,
"model rdf:type nonEmpty");
final Statement S2 = ModelHelper.statement(model, "pinky rdf:type Pig");
Assert.assertTrue(model.isEmpty());
model.add(S1);
Assert.assertFalse(model.isEmpty());
model.add(S2);
Assert.assertFalse(model.isEmpty());
model.remove(S1);
Assert.assertFalse(model.isEmpty());
model.remove(S2);
Assert.assertTrue(model.isEmpty());
}
public void testLiteralNodeAsResourceFails()
{
try
{
model.wrapAsResource(GraphTestBase.node("17"));
Assert.fail("should fail to convert literal to Resource");
}
catch (final UnsupportedOperationException e)
{
JenaTestBase.pass();
}
}
private void testPresentAsRDFNode( final Node n,
final Class<? extends RDFNode> nodeClass )
{
final RDFNode r = model.asRDFNode(n);
Assert.assertSame(n, r.asNode());
JenaTestBase.assertInstanceOf(nodeClass, r);
}
public void testRemoveAll()
{
testRemoveAll("");
testRemoveAll("a RR b");
testRemoveAll("x P y; a Q b; c R 17; _d S 'e'");
testRemoveAll("subject Predicate 'object'; http://nowhere/x scheme:cunning not:plan");
}
protected void testRemoveAll( final String statements )
{
ModelHelper.modelAdd(model, statements);
Assert.assertSame(model, model.removeAll());
Assert.assertEquals("model should have size 0 following removeAll(): ",
0, model.size());
}
/**
* Test that remove(s, p, o) works, in the presence of inferencing graphs
* that
* mean emptyness isn't available. This is why we go round the houses and
* test that expected ~= initialContent + addedStuff - removed -
* initialContent.
*/
public void testRemoveSPO()
{
final Model mc = createModel();
for (final String[] case1 : cases)
{
for (int j = 0; j < 3; j += 1)
{
final Model content = createModel();
final Model baseContent = copy(content);
ModelHelper.modelAdd(content, case1[0]);
final Triple remove = GraphTestBase.triple(case1[1]);
final Node s = remove.getSubject(), p = remove.getPredicate(), o = remove
.getObject();
final Resource S = (Resource) (s.equals(Node.ANY) ? null : mc
.getRDFNode(s));
final Property P = ((p.equals(Node.ANY) ? null : mc.getRDFNode(
p).as(Property.class)));
final RDFNode O = o.equals(Node.ANY) ? null : mc.getRDFNode(o);
final Model expected = ModelHelper.modelWithStatements(this,
case1[2]);
content.removeAll(S, P, O);
final Model finalContent = copy(content).remove(baseContent);
ModelHelper.assertIsoModels(case1[1], expected, finalContent);
}
}
}
public void testToStatement()
{
final Triple t = GraphTestBase.triple("a P b");
final Statement s = model.asStatement(t);
Assert.assertEquals(GraphTestBase.node("a"), s.getSubject().asNode());
Assert.assertEquals(GraphTestBase.node("P"), s.getPredicate().asNode());
Assert.assertEquals(GraphTestBase.node("b"), s.getObject().asNode());
}
public void testTransactions() {
if ( model.supportsTransactions() )
model.executeInTxn(() -> {}) ;
}
public void testURINodeAsResource()
{
final Node n = GraphTestBase.node("a");
final Resource r = model.wrapAsResource(n);
Assert.assertSame(n, r.asNode());
}
}