package org.mindswap.swoop.utils.owlapi.diff;
import java.net.URI;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.semanticweb.owl.impl.model.OWLConnectionImpl;
import org.semanticweb.owl.model.OWLAnnotationProperty;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLClassAxiom;
import org.semanticweb.owl.model.OWLDataProperty;
import org.semanticweb.owl.model.OWLDataValue;
import org.semanticweb.owl.model.OWLDifferentIndividualsAxiom;
import org.semanticweb.owl.model.OWLDisjointClassesAxiom;
import org.semanticweb.owl.model.OWLEntity;
import org.semanticweb.owl.model.OWLEnumeration;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.change.AddAnnotationInstance;
import org.semanticweb.owl.model.change.AddClassAxiom;
import org.semanticweb.owl.model.change.AddDataPropertyInstance;
import org.semanticweb.owl.model.change.AddDomain;
import org.semanticweb.owl.model.change.AddEntity;
import org.semanticweb.owl.model.change.AddEnumeration;
import org.semanticweb.owl.model.change.AddIndividualAxiom;
import org.semanticweb.owl.model.change.AddIndividualClass;
import org.semanticweb.owl.model.change.AddObjectPropertyInstance;
import org.semanticweb.owl.model.change.AddSuperClass;
import org.semanticweb.owl.model.change.AddSuperProperty;
import org.semanticweb.owl.model.change.ChangeVisitor;
import org.semanticweb.owl.model.change.OntologyChange;
import org.semanticweb.owl.model.change.RemoveAnnotationInstance;
import org.semanticweb.owl.model.change.RemoveClassAxiom;
import org.semanticweb.owl.model.change.RemoveDataPropertyInstance;
import org.semanticweb.owl.model.change.RemoveDomain;
import org.semanticweb.owl.model.change.RemoveEntity;
import org.semanticweb.owl.model.change.RemoveEnumeration;
import org.semanticweb.owl.model.change.RemoveIndividualClass;
import org.semanticweb.owl.model.change.RemoveObjectPropertyInstance;
import org.semanticweb.owl.model.change.RemoveSuperClass;
import org.semanticweb.owl.model.change.RemoveSuperProperty;
import org.semanticweb.owl.util.OWLConnection;
public class OWLDiffTest extends TestCase {
//OWLConnection connection;
OWLOntology src, dst, target;
static URI testURI = URI.create("http://example.com/ontology#");
public static Test suite() {
return new TestSuite(OWLDiffTest.class);
}
private OWLOntology createOnt() throws OWLException {
OWLConnection connection = new OWLConnectionImpl();
OWLOntology ont = connection.createOntology(testURI, testURI);
return ont;
}
private void printChanges(OntologyChange[] changes) throws OWLException {
System.out.println("Changes:");
for (int i = 0; i < changes.length; ++i) {
System.out.println(ObjectString.getString(changes[i]));
}
}
private OntologyChange[] getChanges(OWLOntology source, OWLOntology destination, OWLOntology target) throws OWLException {
List changeList = OWLDiff.getChanges(source, destination, target);
OntologyChange[] changes = new OntologyChange[changeList.size()];
changes = (OntologyChange[]) changeList.toArray(changes);
return (OntologyChange[]) changes;
}
public void setUp() throws Exception {
src = createOnt();
dst = createOnt();
target = createOnt();
}
public void test_Empty() throws Exception {
OntologyChange[] changes;
changes = getChanges(src, dst, target);
assertEquals(0, changes.length);
}
public void test_DataPropertyRemoval() throws Exception {
OntologyChange[] changes;
OWLEntity entity = src.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop"));
OntologyChange addProperty = new AddEntity(src, entity, null);
addProperty.accept((ChangeVisitor) src);
changes = getChanges(src, dst, target);
assertEquals(1, changes.length);
assertTrue(changes[0] instanceof RemoveEntity);
}
public void test_AnnotationRemoval() throws Exception {
OntologyChange[] changes;
OWLEntity srcEntity = src.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop"));
OWLAnnotationProperty srcProp = src.getOWLDataFactory().getOWLAnnotationProperty(testURI.resolve("comment"));
OntologyChange srcChange = new AddAnnotationInstance(src, srcEntity, srcProp, "Hello", null);
srcChange.accept((ChangeVisitor) src);
OWLEntity dstEntity = dst.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop"));
OWLAnnotationProperty dstProp = dst.getOWLDataFactory().getOWLAnnotationProperty(testURI.resolve("comment"));
OntologyChange dstChange = new AddEntity(dst, dstEntity, null);
dstChange.accept((ChangeVisitor) dst);
dstChange = new AddEntity(dst, dstProp, null);
dstChange.accept((ChangeVisitor) dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(1, changes.length);
assertTrue(changes[0] instanceof RemoveAnnotationInstance);
}
public void test_DataValue() throws Exception {
OntologyChange[] changes;
OWLIndividual srcIndividual = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("Bob"));
OWLDataProperty srcProp = src.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop"));
OWLDataValue srcDV = src.getOWLDataFactory().getOWLConcreteData(null, "en", "Testing");
OntologyChange srcChange = new AddDataPropertyInstance(src, srcIndividual, srcProp, srcDV, null);
srcChange.accept((ChangeVisitor) src);
OWLIndividual dstIndividual = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("Bob"));
OWLDataProperty dstProp = dst.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop"));
OWLDataValue dstDV = dst.getOWLDataFactory().getOWLConcreteData(null, "en-US", "Testing");
OntologyChange dstChange = new AddDataPropertyInstance(dst, dstIndividual, dstProp, dstDV, null);
dstChange.accept((ChangeVisitor) dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(2, changes.length);
assertTrue(changes[0] instanceof RemoveDataPropertyInstance);
assertTrue(changes[1] instanceof AddDataPropertyInstance);
}
public void test_ObjectValue() throws Exception {
OntologyChange[] changes;
OWLIndividual srcBob = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("Bob"));
OWLObjectProperty srcProp = src.getOWLDataFactory().getOWLObjectProperty(testURI.resolve("knows"));
OWLIndividual srcRoss = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("Ross"));
OntologyChange srcChange = new AddObjectPropertyInstance(src, srcBob, srcProp, srcRoss, null);
srcChange.accept((ChangeVisitor) src);
OWLIndividual dstBob = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("Bob"));
OWLObjectProperty dstProp = dst.getOWLDataFactory().getOWLObjectProperty(testURI.resolve("knows"));
OWLIndividual dstRoss = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("Ross"));
OntologyChange dstChange = new AddObjectPropertyInstance(dst, dstRoss, dstProp, dstBob, null);
dstChange.accept((ChangeVisitor) dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(2, changes.length);
assertTrue(changes[0] instanceof RemoveObjectPropertyInstance);
assertTrue(changes[1] instanceof AddObjectPropertyInstance);
}
public void test_EnumerationRemoval() throws Exception {
OntologyChange[] changes;
OWLIndividual srcBob = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("Bob"));
OWLIndividual srcRoss = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("Ross"));
OWLIndividual srcRobert = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("Robert"));
Set srcSet1 = new HashSet();
Set srcSet2 = new HashSet();
srcSet1.add(srcBob);
srcSet1.add(srcRoss);
srcSet2.add(srcBob);
srcSet2.add(srcRoss);
srcSet2.add(srcRobert);
OWLEnumeration srcEnum1 = src.getOWLDataFactory().getOWLEnumeration(srcSet1);
OWLEnumeration srcEnum2 = src.getOWLDataFactory().getOWLEnumeration(srcSet2);
OWLClass srcClass = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class"));
OntologyChange srcChange1 = new AddEnumeration(src, srcClass, srcEnum1, null);
srcChange1.accept((ChangeVisitor)src);
OntologyChange srcChange2 = new AddEnumeration(src, srcClass, srcEnum2, null);
srcChange2.accept((ChangeVisitor)src);
OWLIndividual dstBob = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("Bob"));
OWLIndividual dstRoss = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("Ross"));
OWLIndividual dstRobert = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("Robert"));
Set dstSet1 = new HashSet();
dstSet1.add(dstBob);
dstSet1.add(dstRoss);
dstSet1.add(dstRobert);
OWLEnumeration dstEnum1 = dst.getOWLDataFactory().getOWLEnumeration(dstSet1);
OWLClass dstClass = dst.getOWLDataFactory().getOWLClass(testURI.resolve("Class"));
OntologyChange dstChange1 = new AddEnumeration(dst, dstClass, dstEnum1, null);
dstChange1.accept((ChangeVisitor)dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(1, changes.length);
assertTrue(changes[0] instanceof RemoveEnumeration);
RemoveEnumeration tgtChange = (RemoveEnumeration) changes[0];
assertEquals(2, tgtChange.getEnumeration().getIndividuals().size());
}
public void test_DisjointRemoval() throws OWLException {
OntologyChange[] changes;
OWLClass srcClass1 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class1"));
OWLClass srcClass2 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OWLClass srcClass3 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class3"));
Set srcDisjoints = new HashSet();
srcDisjoints.add(srcClass1);
srcDisjoints.add(srcClass2);
srcDisjoints.add(srcClass3);
OWLClassAxiom srcAxiom = src.getOWLDataFactory().getOWLDisjointClassesAxiom(srcDisjoints);
OntologyChange srcChange = new AddClassAxiom(src, srcAxiom, null);
srcChange.accept((ChangeVisitor) src);
OWLClass dstClass1 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class1"));
OWLClass dstClass2 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OWLClass dstClass3 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class3"));
Set dstClasses = new HashSet();
dstClasses.add(dstClass1);
dstClasses.add(dstClass2);
dstClasses.add(dstClass3);
for (Iterator iter = dstClasses.iterator(); iter.hasNext(); ) {
OntologyChange dstChange = new AddEntity(dst, (OWLEntity) iter.next(), null);
dstChange.accept((ChangeVisitor) dst);
}
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(1, changes.length);
assertTrue(changes[0] instanceof RemoveClassAxiom);
RemoveClassAxiom tgtChange = (RemoveClassAxiom) changes[0];
assertTrue(tgtChange.getAxiom() instanceof OWLDisjointClassesAxiom);
}
public void test_DifferentIndividuals() throws OWLException {
OntologyChange[] changes;
OWLIndividual srcBob = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("bob"));
OWLIndividual srcJon = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("jon"));
OWLIndividual srcJoe = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("joe"));
Set srcDifferents = new HashSet();
srcDifferents.addAll(Arrays.asList(new OWLIndividual[] {srcBob, srcJon, srcJoe}));
OWLDifferentIndividualsAxiom srcDifferent = src.getOWLDataFactory().getOWLDifferentIndividualsAxiom(srcDifferents);
OntologyChange srcChange = new AddIndividualAxiom(src, srcDifferent, null);
srcChange.accept((ChangeVisitor) src);
OWLIndividual dstBob = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("bob"));
OWLIndividual dstJon = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("jon"));
OWLIndividual dstJoe = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("joe"));
Set dstDifferents = new HashSet();
dstDifferents.addAll(Arrays.asList(new OWLIndividual[] {dstBob, dstJon, dstJoe}));
OWLDifferentIndividualsAxiom dstDifferent = dst.getOWLDataFactory().getOWLDifferentIndividualsAxiom(dstDifferents);
OntologyChange dstChange = new AddIndividualAxiom(dst, dstDifferent, null);
dstChange.accept((ChangeVisitor) dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(0, changes.length);
}
public void test_Types() throws OWLException {
OntologyChange[] changes;
OWLIndividual srcBob = src.getOWLDataFactory().getOWLIndividual(testURI.resolve("bob"));
OWLClass srcClass = src.getOWLDataFactory().getOWLClass(testURI.resolve("TestClass"));
OntologyChange srcChange = new AddIndividualClass(src, srcBob, srcClass, null);
srcChange.accept((ChangeVisitor) src);
OWLIndividual dstBob = dst.getOWLDataFactory().getOWLIndividual(testURI.resolve("bob"));
OWLClass dstClass = dst.getOWLDataFactory().getOWLClass(testURI.resolve("TestClass"));
OntologyChange dstChange1 = new AddEntity(dst, dstBob, null);
dstChange1.accept((ChangeVisitor) dst);
OntologyChange dstChange2 = new AddEntity(dst, dstClass, null);
dstChange2.accept((ChangeVisitor) dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(1, changes.length);
assertTrue(changes[0] instanceof RemoveIndividualClass);
}
public void test_ClassRemoval() throws OWLException {
OntologyChange[] changes;
OWLClass srcClass1 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class1"));
OWLClass srcClass2 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OWLClassAxiom srcAxiom = src.getOWLDataFactory().getOWLSubClassAxiom(srcClass1, srcClass2);
OntologyChange srcChange = new AddClassAxiom(src, srcAxiom, null);
srcChange.accept((ChangeVisitor)src);
OWLClass dstClass2 = dst.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OntologyChange dstChange = new AddEntity(dst, dstClass2, null);
dstChange.accept((ChangeVisitor)dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(2, changes.length);
assertTrue(changes[0] instanceof RemoveEntity);
assertTrue(changes[1] instanceof RemoveClassAxiom);
}
public void test_ClassAddition() throws OWLException {
OntologyChange[] changes;
OWLClass srcClass1 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class1"));
OWLClass srcClass2 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OWLClassAxiom srcAxiom = src.getOWLDataFactory().getOWLSubClassAxiom(srcClass1, srcClass2);
OntologyChange srcChange = new AddClassAxiom(src, srcAxiom, null);
srcChange.accept((ChangeVisitor)src);
OWLClass dstClass2 = dst.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OntologyChange dstChange = new AddEntity(dst, dstClass2, null);
dstChange.accept((ChangeVisitor)dst);
changes = getChanges(dst, src, target);
System.out.print("ClassAddition:");
printChanges(changes);
assertEquals(2, changes.length);
assertTrue(changes[0] instanceof AddEntity);
assertTrue(changes[1] instanceof AddClassAxiom);
}
public void test_ClassNameChange() throws OWLException {
OntologyChange[] changes;
OWLClass srcClass1 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class1a"));
OWLClass srcClass2 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OWLClassAxiom srcAxiom = src.getOWLDataFactory().getOWLSubClassAxiom(srcClass1, srcClass2);
OntologyChange srcChange = new AddClassAxiom(src, srcAxiom, null);
srcChange.accept((ChangeVisitor)src);
OWLClass dstClass1 = dst.getOWLDataFactory().getOWLClass(testURI.resolve("Class1b"));
OWLClass dstClass2 = dst.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OWLClassAxiom dstAxiom = dst.getOWLDataFactory().getOWLSubClassAxiom(dstClass1, dstClass2);
OntologyChange dstChange = new AddClassAxiom(dst, dstAxiom, null);
dstChange.accept((ChangeVisitor)dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(4, changes.length);
assertTrue(changes[0] instanceof RemoveEntity);
assertTrue(changes[1] instanceof RemoveClassAxiom);
assertTrue(changes[2] instanceof AddEntity);
assertTrue(changes[3] instanceof AddClassAxiom);
}
public void test_SuperClassRemoval() throws OWLException {
OntologyChange[] changes;
OWLClass srcClass1 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class1"));
OWLClass srcClass2 = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OntologyChange srcChange = new AddSuperClass(src, srcClass1, srcClass2, null);
srcChange.accept((ChangeVisitor)src);
OWLClass dstClass2 = dst.getOWLDataFactory().getOWLClass(testURI.resolve("Class2"));
OntologyChange dstChange = new AddEntity(dst, dstClass2, null);
dstChange.accept((ChangeVisitor)dst);
changes = getChanges(src, dst, target);
printChanges(changes);
assertEquals(2, changes.length);
assertTrue(changes[0] instanceof RemoveEntity);
assertTrue(changes[1] instanceof RemoveSuperClass);
}
public void test_DomainRemoval() throws OWLException {
OntologyChange[] changes;
OWLDataProperty srcProp = src.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop"));
OWLClass srcClass = src.getOWLDataFactory().getOWLClass(testURI.resolve("Class"));
OntologyChange srcChange = new AddDomain(src, srcProp, srcClass, null);
srcChange.accept((ChangeVisitor) src);
OWLDataProperty dstProp = dst.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop"));
OntologyChange dstChange = new AddEntity(dst, dstProp, null);
dstChange.accept((ChangeVisitor)dst);
OWLClass dstClass = dst.getOWLDataFactory().getOWLClass(testURI.resolve("Class"));
dstChange = new AddEntity(dst, dstClass, null);
dstChange.accept((ChangeVisitor)dst);
changes = getChanges(src, dst, target);
assertEquals(1, changes.length);
assertTrue(changes[0] instanceof RemoveDomain);
}
public void test_SubPropRemoval() throws OWLException {
OntologyChange[] changes;
OWLDataProperty srcProp1 = src.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop1"));
OWLDataProperty srcProp2 = src.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop2"));
OntologyChange srcChange = new AddSuperProperty(src, srcProp1, srcProp2, null);
srcChange.accept((ChangeVisitor)src);
OWLDataProperty dstProp1 = dst.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop1"));
OntologyChange dstChange = new AddEntity(dst, dstProp1, null);
dstChange.accept((ChangeVisitor)dst);
OWLDataProperty dstProp2 = dst.getOWLDataFactory().getOWLDataProperty(testURI.resolve("prop2"));
dstChange = new AddEntity(dst, dstProp2, null);
dstChange.accept((ChangeVisitor)dst);
changes = getChanges(src, dst, target);
assertEquals(1, changes.length);
assertTrue(changes[0] instanceof RemoveSuperProperty);
}
}