JavaCompilerCore/test/unify/UnifyTest.java

736 lines
21 KiB
Java
Raw Normal View History

2015-11-09 13:39:26 +00:00
package unify;
2016-03-14 13:46:10 +00:00
import java.util.ArrayList;
import java.util.Arrays;
2015-11-23 00:03:01 +00:00
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
2015-11-23 00:03:01 +00:00
import org.junit.Test;
2016-03-24 10:57:17 +00:00
import de.dhbwstuttgart.typeinference.unify.Unify;
2015-11-23 00:03:01 +00:00
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
2016-04-01 16:21:51 +00:00
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
2016-04-03 20:43:55 +00:00
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
2016-03-17 15:54:43 +00:00
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
2016-03-14 13:46:10 +00:00
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
2016-04-01 16:21:51 +00:00
import junit.framework.Assert;
2015-11-09 13:39:26 +00:00
public class UnifyTest extends Unify {
2015-11-23 00:03:01 +00:00
/**
* Testing the unification for cases with (n)one pair and without generics.
*/
2015-11-23 00:03:01 +00:00
@Test
public void unifyTestTrivial() {
/*
* INIT
*/
2015-11-23 00:03:01 +00:00
TypeFactory tf = new TypeFactory();
FiniteClosureBuilder fcb = new FiniteClosureBuilder();
2016-04-01 16:21:51 +00:00
UnifyType number = tf.getSimpleType("Number");
UnifyType object = tf.getSimpleType("Object");
UnifyType integer = tf.getSimpleType("Integer");
UnifyType doubl = tf.getSimpleType("Double");
fcb.add(number, object);
fcb.add(integer, number);
fcb.add(doubl, number);
IFiniteClosure fc = fcb.getCollectionExample();
/*
* Test 1:
*
* unify({ }) = { }
*/
Set<UnifyPair> eq = new HashSet<UnifyPair>();
Set<Set<UnifyPair>> expected = new HashSet<>();
2016-04-02 09:29:31 +00:00
expected.add(new HashSet<>());
Set<Set<UnifyPair>> actual = unify(eq, fc);
2016-04-02 09:29:31 +00:00
Assert.assertEquals(expected, actual);
2015-11-23 00:03:01 +00:00
/*
* Test 2:
*
* (a <. Number)
*/
2015-11-23 00:03:01 +00:00
2016-04-01 16:21:51 +00:00
UnifyType tphA = tf.getPlaceholderType("a");
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, number, PairOperator.SMALLERDOT));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, doubl, PairOperator.EQUALSDOT));
actual = unify(eq, fc);
Assert.assertEquals(expected, actual);
/*
* Test 3:
*
* (Integer <. a)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(integer, tphA, PairOperator.SMALLERDOT));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, object, PairOperator.EQUALSDOT));
actual = unify(eq, fc);
Assert.assertEquals(expected, actual);
/*
* Test 4:
*
* (a <.? Number)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, number, PairOperator.SMALLERDOTWC));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
actual = unify(eq, fc);
Assert.assertEquals(expected, actual);
/*
* Test 5:
*
* (a <.? ? super Integer)
*/
2016-04-01 16:21:51 +00:00
UnifyType supInteger = tf.getSuperType(integer);
UnifyType supNumber = tf.getSuperType(number);
UnifyType supObject = tf.getSuperType(object);
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, supInteger, PairOperator.SMALLERDOTWC));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, object, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supInteger, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supNumber, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supObject, PairOperator.EQUALSDOT));
actual = unify(eq, fc);
System.out.println("? super Integer");
System.out.println(actual);
2016-04-03 20:43:55 +00:00
actual = filterGeneratedTPHsMultiple(actual);
Assert.assertEquals(expected, actual);
/*
* Test 6:
*
* (Number <.? a)
*
*/
eq = new HashSet<>();
2016-04-01 16:21:51 +00:00
UnifyType extNumber = tf.getExtendsType(number);
UnifyType extObject = tf.getExtendsType(object);
UnifyType supDouble = tf.getSuperType(doubl);
eq.add(new UnifyPair(number, tphA, PairOperator.SMALLERDOTWC));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, extNumber, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, extObject, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supInteger, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supDouble, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supNumber, PairOperator.EQUALSDOT));
actual = unify(eq, fc);
actual = filterGeneratedTPHsMultiple(actual);
Assert.assertEquals(expected, actual);
/*
* Test 7:
*
* (? extends Number <.? a)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(extNumber, tphA, PairOperator.SMALLERDOTWC));
2015-11-23 00:03:01 +00:00
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, extNumber, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, extObject, PairOperator.EQUALSDOT));
actual = unify(eq, fc);
2016-04-08 16:48:35 +00:00
actual = filterGeneratedTPHsMultiple(actual);
Assert.assertEquals(expected, actual);
/*
* Test 8:
*
* (a <.? ? extends Number)
*/
UnifyType extInteger = tf.getExtendsType(integer);
UnifyType extDouble = tf.getExtendsType(doubl);
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, extNumber, PairOperator.SMALLERDOTWC));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, extNumber, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, extInteger, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, extDouble, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, doubl, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
actual = unify(eq, fc);
actual = filterGeneratedTPHsMultiple(actual);
Assert.assertEquals(expected, actual);
/*
* Test 8:
*
* (Integer <. Number)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(integer, number, PairOperator.SMALLERDOT));
expected = new HashSet<>();
2016-04-03 20:43:55 +00:00
expected.add(new HashSet<>());
actual = unify(eq, fc);
2016-04-03 20:43:55 +00:00
Assert.assertEquals(expected, actual);
/*
* Test 9:
*
* (Integer <.? Number)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(integer, number, PairOperator.SMALLERDOTWC));
expected = new HashSet<>();
actual = unify(eq, fc);
2016-04-03 20:43:55 +00:00
Assert.assertEquals(expected, actual);
/*
* Test 10:
*
* (a <. b)
*/
2016-04-01 16:21:51 +00:00
UnifyType tphB = tf.getPlaceholderType("b");
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, tphB, PairOperator.SMALLERDOT));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, tphB, PairOperator.SMALLERDOT));
actual = unify(eq, fc);
Assert.assertEquals(expected, actual);
/*
* Test 11:
*
* (a <.? b)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, tphB, PairOperator.SMALLERDOTWC));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, tphB, PairOperator.SMALLERDOTWC));
actual = unify(eq, fc);
Assert.assertEquals(expected, actual);
2016-04-12 09:54:26 +00:00
/*
* Test 12:
*
* (void <. void)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, tf.getSimpleType("void"), PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tf.getSimpleType("void"), tphA, PairOperator.SMALLERDOT));
expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, tf.getSimpleType("void"), PairOperator.EQUALSDOT));
//Test funktioniert momentan auch ohne ein "void" in der Finite Closure
//fcb.add(tf.getSimpleType("void"), tf.getSimpleType("Object"));
IFiniteClosure voidFC = fcb.getFiniteClosure();
actual = unify(eq, voidFC);
Assert.assertEquals(expected, actual);
}
@Test
public void unifyTestSimple() {
/*
* INIT
*/
TypeFactory tf = new TypeFactory();
FiniteClosureBuilder fcb = new FiniteClosureBuilder();
2016-04-01 16:21:51 +00:00
UnifyType number = tf.getSimpleType("Number");
UnifyType object = tf.getSimpleType("Object");
UnifyType integer = tf.getSimpleType("Integer");
UnifyType doubl = tf.getSimpleType("Double");
//fcb.add(number, object);
fcb.add(integer, number);
//fcb.add(doubl, number);
IFiniteClosure fc = fcb.getCollectionExample();
/*
* Test 1:
*
* (Vector<a> <. Vector<? extends b>)
* (List<b> <. List<? extends Number>)
*
* Expected:
* {(b = Number), (a = Number)}, {(b = Number), (a = Integer)}, {(b = Number), (a = Integer)}
* (b = Integer),
*/
2016-04-01 16:21:51 +00:00
UnifyType tphA = tf.getPlaceholderType("a");
UnifyType tphB = tf.getPlaceholderType("b");
UnifyType extB = tf.getExtendsType(tphB);
UnifyType extNum = tf.getExtendsType(number);
Set<UnifyPair> eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tf.getSimpleType("Vector", tphA), tf.getSimpleType("Vector", extB), PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tf.getSimpleType("List", tphB), tf.getSimpleType("List", extNum), PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>();
Set<Set<UnifyPair>> actual = unify(eq, fc);
//System.out.println(actual);
//Assert.assertEquals(actual, expected);
/*
* Test 2:
*
* Vector<? extends a> <. List<? extends Number>
*
*/
2016-04-01 16:21:51 +00:00
UnifyType extA = tf.getExtendsType(tphA);
eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tf.getSimpleType("Vector", extA), tf.getSimpleType("Vector", extNum), PairOperator.SMALLERDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
2016-04-03 20:57:11 +00:00
//System.out.println(actual);
//Assert.assertEquals(actual, expected);
/*
* Test 3:
*
* Vector<? extends Number> <. List<? extends a>
*
*/
eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tf.getSimpleType("Vector", extNum), tf.getSimpleType("Vector", extA), PairOperator.SMALLERDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
System.out.println(actual);
//Assert.assertEquals(actual, expected);
/*
* Test 4:
*
* LinkedList <. Deque <. Queue <. Collection
*
* Vector<Number> <. List<a>
* List<a> <. AbstractList<b>
* ? extends Number <.? b
*/
eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tf.getSimpleType("LinkedList", number), tf.getSimpleType("Deque", tphA), PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tf.getSimpleType("Deque", tphA), tf.getSimpleType("Queue", tphB), PairOperator.SMALLERDOT));
eq.add(new UnifyPair(extNum, tphB, PairOperator.SMALLERDOTWC));
expected = new HashSet<>();
actual = unify(eq, fc);
2016-04-03 20:57:11 +00:00
//System.out.println(actual);
//Assert.assertEquals(actual, expected);
}
/**
* These are tests that specifically test cases where the old unify algorithm was incomplete.
*/
@Test
public void unifyTestExtension() {
/*
* INIT
*/
TypeFactory tf = new TypeFactory();
FiniteClosureBuilder fcb = new FiniteClosureBuilder();
UnifyType number = tf.getSimpleType("Number");
UnifyType object = tf.getSimpleType("Object");
UnifyType integer = tf.getSimpleType("Integer");
UnifyType doubl = tf.getSimpleType("Double");
UnifyType mygeneric = tf.getSimpleType("MyGeneric", "T");
fcb.add(mygeneric, object);
fcb.add(integer, number);
//fcb.add(doubl, number);
IFiniteClosure fc = fcb.getCollectionExample();
/*
* Test 1:
* This is a Test for the extension of case 1 in the cartesian product of step 4.
*
* (a <. Vector<b>)
* (List<Integer> <. List<b>)
*
* Expected:
* (b = Integer), (a = Vector<Integer>)
* (b = ? extends Integer), (a = Vector<Integer>),
* (b = ? extends Integer), (a = Vector<? extends Integer>),
* (b = ? super Integer), (a = Vector<Integer>)
* (b = ? super Integer), (a = Vector<Number>)
* (b = ? super Integer), (a = Vector<? super Integer>)
* (b = ? super Integer), (a = Vector<? super Number>)
* (b = ? extends Number), (a = Vector<Integer>)
* (b = ? extends Number), (a = Vector<Number>)
* (b = ? extends Number), (a = Vector<? extends Integer>)
* (b = ? extends Number), (a = Vector<? extends Number>)
*/
UnifyType tphA = tf.getPlaceholderType("a");
UnifyType tphB = tf.getPlaceholderType("b");
UnifyType extB = tf.getExtendsType(tphB);
UnifyType extNum = tf.getExtendsType(number);
Set<UnifyPair> eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tphA, tf.getSimpleType("Stack", tphB), PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tf.getSimpleType("List", integer), tf.getSimpleType("List", tphB), PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>();
Set<Set<UnifyPair>> actual = unify(eq, fc);
System.out.println(actual);
//Assert.assertEquals(actual, expected);
/*
* Test 2:
*
* This is a test for th extension of case 2 of the cartesian product of step 4.
*
* (a <.? ? ext b)
* (b =. Number)
*/
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, extB, PairOperator.SMALLERDOTWC));
eq.add(new UnifyPair(tphB, number, PairOperator.EQUALSDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
System.out.println("Case 2");
System.out.println(actual);
/*
* Test 3:
* This is a test for the extension of case 3 of the cartesian product of step 4.
*
* (a <.? ? sup b)
* (b = Number)
*/
UnifyType supB = tf.getSuperType(tphB);
eq = new HashSet<>();
eq.add(new UnifyPair(tphA, supB, PairOperator.SMALLERDOTWC));
eq.add(new UnifyPair(tphB, number, PairOperator.EQUALSDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
System.out.println("Case 3");
System.out.println(actual);
//Assert.assertEquals(expected, actual);
/*
2016-04-08 16:28:34 +00:00
* Case 4 has no extension
*/
/*
* Test 5:
* This is a test for the extension of case 5 of the cartesian product of step 4.
*
2016-04-08 16:28:34 +00:00
* Vector<b> <. a
* b =. Number
*/
2016-04-08 16:28:34 +00:00
eq = new HashSet<>();
eq.add(new UnifyPair(tf.getSimpleType("HashSet", tphB), tphA, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphB, number, PairOperator.EQUALSDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
System.out.println(actual);
//Assert.assertEquals(expected, actual);
2016-04-08 16:48:35 +00:00
/*
* Test 6:
* This is a test for the extension of case 6 of the cartesian product of step 4.
*
* ? extends b <.? a
* b =. Integer
*/
eq = new HashSet<>();
eq.add(new UnifyPair(extB, tphA, PairOperator.SMALLERDOTWC));
eq.add(new UnifyPair(tphB, integer, PairOperator.EQUALSDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
System.out.println(actual);
//Assert.assertEquals(expected, actual);
/*
* Test 7:
* This is a test for the extension of case 7 of the cartesian product of step 4.
*
* ? sup b <.? a
* b =. Number
*/
eq = new HashSet<>();
eq.add(new UnifyPair(supB, tphA, PairOperator.SMALLERDOTWC));
eq.add(new UnifyPair(tphB, number, PairOperator.EQUALSDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
System.out.println("Case 7");
System.out.println(actual);
//Assert.assertEquals(expected, actual);
/*
* Test 8:
* This is a test for the extension of case 8 of the cartesian product of step 4.
*
* MyGeneric<? extends b> <.? a
* b =. Integer
*/
eq = new HashSet<>();
eq.add(new UnifyPair(tf.getSimpleType("MyGeneric", extB), tphA, PairOperator.SMALLERDOTWC));
eq.add(new UnifyPair(tphB, number, PairOperator.EQUALSDOT));
expected = new HashSet<>();
actual = unify(eq, fc);
System.out.println("Case 8:");
System.out.println(actual);
//Assert.assertEquals(expected, actual);
}
@Test
public void unifyTestComplex() {
2016-04-07 12:30:23 +00:00
/*
* INIT
*/
TypeFactory tf = new TypeFactory();
FiniteClosureBuilder fcb = new FiniteClosureBuilder();
UnifyType tphT = tf.getPlaceholderType("T");
UnifyType vector = tf.getSimpleType("Vector", tphT);
UnifyType number = tf.getSimpleType("Number");
UnifyType integer = tf.getSimpleType("Integer");
UnifyType object = tf.getSimpleType("Object");
UnifyType matrix = tf.getSimpleType("Matrix");
UnifyType vectorvectorint = tf.getSimpleType("Vector", tf.getSimpleType("Vector", integer));
fcb.add(integer, number);
fcb.add(matrix, vectorvectorint);
fcb.add(vector, object);
IFiniteClosure fc = fcb.getFiniteClosure();
Set<UnifyPair> eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tf.getSimpleType("Matrix"), tf.getSimpleType("Vector", tf.getPlaceholderType("a")), PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>();
Set<Set<UnifyPair>> actual = unify(eq, fc);
2015-11-23 00:03:01 +00:00
2016-04-07 12:30:23 +00:00
System.out.println("Test Matrix:");
System.out.println(actual);
2016-04-12 09:54:26 +00:00
}
@Test
public void unifyTestSubclasses() {
/*
* TPH1 < Integer
* Integer < Integer
* TPH1 < TPH2
* TPH2 < Integer
*
* Einzige korrekte Lösung:
* TPH1 = Integer, TPH2 = Integer
*/
TypeFactory tf = new TypeFactory();
FiniteClosureBuilder fcb = new FiniteClosureBuilder();
UnifyType tphT1 = tf.getPlaceholderType("T1");
UnifyType tphT2 = tf.getPlaceholderType("T2");
UnifyType tphT3 = tf.getPlaceholderType("T3");
UnifyType integer = tf.getSimpleType("java.lang.Integer");
UnifyType bool = tf.getSimpleType("java.lang.Boolean");
UnifyType object = tf.getSimpleType("java.lang.Object");
UnifyType main = tf.getSimpleType("Main");
fcb.add(integer, object);
fcb.add(main, object);
fcb.add(bool, object);
IFiniteClosure fc = fcb.getFiniteClosure();
Set<UnifyPair> eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tphT1, integer, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(integer, integer, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphT1, tphT2, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphT2, integer, PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>();
Set<UnifyPair> solution = new HashSet<UnifyPair>();
solution.add(new UnifyPair(tphT1, integer, PairOperator.EQUALSDOT));
solution.add(new UnifyPair(tphT2, integer, PairOperator.EQUALSDOT));
expected.add(solution);
Set<Set<UnifyPair>> actual = unify(eq, fc);
System.out.println("Test Subclass:");
System.out.println(actual);
Assert.assertEquals(expected, actual);
2015-11-23 00:03:01 +00:00
}
@Test
public void applyTypeUnificationRulesTest() {
}
@Test
public void calculatePairSetsTest() {
}
2016-03-14 13:46:10 +00:00
@Test
public void permuteParamsTest() {
TypeFactory tf = new TypeFactory();
2016-03-17 15:54:43 +00:00
ArrayList<Set<UnifyType>> candidates = new ArrayList<>();
2016-03-14 13:46:10 +00:00
2016-04-03 20:57:11 +00:00
UnifyType p11 = tf.getPlaceholderType("p11");
UnifyType p12 = tf.getExtendsType(tf.getSimpleType("p12"));
UnifyType p13 = tf.getSimpleType("p13");
UnifyType p21 = tf.getPlaceholderType("p21");
UnifyType p22 = tf.getPlaceholderType("p22");
UnifyType p31 = tf.getSimpleType("p31", "T");
2016-03-17 15:54:43 +00:00
Set<UnifyType> p1 = new HashSet<>();
2016-04-03 20:57:11 +00:00
p1.add(p11);
p1.add(p12);
p1.add(p13);
2016-03-14 13:46:10 +00:00
2016-03-17 15:54:43 +00:00
Set<UnifyType> p2 = new HashSet<>();
2016-04-03 20:57:11 +00:00
p2.add(p21);
p2.add(p22);
2016-03-14 13:46:10 +00:00
2016-03-17 15:54:43 +00:00
Set<UnifyType> p3 = new HashSet<>();
2016-04-03 20:57:11 +00:00
p3.add(p31);
2016-03-14 13:46:10 +00:00
candidates.add(p1);
candidates.add(p2);
candidates.add(p3);
2016-04-03 20:57:11 +00:00
/*
* Expected Result:
* {<x, y, z> | x in { p11, p12, p13}, y in { p21, p22 }, z in { p31 }}
*/
Set<TypeParams> expected = Arrays.stream(new TypeParams[] {
new TypeParams(p11, p21, p31),
new TypeParams(p11, p22, p31),
new TypeParams(p12, p21, p31),
new TypeParams(p12, p22, p31),
new TypeParams(p13, p21, p31),
new TypeParams(p13, p22, p31)
}).collect(Collectors.toSet());
Set<TypeParams> actual = permuteParams(candidates);
Assert.assertEquals(expected, actual);
2016-03-14 13:46:10 +00:00
}
private Set<Set<UnifyPair>> filterGeneratedTPHsMultiple(Set<Set<UnifyPair>> set) {
2016-04-03 20:43:55 +00:00
return set.stream().map(x -> filterGeneratedTPHs(x)).collect(Collectors.toSet());
}
private Set<UnifyPair> filterGeneratedTPHs(Set<UnifyPair> set) {
2016-04-03 20:43:55 +00:00
return set.stream().filter(x -> !((x.getRhsType() instanceof PlaceholderType) && ((PlaceholderType) x.getRhsType()).isGenerated())).
filter(x -> !((x.getLhsType() instanceof PlaceholderType) && ((PlaceholderType) x.getLhsType()).isGenerated())).collect(Collectors.toSet());
}
private void addAsSet(Set<Set<UnifyPair>> addTo, UnifyPair... mPairs) {
addTo.add(new HashSet<>(Arrays.stream(mPairs).collect(Collectors.toSet())));
}
2015-11-09 13:39:26 +00:00
}