/* * 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.compose; import static org.apache.jena.testing_framework.GraphHelper.*; import static org.junit.Assert.*; import java.util.HashMap; import java.util.Map; import org.junit.runner.RunWith; import org.xenei.junit.contract.Contract; import org.xenei.junit.contract.ContractImpl; import org.xenei.junit.contract.ContractSuite; import org.xenei.junit.contract.ContractTest; import org.apache.jena.graph.Graph; import org.apache.jena.graph.GraphStatisticsHandler; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.graph.compose.Union; import org.apache.jena.graph.impl.GraphBase; import org.apache.jena.testing_framework.AbstractGraphProducer; import org.xenei.junit.contract.IProducer; import org.apache.jena.util.iterator.ExtendedIterator; @RunWith(ContractSuite.class) @ContractImpl(Union.class) public class UnionTest { protected IProducer<Union> graphProducer; public UnionTest() { graphProducer = new AbstractGraphProducer<Union>() { private Map<Graph, Graph[]> map = new HashMap<Graph, Graph[]>(); @Override protected Union createNewGraph() { Graph[] g = { memGraph(), memGraph() }; Union u = new Union(g[0], g[1]); map.put(u, g); return u; } @Override public Graph[] getDependsOn(Graph d) { Graph[] dg = map.get(d); if (dg == null) { throw new IllegalStateException("graph not in map"); } return dg; } @Override public Graph[] getNotDependsOn(Graph g) { return new Graph[] { memGraph() }; } @Override protected void afterClose(Graph g) { map.remove(g); } }; } @Contract.Inject public final IProducer<Union> getUnionTestProducer() { return graphProducer; } @ContractTest public void testUnion() { Graph g1 = graphWith("x R y; p R q"); Graph g2 = graphWith("r Foo s; x R y"); Union u = new Union(g1, g2); assertContains("Union", "x R y", u); assertContains("Union", "p R q", u); assertContains("Union", "r Foo s", u); if (u.size() != 3) fail("oops: size of union is not 3"); u.add(triple("cats eat cheese")); assertContains("Union", "cats eat cheese", u); if (contains(g1, "cats eat cheese") == false && contains(g2, "cats eat cheese") == false) fail("oops: neither g1 nor g2 contains `cats eat cheese`"); } static class AnInteger { public int value = 0; public AnInteger(int value) { this.value = value; } } @ContractTest public void testUnionValues() { testUnion(0, 0, 0, 0); } @ContractTest public void testCopiesSingleNonZeroResult() { testUnion(1, 1, 0, 0); testUnion(1, 0, 1, 0); testUnion(1, 0, 0, 1); testUnion(1, 1, 0, 0); testUnion(2, 0, 2, 0); testUnion(4, 0, 0, 4); } @ContractTest public void testResultIsSumOfBaseResults() { testUnion(3, 1, 2, 0); testUnion(5, 1, 0, 4); testUnion(6, 0, 2, 4); testUnion(7, 1, 2, 4); testUnion(3, 0, 2, 1); testUnion(5, 4, 1, 0); testUnion(6, 2, 2, 2); testUnion(7, 6, 0, 1); } @ContractTest public void testUnknownOverrulesAll() { testUnion(-1, -1, 0, 0); testUnion(-1, 0, -1, 0); testUnion(-1, 0, 0, -1); testUnion(-1, -1, 1, 1); testUnion(-1, 1, -1, 1); testUnion(-1, 1, 1, -1); } /** * Asserts that the statistic obtained by probing the three-element union * with statistics <code>av</code>, <code>bv</code>, and <code>cv</code> is * <code>expected</code>. */ private void testUnion(int expected, int av, int bv, int cv) { AnInteger a = new AnInteger(av), b = new AnInteger(bv), c = new AnInteger( cv); Graph g1 = graphWithGivenStatistic(a); Graph g2 = graphWithGivenStatistic(b); Graph g3 = graphWithGivenStatistic(c); Graph[] graphs = new Graph[] { g1, g2, g3 }; MultiUnion mu = new MultiUnion(graphs); GraphStatisticsHandler gs = new MultiUnion.MultiUnionStatisticsHandler( mu); assertEquals(expected, gs.getStatistic(Node.ANY, Node.ANY, Node.ANY)); } static Graph graphWithGivenStatistic(final AnInteger x) { return new GraphBase() { @Override protected ExtendedIterator<Triple> graphBaseFind(Triple t) { throw new RuntimeException("should never be called"); } @Override protected GraphStatisticsHandler createStatisticsHandler() { return new GraphStatisticsHandler() { @Override public long getStatistic(Node S, Node P, Node O) { return x.value; } }; } }; } }