aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-28 11:45:25 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-28 11:45:25 +0100
commit643d339ade252af66259466d9a9f615760471fc1 (patch)
tree55a9ad7e1c341ede3be2e2d42c8227477296affe /src/test/java
parent906e88533789cf106f84571e8d61dbc3f55a4641 (diff)
Check field exists on receiver type
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFieldAccessTests.java20
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"));
+ }
}