diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-20 18:53:49 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-20 18:53:49 +0000 |
| commit | 96488b724e05f547cdee70beb4037ea361503606 (patch) | |
| tree | 8ea7a7c8e873644bc9f6f104afadb6605e305ee4 /src/test/java | |
| parent | 2d86046067a1db8d6eac019088f511fc192b660c (diff) | |
Detect loops in namespace dependencies
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/NamespaceDependencyLineariserTests.java | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/NamespaceDependencyLineariserTests.java b/src/test/java/org/shedlang/compiler/typechecker/NamespaceDependencyLineariserTests.java index efbeeeaf..0492ce5d 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/NamespaceDependencyLineariserTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/NamespaceDependencyLineariserTests.java @@ -3,11 +3,13 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedNamespaceNode; +import org.shedlang.compiler.typechecker.errors.CircularNamespaceDependencyError; import org.shedlang.compiler.types.NamespaceName; import org.zwobble.precisely.Matcher; import java.util.List; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; @@ -53,6 +55,44 @@ public class NamespaceDependencyLineariserTests { )); } + @Test + public void whenNamespaceDirectlyDependsOnItselfThenErrorIsThrown() { + var namespaces = List.of( + namespaceNode("A", List.of("A")) + ); + + var error = assertThrows( + CircularNamespaceDependencyError.class, + () -> NamespaceDependencyLineariser.orderNamespaces(namespaces) + ); + + assertThat(error.namespaceNames(), isSequence( + equalTo(NamespaceName.of("A")), + equalTo(NamespaceName.of("A")) + )); + } + + @Test + public void whenNamespaceIndirectlyDependsItselfThenErrorIsThrown() { + var namespaces = List.of( + namespaceNode("A", List.of("B")), + namespaceNode("B", List.of("C")), + namespaceNode("C", List.of("A")) + ); + + var error = assertThrows( + CircularNamespaceDependencyError.class, + () -> NamespaceDependencyLineariser.orderNamespaces(namespaces) + ); + + assertThat(error.namespaceNames(), isSequence( + equalTo(NamespaceName.of("A")), + equalTo(NamespaceName.of("B")), + equalTo(NamespaceName.of("C")), + equalTo(NamespaceName.of("A")) + )); + } + private static UntypedNamespaceNode namespaceNode( String namespaceName, List<String> dependencies |
