package org.shedlang.compiler.shidtopatio; import org.junit.jupiter.api.Test; import org.shedlang.compiler.patio.PatioDataElementImmutableDefinition; import org.shedlang.compiler.patio.PatioVisibility; import org.shedlang.compiler.patio.types.PatioDataValues; import org.shedlang.compiler.shidtopatio.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 ShidToPatioContextTests { @Test public void canAddCompilationUnitElementsWithDistinctNames() { var context = ShidToPatioContext.EMPTY; context = context.addCompilationUnitElement(new PatioDataElementImmutableDefinition( "x", PatioVisibility.PRIVATE, PatioDataValues.int_(0), Sources.NULL )); context = context.addCompilationUnitElement(new PatioDataElementImmutableDefinition( "y", PatioVisibility.PRIVATE, PatioDataValues.int_(0), Sources.NULL )); assertThat(context.toCompilationUnit(Sources.NULL).value().elements(), isSequence( instanceOf(PatioDataElementImmutableDefinition.class, has("name", x -> x.name(), equalTo("x"))), instanceOf(PatioDataElementImmutableDefinition.class, has("name", x -> x.name(), equalTo("y"))) )); } @Test public void addingCompilationUnitsWithSameNameThrowsError() { var context = ShidToPatioContext.EMPTY .addCompilationUnitElement(new PatioDataElementImmutableDefinition( "x", PatioVisibility.PRIVATE, PatioDataValues.int_(0), Sources.NULL )); var error = assertThrows( DuplicateCompilationUnitElementName.class, () -> context.addCompilationUnitElement(new PatioDataElementImmutableDefinition( "x", PatioVisibility.PRIVATE, PatioDataValues.int_(0), Sources.NULL )) ); assertThat(error.elementName(), equalTo("x")); } @Test public void canEnsureCompilationUnitElementsWithSameNameAndSameValue() { var context = ShidToPatioContext.EMPTY; context = context.ensureCompilationUnitElement(new PatioDataElementImmutableDefinition( "x", PatioVisibility.PRIVATE, PatioDataValues.int_(0), Sources.RUNTIME )); context = context.ensureCompilationUnitElement(new PatioDataElementImmutableDefinition( "x", PatioVisibility.PRIVATE, PatioDataValues.int_(0), Sources.RUNTIME )); assertThat(context.toCompilationUnit(Sources.NULL).value().elements(), isSequence( instanceOf(PatioDataElementImmutableDefinition.class, has("name", x -> x.name(), equalTo("x"))) )); } @Test public void ensuringCompilationUnitsWithSameNameAndDifferentValueThrowsError() { var context = ShidToPatioContext.EMPTY .ensureCompilationUnitElement(new PatioDataElementImmutableDefinition( "x", PatioVisibility.PRIVATE, PatioDataValues.int_(0), Sources.RUNTIME )); var error = assertThrows( DuplicateCompilationUnitElementName.class, () -> context.ensureCompilationUnitElement(new PatioDataElementImmutableDefinition( "x", PatioVisibility.PRIVATE, PatioDataValues.int_(1), Sources.RUNTIME )) ); assertThat(error.elementName(), equalTo("x")); } }