diff --git a/src/de/dhbwstuttgart/typeinference/unifynew/Unify.java b/src/de/dhbwstuttgart/typeinference/unifynew/Unify.java index c347dd81..2047b150 100644 --- a/src/de/dhbwstuttgart/typeinference/unifynew/Unify.java +++ b/src/de/dhbwstuttgart/typeinference/unifynew/Unify.java @@ -101,9 +101,9 @@ public class Unify { MPair pair = eqQueue.getFirst(); // ReduceUp, ReduceLow, ReduceUpLow - Optional opt = rules.reduceUp(pair); + Optional opt = rules.reduceUpLow(pair); opt = opt.isPresent() ? opt : rules.reduceLow(pair); - opt = opt.isPresent() ? opt : rules.reduceUpLow(pair); + opt = opt.isPresent() ? opt : rules.reduceUp(pair); // One of the rules has been applied if(opt.isPresent()) { diff --git a/src/de/dhbwstuttgart/typinference/unify/model/MPair.java b/src/de/dhbwstuttgart/typinference/unify/model/MPair.java index 4a811940..0088d02a 100644 --- a/src/de/dhbwstuttgart/typinference/unify/model/MPair.java +++ b/src/de/dhbwstuttgart/typinference/unify/model/MPair.java @@ -58,9 +58,7 @@ public class MPair { public boolean equals(Object obj) { if(!(obj instanceof MPair)) return false; - if(obj.hashCode() != hashCode()) - return false; - + MPair other = (MPair) obj; return other.getPairOp() == pairOp diff --git a/test/unify/RuleSetTest.java b/test/unify/RuleSetTest.java index b43f396c..d76546a0 100644 --- a/test/unify/RuleSetTest.java +++ b/test/unify/RuleSetTest.java @@ -23,31 +23,76 @@ public class RuleSetTest { @Test public void testReduceUp() { - Set pairs = new HashSet(); + IRuleSet rules = new RuleSet(new FiniteClosureBuilder().getFiniteClosure()); + TypeFactory tf = new TypeFactory(); + + /* + * Positive Tests + */ - SimpleType t1 = new SimpleType("Set"); - SimpleType t2 = new SimpleType("HashSet"); - SimpleType t3 = new SimpleType("Something"); + MPair reduce1 = new MPair(tf.getSimpleType("type"), tf.getSuperType(tf.getSimpleType("type")), PairOperator.SMALLERDOT); + MPair reduce2 = new MPair(tf.getPlaceholderType("T"), tf.getSuperType(tf.getSimpleType("type")), PairOperator.SMALLERDOT); + + MPair expected1 = new MPair(tf.getSimpleType("type"), tf.getSimpleType("type"), PairOperator.SMALLERDOT); + MPair expected2 = new MPair(tf.getPlaceholderType("T"), tf.getSimpleType("type"), PairOperator.SMALLERDOT); - SuperType s = new SuperType(t2); + Optional opt1 = rules.reduceUp(reduce1); + Optional opt2 = rules.reduceUp(reduce2); - pairs.add(new MPair(t1, t2, PairOperator.SMALLER)); + Assert.assertTrue(opt1.isPresent()); + Assert.assertTrue(opt2.isPresent()); + Assert.assertEquals(opt1.get(), expected1); + Assert.assertEquals(opt2.get(), expected2); + + /* + * Negative Tests + */ - FiniteClosure fc = new FiniteClosure(pairs); + MPair noreduce1 = new MPair(tf.getSuperType(tf.getSimpleType("type")), tf.getSuperType(tf.getSimpleType("type")), PairOperator.SMALLERDOT); + MPair noreduce2 = new MPair(tf.getPlaceholderType("T"), tf.getSimpleType("type"), PairOperator.SMALLERDOT); + MPair noreduce3 = new MPair(tf.getPlaceholderType("T"), tf.getExtendsType(tf.getSimpleType("type")), PairOperator.SMALLERDOT); + MPair noreduce4 = new MPair(tf.getPlaceholderType("T"), tf.getSuperType(tf.getSimpleType("type")), PairOperator.EQUALSDOT); - IRuleSet rules = new RuleSet(fc); - - MPair test = new MPair(t3, s, PairOperator.SMALLERDOT); - - - Optional res = rules.reduceUp(test); - - System.out.println(res); + Assert.assertFalse(rules.reduceUp(noreduce1).isPresent()); + Assert.assertFalse(rules.reduceUp(noreduce2).isPresent()); + Assert.assertFalse(rules.reduceUp(noreduce3).isPresent()); + Assert.assertFalse(rules.reduceUp(noreduce4).isPresent()); } @Test public void testReduceLow() { + IRuleSet rules = new RuleSet(new FiniteClosureBuilder().getFiniteClosure()); + TypeFactory tf = new TypeFactory(); + + /* + * Positive Tests + */ + MPair reduce1 = new MPair(tf.getExtendsType(tf.getSimpleType("type")), tf.getSimpleType("type"), PairOperator.SMALLERDOT); + MPair reduce2 = new MPair(tf.getExtendsType(tf.getSimpleType("type")), tf.getPlaceholderType("T"), PairOperator.SMALLERDOT); + + MPair expected1 = new MPair(tf.getSimpleType("type"), tf.getSimpleType("type"), PairOperator.SMALLERDOT); + MPair expected2 = new MPair(tf.getSimpleType("type"), tf.getPlaceholderType("T"), PairOperator.SMALLERDOT); + Optional opt1 = rules.reduceLow(reduce1); + Optional opt2 = rules.reduceLow(reduce2); + + Assert.assertTrue(opt1.isPresent()); + Assert.assertTrue(opt2.isPresent()); + Assert.assertEquals(opt1.get(), expected1); + Assert.assertEquals(opt2.get(), expected2); + + /* + * Negative Tests + */ + MPair noreduce1 = new MPair(tf.getExtendsType(tf.getSimpleType("type")), tf.getExtendsType(tf.getSimpleType("type")), PairOperator.SMALLERDOT); + MPair noreduce2 = new MPair(tf.getPlaceholderType("T"), tf.getSimpleType("type"), PairOperator.SMALLERDOT); + MPair noreduce3 = new MPair(tf.getSuperType(tf.getPlaceholderType("T")), tf.getSimpleType("type"), PairOperator.SMALLERDOT); + MPair noreduce4 = new MPair(tf.getExtendsType(tf.getPlaceholderType("T")), tf.getSimpleType("type"), PairOperator.EQUALSDOT); + + Assert.assertFalse(rules.reduceLow(noreduce1).isPresent()); + Assert.assertFalse(rules.reduceLow(noreduce2).isPresent()); + Assert.assertFalse(rules.reduceLow(noreduce3).isPresent()); + Assert.assertFalse(rules.reduceLow(noreduce4).isPresent()); } @Test @@ -137,7 +182,7 @@ public class RuleSetTest { @Test public void testErase1() { TypeFactory tf = new TypeFactory(); - RuleSet rules = new RuleSet(new FiniteClosureBuilder().getCollectionExample()); + IRuleSet rules = new RuleSet(new FiniteClosureBuilder().getCollectionExample()); /* * Positive Tests @@ -165,7 +210,7 @@ public class RuleSetTest { @Test public void testErase2() { TypeFactory tf = new TypeFactory(); - RuleSet rules = new RuleSet(new FiniteClosureBuilder().getCollectionExample()); + IRuleSet rules = new RuleSet(new FiniteClosureBuilder().getCollectionExample()); /* * Positive Tests @@ -200,7 +245,7 @@ public class RuleSetTest { @Test public void testErase3() { TypeFactory tf = new TypeFactory(); - RuleSet rules = new RuleSet(new FiniteClosureBuilder().getFiniteClosure()); + IRuleSet rules = new RuleSet(new FiniteClosureBuilder().getFiniteClosure()); /* * Positive Tests @@ -224,7 +269,7 @@ public class RuleSetTest { @Test public void testSwap() { TypeFactory tf = new TypeFactory(); - RuleSet rules = new RuleSet(new FiniteClosureBuilder().getFiniteClosure()); + IRuleSet rules = new RuleSet(new FiniteClosureBuilder().getFiniteClosure()); /* * Positive Tests