package unify; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import org.junit.Assert; import org.junit.Test; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; import de.dhbwstuttgart.typeinference.unify.model.Type; import de.dhbwstuttgart.typeinference.unifynew.TypeFactory; public class FiniteClosureTest { @Test public void testSmaller() { TypeFactory tf = new TypeFactory(); Type integer = tf.getSimpleType("Integer"); Type number = tf.getSimpleType("Number"); FiniteClosureBuilder fcb = new FiniteClosureBuilder(); fcb.add(integer, number); fcb.add(tf.getSimpleType("MyMap", "T"), tf.getSimpleType("HashMap", tf.getSimpleType("Integer"))); fcb.add(tf.getSimpleType("HashMap", "T"), tf.getSimpleType("Collection")); IFiniteClosure fc = fcb.getCollectionExample(); /* * Test Case 1: * * smaller(Set) = { HashSet, Set, LinkedHashSet } */ Type setInt = tf.getSimpleType("Set", integer); Type hashSetInt = tf.getSimpleType("HashSet", integer); Type treeSetInt = tf.getSimpleType("TreeSet", integer); Type linkedHashSetInt = tf.getSimpleType("LinkedHashSet", integer); Set expectedResult = new HashSet<>(Arrays.stream(new Type[] { setInt, hashSetInt, linkedHashSetInt, treeSetInt, }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setInt)); /* * Test Case 2: * * smaller(Set) = * { HashSet, Set, TreeSet, LinkedHashSet, * HashSet, Set, TreeSet, LinkedHashSet } */ Type extInt = tf.getExtendsType(integer); Type hashSetExtInt = tf.getSimpleType("HashSet", extInt); Type treeSetExtInt = tf.getSimpleType("TreeSet", extInt); Type linkedHashSetExtInt = tf.getSimpleType("LinkedHashSet", extInt); Type setExtInt = tf.getSimpleType("Set", extInt); expectedResult = new HashSet<>(Arrays.stream(new Type[] { setInt, hashSetInt, linkedHashSetInt, treeSetInt, hashSetExtInt, treeSetExtInt, linkedHashSetExtInt, setExtInt, }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setExtInt)); /* * Test Case 3: * * smaller(Set) = * { HashSet, Set, TreeSet, LinkedHashSet, * HashSet, Set, TreeSet, LinkedHashSet, * HashSet, Set, TreeSet, LinkedHashSet * HashSet } */ Type hashSetNum = tf.getSimpleType("HashSet", number); Type treeSetNum = tf.getSimpleType("TreeSet", number); Type linkedHashSetNum = tf.getSimpleType("LinkedHashSet", number); Type setNum = tf.getSimpleType("Set", number); Type extNum = tf.getExtendsType(number); Type hashSetExtNum = tf.getSimpleType("HashSet", extNum); Type treeSetExtNum = tf.getSimpleType("TreeSet", extNum); Type linkedHashSetExtNum = tf.getSimpleType("LinkedHashSet", extNum); Type setExtNum = tf.getSimpleType("Set", extNum); expectedResult = new HashSet<>(Arrays.stream(new Type[] { setInt, hashSetInt, linkedHashSetInt, treeSetInt, setNum, hashSetNum, linkedHashSetNum, treeSetNum, setExtInt, hashSetExtInt, linkedHashSetExtInt, treeSetExtInt, setExtNum, hashSetExtNum, linkedHashSetExtNum, treeSetExtNum }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setExtNum)); /* * Test Case 4: * TODO ist das ergebnis korrekt oder müssen die ? ext Ts raus weil der allgemeienste Typ T ausreicht? * smaller(Set) = * { HashSet, Set, TreeSet, LinkedHashSet, * HashSet, Set, TreeSet, LinkedHashSet } */ Type t = tf.getPlaceholderType("T"); Type setT = tf.getSimpleType("Set", t); Type hashSetT = tf.getSimpleType("HashSet", t); Type treeSetT = tf.getSimpleType("TreeSet", t); Type linkedHashSetT = tf.getSimpleType("LinkedHashSet", t); Type hashSetExtT = tf.getSimpleType("HashSet", t); Type treeSetExtT = tf.getSimpleType("TreeSet", t); Type linkedHashSetExtT = tf.getSimpleType("LinkedHashSet", t); Type setExtT = tf.getSimpleType("Set", t); expectedResult = new HashSet<>(Arrays.stream(new Type[] { setT, hashSetT, treeSetT, linkedHashSetT, setExtT, hashSetExtT, treeSetExtT, linkedHashSetExtT }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setT)); /* * Test Case 5 * * smaller(Set = * { Set, HashSet, TreeSet, LinkedHashSet, * Set, HashSet, TreeSet, LinkedHashSet, * Set, HashSet, TreeSet, LinkedHashSet } */ Type superNum = tf.getSuperType(number); Type superInt = tf.getSuperType(integer); Type setSupInt = tf.getSimpleType("Set", superInt); Type hashSetSupInt = tf.getSimpleType("HashSet", superInt); Type linkedHashSetSupInt = tf.getSimpleType("LinkedHashSet", superInt); Type treeSetSupInt = tf.getSimpleType("TreeSet", superInt); Type setSupNum = tf.getSimpleType("Set", superNum); Type hashSetSupNum = tf.getSimpleType("HashSet", superNum); Type linkedHashSetSupNum = tf.getSimpleType("LinkedHashSet", superNum); Type treeSetSupNum = tf.getSimpleType("TreeSet", superNum); expectedResult = new HashSet<>(Arrays.stream(new Type[] { setSupInt, hashSetSupInt, linkedHashSetSupInt, treeSetSupInt, setSupNum, hashSetSupNum, linkedHashSetSupNum, treeSetSupNum, setInt, hashSetInt, linkedHashSetInt, treeSetInt, setNum, hashSetNum, linkedHashSetNum, treeSetNum }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setSupInt)); /* * Test Case 6: * * smaller(Set, Set, TreeSet, LinkedHashSet, * HashSet, Set, TreeSet, LinkedHashSet } * */ expectedResult = new HashSet<>(Arrays.stream(new Type[] { setT, hashSetT, treeSetT, linkedHashSetT, setExtT, hashSetExtT, treeSetExtT, linkedHashSetExtT }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setExtT)); /* * Test Case 7: * * smaller(Set) = * { HashSet, Set, TreeSet, LinkedHashSet, * HashSet, Set, TreeSet, LinkedHashSet } */ Type notInFc = tf.getSimpleType("notInFC"); Type setNotInFc = tf.getSimpleType("Set", notInFc); Type hashSetNotInFc = tf.getSimpleType("HashSet", notInFc); Type treeSetNotInFc = tf.getSimpleType("TreeSet", notInFc); Type linkedHashSetNotInFc = tf.getSimpleType("LinkedHashSet", notInFc); Type hashSetExtNotInFc = tf.getSimpleType("HashSet", notInFc); Type treeSetExtNotInFc = tf.getSimpleType("TreeSet", notInFc); Type linkedHashSetExtNotInFc = tf.getSimpleType("LinkedHashSet", notInFc); Type setExtNotInFc = tf.getSimpleType("Set", notInFc); expectedResult = new HashSet<>(Arrays.stream(new Type[] { setNotInFc, hashSetNotInFc, treeSetNotInFc, linkedHashSetNotInFc, setExtNotInFc, hashSetExtNotInFc, treeSetExtNotInFc, linkedHashSetExtNotInFc }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setNotInFc)); /* * Test Case 8: * * smaller(Set) = * { Set, HashSet, LinkedHashSet, TreeSet, * Set, HashSet, LinkedHashSet, TreeSet } */ Type superNotInFc = tf.getSuperType(notInFc); Type setSuperNotInFc = tf.getSimpleType("Set", superNotInFc); Type hashSetSuperNotInFc = tf.getSimpleType("HashSet", superNotInFc); Type treeSetSuperNotInFc = tf.getSimpleType("TreeSet", superNotInFc); Type linkedHashSetSuperNotInFc = tf.getSimpleType("LinkedHashSet", superNotInFc); expectedResult = new HashSet<>(Arrays.stream(new Type[] { setNotInFc, hashSetNotInFc, treeSetNotInFc, linkedHashSetNotInFc, setSuperNotInFc, hashSetSuperNotInFc, treeSetSuperNotInFc, linkedHashSetSuperNotInFc }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(setSuperNotInFc)); /* * Test Case 8: * * smaller(NotInFc) = * { NotInFc, NotInFc, NotInFc, NotInFc } */ Type notInFcExtNumber = tf.getSimpleType("NotInFc", extNum); Type notInFcInteger = tf.getSimpleType("NotInFc", integer); Type notInFcNumber = tf.getSimpleType("NotInFc", number); Type notInFcExtInt = tf.getSimpleType("NotInFc", extInt); expectedResult = new HashSet<>(Arrays.stream(new Type[] { notInFcExtNumber, notInFcInteger, notInFcNumber, notInFcExtInt }).collect(Collectors.toSet())); Assert.assertEquals(expectedResult, fc.smaller(notInFcExtNumber)); /* * Test Case 9: * * smaller(NotInFc = * { NotInFc, NotInFc } */ Type alsoNotInFc = tf.getSimpleType("AlsoNotInFc"); Type notInFcAlsoNotInFc = tf.getSimpleType("NotInFc", alsoNotInFc); Type notInFcSupAlsoNotInFc = tf.getSimpleType("NotInFc", tf.getSuperType(alsoNotInFc)); expectedResult = new HashSet<>(Arrays.stream(new Type[] { notInFcAlsoNotInFc, notInFcSupAlsoNotInFc }).collect(Collectors.toSet())); Set actual = fc.smaller(notInFcSupAlsoNotInFc); Assert.assertEquals(expectedResult, actual); /* * Test Case 10: * * smaller(TreeMap) = * { TreeMap, TreeMap, TreeMap, TreeMap * TreeMap, TreeMap, TreeMap, TreeMap, * TreeMap, TreeMap, TreeMap * TreeMap, TreeMap, TreeMap, TreeMap } */ Type treeMapExtNumSupInt = tf.getSimpleType("TreeMap", extNum, superInt); expectedResult = new HashSet<>(Arrays.stream(new Type[] { treeMapExtNumSupInt, tf.getSimpleType("TreeMap", extNum, superNum), tf.getSimpleType("TreeMap", extNum, integer), tf.getSimpleType("TreeMap", extNum, number), tf.getSimpleType("TreeMap", number, superInt), tf.getSimpleType("TreeMap", number, superNum), tf.getSimpleType("TreeMap", number, integer), tf.getSimpleType("TreeMap", number, number), tf.getSimpleType("TreeMap", integer, superInt), tf.getSimpleType("TreeMap", integer, superNum), tf.getSimpleType("TreeMap", integer, integer), tf.getSimpleType("TreeMap", integer, number), tf.getSimpleType("TreeMap", extInt, superInt), tf.getSimpleType("TreeMap", extInt, superNum), tf.getSimpleType("TreeMap", extInt, integer), tf.getSimpleType("TreeMap", extInt, number) }).collect(Collectors.toSet())); actual = fc.smaller(treeMapExtNumSupInt); Assert.assertEquals(expectedResult, actual); /* * Test Case 11: * * smaller(SortedMap) = { SortedMap, NavigableMap, TreeMap } */ Type sortedMapNumberT = tf.getSimpleType("SortedMap", number, t); Type navigableMapNumberT = tf.getSimpleType("NavigableMap", number, t); Type treeMapNumberT = tf.getSimpleType("TreeMap", number, t); expectedResult = new HashSet<>(Arrays.stream(new Type[] { sortedMapNumberT, navigableMapNumberT, treeMapNumberT }).collect(Collectors.toSet())); actual = fc.smaller(sortedMapNumberT); Assert.assertEquals(expectedResult, actual); /* * Test Case 12: * * MyMap <* TreeMap> * * smaller(TreeMap) = { TreeMap>, MyMap } */ fcb = new FiniteClosureBuilder(); Type k = tf.getPlaceholderType("K"); Type myMap = tf.getSimpleType("MyMap", k); fcb.add(myMap, tf.getSimpleType("TreeMap", k, tf.getSimpleType("List", k))); fcb.add(integer, number); fc = fcb.getCollectionExample(); Type treeMapNumberListNumber = tf.getSimpleType("TreeMap", number, tf.getSimpleType("List", number)); expectedResult = new HashSet<>(Arrays.stream(new Type[] { treeMapNumberListNumber, tf.getSimpleType("MyMap", number) }).collect(Collectors.toSet())); actual = fc.smaller(treeMapNumberListNumber); Assert.assertEquals(expectedResult, actual); /* * Test Case 13: * * MyMap <* TreeMap> * * smaller(TreeMap) = * { TreeMap, List>, * TreeMap>, * TreeMap>, * TreeMap>, * MyMap } */ Type listInteger = tf.getSimpleType("List", integer); Type treeMapExtNumberListInteger = tf.getSimpleType("TreeMap", extNum, listInteger); expectedResult = new HashSet<>(Arrays.stream(new Type[] { treeMapExtNumberListInteger, tf.getSimpleType("TreeMap", extInt, listInteger), tf.getSimpleType("TreeMap", number, listInteger), tf.getSimpleType("TreeMap", integer, listInteger), tf.getSimpleType("MyMap", integer) }).collect(Collectors.toSet())); actual = fc.smaller(treeMapExtNumberListInteger); Assert.assertEquals(expectedResult, actual); /* * Test Case 14 * * MyMap> <* HashMap * * smaller(HashMap) = */ /* * Test Case 15: * * MyMap> <* HashMap // * TODO sinnvoll ausformulieren * smaller(HashMap) = * { HashMap, List>, * HashMap>, * MyMap> } */ } @Test public void testGreater() { TypeFactory tf = new TypeFactory(); FiniteClosureBuilder fcb = new FiniteClosureBuilder(); fcb.add(tf.getSimpleType("Integer"), tf.getSimpleType("Number")); fcb.add(tf.getSimpleType("MyMap", "T"), tf.getSimpleType("HashMap", tf.getSimpleType("Integer"))); fcb.add(tf.getSimpleType("HashMap", "T"), tf.getSimpleType("Collection")); IFiniteClosure fc = fcb.getCollectionExample(); System.out.println("\n\n----- Greater Test -----"); System.out.println("Greater(LinkedList) = " + fc.greater(tf.getSimpleType("LinkedList", "T"))); System.out.println("Greater(TreeSet) = " + fc.greater(tf.getSimpleType("TreeSet", "T"))); System.out.println("Greater(Collection) = " + fc.greater(tf.getSimpleType("Collection"))); System.out.println(fc.greater(tf.getSimpleType("Deque", tf.getSimpleType("Integer")))); System.out.println(fc.greater(tf.getSimpleType("Deque", tf.getSimpleType("Number")))); System.out.println(fc.greater(tf.getSimpleType("Deque", tf.getExtendsType(tf.getSimpleType("Integer"))))); System.out.println(fc.greater(tf.getSimpleType("Deque", tf.getSuperType(tf.getSimpleType("Integer"))))); } @Test public void testGrArg() { IFiniteClosure fc = new FiniteClosureBuilder().getCollectionExample(); TypeFactory tf = new TypeFactory(); System.out.println("\n\n----- GrArg Test -----"); System.out.println("GrArg(List) = " + fc.grArg(tf.getSimpleType("List", "T"))); System.out.println("GrArg(? extends List) = " + fc.grArg(tf.getExtendsType(tf.getSimpleType("List", "T")))); System.out.println("GrArg(? super List) = " + fc.grArg(tf.getSuperType(tf.getSimpleType("List", "T")))); } @Test public void testSmArg() { IFiniteClosure fc = new FiniteClosureBuilder().getCollectionExample(); TypeFactory tf = new TypeFactory(); System.out.println("\n\n----- SmArg Test -----"); System.out.println("SmArg(List) = " + fc.smArg(tf.getSimpleType("List", "T"))); System.out.println("SmArg(? extends List) = " + fc.smArg(tf.getExtendsType(tf.getSimpleType("List", "T")))); System.out.println("SmArg(? super List) = " + fc.smArg(tf.getSuperType(tf.getSimpleType("List", "T")))); } @Test public void testGetGenericType() { // TODO } private void printDiff(Set expected, Set actual) { System.out.println("Diff:"); System.out.println("In expected but not in actual:"); Set expected1 = new HashSet<>(expected); expected1.removeAll(actual); System.out.println(expected1); } }