aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 17:52:53 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 17:52:53 +0100
commit65e3321942082459badd006f0fed8efee474e8e0 (patch)
tree24eebce3fab94f84aeda17c68cebca653f047668 /src/test/java
parent3224f1c3cd303ef1ed2ea13eb7a2ba4328a64ead (diff)
Type check tuples
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.java6
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTupleTests.java37
3 files changed, 52 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 9f66f16c..c8b0501d 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -251,6 +251,15 @@ public class TypedNodeMatchers {
);
}
+ public static Matcher<TypedExpressionNode> isTypedTupleNode(
+ Matcher<Iterable<? extends TypedExpressionNode>> elements
+ ) {
+ return instanceOf(
+ TypedTupleNode.class,
+ has("elements", x -> x.elements(), elements)
+ );
+ }
+
public static Matcher<TypedTypeLevelExpressionNode<?>> isTypedTupleTypeNode(
Matcher<TupleType> value
) {
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 8c046e4a..36668a8b 100644
--- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
+++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java
@@ -166,6 +166,12 @@ public class Untyped {
return new UntypedTargetNode.Var(name, Sources.NULL);
}
+ public static UntypedTupleNode tuple(
+ List<UntypedExpressionNode> elements
+ ) {
+ return new UntypedTupleNode(elements, Sources.NULL);
+ }
+
public static UntypedTupleTypeNode tupleType(
List<UntypedTypeLevelExpressionNode> elements
) {
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTupleTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTupleTests.java
new file mode 100644
index 00000000..ee719eba
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTupleTests.java
@@ -0,0 +1,37 @@
+package org.shedlang.compiler.typechecker;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.ast.untyped.Untyped;
+import org.shedlang.compiler.types.TupleType;
+import org.shedlang.compiler.types.Types;
+
+import java.util.List;
+
+import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+import static org.zwobble.precisely.Matchers.isSequence;
+
+public class TypeCheckerTupleTests {
+ @Test
+ public void stringLiteralIsTypeCheckedAsString() {
+ var untyped = Untyped.tuple(List.of(
+ Untyped.stringLiteral("hello"),
+ Untyped.boolLiteral(true),
+ Untyped.intLiteral(42)
+ ));
+
+ var typed = TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY);
+
+ assertThat(typed.value(), isTypedTupleNode(isSequence(
+ isTypedStringLiteralNode("hello"),
+ isTypedBoolLiteralNode(true),
+ isTypedIntLiteralNode(42)
+ )));
+ assertThat(typed.value().type(), equalTo(new TupleType(List.of(
+ Types.STRING,
+ Types.BOOL,
+ Types.INT
+ ))));
+ }
+}