From 94fbf8a0e1ef25aca82aeb3e3a239ca0be1618bd Mon Sep 17 00:00:00 2001 From: Julien Kronegg Date: Wed, 19 Apr 2023 08:12:35 +0200 Subject: [PATCH 1/3] feat: added ParameterType message source reference to solve issue 2719 --- .../main/java/io/cucumber/core/runner/CachingGlue.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 3fb86c893c..5962758d5b 100644 --- a/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -235,7 +235,7 @@ void prepareGlue(StepTypeRegistry stepTypeRegistry) throws DuplicateStepDefiniti parameterTypeDefinitions.forEach(ptd -> { ParameterType parameterType = ptd.parameterType(); stepTypeRegistry.defineParameterType(parameterType); - emitParameterTypeDefined(parameterType); + emitParameterTypeDefined(ptd); }); dataTableTypeDefinitions.forEach(dtd -> stepTypeRegistry.defineDataTableType(dtd.dataTableType())); docStringTypeDefinitions.forEach(dtd -> stepTypeRegistry.defineDocStringType(dtd.docStringType())); @@ -285,14 +285,17 @@ void prepareGlue(StepTypeRegistry stepTypeRegistry) throws DuplicateStepDefiniti afterHooks.forEach(this::emitHook); } - private void emitParameterTypeDefined(ParameterType parameterType) { + private void emitParameterTypeDefined(ParameterTypeDefinition parameterTypeDefinition) { + ParameterType parameterType = parameterTypeDefinition.parameterType(); io.cucumber.messages.types.ParameterType messagesParameterType = new io.cucumber.messages.types.ParameterType( parameterType.getName(), parameterType.getRegexps(), parameterType.preferForRegexpMatch(), parameterType.useForSnippets(), bus.generateId().toString(), - null); + parameterTypeDefinition.getSourceReference() + .map(this::createSourceReference) + .orElseGet(this::emptySourceReference)); bus.send(Envelope.of(messagesParameterType)); } From e5653f95ae4fd15fd650d65dbe11a79aa38e84cd Mon Sep 17 00:00:00 2001 From: Julien Kronegg Date: Wed, 19 Apr 2023 08:12:35 +0200 Subject: [PATCH 2/3] feat: added ParameterType message source reference to solve issue 2719 --- CHANGELOG.md | 1 + .../main/java/io/cucumber/core/runner/CachingGlue.java | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d96bdc22..753c1ce565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [JUnit Platform Engine] Add constant for fixed.max-pool-size property ([#2713](https://github.com/cucumber/cucumber-jvm/pull/2713) M.P. Korstanje) - [Core] Support directories containing exclusively rerun files using the `@path/to/rerun` syntax ([#2710](https://github.com/cucumber/cucumber-jvm/pull/2710) Daniel Whitney, M.P. Korstanje) - [Core] Improved event bus performance using UUID generator selectable through SPI ([#2703](https://github.com/cucumber/cucumber-jvm/pull/2703) Julien Kronegg) +- [Core] Added source reference in parameter type messages ([#2719](https://github.com/cucumber/cucumber-jvm/issues/2719) Julien Kronegg) ### Fixed - [Pico] Improve performance ([#2724](https://github.com/cucumber/cucumber-jvm/issues/2724) Julien Kronegg) diff --git a/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 3fb86c893c..5962758d5b 100644 --- a/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -235,7 +235,7 @@ void prepareGlue(StepTypeRegistry stepTypeRegistry) throws DuplicateStepDefiniti parameterTypeDefinitions.forEach(ptd -> { ParameterType parameterType = ptd.parameterType(); stepTypeRegistry.defineParameterType(parameterType); - emitParameterTypeDefined(parameterType); + emitParameterTypeDefined(ptd); }); dataTableTypeDefinitions.forEach(dtd -> stepTypeRegistry.defineDataTableType(dtd.dataTableType())); docStringTypeDefinitions.forEach(dtd -> stepTypeRegistry.defineDocStringType(dtd.docStringType())); @@ -285,14 +285,17 @@ void prepareGlue(StepTypeRegistry stepTypeRegistry) throws DuplicateStepDefiniti afterHooks.forEach(this::emitHook); } - private void emitParameterTypeDefined(ParameterType parameterType) { + private void emitParameterTypeDefined(ParameterTypeDefinition parameterTypeDefinition) { + ParameterType parameterType = parameterTypeDefinition.parameterType(); io.cucumber.messages.types.ParameterType messagesParameterType = new io.cucumber.messages.types.ParameterType( parameterType.getName(), parameterType.getRegexps(), parameterType.preferForRegexpMatch(), parameterType.useForSnippets(), bus.generateId().toString(), - null); + parameterTypeDefinition.getSourceReference() + .map(this::createSourceReference) + .orElseGet(this::emptySourceReference)); bus.send(Envelope.of(messagesParameterType)); } From 49b581d573e3a3644e25da7705c6aaa90bbc61ed Mon Sep 17 00:00:00 2001 From: Julien Kronegg Date: Fri, 21 Apr 2023 23:06:56 +0200 Subject: [PATCH 3/3] feat: added test cases for ParameterType SourceReference --- .../cucumber/core/runner/CachingGlueTest.java | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/cucumber-core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/cucumber-core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 955a6badd5..08345ecb38 100644 --- a/cucumber-core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/cucumber-core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -43,9 +43,7 @@ import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -464,7 +462,7 @@ void scenario_scoped_hooks_have_higher_order() { } @Test - public void emits_hook_messages_to_bus() { + void emits_hook_messages_to_bus() { List events = new ArrayList<>(); EventHandler messageEventHandler = e -> events.add(e); @@ -482,6 +480,50 @@ public void emits_hook_messages_to_bus() { assertThat(events.size(), is(4)); } + @Test + void parameterTypeDefinition_without_source_reference_emits_parameterType_with_empty_source_reference() { + // Given + List events = new ArrayList<>(); + EventHandler messageEventHandler = events::add; + + EventBus bus = new TimeServiceEventBus(Clock.systemUTC(), UUID::randomUUID); + bus.registerHandlerFor(Envelope.class, messageEventHandler); + CachingGlue glue = new CachingGlue(bus); + + glue.addParameterType(new MockedParameterTypeDefinition()); + + // When + glue.prepareGlue(stepTypeRegistry); + + // Then + assertThat(events.size(), is(1)); + io.cucumber.messages.types.SourceReference sourceReference = events.get(0).getParameterType().get() + .getSourceReference().get(); + assertEquals(new io.cucumber.messages.types.SourceReference(null, null, null, null), sourceReference); + } + + @Test + void parameterTypeDefinition_with_source_reference_emits_parameterType_with_non_empty_source_reference() { + // Given + List events = new ArrayList<>(); + EventHandler messageEventHandler = events::add; + + EventBus bus = new TimeServiceEventBus(Clock.systemUTC(), UUID::randomUUID); + bus.registerHandlerFor(Envelope.class, messageEventHandler); + CachingGlue glue = new CachingGlue(bus); + + glue.addParameterType(new MockedParameterTypeDefinitionWithSourceReference()); + + // When + glue.prepareGlue(stepTypeRegistry); + + // Then + assertThat(events.size(), is(1)); + io.cucumber.messages.types.SourceReference sourceReference = events.get(0).getParameterType().get() + .getSourceReference().get(); + assertNotNull(sourceReference.getJavaStackTraceElement()); + } + private static class MockedScenarioScopedStepDefinition extends StubStepDefinition implements ScenarioScoped { MockedScenarioScopedStepDefinition(String pattern, Type... types) { @@ -564,6 +606,17 @@ public boolean isDisposed() { } + private static class MockedParameterTypeDefinitionWithSourceReference extends MockedParameterTypeDefinition { + @Override + public Optional getSourceReference() { + return Optional.of(SourceReference.fromStackTraceElement(new StackTraceElement( + "MockedParameterTypeDefinition", + "getSourceReference", + "CachingGlueTest.java", + 593))); + } + } + private static class MockedHookDefinition implements HookDefinition { private final int order;