aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-09 18:15:27 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-09 18:15:27 +0100
commit92bcb4b11954348daa759eb967d2b15c12744dc5 (patch)
tree99c02a547451d45bc46a9494e0de00913ecafc18 /src/test/java
parentf8174b842a7b2fdab34146c543dade8f92e45b1d (diff)
Type check references
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java9
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java4
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java40
3 files changed, 53 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
index 35b15902..9c2164b5 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -1,5 +1,6 @@
package org.shedlang.compiler.ast.typed;
+import org.shedlang.compiler.types.Type;
import org.zwobble.precisely.Matcher;
import static org.zwobble.precisely.Matchers.*;
@@ -8,6 +9,14 @@ public class TypedNodeMatchers {
private TypedNodeMatchers() {
}
+ public static Matcher<TypedExpressionNode> isTypedReferenceNode(String name, Type type) {
+ return instanceOf(
+ TypedReferenceNode.class,
+ has("name", x -> x.name(), equalTo(name)),
+ has("type", x -> x.type(), equalTo(type))
+ );
+ }
+
public static Matcher<TypedExpressionNode> isTypedStringLiteralNode(String value) {
return instanceOf(
TypedStringLiteralNode.class,
diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
index 932ceae1..32a01ec4 100644
--- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
+++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
@@ -6,6 +6,10 @@ public class Untyped {
private Untyped() {
}
+ public static UntypedReferenceNode reference(String name) {
+ return new UntypedReferenceNode(name, Sources.NULL);
+ }
+
public static UntypedStringLiteralNode stringLiteral(String value) {
return new UntypedStringLiteralNode(value, Sources.NULL);
}
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java
new file mode 100644
index 00000000..2e1d3066
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java
@@ -0,0 +1,40 @@
+package org.shedlang.compiler.typechecker;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.untyped.Untyped;
+import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.util.P;
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedReferenceNode;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+
+public class TypeCheckerReferenceTests {
+ @Test
+ public void whenNameIsBoundInEnvironmentThenTypeIsUsedFromEnvironment() {
+ var untyped = Untyped.reference("x");
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(Map.entry("x", Types.STRING)));
+
+ var typed = TypeChecker.typeCheckExpression(untyped, context);
+
+ assertThat(typed, isTypedReferenceNode("x", Types.STRING));
+ }
+
+ @Test
+ public void whenNameIsNotBoundInEnvironmentThenErrorIsThrown() {
+ var untyped = Untyped.reference("x");
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(Map.entry("y", Types.STRING)));
+
+ var error = assertThrows(
+ UnknownVariableError.class,
+ () -> TypeChecker.typeCheckExpression(untyped, context)
+ );
+
+ assertThat(error.variableName(), equalTo("x"));
+ }
+}