aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-19 12:47:50 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-19 12:47:50 +0000
commit6d71b87e4be3de27432e9efa4d601a0351d68cc4 (patch)
tree6c8b09775f2555e773e5ae0a35c35f060177e653 /src/test/java
parent9a89c6c410dcdced542438a955becea587a07862 (diff)
Check for consistency in compilation unit elements
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioCodeGenContextTests.java86
1 files changed, 85 insertions, 1 deletions
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenContextTests.java b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenContextTests.java
index 4884663e..7d46a284 100644
--- a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenContextTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenContextTests.java
@@ -1,12 +1,96 @@
package org.shedlang.compiler.patio;
import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.patio.ast.PatioDataElementImmutable;
+import org.shedlang.compiler.patio.ast.types.PatioDataValues;
+import org.shedlang.compiler.patio.errors.DuplicateCompilationUnitElementName;
+import org.shedlang.compiler.sources.Sources;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.*;
public class PatioCodeGenContextTests {
@Test
public void canAddCompilationUnitElementsWithDistinctNames() {
var context = PatioCodeGenContext.EMPTY;
- context.addCompilationUnitElement()
+ context = context.addCompilationUnitElement(new PatioDataElementImmutable(
+ "x",
+ PatioDataValues.int_(0),
+ Sources.NULL
+ ));
+ context = context.addCompilationUnitElement(new PatioDataElementImmutable(
+ "y",
+ PatioDataValues.int_(0),
+ Sources.NULL
+ ));
+
+ assertThat(context.toCompilationUnit(Sources.NULL).elements(), isSequence(
+ instanceOf(PatioDataElementImmutable.class, has("name", x -> x.name(), equalTo("x"))),
+ instanceOf(PatioDataElementImmutable.class, has("name", x -> x.name(), equalTo("y")))
+ ));
+ }
+
+ @Test
+ public void addingCompilationUnitsWithSameNameThrowsError() {
+ var context = PatioCodeGenContext.EMPTY
+ .addCompilationUnitElement(new PatioDataElementImmutable(
+ "x",
+ PatioDataValues.int_(0),
+ Sources.NULL
+ ));
+
+ var error = assertThrows(
+ DuplicateCompilationUnitElementName.class,
+ () -> context.addCompilationUnitElement(new PatioDataElementImmutable(
+ "x",
+ PatioDataValues.int_(0),
+ Sources.NULL
+ ))
+ );
+
+ assertThat(error.elementName(), equalTo("x"));
+ }
+
+ @Test
+ public void canEnsureCompilationUnitElementsWithSameNameAndSameValue() {
+ var context = PatioCodeGenContext.EMPTY;
+
+ context = context.ensureCompilationUnitElement(new PatioDataElementImmutable(
+ "x",
+ PatioDataValues.int_(0),
+ Sources.RUNTIME
+ ));
+ context = context.ensureCompilationUnitElement(new PatioDataElementImmutable(
+ "x",
+ PatioDataValues.int_(0),
+ Sources.RUNTIME
+ ));
+
+ assertThat(context.toCompilationUnit(Sources.NULL).elements(), isSequence(
+ instanceOf(PatioDataElementImmutable.class, has("name", x -> x.name(), equalTo("x")))
+ ));
+ }
+
+ @Test
+ public void ensuringCompilationUnitsWithSameNameAndDifferentValueThrowsError() {
+ var context = PatioCodeGenContext.EMPTY
+ .ensureCompilationUnitElement(new PatioDataElementImmutable(
+ "x",
+ PatioDataValues.int_(0),
+ Sources.RUNTIME
+ ));
+
+ var error = assertThrows(
+ DuplicateCompilationUnitElementName.class,
+ () -> context.ensureCompilationUnitElement(new PatioDataElementImmutable(
+ "x",
+ PatioDataValues.int_(1),
+ Sources.RUNTIME
+ ))
+ );
+
+ assertThat(error.elementName(), equalTo("x"));
}
}