package org.shedlang.compiler.config; import org.junit.jupiter.api.Test; import org.shedlang.compiler.config.errors.ConfigError; import org.shedlang.compiler.config.json.Json5ObjectWithSource; import org.shedlang.compiler.sources.SourceTexts; import org.shedlang.compiler.types.NamespaceName; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; public class BinConfigTests { @Test public void canParseBinConfigWithNameAndMainNamespace() { var sourceText = """ { name: "one", mainNamespace: "A/B", } """; var config = parseBinConfig(sourceText); assertThat(config, allOf( has("name", x -> x.name(), equalTo("one")), has("mainNamespace", x -> x.mainNamespace(), equalTo(NamespaceName.of("A", "B"))) )); } @Test public void whenMainNamespaceHasSyntaxErrorThenErrorIsThrown() { var sourceText = """ { name: "one", mainNamespace: "A.B", } """; var error = assertThrows( ConfigError.class, () -> parseBinConfig(sourceText) ); assertThat(error.getMessage(), equalTo(""" Invalid namespace name. Expected: END But got: SYMBOL_DOT "." :1:2 A.B ^""")); assertThat(error.source().describe(), equalTo(""" :3:20 mainNamespace: "A.B", ^^^^^""")); } private BinConfig parseBinConfig(String text) { var sourceText = SourceTexts.string(text); return BinConfig.fromJson5(Json5ObjectWithSource.parse(sourceText)); } }