/*
* 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.graph.test;
import junit.framework.TestSuite;
import org.apache.jena.graph.* ;
/**
Tests for recursive sub-graph extraction.
*/
public class TestGraphExtract extends GraphTestBase
{
public TestGraphExtract(String name)
{ super( name ); }
public static TestSuite suite()
{ return new TestSuite( TestGraphExtract.class ); }
public void testExtractNothing()
{
testExtract( "", "x", "" );
testExtract( "", "x", "a R b" );
testExtract( "", "x", "a R x" );
testExtract( "","x", "a x y" );
}
public void testExtractOneLevel()
{
testExtract( "a R b", "a", "a R b" );
testExtract("a R b; a R c", "a", "a R b; a R c" );
testExtract( "a R b; a S d", "a", "a R b; a S d" );
}
public void testNoJunk()
{
testExtract( "a R b", "a", "a R b; x R y" );
}
public void testExtractTwoLevels()
{
testExtract( "a R b; b S c", "a", "a R b; b S c" );
testExtract( "a R b; b S c", "a", "a R b; b S c; x P y" );
testExtract( "a R b; b S c; b T d", "a", "a R b; b S c; b T d" );
testExtract( "a R b; b S c; a T d", "a", "a R b; a T d; b S c" );
}
public void testExtractSeveralLevels()
{
testExtract( "a R b; b S c; c T d; d U e", "a", "a R b; b S c; c T d; d U e" );
}
public void testExtractNoLoop()
{
testExtract( "a R a", "a", "a R a" );
testExtract( "a R b; b R a", "a", "a R b; b R a; z P a" );
testExtract( "a R b; b S c; c T a", "a", "a R b; b S c; c T a; junk P junk" );
}
public void testTripleFilter()
{
assertTrue( TripleBoundary.stopAtAnonObject.stopAt( triple( "a R _b" ) ) );
assertFalse( TripleBoundary.stopAtAnonObject.stopAt( triple( "a R b" ) ) );
assertFalse( TripleBoundary.stopAtAnonObject.stopAt( triple( "a _R b" ) ) );
assertFalse( TripleBoundary.stopAtAnonObject.stopAt( triple( "_a R b" ) ) );
}
public void testExtractBoundary()
{
testExtract( "a R b; b S _c", "a", "a R b; b S _c; _c T d", TripleBoundary.stopAtAnonObject );
}
/**
This test exposed that the update-existing-graph functionality was broken
if the target graph already contained any statements with a subject S
appearing as subject in the source graph - no further Spo statements were
added.
*/
public void testPartialUpdate()
{
Graph source = graphWith( "a R b; b S e" );
Graph dest = graphWith( "b R d" );
GraphExtract e = new GraphExtract( TripleBoundary.stopNowhere );
e.extractInto( dest, node( "a" ), source );
assertIsomorphic( graphWith( "a R b; b S e; b R d" ), dest );
}
public void testExtract( String wanted, String node, String source )
{
testExtract( wanted, node, source, TripleBoundary.stopNowhere );
}
/**
*/
private void testExtract( String wanted, String node, String source, TripleBoundary b )
{
assertIsomorphic( graphWith( wanted ), extract( node( node ), b, graphWith( source ) ) );
}
public Graph extract( Node node, TripleBoundary b, Graph graph )
{ return new GraphExtract( b ).extract( node, graph ); }
}