diff --git a/java/.mvn/jvm.config b/java/.mvn/jvm.config new file mode 100644 index 0000000..32599ce --- /dev/null +++ b/java/.mvn/jvm.config @@ -0,0 +1,10 @@ +--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED diff --git a/java/pom.xml b/java/pom.xml index 7e61d0e..80dc54c 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -6,18 +6,18 @@ io.cucumber cucumber-parent - 4.5.0 + 5.0.0-SNAPSHOT teamcity-formatter - 0.2.1-SNAPSHOT + 0.3.0-SNAPSHOT jar TeamCity Formatter Interspaces Cucumbers output with TeamCity Service Messages https://github.com/cucumber/teamcity-formatter - io.cucumber.teamcityformatter + io.cucumber.teamcityformatter 1761578982 @@ -60,12 +60,12 @@ io.cucumber messages - [29.0.1,31.0.0) + [32.0.0-SNAPSHOT,33.0.0) io.cucumber query - [14.0.1,15.0.0) + [15.0.0-SNAPSHOT,16.0.0) @@ -132,4 +132,22 @@ test + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + validate + validate + + check + + + + + + diff --git a/java/src/main/java/io/cucumber/teamcityformatter/ComparisonFailure.java b/java/src/main/java/io/cucumber/teamcityformatter/ComparisonFailure.java index 8b12c80..d22ecde 100644 --- a/java/src/main/java/io/cucumber/teamcityformatter/ComparisonFailure.java +++ b/java/src/main/java/io/cucumber/teamcityformatter/ComparisonFailure.java @@ -1,5 +1,7 @@ package io.cucumber.teamcityformatter; +import org.jspecify.annotations.Nullable; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -25,6 +27,7 @@ final class ComparisonFailure { Pattern.DOTALL | Pattern.CASE_INSENSITIVE), }; + @Nullable static ComparisonFailure parse(String message) { for (Pattern pattern : COMPARE_PATTERNS) { ComparisonFailure result = parse(message, pattern); @@ -35,6 +38,7 @@ static ComparisonFailure parse(String message) { return null; } + @Nullable static ComparisonFailure parse(String message, Pattern pattern) { final Matcher matcher = pattern.matcher(message); if (!matcher.find()) { diff --git a/java/src/main/java/io/cucumber/teamcityformatter/OrderableEvent.java b/java/src/main/java/io/cucumber/teamcityformatter/OrderableEvent.java index 57c89fc..49e7b0d 100644 --- a/java/src/main/java/io/cucumber/teamcityformatter/OrderableEvent.java +++ b/java/src/main/java/io/cucumber/teamcityformatter/OrderableEvent.java @@ -1,17 +1,20 @@ package io.cucumber.teamcityformatter; +import org.jspecify.annotations.Nullable; + import java.util.Comparator; import static java.util.Comparator.naturalOrder; import static java.util.Comparator.nullsFirst; +import static java.util.Objects.requireNonNull; final class OrderableEvent implements Comparable> { private final T event; - private final String uri; - private final Long line; + private final @Nullable String uri; + private final @Nullable Integer line; - OrderableEvent(T event, String uri, Long line) { - this.event = event; + OrderableEvent(T event, @Nullable String uri, @Nullable Integer line) { + this.event = requireNonNull(event); this.uri = uri; this.line = line; } diff --git a/java/src/main/java/io/cucumber/teamcityformatter/PathCollector.java b/java/src/main/java/io/cucumber/teamcityformatter/PathCollector.java index a0b263a..a0e5290 100644 --- a/java/src/main/java/io/cucumber/teamcityformatter/PathCollector.java +++ b/java/src/main/java/io/cucumber/teamcityformatter/PathCollector.java @@ -8,18 +8,25 @@ import io.cucumber.messages.types.Scenario; import io.cucumber.messages.types.TableRow; import io.cucumber.query.LineageReducer; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import static java.util.Objects.requireNonNull; + final class PathCollector implements LineageReducer.Collector> { // There are at most 5 levels to a feature file. private final List lineage = new ArrayList<>(5); - private String uri; - private String scenarioName; + private @Nullable String uri; + private @Nullable String scenarioName; private int examplesIndex; private boolean isExample; + private String getRequiredUri() { + return requireNonNull(uri); + } + @Override public void add(GherkinDocument document) { uri = document.getUri().orElse(""); @@ -28,26 +35,26 @@ public void add(GherkinDocument document) { @Override public void add(Feature feature) { String name = getNameOrKeyword(feature.getName(), feature.getKeyword()); - lineage.add(new LineageNode(name, uri, feature.getLocation())); + lineage.add(new LineageNode(name, getRequiredUri(), feature.getLocation())); } @Override public void add(Rule rule) { String name = getNameOrKeyword(rule.getName(), rule.getKeyword()); - lineage.add(new LineageNode(name, uri, rule.getLocation())); + lineage.add(new LineageNode(name, getRequiredUri(), rule.getLocation())); } @Override public void add(Scenario scenario) { String name = getNameOrKeyword(scenario.getName(), scenario.getKeyword()); - lineage.add(new LineageNode(name, uri, scenario.getLocation())); + lineage.add(new LineageNode(name, getRequiredUri(), scenario.getLocation())); scenarioName = name; } @Override public void add(Examples examples, int index) { String name = getNameOrKeyword(examples.getName(), examples.getKeyword()); - lineage.add(new LineageNode(name, uri, examples.getLocation())); + lineage.add(new LineageNode(name, getRequiredUri(), examples.getLocation())); examplesIndex = index; } @@ -55,7 +62,7 @@ public void add(Examples examples, int index) { public void add(TableRow example, int index) { isExample = true; String name = "#" + (examplesIndex + 1) + "." + (index + 1); - lineage.add(new LineageNode(name, uri, example.getLocation())); + lineage.add(new LineageNode(name, getRequiredUri(), example.getLocation())); } @Override @@ -63,7 +70,7 @@ public void add(Pickle pickle) { // Case 1: Pickles from a scenario outline if (isExample) { String pickleName = pickle.getName(); - boolean parameterized = !scenarioName.equals(pickleName); + boolean parameterized = !pickleName.equals(scenarioName); if (parameterized) { LineageNode example = lineage.remove(lineage.size() - 1); String parameterizedExampleName = example.getName() + ": " + pickleName; diff --git a/java/src/main/java/io/cucumber/teamcityformatter/SourceReferenceFormatter.java b/java/src/main/java/io/cucumber/teamcityformatter/SourceReferenceFormatter.java index bc68044..5ad48de 100644 --- a/java/src/main/java/io/cucumber/teamcityformatter/SourceReferenceFormatter.java +++ b/java/src/main/java/io/cucumber/teamcityformatter/SourceReferenceFormatter.java @@ -8,6 +8,10 @@ final class SourceReferenceFormatter { + private SourceReferenceFormatter(){ + /* no-op */ + } + static Optional formatLocation(SourceReference sourceReference) { if (sourceReference.getJavaMethod().isPresent()) { return sourceReference.getJavaMethod() diff --git a/java/src/main/java/io/cucumber/teamcityformatter/SuggestionFormatter.java b/java/src/main/java/io/cucumber/teamcityformatter/SuggestionFormatter.java index d3552df..ac4314c 100644 --- a/java/src/main/java/io/cucumber/teamcityformatter/SuggestionFormatter.java +++ b/java/src/main/java/io/cucumber/teamcityformatter/SuggestionFormatter.java @@ -9,6 +9,10 @@ final class SuggestionFormatter { + private SuggestionFormatter(){ + /* no-op */ + } + static String format(Collection suggestions) { if (suggestions.isEmpty()) { return ""; diff --git a/java/src/main/java/io/cucumber/teamcityformatter/TeamCityWriter.java b/java/src/main/java/io/cucumber/teamcityformatter/TeamCityWriter.java index 4e250e2..133b8fb 100644 --- a/java/src/main/java/io/cucumber/teamcityformatter/TeamCityWriter.java +++ b/java/src/main/java/io/cucumber/teamcityformatter/TeamCityWriter.java @@ -137,7 +137,7 @@ private Stream findAllTestCaseStartedInCanonicalOrder() { .map(testCaseStarted -> { Optional pickle = query.findPickleBy(testCaseStarted); String uri = pickle.map(Pickle::getUri).orElse(null); - Long line = pickle.flatMap(query::findLocationOf).map(Location::getLine).orElse(null); + Integer line = pickle.flatMap(query::findLocationOf).map(Location::getLine).orElse(null); return new OrderableEvent<>(testCaseStarted, uri, line); }) .sorted() @@ -298,23 +298,19 @@ private void printTestStepFinished(TestStepFinished event) { Optional error = testStepResult.getException(); TestStepResultStatus status = testStepResult.getStatus(); switch (status) { - case SKIPPED: { + case SKIPPED -> { String message = error.flatMap(Exception::getMessage).orElse("Step skipped"); out.print(TEMPLATE_TEST_IGNORED, timeStamp, duration, message, name); - break; } - case PENDING: { + case PENDING -> { String details = error.flatMap(Exception::getMessage).orElse(""); out.print(TEMPLATE_TEST_FAILED, timeStamp, duration, "Step pending", details, name); - break; } - case UNDEFINED: { + case UNDEFINED -> { String snippets = findSnippets(event).orElse(""); out.print(TEMPLATE_TEST_FAILED, timeStamp, duration, "Step undefined", snippets, name); - break; } - case AMBIGUOUS: - case FAILED: { + case AMBIGUOUS, FAILED -> { String details = error.flatMap(Exception::getStackTrace).orElse(""); String message = error.flatMap(Exception::getMessage).orElse(null); if (message == null) { @@ -328,10 +324,9 @@ private void printTestStepFinished(TestStepFinished event) { } out.print(TEMPLATE_TEST_COMPARISON_FAILED, timeStamp, duration, "Step failed", details, comparisonFailure.getExpected(), comparisonFailure.getActual(), name); - break; } - default: - break; + default -> { + } } out.print(TEMPLATE_TEST_FINISHED, timeStamp, duration, name); }); @@ -359,23 +354,13 @@ private static String formatHookStepName(Hook hook) { private static String getHookType(Hook hook) { return hook.getType().map( - hookType -> { - switch (hookType) { - case BEFORE_TEST_RUN: - return "BeforeAll"; - case AFTER_TEST_RUN: - return "AfterAll"; - case BEFORE_TEST_CASE: - return "Before"; - case AFTER_TEST_CASE: - return "After"; - case BEFORE_TEST_STEP: - return "BeforeStep"; - case AFTER_TEST_STEP: - return "AfterStep"; - default: - return "Unknown"; - } + hookType -> switch (hookType) { + case BEFORE_TEST_RUN -> "BeforeAll"; + case AFTER_TEST_RUN -> "AfterAll"; + case BEFORE_TEST_CASE -> "Before"; + case AFTER_TEST_CASE -> "After"; + case BEFORE_TEST_STEP -> "BeforeStep"; + case AFTER_TEST_STEP -> "AfterStep"; }).orElse("Unknown"); } @@ -417,10 +402,7 @@ private void printBeforeAfterAllResult(TestRunFinished event, String timestamp) } private void handleAttachment(Attachment event) { - String message = extractAttachmentMessage(event); - if (message != null) { - handleAttachment(message); - } + handleAttachment(extractAttachmentMessage(event)); } private void handleAttachment(String message) { @@ -428,16 +410,14 @@ private void handleAttachment(String message) { } private static String extractAttachmentMessage(Attachment event) { - switch (event.getContentEncoding()) { - case IDENTITY: - return "Write event:\n" + event.getBody() + "\n"; - case BASE64: + return switch (event.getContentEncoding()) { + case IDENTITY -> "Write event:\n" + event.getBody() + "\n"; + case BASE64 -> { String name = event.getFileName().map(s -> s + " ").orElse(""); - return "Embed event: " + name + "[" + event.getMediaType() + " " + (event.getBody().length() / 4) * 3 + yield "Embed event: " + name + "[" + event.getMediaType() + " " + (event.getBody().length() / 4) * 3 + " bytes]\n"; - default: - return null; - } + } + }; } private static String formatTimeStamp(Timestamp timestamp) { diff --git a/java/src/main/java/io/cucumber/teamcityformatter/package-info.java b/java/src/main/java/io/cucumber/teamcityformatter/package-info.java new file mode 100644 index 0000000..e5a8c36 --- /dev/null +++ b/java/src/main/java/io/cucumber/teamcityformatter/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package io.cucumber.teamcityformatter; + +import org.jspecify.annotations.NullMarked; diff --git a/java/src/main/java/module-info.java b/java/src/main/java/module-info.java new file mode 100644 index 0000000..81f6338 --- /dev/null +++ b/java/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module io.cucumber.teamcityformatter { + requires org.jspecify; + + requires io.cucumber.messages; + requires io.cucumber.query; + + exports io.cucumber.teamcityformatter; +} diff --git a/java/src/test/java/io/cucumber/teamcityformatter/ComparisonFailureTest.java b/java/src/test/java/io/cucumber/teamcityformatter/ComparisonFailureTest.java index 9859dc4..c178b85 100644 --- a/java/src/test/java/io/cucumber/teamcityformatter/ComparisonFailureTest.java +++ b/java/src/test/java/io/cucumber/teamcityformatter/ComparisonFailureTest.java @@ -2,7 +2,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; +import org.junit.jupiter.params.shadow.de.siegmar.fastcsv.util.Nullable; +import static java.util.Objects.requireNonNull; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -33,7 +35,6 @@ void junit5() { .containsExactly("1", "42"); } - @SuppressWarnings("JUnit5AssertionsConverter") @Test void junit4() { ComparisonFailure comparisonFailure = create(() -> org.junit.Assert.assertEquals(1, 42)); @@ -50,9 +51,9 @@ void testng7() { .containsExactly("1", "42"); } - private static ComparisonFailure create(Executable executable) { + private static @Nullable ComparisonFailure create(Executable executable) { AssertionError exception = assertThrows(AssertionError.class, executable); - return ComparisonFailure.parse(exception.getMessage()); + return ComparisonFailure.parse(requireNonNull(exception.getMessage())); } } diff --git a/java/src/test/java/io/cucumber/teamcityformatter/Jackson.java b/java/src/test/java/io/cucumber/teamcityformatter/Jackson.java index aa2225d..647ee16 100644 --- a/java/src/test/java/io/cucumber/teamcityformatter/Jackson.java +++ b/java/src/test/java/io/cucumber/teamcityformatter/Jackson.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonCreator.Mode; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.cfg.ConstructorDetector; @@ -24,6 +25,7 @@ final class Jackson { .enable(DeserializationFeature.USE_LONG_FOR_INTS) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) .disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET) + .disable(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS) .build(); private Jackson() { diff --git a/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterAcceptanceTest.java b/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterAcceptanceTest.java index b7bb55f..37c289f 100644 --- a/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterAcceptanceTest.java +++ b/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterAcceptanceTest.java @@ -3,7 +3,6 @@ import io.cucumber.compatibilitykit.MessageOrderer; import io.cucumber.messages.NdjsonToMessageIterable; import io.cucumber.messages.types.Envelope; -import io.cucumber.teamcityformatter.MessagesToTeamCityWriter.Builder; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -25,12 +24,13 @@ import static io.cucumber.teamcityformatter.Jackson.OBJECT_MAPPER; import static io.cucumber.teamcityformatter.MessagesToTeamCityWriter.TeamCityFeature.PRINT_TEST_CASES_AFTER_TEST_RUN; -import static java.nio.file.Files.readAllBytes; +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Objects.requireNonNull; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assumptions.assumeFalse; class MessagesToTeamCityWriterAcceptanceTest { - private static final NdjsonToMessageIterable.Deserializer deserializer = (json) -> OBJECT_MAPPER.readValue(json, Envelope.class); + private static final NdjsonToMessageIterable.Deserializer deserializer = json -> OBJECT_MAPPER.readValue(json, Envelope.class); private static final Random random = new Random(202509121959L); private static final MessageOrderer messageOrderer = new MessageOrderer(random); @@ -51,11 +51,11 @@ private static List getSources() throws IOException { } } - private static ByteArrayOutputStream writePrettyReport(TestCase testCase, Builder builder, Consumer> orderer) throws IOException { + private static ByteArrayOutputStream writePrettyReport(TestCase testCase, MessagesToTeamCityWriter.Builder builder, Consumer> orderer) throws IOException { return writePrettyReport(testCase, new ByteArrayOutputStream(), builder, orderer); } - private static T writePrettyReport(TestCase testCase, T out, Builder builder, Consumer> orderer) throws IOException { + private static T writePrettyReport(TestCase testCase, T out, MessagesToTeamCityWriter.Builder builder, Consumer> orderer) throws IOException { List messages = new ArrayList<>(); try (InputStream in = Files.newInputStream(testCase.source)) { try (NdjsonToMessageIterable envelopes = new NdjsonToMessageIterable(in, deserializer)) { @@ -76,7 +76,7 @@ private static T writePrettyReport(TestCase testCase, T @MethodSource("acceptance") void test(TestCase testCase) throws IOException { ByteArrayOutputStream bytes = writePrettyReport(testCase, testCase.builder, messageOrderer.originalOrder()); - assertThat(bytes.toString()).isEqualToIgnoringNewLines(new String(readAllBytes(testCase.expected))); + assertThat(bytes.toString(UTF_8)).isEqualToIgnoringNewLines(Files.readString(testCase.expected)); } private final List exceptions = Arrays.asList( @@ -91,18 +91,18 @@ void test(TestCase testCase) throws IOException { void testPrintAfterTestRun(TestCase testCase) throws IOException { assumeFalse(() -> exceptions.contains(testCase.name)); - Builder builder = testCase.builder.feature(PRINT_TEST_CASES_AFTER_TEST_RUN, true); + MessagesToTeamCityWriter.Builder builder = testCase.builder.feature(PRINT_TEST_CASES_AFTER_TEST_RUN, true); ByteArrayOutputStream bytes = writePrettyReport(testCase, builder, messageOrderer.originalOrder()); - assertThat(bytes.toString()).isEqualToIgnoringNewLines(new String(readAllBytes(testCase.expected))); + assertThat(bytes.toString(UTF_8)).isEqualToIgnoringNewLines(Files.readString(testCase.expected)); } @ParameterizedTest @MethodSource("acceptance") void testPrintAfterTestRunWithSimulatedParallelExecution(TestCase testCase) throws IOException { assumeFalse(() -> exceptions.contains(testCase.name)); - Builder builder = testCase.builder.feature(PRINT_TEST_CASES_AFTER_TEST_RUN, true); + MessagesToTeamCityWriter.Builder builder = testCase.builder.feature(PRINT_TEST_CASES_AFTER_TEST_RUN, true); ByteArrayOutputStream bytes = writePrettyReport(testCase, builder, messageOrderer.simulateParallelExecution()); - assertThat(bytes.toString()).isEqualToIgnoringNewLines(new String(readAllBytes(testCase.expected))); + assertThat(bytes.toString(UTF_8)).isEqualToIgnoringNewLines(Files.readString(testCase.expected)); } @ParameterizedTest @@ -116,17 +116,17 @@ void updateExpectedFiles(TestCase testCase) throws IOException { static class TestCase { private final Path source; - private final Builder builder; + private final MessagesToTeamCityWriter.Builder builder; private final Path expected; private final String name; - TestCase(Path source, Builder builder) { + TestCase(Path source, MessagesToTeamCityWriter.Builder builder) { this.source = source; this.builder = builder; String fileName = source.getFileName().toString(); this.name = fileName.substring(0, fileName.lastIndexOf(".ndjson")); - this.expected = source.getParent().resolve(name + ".log"); + this.expected = requireNonNull(source.getParent()).resolve(name + ".log"); } @Override diff --git a/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterTest.java b/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterTest.java index 2be2fa2..4ca84ca 100644 --- a/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterTest.java +++ b/java/src/test/java/io/cucumber/teamcityformatter/MessagesToTeamCityWriterTest.java @@ -3,6 +3,7 @@ import io.cucumber.messages.types.Envelope; import io.cucumber.messages.types.TestRunFinished; import io.cucumber.messages.types.TestRunStarted; +import io.cucumber.messages.types.Timestamp; import org.junit.jupiter.api.Test; import java.io.ByteArrayOutputStream; @@ -46,7 +47,9 @@ void it_throws_when_writing_after_close() throws IOException { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); MessagesToTeamCityWriter writer = create(bytes); writer.close(); - assertThrows(IOException.class, () -> writer.write(null)); + assertThrows(IOException.class, () -> writer.write( + Envelope.of(new TestRunStarted(new Timestamp(0L, 0), "")) + )); } @Test diff --git a/java/src/test/java/io/cucumber/teamcityformatter/SourceReferenceFormatterTest.java b/java/src/test/java/io/cucumber/teamcityformatter/SourceReferenceFormatterTest.java index 21efc5e..00d8565 100644 --- a/java/src/test/java/io/cucumber/teamcityformatter/SourceReferenceFormatterTest.java +++ b/java/src/test/java/io/cucumber/teamcityformatter/SourceReferenceFormatterTest.java @@ -11,8 +11,8 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Could be replaced by compatibility-kit#131. - */ + * Could be replaced by compatibility-kit#131. + */ class SourceReferenceFormatterTest { @Test @@ -69,7 +69,7 @@ void stacktrace() { "path/to/org/example/Example.java", "example" ), - new Location(31415L, 42L) + new Location(31415, 42) ); assertThat(SourceReferenceFormatter.formatLocation(sourceReference)) .contains("java:test://org.example.Example/example"); @@ -86,7 +86,7 @@ void stacktrace_unnamed_packaged() { "path/to/Example.java", "" ), - new Location(31415L, 42L) + new Location(31415, 42) ); assertThat(SourceReferenceFormatter.formatLocation(sourceReference)) .contains("java:test://Example/Example"); @@ -102,7 +102,7 @@ void stacktrace__constructor() { "path/to/org/example/Example.java", "" ), - new Location(31415L, 42L) + new Location(31415, 42) ); assertThat(SourceReferenceFormatter.formatLocation(sourceReference)) .contains("java:test://org.example.Example/Example");