/*
* 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
///////////////
package org.apache.jena.ontology.impl;
// Imports
///////////////
import junit.framework.*;
import java.util.*;
import org.apache.jena.ontology.* ;
import org.apache.jena.rdf.model.* ;
import org.apache.jena.vocabulary.* ;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>
* Unit tests for listXXX methods on ontmodel
* </p>
*/
public class TestListSyntaxCategories
extends TestCase
{
// Constants
//////////////////////////////////
public static final String NS = "http://jena.hpl.hp.com/testing/ontology#";
// Static variables
//////////////////////////////////
protected static DoListTest[] testCases = {
// Ontology
new DoListTest( "OWL list ontologies", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {"http://jena.hpl.hp.com/testing/ontology"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listOntologies();
}
@Override
public boolean test( Resource r ) {
return r instanceof Ontology;
}
},
// Properties
new DoListTest( "OWL list properties", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 2,
new String[] {NS+"p",NS+"karma"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listOntProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL list properties", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM, 1,
new String[] {NS+"p"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listOntProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL list object properties", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 2,
new String[] {NS+"op", NS+"op1"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listObjectProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL list datatype properties", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"dp"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listDatatypeProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL list functional properties", "file:testing/ontology/owl/list-syntax/test-proptypes.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"fp"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listFunctionalProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof FunctionalProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL list transitive properties", "file:testing/ontology/owl/list-syntax/test-proptypes.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"tp"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listTransitiveProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof TransitiveProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL list symmetric properties", "file:testing/ontology/owl/list-syntax/test-proptypes.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"sp"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listSymmetricProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof SymmetricProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL list inverse functional properties", "file:testing/ontology/owl/list-syntax/test-proptypes.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"ifp"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listInverseFunctionalProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof InverseFunctionalProperty &&
r instanceof Property;
}
},
// individuals
new DoListTest( "OWL list individuals", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 8,
new String[] {NS+"A0", NS+"A1", NS+"C0", NS+"a0", NS+"a1", NS+"a2", NS+"z0", NS+"z1"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list typed individuals", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM, 2,
new String[] {NS+"A0", NS+"A1"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
Model mVocab = ModelFactory.createDefaultModel();
Resource cA = mVocab.createResource( "http://jena.hpl.hp.com/testing/ontology#A");
return m.listIndividuals( cA );
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list individuals negative case 1", null, OntModelSpec.OWL_MEM, 0,
new String[] {} )
{
@Override
protected void addAxioms( OntModel m ) {
// A0 should not an individual
m.add( m.createResource( NS + "A0"), RDF.type, OWL.Class );
}
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list individuals negative case 2", null, OntModelSpec.OWL_MEM_MICRO_RULE_INF, 0,
new String[] {} )
{
@Override
protected void addAxioms( OntModel m ) {
// A0 should not an individual
m.add( m.createResource( NS + "A0"), RDF.type, OWL.Class );
}
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list individuals negative case 3", null, OntModelSpec.OWL_MEM, 0,
new String[] {} )
{
@Override
protected void addAxioms( OntModel m ) {
// A0 should not an individual, even though we have materialised some of the entailment triples
Resource a0 = m.createResource( NS + "A0");
m.add( a0, RDF.type, OWL.Class );
m.add( OWL.Class, RDF.type, OWL.Class );
}
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list individuals negative case 4", null, OntModelSpec.OWL_MEM, 0,
new String[] {} )
{
@Override
protected void addAxioms( OntModel m ) {
// A0 should not an individual, even though we have materialised some of the entailment triples
Resource a0 = m.createResource( NS + "A0");
m.add( a0, RDF.type, OWL.Class );
m.add( OWL.Class, RDF.type, RDFS.Class );
}
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list individuals - punning", null, OntModelSpec.OWL_MEM, 1,
new String[] {NS + "A0"} )
{
@Override
protected void addAxioms( OntModel m ) {
// A0 should be an individual, since we are punning
Resource a0 = m.createResource( NS + "A0");
Resource a1 = m.createResource( NS + "A1");
m.add( a0, RDF.type, OWL.Class );
m.add( a1, RDF.type, OWL.Class );
m.add( a0, RDF.type, a1 );
}
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "empty OWL list individuals", null, OntModelSpec.OWL_MEM, 0, new String[] {} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "empty OWL+rule list individuals", null, OntModelSpec.OWL_MEM_RULE_INF, 0, new String[] {} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "empty OWL+RDFS rule list individuals (bug report JENA-3)", null, OntModelSpec.RDFS_MEM_RDFS_INF, 0, new String[] {} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list individuals with inference", "file:testing/ontology/owl/list-syntax/owlDemoSchema.xml", OntModelSpec.OWL_LITE_MEM_RULES_INF, 6, null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list individuals in composite model", null, OntModelSpec.OWL_MEM, 1, new String[] {"http://example.com/foo#anInd"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel schema ) {
Model data = ModelFactory.createDefaultModel();
Resource c = schema.createResource( "http://example.com/foo#AClass" );
Resource i = data.createResource( "http://example.com/foo#anInd" );
schema.add( c, RDF.type, OWL.Class );
data.add( i, RDF.type, c );
OntModel composite = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, schema );
composite.addSubModel( data );
return composite.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL list all different", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listAllDifferent();
}
@Override
public boolean test( Resource r ) {
return r instanceof AllDifferent;
}
},
// classes
new DoListTest( "OWL list classes", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 11,
new String[] {NS+"A", NS+"B", NS+"C", NS+"D", NS+"E", NS+"X0", NS+"X1", NS+"Y0", NS+"Y1", NS+"Z", } )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL list named classes", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 10,
new String[] {NS+"A", NS+"B", NS+"C", NS+"D", NS+"E", NS+"X0", NS+"X1", NS+"Y0", NS+"Y1", NS+"Z", } )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listNamedClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL list intersection classes", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"A" } )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIntersectionClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL list union classes", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"B"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listUnionClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL list complement classes", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"C"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listComplementClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL list enumerated classes", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"D"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listEnumeratedClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL list restrictions", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listRestrictions();
}
@Override
public boolean test( Resource r ) {
return r instanceof Restriction;
}
},
// Annotation property
new DoListTest( "OWL list annotation properties", "file:testing/ontology/owl/list-syntax/test.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listAnnotationProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof AnnotationProperty;
}
},
// !!!!!!! Following tests use ontology that imports owl.owl !!!!!!!!!!!
// ontologies
new DoListTest( "OWL+import list ontologies", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 2,
new String[] {"http://jena.hpl.hp.com/testing/ontology", "http://www.w3.org/2002/07/owl"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listOntologies();
}
@Override
public boolean test( Resource r ) {
return r instanceof Ontology;
}
},
// Properties
new DoListTest( "OWL+import list properties", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 46,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listOntProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL+import list object properties", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 2,
new String[] {NS+"op", NS+"op1"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listObjectProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof Property;
}
},
new DoListTest( "OWL+import list datatype properties", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"dp"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listDatatypeProperties();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntProperty &&
r instanceof Property;
}
},
// individuals
new DoListTest( "OWL+import list individuals", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 8,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIndividuals();
}
@Override
public boolean test( Resource r ) {
return r instanceof Individual;
}
},
new DoListTest( "OWL+import list all different", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listAllDifferent();
}
@Override
public boolean test( Resource r ) {
return r instanceof AllDifferent;
}
},
// classes
new DoListTest( "OWL+import list classes", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 14,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL+import list named classes", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 12,
new String[] {NS+"A", NS+"B", NS+"C", NS+"D", NS+"E", NS+"X0", NS+"X1", NS+"Y0", NS+"Y1", NS+"Z",
OWL.Thing.getURI(), OWL.Nothing.getURI()} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listNamedClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL+import list intersection classes", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"A" } )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listIntersectionClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL+import list union classes", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 2,
new String[] {NS+"B", OWL.Thing.getURI()} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listUnionClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL+import list complement classes", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 3,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listComplementClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL+import list enumerated classes", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
new String[] {NS+"D"} )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listEnumeratedClasses();
}
@Override
public boolean test( Resource r ) {
return r instanceof OntClass;
}
},
new DoListTest( "OWL+import list restrictions", "file:testing/ontology/owl/list-syntax/test-with-import.rdf", OntModelSpec.OWL_MEM_TRANS_INF, 1,
null )
{
@Override
public Iterator< ? extends Resource> doList( OntModel m ) {
return m.listRestrictions();
}
@Override
public boolean test( Resource r ) {
return r instanceof Restriction;
}
},
};
// Instance variables
//////////////////////////////////
// Constructors
//////////////////////////////////
public TestListSyntaxCategories( String name ) {
super( name );
}
// External signature methods
//////////////////////////////////
public static TestSuite suite() {
TestSuite s = new TestSuite( "TestListSyntaxCategories" );
for ( DoListTest testCase : testCases )
{
s.addTest( testCase );
}
return s;
}
// Internal implementation methods
//////////////////////////////////
//==============================================================================
// Inner class definitions
//==============================================================================
protected static class DoListTest
extends TestCase
{
protected String m_fileName;
protected OntModelSpec m_spec;
protected int m_count;
protected String[] m_expected;
protected boolean m_exExpected; // exception expected during list operation
protected DoListTest( String name, String fileName, OntModelSpec spec, int count, String[] expected ) {
this( name, fileName, spec, count, expected, false );
}
protected DoListTest( String name, String fileName, OntModelSpec spec, int count, String[] expected, boolean exExpected ) {
super( name );
m_fileName = fileName;
m_spec = spec;
m_count = count;
m_expected = expected;
m_exExpected = exExpected;
}
@Override
public void setUp() {
// ensure the ont doc manager is in a consistent state
OntDocumentManager.getInstance().reset( true );
}
@Override
public void runTest() {
Logger logger = LoggerFactory.getLogger( getClass() );
OntModel m = ModelFactory.createOntologyModel( m_spec, null );
m.getDocumentManager().setMetadataSearchPath( "ont-policy-test.rdf", true );
if (m_fileName != null) {
m.read( m_fileName );
}
// hook to add extra axioms
addAxioms( m );
boolean exOccurred = false;
Iterator<? extends Resource> i = null;
try {
i = doList( m );
}
catch (OntologyException e) {
exOccurred = true;
}
assertEquals( "Ontology exception" + (m_exExpected ? " was " : " was not ") + "expected", m_exExpected, exOccurred );
if (!exOccurred) {
List<Resource> expected = expected( m );
List<Resource> actual = new ArrayList<>();
int extraneous = 0;
// now we walk the iterator
while (i.hasNext()) {
Resource res = i.next();
assertTrue( "Should not fail node test on " + res, test( res ));
actual.add( res );
if (expected != null) {
if (expected.contains( res )) {
expected.remove( res );
}
else {
if (!res.isAnon()) {
// since we can't list expected anon resources, we ignore them in this check
extraneous++;
logger.debug( "found extraneous result: " + res );
}
}
}
}
// debugging
if (m_count != actual.size()) {
logger.debug( getName() + " - expected " + m_count + " results, actual = " + actual.size() );
for ( Resource anActual : actual )
{
logger.debug( getName() + " - saw actual: " + anActual );
}
}
if (expected != null && !expected.isEmpty()) {
for ( Resource anExpected : expected )
{
logger.debug( getName() + " - expected but did not find: " + anExpected );
}
}
assertEquals( getName() + ": wrong number of results returned", m_count, actual.size() );
if (expected != null) {
assertTrue( "Did not find all expected resources in iterator", expected.isEmpty() );
assertEquals( "Found extraneous results, not in expected list", 0, extraneous );
}
}
}
/* get the iterator */
public Iterator<? extends Resource> doList( OntModel m ) {
// should be overriden in sub-classes
return null;
}
/* test the Java type of the result, and other tests */
public boolean test( Resource r ) {
return true;
}
protected List<Resource> expected( OntModel m ) {
if (m_expected != null) {
List<Resource> expected = new ArrayList<>();
for ( String aM_expected : m_expected )
{
expected.add( m.getResource( aM_expected ) );
}
return expected;
}
else {
return null;
}
}
/** Add extra axioms hook */
protected void addAxioms( OntModel m ) {
// default is no-op
}
}
}