package no.priv.garshol.duke.test; import java.util.Collection; import org.junit.Test; import org.junit.After; import org.junit.Before; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertEquals; import no.priv.garshol.duke.EquivalenceClassDatabase; public abstract class ClassDatabaseTest { private EquivalenceClassDatabase classdb; @Before public void setup() { classdb = createDatabase(); } public abstract EquivalenceClassDatabase createDatabase(); @Test public void testEmpty() { assertTrue("nothing's happened, so there should be no links", classdb.getClass("id1").isEmpty()); } @Test public void testSingle() { classdb.addLink("id1", "id2"); classdb.commit(); assertTrue("unknown ID should have no class", classdb.getClass("id3").isEmpty()); checkClass(classdb.getClass("id1"), "id1", "id2"); checkClass(classdb.getClass("id2"), "id1", "id2"); } @Test public void testSingleSymmetric() { classdb.addLink("id1", "id2"); classdb.addLink("id2", "id1"); classdb.commit(); assertTrue("unknown ID should have no class", classdb.getClass("id3").isEmpty()); checkClass(classdb.getClass("id1"), "id1", "id2"); checkClass(classdb.getClass("id2"), "id1", "id2"); } @Test public void testDouble() { classdb.addLink("id1", "id2"); classdb.addLink("id3", "id4"); classdb.commit(); assertTrue("unknown ID should have no class", classdb.getClass("id5").isEmpty()); checkClass(classdb.getClass("id1"), "id1", "id2"); checkClass(classdb.getClass("id2"), "id1", "id2"); checkClass(classdb.getClass("id3"), "id3", "id4"); checkClass(classdb.getClass("id4"), "id3", "id4"); } @Test public void testDoubleMerge() { classdb.addLink("id1", "id2"); classdb.addLink("id3", "id4"); classdb.addLink("id1", "id3"); classdb.commit(); assertTrue("unknown ID should have no class", classdb.getClass("id5").isEmpty()); checkClass(classdb.getClass("id1"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id2"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id3"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id4"), "id1", "id2", "id3", "id4"); } @Test public void testFourOneByOne() { classdb.addLink("id1", "id2"); classdb.addLink("id1", "id3"); classdb.addLink("id1", "id4"); classdb.commit(); assertTrue("unknown ID should have no class", classdb.getClass("id5").isEmpty()); checkClass(classdb.getClass("id1"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id2"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id3"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id4"), "id1", "id2", "id3", "id4"); } @Test public void testFourOneByOne2() { classdb.addLink("id2", "id1"); classdb.addLink("id1", "id3"); classdb.addLink("id4", "id1"); classdb.commit(); assertTrue("unknown ID should have no class", classdb.getClass("id5").isEmpty()); checkClass(classdb.getClass("id1"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id2"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id3"), "id1", "id2", "id3", "id4"); checkClass(classdb.getClass("id4"), "id1", "id2", "id3", "id4"); } @Test public void testBiggerIntoSmaller() { classdb.addLink("id1", "id2"); classdb.addLink("id3", "id4"); classdb.addLink("id5", "id6"); classdb.addLink("id4", "id5"); classdb.addLink("id1", "id3"); classdb.commit(); assertTrue("unknown ID should have no class", classdb.getClass("id7").isEmpty()); checkClass(classdb.getClass("id1"), "id1", "id2", "id3", "id4", "id5", "id6"); checkClass(classdb.getClass("id2"), "id1", "id2", "id3", "id4", "id5", "id6"); checkClass(classdb.getClass("id3"), "id1", "id2", "id3", "id4", "id5", "id6"); checkClass(classdb.getClass("id4"), "id1", "id2", "id3", "id4", "id5", "id6"); checkClass(classdb.getClass("id5"), "id1", "id2", "id3", "id4", "id5", "id6"); checkClass(classdb.getClass("id6"), "id1", "id2", "id3", "id4", "id5", "id6"); } private void checkClass(Collection<String> klass, String... ids) { assertEquals("wrong size of class", klass.size(), ids.length); for (String id : ids) assertTrue("class must contain " + id, klass.contains(id)); } }