From 6d71b87e4be3de27432e9efa4d601a0351d68cc4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 19 Nov 2023 12:47:50 +0000 Subject: Check for consistency in compilation unit elements --- .../compiler/patio/PatioCodeGenContextTests.java | 86 +++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) (limited to 'src/test/java') 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")); } } -- cgit v1.2.3