aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-20 18:53:49 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-20 18:53:49 +0000
commit96488b724e05f547cdee70beb4037ea361503606 (patch)
tree8ea7a7c8e873644bc9f6f104afadb6605e305ee4 /src/test/java
parent2d86046067a1db8d6eac019088f511fc192b660c (diff)
Detect loops in namespace dependencies
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/NamespaceDependencyLineariserTests.java40
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