You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2013/09/06 16:21:40 UTC

[1/3] git commit: added test for new statement collections with parameterized equality

Updated Branches:
  refs/heads/develop e43574efa -> 408be3d55


added test for new statement collections with parameterized equality


Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/a9673202
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/a9673202
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/a9673202

Branch: refs/heads/develop
Commit: a96732021819e5c878ac2bc52eed70137aca8eaf
Parents: e43574e
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Fri Sep 6 15:30:11 2013 +0200
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Fri Sep 6 15:30:11 2013 +0200

----------------------------------------------------------------------
 .../collections/EquivalenceHashSetTest.java     |   2 +
 .../sesame/model/StatementCommonsTest.java      | 225 +++++++++++++++++++
 .../kiwi/reasoner/engine/ReasoningEngine.java   |   6 +-
 .../kiwi/reasoner/model/program/Pattern.java    |  21 +-
 .../kiwi/test/PostgreSQLConcurrencyTest.java    |   3 +
 5 files changed, 242 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/a9673202/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/collections/EquivalenceHashSetTest.java
----------------------------------------------------------------------
diff --git a/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/collections/EquivalenceHashSetTest.java b/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/collections/EquivalenceHashSetTest.java
index 4aa3e9c..a01813c 100644
--- a/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/collections/EquivalenceHashSetTest.java
+++ b/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/collections/EquivalenceHashSetTest.java
@@ -107,10 +107,12 @@ public class EquivalenceHashSetTest {
 
         // test sets with elements, insertion order different
         Assert.assertEquals(set1,set2);
+        Assert.assertEquals(set1.hashCode(), set2.hashCode());
 
         set1.add(c1);
 
         Assert.assertNotEquals(set1,set2);
+        Assert.assertNotEquals(set1.hashCode(), set2.hashCode());
 
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/a9673202/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/sesame/model/StatementCommonsTest.java
----------------------------------------------------------------------
diff --git a/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/sesame/model/StatementCommonsTest.java b/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/sesame/model/StatementCommonsTest.java
new file mode 100644
index 0000000..05a6003
--- /dev/null
+++ b/commons/marmotta-commons/src/test/java/org/apache/marmotta/commons/sesame/model/StatementCommonsTest.java
@@ -0,0 +1,225 @@
+package org.apache.marmotta.commons.sesame.model;
+
+import com.google.common.base.Equivalence;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.*;
+import org.openrdf.model.impl.ValueFactoryImpl;
+
+import java.util.*;
+
+/**
+ * Add file description here!
+ *
+ * @author Sebastian Schaffert (sschaffert@apache.org)
+ */
+public class StatementCommonsTest {
+
+    protected static Random rnd = new Random();
+
+
+    Statement stmt1, stmt2, stmt3, stmt4;
+
+    ValueFactory valueFactory;
+
+    private List<URI> resources = new ArrayList<>();
+
+    private List<Value> objects = new ArrayList<>();
+
+
+    @Before
+    public void setup() {
+        valueFactory = new ValueFactoryImpl();
+
+        Resource s1 = randomURI();
+        URI p1 = randomURI();
+        URI p2 = randomURI();
+        Value o1 = randomObject();
+        Resource c1 = randomURI();
+        Resource c2 = randomURI();
+
+
+        stmt1 = valueFactory.createStatement(s1,p1,o1,c1);
+        stmt2 = valueFactory.createStatement(s1,p1,o1,c2);
+        stmt3 = valueFactory.createStatement(s1,p2,o1,c1);
+        stmt4 = valueFactory.createStatement(s1,p1,o1,c1);
+    }
+
+
+    @Test
+    public void testTripleEquivalence() {
+        Equivalence<Statement> e = StatementCommons.tripleEquivalence();
+
+        Assert.assertTrue(e.equivalent(stmt1,stmt2));
+        Assert.assertTrue(e.equivalent(stmt1,stmt4));
+        Assert.assertFalse(e.equivalent(stmt1,stmt3));
+    }
+
+    @Test
+    public void testQuadrupleEquivalence() {
+        Equivalence<Statement> e = StatementCommons.tripleEquivalence();
+
+        Assert.assertTrue(e.equivalent(stmt1,stmt2));
+        Assert.assertTrue(e.equivalent(stmt1,stmt4));
+        Assert.assertFalse(e.equivalent(stmt1,stmt3));
+    }
+
+    @Test
+    public void testTripleSet() {
+        Set<Statement> set = StatementCommons.newTripleSet();
+
+        set.add(stmt1);
+
+        // triple 2 just has different context, so should be contained already
+        Assert.assertTrue(set.contains(stmt2));
+
+        // adding triple 2 should not change size
+        set.add(stmt2);
+
+        Assert.assertEquals(1,set.size());
+
+        // statement 3 is different, so not contained and size increased
+        Assert.assertFalse(set.contains(stmt3));
+
+        set.add(stmt3);
+
+        Assert.assertEquals(2,set.size());
+
+    }
+
+    @Test
+    public void testQuadrupleSet() {
+        Set<Statement> set = StatementCommons.newQuadrupleSet();
+
+        set.add(stmt1);
+
+        // triple 2 has different context, so should not be contained already
+        Assert.assertFalse(set.contains(stmt2));
+
+        // adding triple 2 should change size
+        set.add(stmt2);
+
+        Assert.assertEquals(2,set.size());
+
+        // statement 3 is different, so not contained and size increased
+        Assert.assertFalse(set.contains(stmt3));
+
+        set.add(stmt3);
+
+        Assert.assertEquals(3,set.size());
+
+    }
+
+
+    @Test
+    public void testTripleMap() {
+        Map<Statement, String> map = StatementCommons.newTripleMap();
+
+        String s1 = RandomStringUtils.random(8);
+        String s2 = RandomStringUtils.random(8);
+        String s3 = RandomStringUtils.random(8);
+
+        map.put(stmt1, s1);
+
+        // triple 2 just has different context, so should be contained already
+        Assert.assertEquals(s1, map.get(stmt2));
+
+        // adding triple 2 should not change size
+        map.put(stmt2,s2);
+
+        Assert.assertEquals(1, map.size());
+
+        // value now replaced?
+        Assert.assertEquals(s2, map.get(stmt1));
+
+        // statement 3 is different, so not contained and size increased
+        Assert.assertFalse(map.containsKey(stmt3));
+
+        map.put(stmt3,s3);
+
+        Assert.assertEquals(2, map.size());
+
+    }
+
+    @Test
+    public void testQuadrupleMap() {
+        Map<Statement, String> map = StatementCommons.newQuadrupleMap();
+
+        String s1 = RandomStringUtils.random(8);
+        String s2 = RandomStringUtils.random(8);
+        String s3 = RandomStringUtils.random(8);
+
+        map.put(stmt1, s1);
+
+        // triple 2 just has different context, so should be contained already
+        Assert.assertNotEquals(s1, map.get(stmt2));
+
+        // adding triple 2 should change size
+        map.put(stmt2,s2);
+
+        Assert.assertEquals(2, map.size());
+
+        // value not replaced?
+        Assert.assertEquals(s1, map.get(stmt1));
+
+        // statement 3 is different, so not contained and size increased
+        Assert.assertFalse(map.containsKey(stmt3));
+
+        map.put(stmt3,s3);
+
+        Assert.assertEquals(3, map.size());
+
+    }
+
+
+    /**
+     * Return a random URI, with a 10% chance of returning a URI that has already been used.
+     * @return
+     */
+    protected URI randomURI() {
+        if(resources.size() > 0 && rnd.nextInt(10) == 0) {
+            // return a resource that was already used
+            return resources.get(rnd.nextInt(resources.size()));
+        } else {
+            URI resource = valueFactory.createURI("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+            resources.add(resource);
+            return resource;
+        }
+    }
+
+    /**
+     * Return a random RDF value, either a reused object (10% chance) or of any other kind.
+     * @return
+     */
+    protected Value randomObject() {
+        if(objects.size() > 0 && rnd.nextInt(10) == 0) {
+            return objects.get(rnd.nextInt(objects.size()));
+        } else {
+            Value object;
+            switch(rnd.nextInt(6)) {
+                case 0: object = valueFactory.createURI("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+                    break;
+                case 1: object = valueFactory.createBNode();
+                    break;
+                case 2: object = valueFactory.createLiteral(RandomStringUtils.randomAscii(40));
+                    break;
+                case 3: object = valueFactory.createLiteral(rnd.nextInt());
+                    break;
+                case 4: object = valueFactory.createLiteral(rnd.nextDouble());
+                    break;
+                case 5: object = valueFactory.createLiteral(rnd.nextBoolean());
+                    break;
+                default: object = valueFactory.createURI("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+                    break;
+
+            }
+            objects.add(object);
+            return object;
+        }
+
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/a9673202/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/engine/ReasoningEngine.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/engine/ReasoningEngine.java b/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/engine/ReasoningEngine.java
index 415fa3c..8d2e08d 100644
--- a/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/engine/ReasoningEngine.java
+++ b/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/engine/ReasoningEngine.java
@@ -924,10 +924,10 @@ public class ReasoningEngine implements TransactionListener {
     public void shutdown() {
         log.info("shutting down reasoning service ...");
 
-        for(int i = 0; i<10 && isRunning(); i++) {
-            log.warn("reasoner not yet finished, waiting for 10 seconds (try={})", i+1);
+        for(int i = 0; i<20 && isRunning(); i++) {
+            log.warn("reasoner not yet finished, waiting for 1 seconds (try={})", i+1);
             try {
-                Thread.sleep(10000);
+                Thread.sleep(1000);
             } catch (InterruptedException e) {
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/a9673202/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/model/program/Pattern.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/model/program/Pattern.java b/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/model/program/Pattern.java
index 91c9aa4..6fd96f9 100644
--- a/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/model/program/Pattern.java
+++ b/libraries/kiwi/kiwi-reasoner/src/main/java/org/apache/marmotta/kiwi/reasoner/model/program/Pattern.java
@@ -17,6 +17,8 @@
  */
 package org.apache.marmotta.kiwi.reasoner.model.program;
 
+import com.google.common.base.Objects;
+
 import java.util.Map;
 
 /**
@@ -93,28 +95,23 @@ public class Pattern  {
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
 
-        if(context == null && object == null && subject == null && property == null) {
-            return super.equals(o);
+        if(! (o instanceof Pattern)) {
+            return false;
         }
 
         Pattern pattern = (Pattern) o;
 
-        if (context != null ? !context.equals(pattern.context) : pattern.context != null) return false;
-        if (object != null ? !object.equals(pattern.object) : pattern.object != null) return false;
-        if (property != null ? !property.equals(pattern.property) : pattern.property != null) return false;
-        if (subject != null ? !subject.equals(pattern.subject) : pattern.subject != null) return false;
+        if(!Objects.equal(this.context, pattern.context)) return false;
+        if(!Objects.equal(this.object, pattern.object)) return false;
+        if(!Objects.equal(this.property, pattern.property)) return false;
+        if(!Objects.equal(this.subject, pattern.subject)) return false;
 
         return true;
     }
 
     @Override
     public int hashCode() {
-        int result = subject != null ? subject.hashCode() : 0;
-        result = 31 * result + (property != null ? property.hashCode() : 0);
-        result = 31 * result + (object != null ? object.hashCode() : 0);
-        result = 31 * result + (context != null ? context.hashCode() : 0);
-        return result;
+        return Objects.hashCode(subject, property, object, context);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/a9673202/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/PostgreSQLConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/PostgreSQLConcurrencyTest.java b/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/PostgreSQLConcurrencyTest.java
index 8d5fb94..cfe352d 100644
--- a/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/PostgreSQLConcurrencyTest.java
+++ b/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/PostgreSQLConcurrencyTest.java
@@ -30,6 +30,8 @@ public class PostgreSQLConcurrencyTest extends ConcurrencyTestBase {
     public static void setup() throws RepositoryException {
         logger = LoggerFactory.getLogger(PostgreSQLConcurrencyTest.class);
 
+        logger.info("creating test setup...");
+
         KiWiConfiguration psql = KiWiDatabaseRunner.createKiWiConfig("PostgreSQL", new PostgreSQLDialect());
         DBConnectionChecker.checkDatabaseAvailability(psql);
         
@@ -42,6 +44,7 @@ public class PostgreSQLConcurrencyTest extends ConcurrencyTestBase {
 
     @AfterClass
     public static void dropDatabase() throws RepositoryException, SQLException, SailException {
+        logger.info("cleaning up test setup...");
     	if (store != null && store.isInitialized()) {
             assertTrue(store.checkConsistency());
             store.closeValueFactory(); // release all connections before dropping the database


[2/3] git commit: added more testing to track down reasoner bugs

Posted by ss...@apache.org.
added more testing to track down reasoner bugs


Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/10f71b42
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/10f71b42
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/10f71b42

Branch: refs/heads/develop
Commit: 10f71b4225bf43ae97b3a2c4a7f5451f97f078cf
Parents: a967320
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Fri Sep 6 16:17:17 2013 +0200
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Fri Sep 6 16:17:17 2013 +0200

----------------------------------------------------------------------
 .../reasoner/test/model/JustificationTest.java  | 149 +++++++++++++++++++
 1 file changed, 149 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/10f71b42/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java b/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java
new file mode 100644
index 0000000..b0a5ef9
--- /dev/null
+++ b/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java
@@ -0,0 +1,149 @@
+package org.apache.marmotta.kiwi.reasoner.test.model;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.marmotta.commons.sesame.model.Namespaces;
+import org.apache.marmotta.kiwi.model.rdf.*;
+import org.apache.marmotta.kiwi.reasoner.model.program.Justification;
+import org.apache.marmotta.kiwi.reasoner.model.program.Rule;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.URI;
+import org.openrdf.model.Value;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Test critical functionality of justification objects, primarily equals and similar
+ *
+ * @author Sebastian Schaffert (sschaffert@apache.org)
+ */
+public class JustificationTest {
+
+    protected static Random rnd = new Random();
+
+
+    private KiWiTriple t1, t2, t3, t4; // base
+    private KiWiTriple i1, i2, i3, i4; // inferred
+    private Rule r1, r2;
+
+    private KiWiUriResource ctx_inferred;
+
+
+    private List<KiWiUriResource> resources = new ArrayList<>();
+
+    private List<KiWiNode> objects = new ArrayList<>();
+
+
+    @Before
+    public void setup() {
+        KiWiUriResource s1 = randomURI();
+        KiWiUriResource s2 = randomURI();
+        KiWiUriResource s3 = randomURI();
+        KiWiUriResource s4 = randomURI();
+        KiWiUriResource p1 = randomURI();
+        KiWiUriResource p2 = randomURI();
+        KiWiNode o1 = randomObject();
+        KiWiNode o2 = randomObject();
+        KiWiNode o3 = randomObject();
+        KiWiNode o4 = randomObject();
+
+        ctx_inferred = randomURI();
+
+        t1 = new KiWiTriple(s1,p1,o1, null);
+        t2 = new KiWiTriple(s1,p1,o2, null);
+        t3 = new KiWiTriple(s2,p1,o3, null);
+        t4 = new KiWiTriple(s1,p1,o1, randomURI());
+
+
+        i1 = new KiWiTriple(s1,p2,o1, ctx_inferred); i1.setInferred(true);
+        i2 = new KiWiTriple(s1,p1,o2, ctx_inferred); i2.setInferred(true);
+        i3 = new KiWiTriple(s3,p1,o3, ctx_inferred); i3.setInferred(true);
+        i4 = new KiWiTriple(s1,p2,o1, ctx_inferred); i4.setInferred(true);
+
+
+    }
+
+
+    @Test
+    public void testJustificationEquals() {
+        Justification j1 = new Justification();
+        j1.setTriple(i1);
+        j1.getSupportingTriples().add(t1);
+        j1.getSupportingTriples().add(t4);
+
+        Justification j2 = new Justification();
+        j2.setTriple(i4);
+        j2.getSupportingTriples().add(t4);
+        j2.getSupportingTriples().add(t1);
+
+        Assert.assertEquals(j1,j2);
+
+        // j3 differs in the inferred triple
+        Justification j3 = new Justification();
+        j3.setTriple(i2);
+        j3.getSupportingTriples().add(t4);
+        j3.getSupportingTriples().add(t1);
+
+        Assert.assertNotEquals(j1, j3);
+
+        // j4 differs in the supporting triples
+        Justification j4 = new Justification();
+        j4.setTriple(i1);
+        j4.getSupportingTriples().add(t2);
+        j4.getSupportingTriples().add(t4);
+
+        Assert.assertNotEquals(j1, j4);
+    }
+
+
+    /**
+     * Return a random URI, with a 10% chance of returning a URI that has already been used.
+     * @return
+     */
+    protected KiWiUriResource randomURI() {
+        if(resources.size() > 0 && rnd.nextInt(10) == 0) {
+            // return a resource that was already used
+            return resources.get(rnd.nextInt(resources.size()));
+        } else {
+            KiWiUriResource resource = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+            resources.add(resource);
+            return resource;
+        }
+    }
+
+    /**
+     * Return a random RDF value, either a reused object (10% chance) or of any other kind.
+     * @return
+     */
+    protected KiWiNode randomObject() {
+        if(objects.size() > 0 && rnd.nextInt(10) == 0) {
+            return objects.get(rnd.nextInt(objects.size()));
+        } else {
+            KiWiNode object;
+            switch(rnd.nextInt(6)) {
+                case 0: object = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+                    break;
+                case 1: object = new KiWiAnonResource();
+                    break;
+                case 2: object = new KiWiStringLiteral(RandomStringUtils.randomAscii(40));
+                    break;
+                case 3: object = new KiWiIntLiteral(rnd.nextLong(), new KiWiUriResource(Namespaces.NS_XSD + "integer"));
+                    break;
+                case 4: object = new KiWiDoubleLiteral(rnd.nextDouble(), new KiWiUriResource(Namespaces.NS_XSD + "double"));
+                    break;
+                case 5: object = new KiWiBooleanLiteral(rnd.nextBoolean(), new KiWiUriResource(Namespaces.NS_XSD + "boolean"));
+                    break;
+                default: object = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+                    break;
+
+            }
+            objects.add(object);
+            return object;
+        }
+
+    }
+
+}


[3/3] git commit: more justification testing

Posted by ss...@apache.org.
more justification testing


Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/408be3d5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/408be3d5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/408be3d5

Branch: refs/heads/develop
Commit: 408be3d55c2e97b30fe0fb29ec2499ced3ea2135
Parents: 10f71b4
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Fri Sep 6 16:21:40 2013 +0200
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Fri Sep 6 16:21:40 2013 +0200

----------------------------------------------------------------------
 .../reasoner/test/model/JustificationTest.java  | 112 ++++++++++++-------
 1 file changed, 71 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/408be3d5/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java b/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java
index b0a5ef9..086f2e8 100644
--- a/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java
+++ b/libraries/kiwi/kiwi-reasoner/src/test/java/org/apache/marmotta/kiwi/reasoner/test/model/JustificationTest.java
@@ -11,9 +11,7 @@ import org.junit.Test;
 import org.openrdf.model.URI;
 import org.openrdf.model.Value;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
+import java.util.*;
 
 /**
  * Test critical functionality of justification objects, primarily equals and similar
@@ -31,12 +29,6 @@ public class JustificationTest {
 
     private KiWiUriResource ctx_inferred;
 
-
-    private List<KiWiUriResource> resources = new ArrayList<>();
-
-    private List<KiWiNode> objects = new ArrayList<>();
-
-
     @Before
     public void setup() {
         KiWiUriResource s1 = randomURI();
@@ -99,19 +91,63 @@ public class JustificationTest {
     }
 
 
+    @Test
+    public void testJustificationSet() {
+        Set<Justification> set = new HashSet<>();
+
+        Justification j1 = new Justification();
+        j1.setTriple(i1);
+        j1.getSupportingTriples().add(t1);
+        j1.getSupportingTriples().add(t4);
+        set.add(j1);
+
+        Justification j2 = new Justification();
+        j2.setTriple(i4);
+        j2.getSupportingTriples().add(t4);
+        j2.getSupportingTriples().add(t1);
+
+        Assert.assertTrue(set.contains(j2));
+
+        set.add(j2);
+
+        Assert.assertEquals(1, set.size());
+
+
+        // j3 differs in the inferred triple
+        Justification j3 = new Justification();
+        j3.setTriple(i2);
+        j3.getSupportingTriples().add(t4);
+        j3.getSupportingTriples().add(t1);
+
+        Assert.assertFalse(set.contains(j3));
+
+        set.add(j3);
+
+        Assert.assertEquals(2, set.size());
+
+
+        // j4 differs in the supporting triples
+        Justification j4 = new Justification();
+        j4.setTriple(i1);
+        j4.getSupportingTriples().add(t2);
+        j4.getSupportingTriples().add(t4);
+
+        Assert.assertFalse(set.contains(j4));
+
+        set.add(j4);
+
+        Assert.assertEquals(3, set.size());
+    }
+
+
+
     /**
      * Return a random URI, with a 10% chance of returning a URI that has already been used.
      * @return
      */
     protected KiWiUriResource randomURI() {
-        if(resources.size() > 0 && rnd.nextInt(10) == 0) {
-            // return a resource that was already used
-            return resources.get(rnd.nextInt(resources.size()));
-        } else {
-            KiWiUriResource resource = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
-            resources.add(resource);
-            return resource;
-        }
+        KiWiUriResource resource = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+        return resource;
     }
 
     /**
@@ -119,31 +155,25 @@ public class JustificationTest {
      * @return
      */
     protected KiWiNode randomObject() {
-        if(objects.size() > 0 && rnd.nextInt(10) == 0) {
-            return objects.get(rnd.nextInt(objects.size()));
-        } else {
-            KiWiNode object;
-            switch(rnd.nextInt(6)) {
-                case 0: object = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
-                    break;
-                case 1: object = new KiWiAnonResource();
-                    break;
-                case 2: object = new KiWiStringLiteral(RandomStringUtils.randomAscii(40));
-                    break;
-                case 3: object = new KiWiIntLiteral(rnd.nextLong(), new KiWiUriResource(Namespaces.NS_XSD + "integer"));
-                    break;
-                case 4: object = new KiWiDoubleLiteral(rnd.nextDouble(), new KiWiUriResource(Namespaces.NS_XSD + "double"));
-                    break;
-                case 5: object = new KiWiBooleanLiteral(rnd.nextBoolean(), new KiWiUriResource(Namespaces.NS_XSD + "boolean"));
-                    break;
-                default: object = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
-                    break;
-
-            }
-            objects.add(object);
-            return object;
-        }
+        KiWiNode object;
+        switch(rnd.nextInt(6)) {
+            case 0: object = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+                break;
+            case 1: object = new KiWiAnonResource(RandomStringUtils.randomAscii(8));
+                break;
+            case 2: object = new KiWiStringLiteral(RandomStringUtils.randomAscii(40));
+                break;
+            case 3: object = new KiWiIntLiteral(rnd.nextLong(), new KiWiUriResource(Namespaces.NS_XSD + "integer"));
+                break;
+            case 4: object = new KiWiDoubleLiteral(rnd.nextDouble(), new KiWiUriResource(Namespaces.NS_XSD + "double"));
+                break;
+            case 5: object = new KiWiBooleanLiteral(rnd.nextBoolean(), new KiWiUriResource(Namespaces.NS_XSD + "boolean"));
+                break;
+            default: object = new KiWiUriResource("http://localhost/" + RandomStringUtils.randomAlphanumeric(8));
+                break;
 
+        }
+        return object;
     }
 
 }