diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-28 11:45:25 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-28 11:45:25 +0100 |
| commit | 643d339ade252af66259466d9a9f615760471fc1 (patch) | |
| tree | 55a9ad7e1c341ede3be2e2d42c8227477296affe /src/test/java | |
| parent | 906e88533789cf106f84571e8d61dbc3f55a4641 (diff) | |
Check field exists on receiver type
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java index cb93f758..88ffa75a 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java @@ -42,7 +42,7 @@ public class TypeCheckerFieldAccessTests { } @Test - public void whenReceiverIsNotStructTypeThenErrorIsReturned() { + public void whenReceiverIsNotStructTypeThenErrorIsThrown() { var untyped = Untyped.fieldAccess( Untyped.reference("user"), "name" @@ -55,4 +55,22 @@ public class TypeCheckerFieldAccessTests { assertThat(error.type(), equalTo(Types.STRING)); assertThat(error.fieldName(), equalTo("name")); } + + @Test + public void whenReceiverHasNoSuchFieldThenErrorIsThrown() { + var untyped = Untyped.fieldAccess( + Untyped.reference("user"), + "name" + ); + var structType = Types.struct(NamespaceName.of("Example"), "User"); + var structTypeInfo = new StructTypeInfo(P.orderedPMap(Map.entry("username", Types.STRING))); + var context = TypeCheckerContext.EMPTY + .enterGlobal(P.map(Map.entry("user", structType))) + .addStructTypeInfo(structType, structTypeInfo); + + var error = assertThrows(NoSuchFieldError.class, () -> TypeChecker.typeCheckExpression(untyped, context)); + + assertThat(error.type(), equalTo(structType)); + assertThat(error.fieldName(), equalTo("name")); + } } |
