/*
* 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.assembler.test;
import java.util.*;
import org.apache.jena.assembler.ModelExpansion ;
import org.apache.jena.rdf.model.* ;
public class TestModelExpansion extends AssemblerTestBase
{
public TestModelExpansion( String name )
{ super( name ); }
public void testAddsSubclasses()
{
Model base = model( "a R b" );
Model schema = model( "x rdfs:subClassOf y; y P z" );
Model answer = ModelExpansion.withSchema( base, schema );
assertIsoModels( model( "a R b; x rdfs:subClassOf y" ), answer );
}
public void testOmitsAnonynousSubclasses()
{
Model base = model( "a R b" );
Model schema = model( "x rdfs:subClassOf _y; z rdfs:subClassOf _a" );
Model answer = ModelExpansion.withSchema( base, schema );
assertIsoModels( model( "a R b" ), answer );
}
public void testAddsDomainTypes()
{
Model base = model( "a R b" );
Model schema = model( "R rdfs:domain T" );
Model answer = ModelExpansion.withSchema( base, schema );
assertIsoModels( model( "a R b; a rdf:type T" ), answer );
}
public void testAddsRangeTypes()
{
Model base = model( "a R b" );
Model schema = model( "R rdfs:range T" );
Model answer = ModelExpansion.withSchema( base, schema );
assertIsoModels( model( "a R b; b rdf:type T" ), answer );
}
public void testLabelsDontCrashExpansion()
{
Model base = ModelFactory.createRDFSModel( model( "a R b; a rdfs:label 'hello'" ) );
Model schema = ModelFactory.createRDFSModel( model( "R rdfs:range T" ) );
Model answer = ModelExpansion.withSchema( base, schema );
}
public void testIntersection()
{
testIntersection( "x rdf:type T; x rdf:type U", true, "T U" );
testIntersection( "x rdf:type T; x rdf:type U", true, "T" );
testIntersection( "x rdf:type T; x rdf:type U", false, "T U V" );
testIntersection( "x rdf:type T; x rdf:type U; x rdf:type V", true, "T U V" );
}
private void testIntersection( String xTyped, boolean infers, String intersectionTypes )
{
Model base = model( xTyped );
Model schema = intersectionModel( "I", intersectionTypes );
Model answer = ModelExpansion.withSchema( base, schema );
assertEquals( "should [not] infer (x rdf:type I)", infers, answer.contains( statement( "x rdf:type I" ) ) );
}
private Model intersectionModel( String inter, String types )
{
return model( "I owl:equivalentClass _L; _L owl:intersectionOf _L1" + rdfList( "_L", types ) );
}
private String rdfList( String base, String types )
{
StringBuilder result = new StringBuilder();
List<String> L = listOfStrings( types );
String rest = "rdf:nil";
for (int i = L.size(); i > 0; i -= 1)
{
String current = base + i;
result.append( "; " ).append( current ).append( " rdf:rest " ).append( rest );
result.append( "; " ).append( current ).append( " rdf:first " ).append( L.get(i-1) );
rest = current;
}
return result.toString();
}
public void testAddsSupertypes()
{
Model base = model( "a rdf:type T; T rdfs:subClassOf U" );
Model schema = model( "T rdfs:subClassOf V" );
Model answer = ModelExpansion.withSchema( base, schema );
assertIsoModels( model( "a rdf:type T; a rdf:type U; a rdf:type V; T rdfs:subClassOf U; T rdfs:subClassOf V" ), answer );
}
public void testSubclassClosureA()
{
Model m = model( "A rdfs:subClassOf B; B rdfs:subClassOf C" );
subClassClosure( m );
assertIsoModels( model( "A rdfs:subClassOf B; B rdfs:subClassOf C; A rdfs:subClassOf C" ), m );
}
public void testSubclassClosureB()
{
Model m = model( "A rdfs:subClassOf B; B rdfs:subClassOf C; X rdfs:subClassOf C" );
subClassClosure( m );
assertIsoModels( model( "A rdfs:subClassOf B; B rdfs:subClassOf C; A rdfs:subClassOf C; X rdfs:subClassOf C" ), m );
}
public void testSubclassClosureC()
{
Model m = model( "A rdfs:subClassOf B; B rdfs:subClassOf C; X rdfs:subClassOf C; Y rdfs:subClassOf X" );
subClassClosure( m );
assertIsoModels( model( "A rdfs:subClassOf B; B rdfs:subClassOf C; A rdfs:subClassOf C; X rdfs:subClassOf C; Y rdfs:subClassOf X; Y rdfs:subClassOf C" ), m );
}
public void testSubclassClosureD()
{
Model m = model( "A rdfs:subClassOf B; B rdfs:subClassOf C; X rdfs:subClassOf C; Y rdfs:subClassOf X; U rdfs:subClassOf A; U rdfs:subClassOf Y" );
subClassClosure( m );
assertIsoModels( model( "A rdfs:subClassOf B; B rdfs:subClassOf C; A rdfs:subClassOf C; X rdfs:subClassOf C; Y rdfs:subClassOf X; Y rdfs:subClassOf C; U rdfs:subClassOf A; U rdfs:subClassOf B; U rdfs:subClassOf C; U rdfs:subClassOf X; U rdfs:subClassOf Y" ), m );
}
public void testSubclassClosureE()
{
Model m = model( "A rdfs:subClassOf B; B rdfs:subClassOf C" );
subClassClosure( m );
assertIsoModels( model( "A rdfs:subClassOf B; B rdfs:subClassOf C; A rdfs:subClassOf C" ), m );
}
protected void subClassClosure( Model m )
{ ModelExpansion.addSubClassClosure( m ); }
}