/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.model.util;
import java.util.Collection;
import java.util.HashSet;
import junit.framework.TestCase;
import org.openrdf.model.BNode;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.ValueFactoryImpl;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.model.vocabulary.RDFS;
/**
* @author jeen
*/
public class ModelUtilTest extends TestCase {
private Collection<Statement> model1;
private Collection<Statement> model2;
private static ValueFactory VF = new ValueFactoryImpl();
private URI foo;
private URI bar;
@Override
protected void setUp() {
model1 = new HashSet<Statement>();
model2 = new HashSet<Statement>();
foo = VF.createURI("http://example.org/foo");
bar = VF.createURI("http://example.org/bar");
}
public void testModelsEqual() {
// two identical statements, no bnodes
model1.add(VF.createStatement(foo, RDF.TYPE, bar));
assertFalse(ModelUtil.equals(model1, model2));
model2.add(VF.createStatement(foo, RDF.TYPE, bar));
assertTrue(ModelUtil.equals(model1, model2));
// add same statement again
model2.add(VF.createStatement(foo, RDF.TYPE, bar));
assertTrue("Duplicate statement should not be considered", ModelUtil.equals(model1, model2));
// two identical statements with bnodes added.
model1.add(VF.createStatement(foo, RDF.TYPE, VF.createBNode()));
model2.add(VF.createStatement(foo, RDF.TYPE, VF.createBNode()));
assertTrue(ModelUtil.equals(model1, model2));
// chained bnodes
BNode chainedNode1 = VF.createBNode();
model1.add(VF.createStatement(bar, RDFS.SUBCLASSOF, chainedNode1));
model1.add(VF.createStatement(chainedNode1, RDFS.SUBCLASSOF, foo));
BNode chainedNode2 = VF.createBNode();
model2.add(VF.createStatement(bar, RDFS.SUBCLASSOF, chainedNode2));
model2.add(VF.createStatement(chainedNode2, RDFS.SUBCLASSOF, foo));
assertTrue(ModelUtil.equals(model1, model2));
// two bnode statements with non-identical predicates
model1.add(VF.createStatement(foo, foo, VF.createBNode()));
model2.add(VF.createStatement(foo, bar, VF.createBNode()));
assertFalse(ModelUtil.equals(model1, model2));
}
public void testIsSubset() {
// two empty sets
assertTrue(ModelUtil.isSubset(model1, model2));
assertTrue(ModelUtil.isSubset(model2, model1));
// two identical statements, no bnodes
model1.add(VF.createStatement(foo, RDF.TYPE, bar));
assertFalse(ModelUtil.isSubset(model1, model2));
assertTrue(ModelUtil.isSubset(model2, model1));
model2.add(VF.createStatement(foo, RDF.TYPE, bar));
assertTrue(ModelUtil.isSubset(model1, model2));
assertTrue(ModelUtil.isSubset(model2, model1));
// two identical statements with bnodes added.
model1.add(VF.createStatement(foo, RDF.TYPE, VF.createBNode()));
assertFalse(ModelUtil.isSubset(model1, model2));
assertTrue(ModelUtil.isSubset(model2, model1));
model2.add(VF.createStatement(foo, RDF.TYPE, VF.createBNode()));
assertTrue(ModelUtil.isSubset(model1, model2));
assertTrue(ModelUtil.isSubset(model2, model1));
// chained bnodes
BNode chainedNode1 = VF.createBNode();
model1.add(VF.createStatement(bar, RDFS.SUBCLASSOF, chainedNode1));
model1.add(VF.createStatement(chainedNode1, RDFS.SUBCLASSOF, foo));
assertFalse(ModelUtil.isSubset(model1, model2));
assertTrue(ModelUtil.isSubset(model2, model1));
BNode chainedNode2 = VF.createBNode();
model2.add(VF.createStatement(bar, RDFS.SUBCLASSOF, chainedNode2));
model2.add(VF.createStatement(chainedNode2, RDFS.SUBCLASSOF, foo));
assertTrue(ModelUtil.isSubset(model1, model2));
assertTrue(ModelUtil.isSubset(model2, model1));
// two bnode statements with non-identical predicates
model1.add(VF.createStatement(foo, foo, VF.createBNode()));
model2.add(VF.createStatement(foo, bar, VF.createBNode()));
assertFalse(ModelUtil.isSubset(model1, model2));
assertFalse(ModelUtil.isSubset(model2, model1));
}
}