package org.shedlang.compiler.config; import org.junit.jupiter.api.Test; import org.shedlang.compiler.config.json.Json5ObjectWithSource; import org.shedlang.compiler.sources.SourceTexts; import java.util.OptionalLong; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; public class GcConfigTests { @Test public void whenNameIsUnrecognisedThenErrorIsThrown() { var source = """ { name: "huh", } """; var error = assertThrows( IllegalArgumentException.class, () -> parseGcConfig(source) ); assertThat(error.getMessage(), equalTo("Unrecognised GC name: \"huh\"")); } @Test public void canParseConfigForBump() { var source = """ { "name": "bump", } """; var config = parseGcConfig(source); assertThat(config, instanceOf(GcBumpConfig.class)); } @Test public void canParseMinimalConfigForMarkAndSweep() { var source = """ { name: "mark-and-sweep", } """; var config = parseGcConfig(source); assertThat(config, instanceOf(GcMarkAndSweepConfig.class)); } @Test public void additionalFieldsCanBeUsedBySpecificGcConfig() { var source = """ { name: "mark-and-sweep", collectInterval: 10000, } """; var config = parseGcConfig(source); assertThat(config, instanceOf( GcMarkAndSweepConfig.class, has("collectInterval", x -> x.collectInterval(), equalTo(OptionalLong.of(10000L))) )); } private GcConfig parseGcConfig(String text) { var sourceText = SourceTexts.string(text); return GcConfig.fromJson5(Json5ObjectWithSource.parse(sourceText)); } }