aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java
index 8bcf38d..0af0020 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/FreeVariablesTests.java
@@ -1,22 +1,27 @@
package org.zwobble.couscous.tests.frontends.java;
import org.junit.Test;
-import org.zwobble.couscous.ast.ReferenceNode;
-import org.zwobble.couscous.ast.VariableDeclaration;
+import org.zwobble.couscous.ast.*;
+import org.zwobble.couscous.frontends.java.FreeVariables;
import org.zwobble.couscous.tests.TestIds;
+import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.types.TypeParameter;
import org.zwobble.couscous.types.Types;
import java.util.List;
+import java.util.Set;
import static java.util.Collections.emptyList;
import static org.junit.Assert.assertEquals;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
+import static org.zwobble.couscous.ast.FormalTypeParameterNode.formalTypeParameter;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.frontends.java.FreeVariables.findFreeVariables;
import static org.zwobble.couscous.util.ExtraLists.list;
+import static org.zwobble.couscous.util.ExtraSets.set;
public class FreeVariablesTests {
@Test
@@ -43,4 +48,27 @@ public class FreeVariablesTests {
reference(declaration)));
assertEquals(emptyList(), freeVariables);
}
+
+ @Test
+ public void typeParameterIsFreeIfThereIsNoAssociatedDeclaration() {
+ TypeParameter typeParameter = new TypeParameter(TestIds.ANY_ID, "T");
+ MethodNode method = MethodNode.builder("f").argument(argOfType(typeParameter)).build();
+ Set<TypeParameter> freeTypeParameters = FreeVariables.findFreeTypeParameters(method);
+ assertEquals(set(typeParameter), freeTypeParameters);
+ }
+
+ @Test
+ public void typeParameterIsNotFreeIfItIsDeclared() {
+ TypeParameter typeParameter = new TypeParameter(TestIds.ANY_ID, "T");
+ MethodNode method = MethodNode.builder("f")
+ .typeParameter(formalTypeParameter(typeParameter))
+ .argument(argOfType(typeParameter))
+ .build();
+ Set<TypeParameter> freeTypeParameters = FreeVariables.findFreeTypeParameters(method);
+ assertEquals(set(), freeTypeParameters);
+ }
+
+ private FormalArgumentNode argOfType(Type type) {
+ return FormalArgumentNode.formalArg(var(TestIds.variable("x"), "x", type));
+ }
}