From 65e3321942082459badd006f0fed8efee474e8e0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 Sep 2023 17:52:53 +0100 Subject: Type check tuples --- .../compiler/ast/typed/TypedNodeMatchers.java | 9 ++++++ .../org/shedlang/compiler/ast/untyped/Untyped.java | 6 ++++ .../typechecker/TypeCheckerTupleTests.java | 37 ++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTupleTests.java (limited to 'src/test/java') 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 isTypedTupleNode( + Matcher> elements + ) { + return instanceOf( + TypedTupleNode.class, + has("elements", x -> x.elements(), elements) + ); + } + public static Matcher> isTypedTupleTypeNode( Matcher 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 elements + ) { + return new UntypedTupleNode(elements, Sources.NULL); + } + public static UntypedTupleTypeNode tupleType( List 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 + )))); + } +} -- cgit v1.2.3