diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-01-05 23:39:19 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-01-05 23:39:19 +0000 |
| commit | 1e6e1f7bb8776fc013f76828ed8df3f9297d095b (patch) | |
| tree | 69033190a65779f6dbd694e15d66763b53408c5d /src/test/java | |
| parent | f54116f39ccb6d1efec95d76c59e9dad1d46e426 (diff) | |
Use java-source-text for JSON5 parsing
Diffstat (limited to 'src/test/java')
6 files changed, 118 insertions, 92 deletions
diff --git a/src/test/java/org/shedlang/compiler/config/BinConfigTests.java b/src/test/java/org/shedlang/compiler/config/BinConfigTests.java index eb6514d1..b11562d5 100644 --- a/src/test/java/org/shedlang/compiler/config/BinConfigTests.java +++ b/src/test/java/org/shedlang/compiler/config/BinConfigTests.java @@ -3,8 +3,8 @@ 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.Sources; import org.shedlang.compiler.types.NamespaceName; +import org.zwobble.sourcetext.SourceText; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.zwobble.precisely.AssertThat.assertThat; @@ -13,14 +13,14 @@ import static org.zwobble.precisely.Matchers.*; public class BinConfigTests { @Test public void canParseBinConfigWithNameAndMainNamespace() { - var source = Sources.string(""" + var sourceText = """ { name: "one", mainNamespace: "A/B", } - """); + """; - var config = BinConfig.fromJson5(Json5ObjectWithSource.parse(source)); + var config = parseBinConfig(sourceText); assertThat(config, allOf( has("name", x -> x.name(), equalTo("one")), @@ -29,23 +29,23 @@ public class BinConfigTests { } @Test public void whenMainNamespaceHasSyntaxErrorThenErrorIsThrown() { - var source = Sources.string(""" + var sourceText = """ { name: "one", mainNamespace: "A.B", } - """); + """; var error = assertThrows( ConfigError.class, - () -> BinConfig.fromJson5(Json5ObjectWithSource.parse(source)) + () -> parseBinConfig(sourceText) ); assertThat(error.getMessage(), equalTo(""" Invalid namespace name. Expected: END But got: SYMBOL_DOT "." - + <string>:1:2 A.B ^""")); @@ -54,4 +54,9 @@ public class BinConfigTests { mainNamespace: "A.B", ^^^^^""")); } + + private BinConfig parseBinConfig(String text) { + var sourceText = SourceText.fromString("<string>", text); + return BinConfig.fromJson5(Json5ObjectWithSource.parse(sourceText)); + } } diff --git a/src/test/java/org/shedlang/compiler/config/GcConfigTests.java b/src/test/java/org/shedlang/compiler/config/GcConfigTests.java index 351d3d5b..1dfa27a4 100644 --- a/src/test/java/org/shedlang/compiler/config/GcConfigTests.java +++ b/src/test/java/org/shedlang/compiler/config/GcConfigTests.java @@ -2,7 +2,7 @@ package org.shedlang.compiler.config; import org.junit.jupiter.api.Test; import org.shedlang.compiler.config.json.Json5ObjectWithSource; -import org.shedlang.compiler.sources.Sources; +import org.zwobble.sourcetext.SourceText; import java.util.OptionalLong; @@ -13,15 +13,15 @@ import static org.zwobble.precisely.Matchers.*; public class GcConfigTests { @Test public void whenNameIsUnrecognisedThenErrorIsThrown() { - var source = Sources.string(""" + var source = """ { name: "huh", } - """); + """; var error = assertThrows( IllegalArgumentException.class, - () -> GcConfig.fromJson5(Json5ObjectWithSource.parse(source)) + () -> parseGcConfig(source) ); assertThat(error.getMessage(), equalTo("Unrecognised GC name: \"huh\"")); @@ -29,44 +29,49 @@ public class GcConfigTests { @Test public void canParseConfigForBump() { - var source = Sources.string(""" + var source = """ { "name": "bump", } - """); + """; - var config = GcConfig.fromJson5(Json5ObjectWithSource.parse(source)); + var config = parseGcConfig(source); assertThat(config, instanceOf(GcBumpConfig.class)); } @Test public void canParseMinimalConfigForMarkAndSweep() { - var source = Sources.string(""" + var source = """ { name: "mark-and-sweep", } - """); + """; - var config = GcConfig.fromJson5(Json5ObjectWithSource.parse(source)); + var config = parseGcConfig(source); assertThat(config, instanceOf(GcMarkAndSweepConfig.class)); } @Test public void additionalFieldsCanBeUsedBySpecificGcConfig() { - var source = Sources.string(""" + var source = """ { name: "mark-and-sweep", collectInterval: 10000, } - """); + """; - var config = GcConfig.fromJson5(Json5ObjectWithSource.parse(source)); + 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 = SourceText.fromString("<string>", text); + return GcConfig.fromJson5(Json5ObjectWithSource.parse(sourceText)); + } } diff --git a/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java b/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java index 551c29d6..d867fd71 100644 --- a/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java +++ b/src/test/java/org/shedlang/compiler/config/GcMarkAndSweepConfigTests.java @@ -2,7 +2,7 @@ package org.shedlang.compiler.config; import org.junit.jupiter.api.Test; import org.shedlang.compiler.config.json.Json5ObjectWithSource; -import org.shedlang.compiler.sources.Sources; +import org.zwobble.sourcetext.SourceText; import java.util.OptionalLong; @@ -13,9 +13,9 @@ import static org.zwobble.precisely.Matchers.has; public class GcMarkAndSweepConfigTests { @Test public void collectIntervalCanBeMissing() { - var source = Sources.string("{}"); + var sourceText = SourceText.fromString("<string>", "{}"); - var config = GcMarkAndSweepConfig.fromJson5(Json5ObjectWithSource.parse(source)); + var config = GcMarkAndSweepConfig.fromJson5(Json5ObjectWithSource.parse(sourceText)); assertThat(config, has( "collectInterval", @@ -26,7 +26,7 @@ public class GcMarkAndSweepConfigTests { @Test public void additionalFieldsCanBeUsedBySpecificGcConfig() { - var source = Sources.string(""" + var source = SourceText.fromString("<string>", """ { name: "mark-and-sweep", collectInterval: 10000, diff --git a/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java b/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java index d7e5ac6f..c923e654 100644 --- a/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java +++ b/src/test/java/org/shedlang/compiler/config/ProfileConfigTests.java @@ -2,7 +2,7 @@ package org.shedlang.compiler.config; import org.junit.jupiter.api.Test; import org.shedlang.compiler.config.json.Json5ObjectWithSource; -import org.shedlang.compiler.sources.Sources; +import org.zwobble.sourcetext.SourceText; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; @@ -10,42 +10,42 @@ import static org.zwobble.precisely.Matchers.*; public class ProfileConfigTests { @Test public void canParseProfileConfigWithName() { - var source = Sources.string(""" + var source = """ { name: "one", } - """); + """; - var config = ProfileConfig.fromJson5(Json5ObjectWithSource.parse(source)); + var config = parseProfileConfig(source); assertThat(config, has("name", x -> x.name(), equalTo("one"))); } @Test public void canParseProfileConfigWithoutGc() { - var source = Sources.string(""" + var source = """ { name: "one", } - """); + """; - var config = ProfileConfig.fromJson5(Json5ObjectWithSource.parse(source)); + var config = parseProfileConfig(source); assertThat(config, has("name", x -> x.gc(), isOptionalEmpty())); } @Test public void canParseProfileConfigWithGc() { - var source = Sources.string(""" + var source = """ { name: "one", gc: { "name": "bump", }, } - """); + """; - var config = ProfileConfig.fromJson5(Json5ObjectWithSource.parse(source)); + var config = parseProfileConfig(source); assertThat(config, has( "gc", @@ -53,4 +53,9 @@ public class ProfileConfigTests { isOptionalOf(equalTo(GcConfig.BUMP)) )); } + + private ProfileConfig parseProfileConfig(String text) { + var sourceText = SourceText.fromString("<string>", text); + return ProfileConfig.fromJson5(Json5ObjectWithSource.parse(sourceText)); + } } diff --git a/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java b/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java index 2a852f98..449dd9ff 100644 --- a/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java +++ b/src/test/java/org/shedlang/compiler/config/ProjectConfigTests.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.shedlang.compiler.config.errors.ConfigError; import org.shedlang.compiler.config.errors.Json5SyntaxConfigError; import org.shedlang.compiler.types.NamespaceName; +import org.zwobble.sourcetext.SourceText; import java.nio.file.Path; @@ -18,7 +19,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasSyntaxErrorsOnFirstLineThenErrorIsThrown() { var error = assertThrows( Json5SyntaxConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, "[1] ]1") + () -> parseProjectConfig("[1] ]1") ); assertThat(error.getMessage(), equalTo("Expected end of document, but was ']'")); @@ -33,7 +34,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasSyntaxErrorsOnNonFirstLineThenErrorIsThrown() { var error = assertThrows( Json5SyntaxConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, "[\n1\n]\n 2") + () -> parseProjectConfig("[\n1\n]\n 2") ); assertThat(error.getMessage(), equalTo("Expected end of document, but was number '2'")); @@ -46,14 +47,14 @@ public class ProjectConfigTests { @Test public void canParseProjectConfigWithNoBins() { - var config = ProjectConfig.fromString(PROJECT_PATH, "{}"); + var config = parseProjectConfig("{}"); assertThat(config.bins(), isSequence()); } @Test public void canParseProjectConfigWithBins() { - var config = ProjectConfig.fromString(PROJECT_PATH, """ + var config = parseProjectConfig(""" { bins: [ { @@ -86,7 +87,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasBinsThatArentArrayThenErrorIsThrown() { var error = assertThrows( ConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, """ + () -> parseProjectConfig(""" {bins: true}""" ) ); @@ -103,7 +104,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasBinThatIsntObjectThenErrorIsThrown() { var error = assertThrows( ConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, """ + () -> parseProjectConfig(""" { bins: [1], }""" @@ -120,14 +121,14 @@ public class ProjectConfigTests { @Test public void canParseProjectConfigWithNoExamples() { - var config = ProjectConfig.fromString(PROJECT_PATH, "{}"); + var config = parseProjectConfig("{}"); assertThat(config.examples(), isSequence()); } @Test public void canParseProjectConfigWithExamples() { - var config = ProjectConfig.fromString(PROJECT_PATH, """ + var config = parseProjectConfig(""" { examples: [ {bin: "one"}, @@ -152,7 +153,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasExamplesThatArentArrayThenErrorIsThrown() { var error = assertThrows( ConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, """ + () -> parseProjectConfig(""" {examples: true}""" ) ); @@ -169,7 +170,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasExampleThatIsntObjectThenErrorIsThrown() { var error = assertThrows( ConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, """ + () -> parseProjectConfig(""" { examples: [1], }""" @@ -186,14 +187,14 @@ public class ProjectConfigTests { @Test public void canParseProjectConfigWithNoProfiles() { - var config = ProjectConfig.fromString(PROJECT_PATH, "{}"); + var config = parseProjectConfig("{}"); assertThat(config.profiles(), isSequence()); } @Test public void canParseProjectConfigWithProfiles() { - var config = ProjectConfig.fromString(PROJECT_PATH, """ + var config = parseProjectConfig(""" { profiles: [ {name: "one"}, @@ -218,7 +219,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasProfilesThatArentArrayThenErrorIsThrown() { var error = assertThrows( ConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, """ + () -> parseProjectConfig(""" {profiles: true}""" ) ); @@ -235,7 +236,7 @@ public class ProjectConfigTests { public void whenProjectConfigHasProfileThatIsntObjectThenErrorIsThrown() { var error = assertThrows( ConfigError.class, - () -> ProjectConfig.fromString(PROJECT_PATH, """ + () -> parseProjectConfig(""" { profiles: [1], }""" @@ -249,4 +250,9 @@ public class ProjectConfigTests { ^""" )); } + + private ProjectConfig parseProjectConfig(String text) { + var sourceText = SourceText.fromString("<string>", text); + return ProjectConfig.fromSourceText(PROJECT_PATH, sourceText); + } } diff --git a/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java b/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java index 112a45bc..15946c26 100644 --- a/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java +++ b/src/test/java/org/shedlang/compiler/config/json/Json5ObjectWithSourceTests.java @@ -2,19 +2,19 @@ package org.shedlang.compiler.config.json; import org.junit.jupiter.api.Test; import org.shedlang.compiler.config.errors.ConfigError; -import org.shedlang.compiler.sources.Sources; +import org.zwobble.sourcetext.SourceText; import java.util.Optional; 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.*; +import static org.zwobble.precisely.Matchers.equalTo; public class Json5ObjectWithSourceTests { @Test public void whenMemberIsMissingThenGetLongThrowsError() { - var source = Sources.string(""" + var source = """ { a: { b: [ @@ -23,8 +23,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var error = assertThrows( ConfigError.class, @@ -47,7 +47,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsNotNumberFiniteThenGetLongThrowsError() { - var source = Sources.string(""" + var source = """ { a: { b: [ @@ -56,8 +56,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var error = assertThrows( ConfigError.class, @@ -80,7 +80,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsFiniteNumberButIsNotLongThenGetLongThrowsError() { - var source = Sources.string(""" + var source = """ { a: { b: [ @@ -89,8 +89,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var error = assertThrows( ConfigError.class, @@ -113,7 +113,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsLongThenGetLongReturnsValue() { - var source = Sources.string(""" + var source = """ { a: { b: [ @@ -122,8 +122,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var result = object .getObject("a") @@ -137,7 +137,7 @@ public class Json5ObjectWithSourceTests { } @Test public void whenMemberIsMissingThenGetLongOrNoneReturnsEmptyOptional() { - var source = Sources.string(""" + var source = """ { a: { b: [ @@ -146,8 +146,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var result = object .getObject("a") @@ -162,7 +162,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsNotLongThenGetLongOrNoneThrowsError() { - var source = Sources.string(""" + var source = """ { a: { b: [ @@ -171,8 +171,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var error = assertThrows( ConfigError.class, @@ -195,7 +195,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsLongOrNoneThenGetLongReturnsValue() { - var source = Sources.string(""" + var source = """ { a: { b: [ @@ -204,8 +204,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var result = object .getObject("a") @@ -220,7 +220,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsMissingThenGetStringThrowsError() { - var source = Sources.string(""" + var source = """ { shed: { bins: [ @@ -229,8 +229,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var error = assertThrows( ConfigError.class, @@ -253,7 +253,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsNotStringThenGetStringThrowsError() { - var source = Sources.string(""" + var source = """ { shed: { bins: [ @@ -262,8 +262,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var error = assertThrows( ConfigError.class, @@ -286,7 +286,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsStringThenGetStringReturnsValue() { - var source = Sources.string(""" + var source = """ { shed: { bins: [ @@ -295,8 +295,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var result = object .getObject("shed") @@ -307,7 +307,7 @@ public class Json5ObjectWithSourceTests { .getString("name"); assertThat(result.value(), equalTo("two")); - assertThat(result.source().describe(), equalTo( + assertThat(result.sourceRange().describe(), equalTo( """ <string>:5:20 {name: "two"}, @@ -317,7 +317,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsMissingThenGetStringOrNoneReturnsEmptyOptional() { - var source = Sources.string(""" + var source = """ { shed: { bins: [ @@ -326,8 +326,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var result = object .getObject("shed") @@ -342,7 +342,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsNotStringThenGetStringOrNoneThrowsError() { - var source = Sources.string(""" + var source = """ { shed: { bins: [ @@ -351,8 +351,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var error = assertThrows( ConfigError.class, @@ -375,7 +375,7 @@ public class Json5ObjectWithSourceTests { @Test public void whenMemberIsStringThenGetStringOrNoneReturnsValue() { - var source = Sources.string(""" + var source = """ { shed: { bins: [ @@ -384,8 +384,8 @@ public class Json5ObjectWithSourceTests { ], }, } - """); - var object = Json5ObjectWithSource.parse(source); + """; + var object = parseJson5Object(source); var result = object .getObject("shed") @@ -396,11 +396,16 @@ public class Json5ObjectWithSourceTests { .getStringOrNone("name"); assertThat(result.orElseThrow().value(), equalTo("two")); - assertThat(result.orElseThrow().source().describe(), equalTo( + assertThat(result.orElseThrow().sourceRange().describe(), equalTo( """ <string>:5:20 {name: "two"}, ^^^^^""" )); } + + private Json5ObjectWithSource parseJson5Object(String text) { + var sourceText = SourceText.fromString("<string>", text); + return Json5ObjectWithSource.parse(sourceText); + } } |
